特征的线性组合
之前的二分类问题中, 如果把 $z=w^Tx+b$ 看做是衍生的新特征, 实际上感知机的模型就是 $y=\text{sign}(z)$. 二项逻辑斯蒂回归模型中, $P(y=1 \mid x) = \sigma(z)=\frac{1}{1+e^{-z}}$. 相当于引入了一个 sigmoid 函数进行非线性变换.
因此, 神经网络应运而生, 主要想法:
- 通过各维特征线性组合得到新特征
- 基于衍生特征通过非线性变换得到新特征
- 再对新特征进行线性组合和非线性变换, 逐层叠加
- 通过嵌套逼近复杂函数
多层前馈神经网络
设当前的 (衍生) 特征向量是
$$ z = \left(z^{(1)},z^{(2)},\cdots,z^{(m)}\right)^T $$进行线性组合
$$ v \cdot z - \theta = \sum_{i=1}^m v_i z^{(i)} - \theta $$再通过非线性变换 (考虑到数学性质, 通常是 sigmoid 函数):
$$ t = g(v \cdot z - \theta) $$定义
多层前馈神经网络 是常见的神经网络模型:
- 逐层排列神经元, 仅限于相邻层之间的完全连接;
- 接受外部输入信号的神经元在同一层, 称为 输入层;
- 最后一层神经元输出网络的结果, 称为 输出层;
- 输入层和输出层之间的神经元称为 隐藏层;
- 输入层直接接受激活函数, 输出层和隐藏层都对接受到的信号做激活函数变换.
所谓 感知机, 就是没有隐藏层的前馈神经网络.
前面学到的感知机学习能力有限, 例如它无法解决异或问题. 但是, 只要再加一层隐藏层, 就可以解决.
考虑一个单隐层的神经网络:
- 输入层有 $n$ 个神经元来接受输入信号;
- 输出层有 $k$ 个神经元来输出结果, 且第 $l$ 个神经元的阈值是 $\theta_l$;
- 隐藏层有 $m$ 个神经元, 第 $t$ 个神经元的阈值是 $\gamma_t$.
- 输入层到隐藏层的权重是 $w_{jt}$, 隐藏层到输出层的权重是 $v_{tl}$.
因而, 隐藏层的输出是
$$ z^{(t)}(x)=\sigma \left(\sum_{j=1}^n w_{jt} x^{(j)} - \gamma_t \right) $$输出层的输出是
$$ y^{(l)}(x) = \sigma \left( \sum_{t=1}^m v_{tl} z^{(t)} - \theta_l \right) $$参数集为 $\Theta = \{w_{jt},v_{tl},\gamma_t,\theta_l\}$
误差反向传播算法
我们采用平方误差作为预测损失函数, 则
$$ R(\Theta) = \sum_{i=1}^N R_i(\Theta) = \sum_{i=1}^N \| y_i - \hat{y}_i \| ^2 = \sum_{i=1}^N \sum_{l=1}^k (y_i^{(l)} - \hat{y}_i^{(l)})^2 $$依然采用经验风险最小化策略, 通过梯度下降法来求解参数集 $\Theta$. 求偏导可得:
$$ \begin{aligned} \frac{\partial R_i(\Theta)}{\partial v_{tl}} &= \delta_i^{(l)}z^{(t)}(x_i) \\ \frac{\partial R_i(\Theta)}{\partial \theta_l} &= -\delta_i^{(l)} \\ \frac{\partial R_i(\Theta)}{\partial w_{jt}} &= s_i^{(t)} x_i^{(j)} \\ \frac{\partial R_i(\Theta)}{\partial \gamma_t} &= -s_i^{(t)} \end{aligned} $$其中
$$ \begin{aligned} \delta_i^{(l)}&=-2(y_i^{(l)}-\hat{y}_i^{(l)})\hat{y}_i^{(l)}(1-\hat{y}_i^{(l)}) \\ s_i^{(t)} &= z^{(t)}(x_i)(1-z^{(t)}(x_i))\sum_{l=1}^k v_{tl}\delta_i^{(l)} \end{aligned} $$给定学习率 $\eta$, 按照 $\alpha = \alpha - \eta \frac{\partial R_i(\Theta)}{\partial \alpha}$ 进行迭代更新.
采用正则化策略来缓解过拟合问题:
$$ \hat{\Theta} = \argmin_{\Theta} (R(\Theta) + \lambda J(\Theta)) $$其中 $J(\Theta)$ 是正则化项, 通常是参数的 $L_2$ 范数, 所有参数的平方和.
关于激活函数, 除了 sigmoid 函数, 还有 tanh 函数, ReLU 函数等. 前两者函数性质连续, 但是在部分情况可能导数接近 $0$, 从而导致梯度消失问题. 相对之下, ReLU 函数梯度计算简单. 还有带泄漏的 ReLU 函数:
$$ f(x) = \begin{cases} x & x>0 \\ \lambda x & x \leq 0 \end{cases} $$等等.