本文主要对神经网络反向传播(Backpropagation Algorithm)的求导关键部分做笔记,并简要介绍自编码器概念(Autoencoder)。
参考
符号
符号 | 含义 |
---|---|
$(x^i, y^i)$ | 第 $i$ 个训练样本 |
$h_{W,b}(x)$ | 输入为 $x$ 时的假设输出,其中包含参数 $W,b$ |
$a_i^l$ | 第 $l$ 层 $i$ 单元的激活值,对第一层有 $a_i^1=x_i$ |
$W^l_{ij}$ | 连接第 $l$ 层 $j$ 单元和第 $l+1$ 层 $i$ 单元的参数 |
$b^l_i$ | 连接第 $l$ 层偏置单元和第 $l+1$ 层 $i$ 单元的参数 |
$z_i^l$ | 第 $l$ 层 $i$ 单元所有输入的加权和 |
$f()$ | 激活函数,可选 $sigmoid$ 或 $tanh$ 函数 |
$s_l$ | 第 $l$ 层的单元数目(不包含偏置单元) |
$n_l$ | 神经网络层数 |
有:
$$z_i^{l+1} = bi^{l} + \sum{j=1}^{s{l}} W{ij}^{l} a_j^{l}$$
$$a_i^l = f(z_i^l)$$
前向传播(forward propagation)
从输入层单元开始,逐层计算下层单元,直到求得输出层。可以说就是神经网络由输入预测输出的整个过程。
反向传播
反向传播运用梯度下降试图寻找最优模型参数,即 $W_{ij}^l$ 与 $b_i^l$,使得代价函数最小。梯度下降开始前给参数随机赋值,用前向传播计算出各层单元。下降关键是整体代价函数 $J$ 对参数 $W$ 和 $b$ 的求导。
对于单个样例 $(x,y)$,其代价函数为:
$$ J(W,b; x,y) = \frac{1}{2} \left| h_{W,b}(x) - y \right|^2 $$
给定一个包含 $m$ 个样例的数据集,定义整体代价函数为:
$$ J(W,b) = \frac{1}{m} \sum{i=1}^m J(W,b;x^{(i)},y^{(i)}) + \frac{\lambda}{2} \sum (W^{(l)}{ji})^2 $$
第一项是对所有样例的代价求和取平均,而第二项作为规则化项,防止过拟合。因为第二项求导简单,不再赘述。对第二项只关心单个样例求导,即
$$ \frac{\partial J(W,b;x,y)}{\partial W_{ij}^l}\;\; and \;\; \frac{\partial J(W,b;x,y)}{\partial b_i^l} $$
首先有:
$$\frac{\partial J}{\partial W_{ij}^l} = \frac{\partial J}{\partial z_i^{l+1}} \frac{\partial zi^{l+1}}{\partial W{ij}^l} = \frac{\partial J}{\partial z_i^{l+1}} a_j^l$$
同理:
$$\frac{\partial J}{\partial b_i^l} = \frac{\partial J}{\partial z_i^{l+1}} \frac{\partial z_i^{l+1}}{\partial b_i^l} = \frac{\partial J}{\partial z_i^{l+1}} $$
所以,关键是求解:
$$ \delta^{(l+1)}_i = \frac{\partial J}{\partial z_i^{l+1}}$$
当 $l=n_l$
$$ \delta^{(n_l)}_i
= \frac{\partial}{\partial z^{n_l}i}\frac{1}{2} \left| y - h{W,b}(x) \right|^2
= \frac{\partial}{\partial z^{n_l}i}\frac{1}{2} \sum{j=1}^{S_{n_l}} (y_j-f(z_j^{(n_l)}))^2 \
= - (y_i - f(z_i^{(n_l)})) \cdot f’(z^{(n_l)}_i) = - (y_i - a^{(n_l)}_i) \cdot f’(z^{(n_l)}_i) $$
当 $l<n_l$
$$\delta^{(l)}_i = \frac{\partial J}{\partial zi^{l}}
= \sum{k=1}^{s_{l+1}} \frac{\partial J}{\partial z_k^{l+1}} \frac{\partial z_k^{l+1}}{\partial a_i^l} \frac{\partial a_i^l}{\partial zi^l} \
= \sum{k=1}^{s_{l+1}} \delta^{(l+1)}k W{ki}^l f’(z^{(l)}_i)
$$
这里用了链式求导法则, $a_i^l$ 是 $z_i^l$ 的函数,而 $l+1$ 层的所有 $z_k^{l+1}$ 都是 $a_i^l$ 的函数且作为 $J$ 的自变量。
可见求解 $\delta^{(l)}_i$ 需要用到 $l+1$ 层的 $\delta$,所以迭代过程从输出层“反向”向输入层渐进。
自编码器与稀疏性
自编码器是一种输入作为输出进行训练的神经网络。通常会给隐藏层神经元添加限制,比如要求100维输入样本只能使用50个隐藏神经元,由于最终训练出的模型能“还原”输入,所以这50个隐藏神经元能“压缩”表示这100维的样本。稀疏性限制也可被用于这样的目的。
稀疏性可以被简单地解释如下。如果当神经元的输出接近于1的时候我们认为它被激活,而输出接近于0的时候认为它被抑制,那么使得神经元大部分的时间都是被抑制的限制则被称作稀疏性限制。