一、二分类

任务定义

  • 输入:一个特征向量 x∈Rnx \in \mathbb{R}^nxRn
  • 输出:预测 y∈{0,1}y\in\{0,1\}y{0,1}
  • 目标是构建一个模型,使得对于正样本 y=1y=1y=1 和负样本 y=0y=0y=0 能输出概率值 0≤y^≤10 \le \hat y \le 10y^1

二、逻辑回归

1. 为什么逻辑回归?

线性回归适合连续预测,而逻辑回归用 Sigmoid 函数 建模二分类概率输出:
y^=σ(z)=11+e−z,z=θTx \hat y = \sigma(z) = \frac{1}{1 + e^{-z}} ,\quad z = \theta^T x y^=σ(z)=1+ez1,z=θTx
其中:

  • z=θTxz=\theta^T xz=θTx 可看成 “线性得分”
  • σ(z)σ(z)σ(z) 映射到 [0,1] 作为概率

2. 原理解析

逻辑回归背后是假设:
P(y=1∣x)=σ(θTx) P(y=1|x) = σ(\theta^T x) P(y=1∣x)=σ(θTx)
这个模型可以被看成对输入特征做线性判别,再用 Sigmoid 转换为概率输出。

三、逻辑回归的代价函数

1. 目标

构建一个 “代价(loss)函数” 衡量预测值 y^\hat yy^ 与真实标签 yyy 的差距。

2. 使用逻辑损失

L(y^,y)=−(ylog⁡(y^)+(1−y)log⁡(1−y^)) \mathcal{L}(\hat y, y) = - (y \log(\hat y) + (1-y) \log(1-\hat y)) L(y^,y)=(ylog(y^)+(1y)log(1y^))

该损失函数理由:

  • y=1y=1y=1,损失为 −log⁡(y^)-\log(\hat y)log(y^),若模型预测概率低,则损失大。
  • y=0y=0y=0,损失为 −log⁡(1−y^)-\log(1-\hat y)log(1y^),若模型预测概率高,则损失大。
  • 有良好的凸性(globally convex),便于优化。

四、梯度下降

1. 目标

最小化代价函数:
J(θ)=1m∑i=1mL(y^(i),y(i)) J(\theta)=\frac{1}{m}\sum_{i=1}^m \mathcal{L}(\hat y^{(i)}, y^{(i)}) J(θ)=m1i=1mL(y^(i),y(i))

2. 梯度下降规则

θ:=θ−α∇θJ(θ) \theta := \theta - \alpha \nabla_\theta J(\theta) θ:=θαθJ(θ)

其中 α\alphaα 是学习率。

五、导数

1. 为什么需要导数?

导数告诉我们 函数变化最快的方向,有助于沿最陡下降方向更新参数。

2. Sigmoid 导数技巧

σ′(z)=σ(z)(1−σ(z)) σ'(z) = σ(z)(1-σ(z)) σ(z)=σ(z)(1σ(z))

这是 Sigmoid 函数导数的重要结论,后续反向传播中广泛使用。

六、更多导数例子

1. 常见例子

  • f(z)=z2f(z)=z^2f(z)=z2 的导数是 2z2z2z
  • f(z)=log⁡(z)f(z)=\log(z)f(z)=log(z) 的导数是 1/z1/z1/z

理解这些导数有助于推导梯度公式。

七、计算图

1. 什么时候用?

计算图是将复杂的函数分解为多个节点(运算单元)并按顺序串联的图结构,便于求 正向计算反向求导

2. 原理说明

通过链式法则(chain rule),计算图能分步求导:
如果 J=f(g(h(w)))J=f(g(h(w)))J=f(g(h(w))),则:
dJdw=dJdg⋅dgdh⋅dhdw \frac{dJ}{dw} = \frac{dJ}{dg}\cdot \frac{dg}{dh}\cdot \frac{dh}{dw} dwdJ=dgdJdhdgdwdh

八、计算图导数

步骤

  1. 从输入到输出逐层计算
  2. 从输出向输入沿边求导
  3. 每步使用链式法则

九、逻辑回归的梯度下降

对参数求导:
∂J∂θ=1mXT(y^−y) \frac{\partial J}{\partial \theta} = \frac{1}{m}X^T(\hat y - y) θJ=m1XT(y^y)
其中:

  • X∈Rm×nX\in\mathbb{R}^{m\times n}XRm×n
  • y^=σ(Xθ)\hat y = σ(X\theta)y^=σ()

这个表达式其实就是向量化后的梯度公式。

十、多样本梯度下降例子

在 m 个样本中一次计算整个梯度(Batch GD),适合中等规模数据;见后一节向量化。

十一、向量化

1. 为什么要向量化?

向量化能利用线性代数库(BLAS/LAPACK)的优化,极大加速计算,避免 Python/Octave 中的显式循环。

十二、更多向量化例子

示例:

  • 所有样本前向传播:

Z=WTX+b Z = W^T X + b Z=WTX+b

代替循环求每个 x(i)x^{(i)}x(i)z(i)z^{(i)}z(i)

十三、向量化逻辑回归

1. 正向传播

输入矩阵 X∈Rn×mX\in\mathbb{R}^{n\times m}XRn×m
Z=WTX+b Z = W^T X + b Z=WTX+b

A=σ(Z) A = σ(Z) A=σ(Z)

2. 反向传播(向量化)

dZ=A−Y dZ = A - Y dZ=AY

dW=1mXdZT dW = \frac{1}{m}X dZ^T dW=m1XdZT

db=1m∑dZ db = \frac{1}{m}\sum dZ db=m1dZ

十四、向量化逻辑回归的梯度计算

完整推导:

  1. dZ=A−YdZ = A-YdZ=AY(损失对线性输出导数)
  2. dW=1mXdZTdW = \frac{1}{m} X dZ^TdW=m1XdZT
  3. db=1m∑dZdb = \frac{1}{m}\sum dZdb=m1dZ

十五、Python 中的广播机制

1. 广播是啥?

当两个不同形状的 numpy 数组进行运算时,NumPy 会自动扩展(broadcast)较小的数组,使得形状匹配。

2. 原理解释

广播机制是通过 对齐轴 并在必要时 重复元素 来匹配维度,从而避免手动重复 reshape。

十六、Python/NumPy 向量使用注意点

  • 使用 np.dot() 做矩阵乘法,不要使用 *(表示元素乘)
  • 保证维度匹配
  • 小心形状 (n,) vs (n,1)

十七、逻辑回归损失函数

为什么损失函数这样定义?

  • 对数损失对应的是 最大似然估计(MLE) 的对数似然(log-likelihood)最小化问题,这使得逻辑回归与统计学中的概率解释紧密相关。
  • 对数损失相比平方误差不会导致 “饱和区梯度过小” 的问题,提升训练稳定性。

更多推荐