机器学习 课程笔记

绪论

机器学习的定义:

A computer program is said to learn from experience EE with respect to some task TT and some performance measure PP, if its performance on TT, as measured by PP, improves with experience EE. (Tom Mitchell, 1998)

机器学习 = 随着经验 EE 的增加,完成任务 TT 的表现 PP 持续变好。

机器学习就是要寻找一个函数

我们希望从数据中学习一个映射:

f:Xyf:X\to y

其中:

  • XX:输入空间(特征)
  • yy :输出空间(标签)

训练集的数学表示:

Straining={(X(i),y(i))}i=1N{X,Y}NS_{\text{training}} = \{(X^{(i)}, y^{(i)})\}_{i=1}^{N} \in \{\mathcal{X}, \mathcal{Y}\}^{N}

其中,

  • NN:样本数量

  • 每个样本由两部分组成:

    • X(i)X^{(i)} :第 ii 个样本的特征
    • y(i)y^{(i)}:第 ii 个样本的标签
  • 训练的目标就是在训练集上学习一个函数:

    f:XYf : X \to Y

机器学习的基本流程

机器学习整体流程非常固定,可分为三大步:

选择模型

选择一个模型(定义函数集合)等价于选择一个函数族:

F={fθθRd}\mathcal{F} = \{f_\theta \mid \theta \in \mathbb{R}^d\}

例如:

  • 线性回归:

    fθ(x)=θTxf_\theta(x) = \theta^T x

  • 神经网络:网络结构决定函数族的形状

  • SVM:决策边界的形式由模型选择决定

定义目标函数

即定义损失函数/似然函数/正则项,目标函数通常称为 J(θ)J(\theta)L(θ)L(\theta)

J(θ)=1Ni=1NL(fθ(X(i)),y(i))J(\theta) = \frac{1}{N}\sum_{i=1}^N L\big(f_\theta(X^{(i)}), y^{(i)} \big)

下面按类别总结。

分类常用损失
  1. 0-1 损失:不可导,不用于训练,只用于评估。)

L(y,y^)={0,y=y^1,yy^L(y, \hat{y}) = \begin{cases} 0, & y = \hat{y} \\ 1, & y \neq \hat{y} \end{cases}

  1. 交叉熵损失(最常用),二分类:

    L(y,y^)=(ylogy^+(1y)log(1y^))L(y, \hat{y}) = - \big( y\log \hat{y} + (1-y)\log(1-\hat{y}) \big)

回归常用损失
  1. 均方误差(MSE),光滑,可导,最常用。

L(y,y^)=(yy^)2L(y, \hat{y}) = (y - \hat{y})^2

  1. 平均绝对误差(MAE),抗离群点能力强。

L(y,y^)=yy^L(y, \hat{y}) = |y - \hat{y}|

  1. Huber 损失,结合 MSE 和 MAE 的优点。

Lδ(y,y^)={12(yy^)2,yy^δδyy^12δ2,yy^>δL_\delta(y, \hat{y}) = \begin{cases} \frac{1}{2}(y - \hat{y})^2, & |y - \hat{y}| \le \delta \\ \delta \cdot |y - \hat{y}| - \frac{1}{2}\delta^2, & |y - \hat{y}| > \delta \end{cases}

概率推理相关损失
  1. KL 散度(常用于 VAEs)

DKL(PQ)=xP(x)logP(x)Q(x)D_{\mathrm{KL}}(P \| Q) = \sum_x P(x)\log \frac{P(x)}{Q(x)}

  1. 最大似然(MLE)

目标是最大化似然:

θ=argmaxθp(yx;θ)\theta^* = \arg\max_\theta p(y \mid x; \theta)

等价于最小化负对数似然 NLL:

θ=argminθlogp(yx;θ)\theta^* = \arg\min_\theta -\log p(y \mid x; \theta)

正则化(避免过拟合)
  1. L1 正则,使参数稀疏。

Θ1=λi=1dθi||\Theta||_{1} = \lambda \sum_{i=1}^{d} |\theta_i|

  1. L2 正则,使参数变小(权重衰减)。

Θ22=λi=1dθi2||\Theta||_{2}^{2} = \lambda \sum_{i=1}^{d} \theta_i^{2}

  1. 范数约束

Θ22c||\Theta||_2^2 \le c

选择最优函数(训练 = 优化)

最常用方法:梯度下降

θi(t)θi(t1)λθi(t1)J(Θ)\theta_i^{(t)} \leftarrow \theta_i^{(t-1)} - \lambda \frac{\partial}{\partial \theta_i^{(t-1)}} J(\Theta)

其中:

  • λ\lambda:学习率
  • J(θ)J(\theta):目标函数

梯度下降是一个迭代求解最小值的过程。


随机梯度下降(SGD)每一步只使用一个样本或小批量样本:

θθλθJmini-batch(θ)\theta \leftarrow \theta - \lambda \nabla_\theta J_{\text{mini-batch}}(\theta)

优点:

  • 更快
  • 可以在线学习
  • 适合大规模数据

机器学习的主要类型

监督学习(Supervised Learning)

利用带标签数据学习一个映射 f:XYf : X \to Y

任务:

  • 分类
  • 回归

关键点:

  • 标签真实、明确
  • 训练目标:拟合标签

半监督学习(Semi-supervised Learning)

结合少量标注 + 大量无标注数据。

两大基本假设

  1. 聚类假设:同一聚类中的样本倾向于有相同的标签

  2. 流形假设:数据分布在低维流形上,局部相似 → 标签相似

无监督学习(Unsupervised Learning)

没有标签,从数据中发现结构。

任务:

  • 聚类(k-means、层次聚类)
  • 降维(PCA、LDA)
  • 密度估计

强化学习(Reinforcement Learning)

Agent 与环境交互,通过累积奖励学习策略。

强化学习不是“靠标签”,而是凭 trial-and-error 学习。

类型如何学习?
监督学习给定正确答案(指导)
强化学习给定奖励(好/坏),但没有对错标签

自监督学习(Self-supervised Learning)

从无标签数据中自动构造标签来训练模型。

例子:

  • BERT:预测被 mask 的词
  • GPT:预测下一个词
  • SimCLR:预测不同视角的相似性

Yann LeCun:

如果人工智能是一块蛋糕,蛋糕的大部分是自监督学习,糖衣是监督学习,樱桃是强化学习。

  • 意思:自监督学习未来最重要。

线性回归

监督学习概述

监督学习的任务类型:

  • 回归(Regression):输出是连续值,如房价预测、温度预测。
  • 分类(Classification):输出是离散类别,如图片识别、垃圾邮件分类。

监督学习的一般范式

训练集形式:

{(x(i),y(i))i=1,,m}\{(x^{(i)}, y^{(i)}) \mid i = 1,\ldots,m\}

  • x(i)Rnx^{(i)} \in \mathbb{R}^nnn 维特征
  • y(i)Ry^{(i)} \in \mathbb{R}:输出(回归时)或类别(分类时)

线性回归模型(Hypothesis)

给定 nn 个特征,线性回归假设模型为:

hθ(x)=θ0+θ1x1++θnxnh_\theta(x) = \theta_0 + \theta_1 x_1 + \cdots + \theta_n x_n

θ\theta 是参数(权重),需要从数据中学习。

写成向量形式:

hθ(x)=θTxh_\theta(x) = \theta^T x

若将 xx 扩展为:

x=[1x1xn]x = \begin{bmatrix} 1 \\ x_1 \\ \vdots \\ x_n \end{bmatrix}

则上式成立。

确定 θ\theta

我们需要一个 代价函数 (cost function)来衡量 h(x)h(x) 与真实 yy 的误差。

从样本数据推导损失函数

  1. 原始误差表示绝对误差(L1)

J(θ)=i=1mhθ(x(i))y(i)J(\theta) = \sum_{i=1}^m | h_\theta(x^{(i)}) - y^{(i)} |

直观、可解释,但:

  • 不可导(在 0 点不可导)
  • 优化困难
  1. 更常用平方误差(L2)

为了可导且数学简单,我们改为平方误差:

J(θ)=i=1m(hθ(x(i))y(i))2J(\theta) = \sum_{i=1}^m ( h_\theta(x^{(i)}) - y^{(i)} )^2

常见形式会加入 12\frac{1}{2} [1]

J(θ)=12i=1m(hθ(x(i))y(i))2J(\theta) = \frac{1}{2} \sum_{i=1}^m ( h_\theta(x^{(i)}) - y^{(i)} )^2

线性模型的特点

  • 形式简单
  • 可解释性强(θ\theta 的大小反映特征的重要性)
  • 是许多非线性模型的基础
  • 深度模型可以被看作线性模型的堆叠

模型训练前的特征规范化(Feature Normalization)

这部分很关键,如果不同特征量级差别巨大:

  • 代价函数的等高线变得“狭长”
  • 梯度下降效率极低

因此需要归一化:

xi:=ximean(xi)std(xi)x_i := \frac{x_i - \text{mean}(x_i)}{\text{std}(x_i)}

解释:

  • 减去均值:让数据居中
  • 除以标准差:让尺度一致

作用:

让不同特征处于相近范围(通常是 1-111 之间),梯度下降会快很多

最小二乘目标函数(Least Squares)

最终要优化的目标:

minθJ(θ)=12i=1m(hθ(x(i))y(i))2\min_\theta J(\theta) = \frac{1}{2} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2

目标:找到能让模型预测接近真实 yy 的参数 $\theta $。

线性回归的正规方程(Normal Equation)

如果不想用优化(如梯度下降),可以直接给出 θ\theta闭式解(closed-form solution)[2]

构造矩阵 XX 和向量 YY

训练样本:

(x(1),y(1)),,(x(m),y(m))(x^{(1)}, y^{(1)}), \ldots, (x^{(m)}, y^{(m)})

令:

X=[(x(1))T(x(2))T(x(m))T]=[1x1(1)xn(1)1x1(2)xn(2)1x1(m)xn(m)]Y=[y(1)y(2)y(m)]X =\begin{bmatrix} (x^{(1)})^T \\ (x^{(2)})^T \\ \vdots \\ (x^{(m)})^T \end{bmatrix}= \begin{bmatrix} 1 & x_1^{(1)} & \cdots & x_n^{(1)} \\ 1 & x_1^{(2)} & \cdots & x_n^{(2)} \\ \vdots & \vdots & \ddots & \vdots \\ 1 & x_1^{(m)} & \cdots & x_n^{(m)} \end{bmatrix}\\ Y = \begin{bmatrix} y^{(1)} \\ y^{(2)} \\ \vdots \\ y^{(m)} \end{bmatrix}

用矩阵表示目标函数

首先:

hθ(x(i))=(x(i))Tθh_\theta(x^{(i)}) = (x^{(i)})^T \theta

因此:

XθY=[(x(1))Tθy(1)(x(m))Tθy(m)]X\theta - Y= \begin{bmatrix} (x^{(1)})^T\theta - y^{(1)} \\ \vdots \\ (x^{(m)})^T\theta - y^{(m)} \end{bmatrix}

平方和误差可以写成:

J(θ)=12(XθY)T(XθY)J(\theta) = \frac{1}{2}(X\theta - Y)^T (X\theta - Y)

正规方程求解法

取导数:

θ12(XθY)T(XθY)=XT(XθY)\frac{\partial}{\partial \theta} \frac{1}{2}(X\theta - Y)^T (X\theta - Y) = X^T(X\theta - Y)

令其 =0= 0

XTXθ=XTYX^T X \theta = X^T Y

最终解为:

θ=(XTX)1XTY\theta = (X^T X)^{-1} X^T Y

条件:XTXX^TX 可逆(如果不可逆,则可以使用伪逆 (XTX)+(X^TX)^{+}

梯度下降法求解

梯度下降法(Gradient Descent)是用来 最小化 一个目标函数 J(θ)J(\theta) 的最常用方法。

直觉上:

  • 梯度(gradient)表示函数上升最快的方向
  • 因此最陡下降方向是其反方向

所以我们更新参数的方法是:

θj:=θjαθjJ(θ)\theta_j := \theta_j - \alpha \frac{\partial}{\partial\theta_j} J(\theta)

其中:

  • α\alpha:学习率(step size)
  • θjJ(θ)\frac{\partial}{\partial\theta_j} J(\theta):梯度

如果不是要“下山”,而是要“爬山”(最大化):

θj:=θj+αθjJ(θ)\theta_j := \theta_j + \alpha \frac{\partial}{\partial\theta_j} J(\theta)

梯度是指向上升最快方向的向量

  • 要最大化 → 顺着梯度走
  • 要最小化 → 逆着梯度走

梯度的数学意义

函数 z=f(x,y)z = f(x, y) 的梯度是:

f(x,y)=(fx,fy)\nabla f(x,y) = \left(\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}\right)

它代表在点 (x,y) 处函数上升最快的方向


在参数一维情况下更新示例

假设只有一维参数 ww,损失函数 L(w)L(w)

w(1)w(0)ηdLdww=w(0)w^{(1)} \leftarrow w^{(0)} - \eta \frac{dL}{dw}\bigg|_{w=w^{(0)}}

  • 如果导数为正 → 表示在右边函数变大 → 要往左(减小 ww
  • 如果导数为负 → 要往右(增大 ww

线性回归的梯度推导

对于单个样本:

hθ(x)=i=0nθixih_\theta(x) = \sum_{i=0}^{n} \theta_i x_i

损失函数(单样本):

J=12(hθ(x)y)2J = \frac12 (h_\theta(x) - y)^2

计算偏导:

θjJ=(hθ(x)y)xj\frac{\partial}{\partial \theta_j} J = (h_\theta(x) - y) x_j

因此更新规则(单样本):

θj:=θjα(hθ(x)y)xj\theta_j := \theta_j - \alpha (h_\theta(x) - y) x_j

这也叫 LMS(Least Mean Square)更新规则


LMS 规则的性质如下:

更新量:

Δθj=αhθ(x)yxj|\Delta \theta_j| = \alpha |h_\theta(x) - y| |x_j|

因此:误差越大,更新越快

从单样本到多样本:BGD, SGD, Mini-Batch

  1. Batch Gradient Descent(批量梯度下降)

每次用所有样本的平均梯度:

θj:=θj+αi=1m(y(i)hθ(x(i)))xj(i)\theta_{j} := \theta_{j} + \alpha \sum_{i=1}^{m} (y^{(i)} - h_\theta(x^{(i)})) x_j^{(i)}

特点:

  • 每次更新很“准”,但速度慢
  • 大数据集时很低效
  1. Stochastic Gradient Descent(随机梯度下降)

每次只用一个样本:

θj:=θj+α(y(i)hθ(x(i)))xj(i)\theta_j := \theta_j + \alpha (y^{(i)} - h_\theta(x^{(i)})) x_j^{(i)}

特点:

  • 更新频繁 → 收敛快
  • 会震荡 → 不会到精确最小值,但会接近它
  1. Mini-Batch Gradient Descent

折中方法:每次用 BB 个样本(如32、64、128)。

优点:

  • 稳定
  • 高效
  • GPU 适配

目前深度学习里最常用。

线性回归损失是凸函数

这部分证明线性回归的损失一定只有一个全局最优

线性回归损失:

J(θ)=12i=1m(hθ(x(i))y(i))2J(\theta) = \frac{1}{2} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2

是一个 二次函数(quadratic function),对应一个“碗形”:

  • 凸函数(convex function)
  • 只有一个全局最小值,没有局部最小值

所以梯度下降一定能找到全局最优。

关于学习率 α\alpha 的讨论

  1. 如果 α\alpha 太小:

    • 每一步走很慢,收敛慢
  2. 如果 α\alpha 太大:

    • 跨过“山谷”,震荡甚至发散

解决方法

现代优化算法使用动态学习率:

  • Adagrad
  • RMSProp
  • Momentum
  • Adam(RMSProp + Momentum)

Adam 最常用。

梯度下降和正规方程的对比

项目梯度下降正规方程
是否需要学习率需要不需要
是否需要迭代
是否需要特征归一化需要不需要
时间复杂度O(kn2)O(k n^2)O(n3)O(n^3),需要计算逆
特征数量大时可用不可用

正规方程缺点:

  • 需要矩阵 (XTX)1(X^TX)^{-1},可能不可逆
  • 特征维度大(如1万)时,求逆非常慢

所以实际工程中基本不用正规方程,深度学习完全都用梯度方法。

线性回归的概率解释(核心思想)

线性回归假设数据满足:

y(i)=hθ(x(i))+ϵ(i)y^{(i)} = h_\theta(x^{(i)}) + \epsilon^{(i)}

其中:

  • ϵ(i)\epsilon^{(i)} 独立同分布
  • 服从高斯分布 N(0,σ2)\mathcal{N}(0, \sigma^2)

为什么服从高斯?中心极限定理:很多随机因素叠加会接近正态分布。


最小二乘 = 最大似然估计(MLE)

若误差为高斯分布,那么最大化似然就是最小化平方误差和,这是因为高斯分布概率密度:

exp((yhθ(x))22σ2)\exp\left(-\frac{(y - h_\theta(x))^2}{2\sigma^2}\right)

要最大化似然,就是要最小化上式指数的负号部分:

minθ(y(i)hθ(x(i)))2\min_\theta \sum (y^{(i)} - h_\theta(x^{(i)}))^2

这部分可以证明:

在高斯噪声假设下,最小二乘法是最大似然估计(MLE)得到的最优解。

即:

  • 假设噪声 ~ N(0,σ2)N(0,\sigma^2)
  • 写出似然函数
  • 对数化
  • 最大化似然
  • 得到与最小二乘 完全等价

这个证明的意义是:

线性回归不仅仅是数学上的“平方误差最小”,而是统计意义上的 最优无偏估计

这让线性回归有了非常强的理论基础。

线性回归的拓展

局部加权线性回归

普通线性回归给每个样本同等权重,而 局部加权线性回归(Locally Weighted Linear Regression, LWR)会根据预测点 xx 的邻近程度,对样本赋予不同的权重 wiw_i

  • 距离近 → 权重大
  • 距离远 → 权重小

直观理解:我们希望“关注局部”,即预测时主要用邻近点的信息,而不是全局平均。

带权重的平方误差函数

f(θ)=i=1mwi(yixiTθ)2f(\theta) = \sum_{i=1}^{m} w_i (y_i - x_i^T \theta)^2

  • θ\theta:回归系数
  • wiw_i:样本 ii 的权重

矩阵形式:

f(θ)=(yXθ)TW(yXθ)f(\theta) = (y - X \theta)^T W (y - X \theta)

  • W=diag(w1,w2,,wm)W = \text{diag}(w_1, w_2, \dots, w_m)

求解方法

令偏导数为 0:

f(θ)θ=2XTW(yXθ)=0\frac{\partial f(\theta)}{\partial \theta} = -2 X^T W (y - X\theta) = 0

得到 加权正规方程

XTWy=XTWXθX^T W y = X^T W X \theta

求解参数:

θ=(XTWX)1XTWy\theta = (X^T W X)^{-1} X^T W y

与普通正规方程类似,只是加入了权重矩阵 WW


权重选择

最常用的是 高斯核函数

wii=exp(xix22k2)w_{ii} = \exp\left( -\frac{|x_i - x|^2}{2 k^2} \right)

  • xix_i:训练样本
  • xx:预测点
  • kk:控制“局部性”的参数
    • kk 大 → 权重差异小 → 更像全局回归
    • kk 小 → 权重差异大 → 只使用附近点

直观:预测点周围的点“更重要”,远的点几乎不参与。

非线性模型的多元回归

线性回归可以扩展到非线性特征,通过 特征变换

hθ(x)=j=0nθjϕj(x)h_\theta(x) = \sum_{j=0}^{n} \theta_j \phi_j(x)

  • ϕj(x)\phi_j(x) 可以是多项式、正弦、指数等函数
  • 保留线性回归解法,只是特征被非线性映射

损失函数:

J(θ)=i(yiθTϕ(xi))2J(\theta) = \sum_i (y^i - \theta^T \phi(x^i))^2

矩阵形式:

θ=(ΦTΦ)1ΦTy\theta = (\Phi^T \Phi)^{-1} \Phi^T y

  • Φ\Phi 是映射后的特征矩阵
  • 与普通线性回归求解方法相同

直观理解:线性回归“只对参数线性”,特征可以非线性 → 可拟合复杂关系。

机器学习中的若干讨论

样本离群点(Outliers)

  • 极端值可能严重影响线性回归结果

  • 对应方法:鲁棒回归(robust regression)、使用 L1 损失

欠拟合与过拟合

  • 欠拟合(underfitting):模型太简单 → 对训练数据拟合不好

  • 过拟合(overfitting):模型太复杂 → 对训练数据拟合好,但泛化差

直观理解:奥卡姆剃刀法则(Occam’s Razor):在多个可行模型中,选择最简单的能解释数据的模型

正则化(Regularization)

  1. L2 正则化(Ridge / 岭回归)

minwi=1m(yiwTxi)2+λw22\min_w \sum_{i=1}^m (y_i - w^T x_i)^2 + \lambda \| w \|_2^2

惩罚系数过大 → 参数更小 → 降低过拟合


  1. L1 正则化(LASSO 回归)

minwi=1m(yiwTxi)2+λw1\min_w \sum_{i=1}^m (y_i - w^T x_i)^2 + \lambda \| w \|_1

可以得到 稀疏解 → 自然完成特征选择

特征选择(Feature Selection)

  • 选择重要特征,去掉冗余特征

  • LASSO 的稀疏解本质就是一种自动特征选择方法

逻辑回归

在线性回归中,目标变量 yy 是连续的,而逻辑回归要解决 分类问题 (Classification)

  • 输入:特征向量 x(i)x^{(i)}
  • 输出:类别标签 y(i)y^{(i)}

最常见的是:

  1. 二分类

y{0,1}y \in \{0,1\}

例如:

  • 1:垃圾邮件,0:正常邮件
  • 1:肿瘤恶性,0:肿瘤良性
  • 1:人脸匹配成功,0:不匹配
  1. 多分类

y{1,2,,K}y \in \{1,2,\cdots,K\}

一般多分类可以拆成多个二分类(如 One-vs-All 方法)。

从线性回归到分类器

为什么直接用线性回归不行?线性回归输出的是实数:

y^=θTx\hat{y} = \theta^T x

但分类需要输出:

  • 明确类别标签

  • 属于某一类的概率(更好)

线性回归有两个问题:

  1. 输出不是概率(可能 <0 或 >1),例如预测癌症概率不能得到 1.3 或 -0.8。

  2. 使用单位阶跃函数不可导,若我们强行使用“硬分类”:

y={1z>00z<0y = \begin{cases} 1 & z>0\\ 0 & z<0 \end{cases}

​ 这是 不连续 的,无法用梯度优化。

Sigmoid 函数(Logistic 函数)

逻辑回归的核心思想:

用线性函数得到一个值 zz
再用 Sigmoid 将其变成一个概率

Sigmoid 函数

g(z)=11+ezg(z)=\frac{1}{1+e^{-z}}

关键性质:

  • z+z→+\infty 时 → 1

  • zz→-\infty 时 → 0

  • 输出永远在 (0,1)(0,1) 之间

  • 可导

    g(z)=g(z)(1g(z))g'(z)=g(z)(1-g(z))

这正适合做 概率模型

逻辑回归的假设函数

hθ(x)=11+eθTxh_\theta(x)=\frac{1}{1+e^{-\theta^Tx}}

解释:

  • 输出 = 输入属于正类(y=1y=1)的概率

概率视角 P(yx)P(y|x) 的表达

对于二分类:

P(y=1x;θ)=hθ(x)P(y=1|x;\theta)=h_\theta(x)

可写成统一形式:

P(yx;θ)=(hθ(x))y(1hθ(x))1yP(y|x;\theta)= (h_\theta(x))^y (1-h_\theta(x))^{1-y}

如果:

  • y=1y=1 → 保留前项
  • y=0y=0 → 保留后项

这为后面的似然函数打下基础。

Logit 几率比(odds ratio)

几率比:

odds=p1p\text{odds} = \frac{p}{1-p}

例如:中彩票概率 0.1,则:

odds=0.10.9=1:9\text{odds} = \frac{0.1}{0.9}=1:9


与逻辑回归的关系

从模型:

p=hθ(x)p = h_\theta(x)

推得:

p1p=eθTx\frac{p}{1-p}=e^{\theta^T x}

再取对数(logit transform):

lnp1p=θTx\ln \frac{p}{1-p} = \theta^T x

意义:

逻辑回归实际上在学习:
特征如何影响 log(几率比)
这是一种“线性解释的概率模型”。

用最大似然估计推导逻辑回归目标函数

“概率给事件,似然给参数”。

逻辑回归模型的似然:

L(θ)=i=1m(hθ(x(i)))y(i)(1hθ(x(i)))1y(i)L(\theta) = \prod_{i=1}^m (h_\theta(x^{(i)}))^{y^{(i)}}(1-h_\theta(x^{(i)}))^{1-y^{(i)}}

因为样本独立同分布(i.i.d.),取对数 → 对数似然(便于推导):

(θ)=i=1m[y(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]\ell(\theta) = \sum_{i=1}^m \left[ y^{(i)}\log h_\theta(x^{(i)}) + (1-y^{(i)})\log(1-h_\theta(x^{(i)})) \right]

这就是逻辑回归优化的目标。

使用梯度上升法优化参数

因为我们要最大化:

maxθ(θ)\max_\theta \ell(\theta)

梯度上升更新规则:

θ:=θ+α(θ)\theta := \theta + \alpha\nabla \ell(\theta)

注意可与线性回归做对比:

  • 线性回归是梯度下降(-
  • 逻辑回归是梯度上升(++

推导梯度

最终结论:

(θ)θj=(y(i)hθ(x(i)))xj(i)\frac{\partial \ell(\theta)}{\partial \theta_j} = (y^{(i)} - h_\theta(x^{(i)}))x_j^{(i)}

与线性回归几乎一样

因此有,

随机梯度上升(SGD)更新:

θj:=θj+α(y(i)hθ(x(i)))xj(i)\theta_j := \theta_j + \alpha (y^{(i)} - h_\theta(x^{(i)})) x_j^{(i)}

Softmax 回归(多分类)

当类别:

y{1,2,,k}y \in \{1,2,\dots,k\}

Softmax 回归模型输出 kk 个概率:

p(y=jx;θ)=eθjTxl=1keθlTxp(y=j|x;\theta)=\frac{e^{\theta_j^T x}}{\sum_{l=1}^k e^{\theta_l^T x}}

组合写法:

hθ(x)=1j=1keθjTx[eθ1Txeθ2TxeθkTx]h_\theta(x)= \frac{1}{\sum_{j=1}^k e^{\theta_j^T x}} \begin{bmatrix} e^{\theta_1^T x}\\ e^{\theta_2^T x}\\ \vdots\\ e^{\theta_k^T x} \end{bmatrix}

Softmax 是逻辑回归的多分类扩展:Sigmoid 是二分类概率归一化,Softmax 是 kk 类概率归一化

补充:Softmax 的目标函数是交叉熵,后面神经网络还会讲。

牛顿法(Newton Iteration)

牛顿法本质是:

利用一阶与二阶导数,通过“局部二次近似”求方程的根。

求方程 f(x)=0f(x)=0 的牛顿公式

目标求解:

f(x)=0f(x)=0

牛顿迭代公式:

xn+1=xnf(xn)f(xn)x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}

理解:

f(x)f(x) 用泰勒展开近似成直线,然后找它的根。

函数根与最优化的联系

逻辑回归要做的是:

  • 最大化对数似然函数 (θ)\ell(\theta)
  • 最大化等价于求一阶导数为 0 的点(极值点)

即:

θ(θ)=0\nabla_\theta \ell(\theta) = 0

把它看作方程:

f(θ)=(θ)=0f(\theta) = \ell'(\theta) = 0

将牛顿法用于逻辑回归

设:

f(θ)=(θ)f(\theta)=\ell'(\theta)

牛顿更新变为:

θ:=θ(θ)(θ)\theta := \theta - \frac{\ell'(\theta)}{\ell''(\theta)}

Newton–Raphson 方法

适用于多维(向量)情况。

θRn\theta \in \mathbb{R}^n 时:

  • 一阶导 → 梯度向量 (θ)\nabla \ell(\theta)
  • 二阶导 → Hessian 矩阵 HH

更新公式:

θ:=θH1(θ)\theta := \theta - H^{-1} \nabla \ell(\theta)

解释:

  • 梯度:朝着最陡方向上升
  • Hessian:告诉我们“弯曲程度”,调整步长避免震荡
  • 本质:每次用二阶信息做“二次优化”

在逻辑回归中,这个方法叫 Fisher Scoring

为什么?

  • 逻辑回归中 Hessian 具有特定形式(负定),可写成期望形式
  • 用期望替代 Hessian,就是 Fisher 信息矩阵
  • 于是形成经典的 Fisher Scoring 更新:

θ:=θH1(θ)\theta := \theta - H^{-1}\nabla \ell(\theta)

这比梯度上升 更快收敛(通常只要几次迭代)

牛顿法和梯度上升的比较

方法收敛速度计算代价适用场景
梯度上升慢,一阶信息高维参数、大数据
牛顿法很快(二阶)需要计算 Hessian,代价高参数维度较小的模型

逻辑回归一般维度不大,传统统计时代都用牛顿法求解。

模型评估方法与性能评价指标

逻辑回归属于分类模型,因此我们需要:

  • 避免过拟合/欠拟合
  • 正确划分数据集
  • 正确评价模型性能

过拟合与欠拟合

过拟合

模型过度学习训练集的细节+噪声 → 测试集表现变差

原因包括:

  • 模型太复杂
  • 特征太多
  • 数据量太少
  • 参数权重太大

解决:

  • 正则化(L1/L2)
  • 更多样本
  • 降低特征维度

数据集划分

数据集作用比例
训练集拟合模型50%~80%
验证集调超参数10%~20%
测试集最终评估,不能再调参10%~30%

常见划分方法

  1. 留出法(Hold-out):一次性划分 训练 / 验证 / 测试。

    • 缺点:容易受切分的随机性影响。
  2. 交叉验证(Cross-validation):将数据切成 KK 折:

    • 每次选择 11 折做验证

    • 其他 K1K-1 折做训练

    • KK 轮结果平均

​ 最常用:K=10K=10

​ 当 K=NK=N(样本数)时 → 留一法 LOOCV

  1. 自助法 Bootstrapping(有放回抽样):每次抽样 mm 次(有放回),约有 1/e1/31/e \approx 1/3 样本落入测试集。

    • 优点:

      • 小数据集非常有用

      • Bagging 等集成学习强依赖该方法

分类性能指标

分类评价不仅仅是准确率。

混淆矩阵(Confusion Matrix)

预测正类预测负类
真实正类TPFN
真实负类FPTN

这是后面所有指标的基础。

准确率 Accuracy

Accuracy=TP+TNTP+TN+FP+FN\text{Accuracy} = \frac{\text{TP} + \text{TN}}{\text{TP} + \text{TN} + \text{FP} + \text{FN}}

适用于数据平衡的场景。

精确率 Precision(查准率)

Precision=TPTP+FP\text{Precision} = \frac{\text{TP}}{\text{TP}+\text{FP}}

预测为正的样本中,有多少是真正的正例。

用于:垃圾邮件、广告点击预测等 假正成本高 的任务。

召回率 Recall(查全率)

Recall=TPTP+FN\text{Recall} = \frac{\text{TP}}{\text{TP}+\text{FN}}

真实为正的样本中,有多少被找出来。

用于:疾病预测、地震预测、作弊检测等 漏报代价高 的任务。

F1 分数(调和平均)

F1=21Precision+1Recall=2PRP+R\text F1 = \frac{2}{\frac{1}{\text{Precision}} + \frac{1}{\text{Recall}}} = 2 \cdot \frac{\text{PR}}{\text{P}+\text{R}}

当需要均衡 Precision 和 Recall 时使用。

平均每类准确率(Average Per-class Accuracy)

用于多分类:

1Ki=1KAccuracyi\frac{1}{K}\sum_{i=1}^K \text{Accuracy}_i

比总体 Accuracy 更能体现多类任务中的表现。

ROC 曲线

横轴:FPR(假正例率)

FPR=FPFP+TN\text{FPR} = \frac{\text{FP}}{\text{FP}+\text{TN}}

纵轴:TPR(真正例率)= Recall

TPR=TPTP+FN\text{TPR} = \frac{\text{TP}}{\text{TP}+\text{FN}}

每个阈值对应一个 (FPR, TPR) 点,连接形成 ROC 曲线。

AUC

就是 ROC 曲线下的面积

  • AUC = 1 → 完美分类器
  • AUC = 0.5 → 随机猜测
  • 越大越好

特点:

  • 不受类别不平衡影响(非常重要)
  • 光滑 ROC 曲线表明模型未过拟合

常用网络模型

卷积神经网络(CNN)

DNN(全连接网络)在图像上有一个致命问题:参数量爆炸:例如, 100×100 ×3 的彩色图片,如果用全连接层输入:

100 × 100 × 3 = 30,000 个输入节点
如果下一层是 1000 节点,则需要 3千万参数

非常容易过拟合。


而 CNN 利用图像特性,能够减少参数

  1. 局部连接,图像的模式(边缘、纹理)一般都很局部,不需要覆盖全图,所以卷积只连接像素的一个小邻域(如 3×3)。

  2. 参数共享,同一模式会在不同区域出现,所以使用同一卷积核扫描整张图,参数量不随图像大小增长。

  3. 下采样不改变物体,所以池化层(Pooling)减少分辨率,但保留关键结构。

CNN 的典型结构

graph TD
    A[Input Image] --> B[Convolution Layer]
    B --> C[ReLU]
    C --> D[Pooling Layer]
    D --> E[Convolution Layer]
    E --> F[ReLU]
    F --> G[Pooling Layer]
    G --> H[Flatten]
    H --> I[Fully Connected Layers]
    I --> J[Output]

Convolution Layer -> Pooling Layer 可以重复很多次

操作目的效果
Convolution找局部模式(边缘、纹理、形状)提取特征
Parameter sharing同一卷积核扫全图降低参数量
Pooling降低分辨率提高鲁棒性
Multiple filters不同通道学不同特征多层次特征提取

卷积层(Convolution Layer)

卷积核心思想:边界检测(edge detection)、特征提取

卷积核是一个小矩阵,例如(Sobel 核):

1
2
3
[-1  0  1]
[-2 0 2]
[-1 0 1]

每个卷积核扫描整张图,得到一个 特征图(feature map)。

多通道输出:使用 KK 个卷积核,就得到 KK 个通道,通道数 = 卷积核数量


卷积减少尺寸(不使用 padding 时):

如果输入大小为:H×WH \times W
卷积核为 k×kk \times k
输出大小为 (Hk+1)×(Wk+1)(H - k + 1) \times (W - k + 1)

池化层(Pooling Layer)

池化层的作用有:

  1. 下采样 → 降低分辨率
  2. 保留关键特征,使模型对小变化具有稳定性(translation invariant)
  3. 降低参数量、计算量

常用池化方式

  • 最大池化 Max Pooling(最常用):选出区域中最大值

  • 平均池化 Average Pooling


池化不会改变通道数:它只改变宽高,不改变通道数量。

常用参数:

窗口大小 2×2、步长 2

意味着区域不重叠,尺寸缩小一半

Flatten 层

Pooling 后的输出形状为:

1
(批量大小,通道数,高,宽)

Flatten 会把每个样本摊平为一个向量:

1
通道 × 高 × 宽

然后输入到全连接层(分类器)。

经典 CNN 架构

LeNet-5(1998)
  • 用于手写数字(MNIST)识别
  • 第一篇“实用性” CNN 论文(Yann LeCun)

LeNet 架构流程:

graph TD
    A[Input 32x32 Image] --> B[Conv 5x5, 6 Channels]
    B --> C[Avg Pool 2x2]
    C --> D[Conv 5x5, 16 Channels]
    D --> E[Avg Pool 2x2]
    E --> F[Flatten]
    F --> G[FC 120]
    G --> H[FC 84]
    H --> I[FC 10 Classes]
AlexNet(2012)

推动深度学习爆发的关键模型

  • 更深层
  • 使用 GPU 训练
  • 使用 ReLU
  • 使用 Dropout
  • 在 ImageNet 取得显著突破
VGG(2014)

特点:

  • 使用简单的结构:连续的 3×3 卷积堆叠
  • 深度更大(16 或 19 层)

优点:结构规则,方便迁移学习

GoogLeNet(2014)

使用 Inception 模块(并行多尺度卷积)

ResNet(2015)
  • 使用 残差结构(Residual block)
  • 解决深度网络梯度消失问题
  • 可训练上百层甚至上千层

ImageNet 数据集

ImageNet(李飞飞团队):

  • 1500 万图像
  • 22,000 个类别
  • 大规模标注

推动深度学习的两大动力:

  1. 大数据(ImageNet)
  2. GPU 计算能力

之后才有 AlexNet、VGG、ResNet 等模型的发展。

循环神经网络(RNN)

序列建模的核心困难,需要让 RNN 解决。

以往的前馈网络(DNN/CNN)满足的结构是:

Input → Algorithm → Output

每个输入只对应一个输出,没有记忆能力。

但在许多任务中:

  • 句子(文本)
  • 声音(语音)
  • 视频帧序列
  • 行为序列、时间序列(金融预测)

当前时刻的输入必须依赖之前的上下文,没有记忆能力的模型无法完成。所以需要 RNN —— 能把之前的信息保存下来。


RNN 的核心思想:“隐状态(hidden state)是记忆,它跟随时间不断更新

单步结构:

1
2
3
4
Xt → (U) → ◼ → (V) → Ot

W
St-1

数学表达:

  1. 隐状态更新

St=f(UXt+WSt1)S_t = f(U X_t + W S_{t-1})

  1. 输出

Ot=g(VSt)O_t = g(V S_t)

隐状态 StS_t 同时依赖当前输入 XtX_t,也依赖历史状态 St1S_{t-1},这就是 RNN 可以“记住前文信息”的原因。

RNN 的时间展开(unrolling)

展开后的结构:

graph LR
    S0((S0)) --> A1[Cell t=1]
    A1 --> A2[Cell t=2]
    A2 --> A3[Cell t=3]
    A3 --> A4[Cell t=4]

    X1 --> A1
    X2 --> A2
    X3 --> A3
    X4 --> A4

    A1 --> O1
    A2 --> O2
    A3 --> O3
    A4 --> O4

输入顺序不同 → 隐状态传递不同 → 输出也不同,所以RNN 是顺序敏感的模型

RNN 的变种结构

双向 RNN(Bi-RNN)

普通 RNN:

  • 只能看到过去 → 不看未来

对于句子理解来说:

  • 当前词意义通常依赖前文和后文

所以有:

← RNN (看未来)
→ RNN (看过去)

拼接两者输出:

graph LR
    X1 --> F1[Forward RNN]
    X2 --> F2[Forward RNN]
    X3 --> F3[Forward RNN]

    X1 --> B1[Backward RNN]
    X2 --> B2[Backward RNN]
    X3 --> B3[Backward RNN]

    F1 --> C1[(Concat)]
    B1 --> C1
    F2 --> C2[(Concat)]
    B2 --> C2
    F3 --> C3[(Concat)]
    B3 --> C3

Deep RNN(多层 RNN)

把多个 RNN 叠在一起:

RNN layer 1 → RNN layer 2 → …

提高模型表达能力。

RNN 的三个主要缺点

  1. 短期记忆问题
    只能记住最近输入,无法处理长序列
    因为每一步都对记忆进行“覆盖”
  2. 训练困难
    RNN 的时间展开非常长,梯度要跨时间回传
  3. 梯度消失和梯度爆炸
    不适合学习长期依赖
    这也是为什么要有 LSTM、GRU

LSTM:解决长期依赖问题

LSTM(1997)引入 记忆单元(cell state) + 三个门

  • 输入门 iti_t
  • 遗忘门 ftf_t
  • 输出门 oto_t

公式如下:

it=σ(Wiixt+bii+Whiht1+bhi)ft=σ(Wifxt+bif+Whfht1+bhf)gt=tanh(Wigxt+big+Whght1+bhg)ot=σ(Wioxt+bio+Whoht1+bho)ct=ftct1+itgtht=ottanh(ct)\begin{aligned} i_{t}&=\sigma(W_{ii}x_t+b_{ii}+W_{hi}h_{t-1}+b_{hi})\\ f_{t}&=\sigma(W_{if}x_t+b_{if}+W_{hf}h_{t-1}+b_{hf})\\ g_{t}&=\tanh(W_{ig}x_t+b_{ig}+W_{hg}h_{t-1}+b_{hg})\\ o_{t}&=\sigma(W_{io}x_t+b_{io}+W_{ho}h_{t-1}+b_{ho})\\ c_{t}&=f_{t}\odot c_{t-1}+i_{t}\odot g_{t}\\ h_{t}&=o_{t}\odot\tanh(c_{t}) \end{aligned}

LSTM 核心机制

  • 遗忘门决定忘多少历史
  • 输入门决定写入多少新信息
  • 输出门决定输出多少记忆

梯度可以沿着 ctc_t 长距离传播,不容易消失。

GRU:更轻量的 RNN

比 LSTM 少一个门,更简单、训练更快。

GRU 结构:

  • 重置门 rtr_t
  • 更新门 ztz_t
  • 候选隐藏状态 h~t\tilde{h}_t

rt=σ(Wr[ht1,xt])zt=σ(Wz[ht1,xt])h~t=tanh(Wh~[rtht1,xt])ht=(1zt)ht1+zth~t\begin{aligned} r_t &= \sigma(W_r[h_{t-1}, x_t])\\ z_t &= \sigma(W_z[h_{t-1}, x_t])\\ \tilde{h}_t &= \tanh(W_{\tilde{h}}[r_t*h_{t-1}, x_t])\\ h_t &= (1-z_t)*h_{t-1} + z_t*\tilde{h}_t \end{aligned}

GRU 和 LSTM 效果相似,但参数更少。

Attention 机制

心理学基础:注意力是“选择信息子集、集中关注”的过程。

在深度学习中:Attention = 根据重要性对输入序列加权,让模型专注于更相关的部分。

好处:

  • 解决 RNN 的长距离依赖问题
  • 更好的信噪比,提高性能
  • 可以解释模型关注了哪里
  • 是 Transformer、BERT、GPT 的基础

Seq2Seq with Attention

RNN Seq2Seq 的问题:

  • 编码器要把整个句子压成一个向量(太难)
  • 会丢失大量信息
  • 长句效果差

注意力机制:

  • 解码器的每一步都使用编码器所有隐藏状态按权重加权
  • “动态取信息”,而不是用一个静态向量

Self-Attention(自注意力)

这是 Transformer 的核心。

Self-Attention 的输入是一个序列:

a1,a2,...,ana^1, a^2, ..., a^n

对每个 aia^i,计算:

  • 查询向量 (query)

    qi=Wqaiq^i = W^q a^i

  • 键向量 (key)

    ki=Wkaik^i = W^k a^i

  • 值向量 (value)

    vi=Wvaiv^i = W^v a^i

对序列中的所有 pair 做 attention:

α1,i=q1kid\alpha_{1,i} = \frac{q^1 \cdot k^i}{\sqrt{d}}

Softmax 归一化后,用这些权重加权 value:

b1=iSoftmax(α1,i)vib^1 = \sum_i \text{Softmax}(\alpha_{1,i}) \, v^i

这就是“自注意力”:每个位置都能看所有位置 → 并行计算 → 替代 RNN。

多头自注意力 Multi-Head Self Attention

一个头只能学习一种关系模式

例如:

  • 语法依赖
  • 主题相关
  • 相邻词关系
  • 长程依赖

多头注意力(Multi-Head Attention)让模型学多种模式。

做法:

  1. 把输入向量拆成多个子空间
  2. 每个子空间做一次 Self-Attention(称为一个“头”)
  3. 最后拼接(concat)各头的输出
  4. 再做线性变换
graph TD
    A[Input Sequence] --> S1[Linear Q K V Projection for Head 1]
    A --> S2[Linear Q K V Projection for Head 2]
    A --> S3[Linear Q K V Projection for Head h]
    S1 --> AT1[Self Attention Head 1]
    S2 --> AT2[Self Attention Head 2]
    S3 --> AT3[Self Attention Head h]
    AT1 --> C[Concat]
    AT2 --> C
    AT3 --> C
    C --> O[Linear Projection]

总结:

  • 多头注意力 = 多种信息模式的组合
  • Transformer 并行、高效、无序列依赖

参考和注解

  1. 便于求导,使导数中前面的系数变得更整齐。
  2. 一个数学问题的解可以用有限次的标准数学运算直接表达出来,不需要迭代、极限、数值方法等过程。

机器学习 课程笔记
https://blog.kisechan.space/2025/notes-machine-learning/
作者
Kisechan
发布于
2025年11月16日
更新于
2025年11月17日
许可协议