1. 神经网络模型
所谓神经网络就是将许多个单一“神经元”联结在一起,这样,一个“神经元”的输出就可以是另一个“神经元”的输入。
我们使用圆圈来表示神经网络的输入,标上“+1”的圆圈被称为偏置节点,也就是截距项。神经网络最左边的一层叫做输入层,最右的一层叫做输出层(下图中,输出层只有一个节点)。中间所有节点组成的一层叫做隐藏层,因为我们不能在训练样本集中观测到它们的值。同时可以看到,神经网络的例子中有3个输入单元(偏置单元不计在内),3个隐藏单元及一个输出单元。
这里使用的激活函数$f(\cdot)$是sigmoid函数。
使用$n_l$来表示网络的层数,上图的$n_l=3$,我们将第l层作为$L_l$,于是$L_l$是输入层,输出层是$L_{nl}$。上图的神经网络的参数是$(W,b) = (W^{(1)},b^{(1)},W^{(2)},b^{(2)})$,其中$W_{ij}^{(l)}$是第l层第j单元与第l+1层第i单元之间的联接参数(又叫权重),$b_i^{(l)}$是第l+1层第i单元的偏置项。注意,偏置单元是没有输入的,因为它们总是输出+1。同时使用$S_l$表示第l层的节点数(无偏置单元)。
我们用$ a^{(l)}_i $表示第 l 层第 i 单元的激活值(输出值)。当 l=1 时, $ a^{(1)}_i = x_i $,也就是第 i 个输入值(输入值的第 i 个特征)。对于给定参数集合 W,b ,我们的神经网络就可以按照函数 $h_{W,b}(x)$ 来计算输出结果。计算过程:
我们用 $z^{(l)}_i $表示第 l 层第 i 单元输入加权和(包括偏置单元),那么可以表示为 $z_i^{(2)} = \sum_{j=1}^n W^{(1)}_{ij} x_j + b^{(1)}_i $,则$ a^{(l)}_i = f(z^{(l)}_i) $。
这样我们就可以得到一种更简洁的表示法。这里我们将激活函数$ f(\cdot) $ 扩展为用向量(分量的形式)来表示,即 $ f([z_1, z_2, z_3]) = [f(z_1), f(z_2), f(z_3)] $ ,那么,上面的等式可以更简洁地表示为:
这个过程称作前向传播。使用$a^{(1)} = x $作为输入层的激活的值,那么给定第l层的激活值$a^{(l)}$之后,第l+1层的激活值$a^{(l+1)}$就可以按照步骤进行计算:
当然神经网络也可以有多个输出单元,以及多个隐藏层。
2. 反向传导算法
2.1 代价函数
假设我们有一个固定样本集,$ \{ (x^{(1)}, y^{(1)}), \ldots, (x^{(m)}, y^{(m)}) \} $,已经包含M个样例,我们可以使用批量梯度下降法来解神经网络。对于单个样例$(x,y)$,代价函数为:
这是一个方差代价函数,一个包含M个样例的数据集,整体的代价函数就是:
\begin{align}
W_{ij}^{(l)} &= W_{ij}^{(l)} - \alpha \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) \\
b_{i}^{(l)} &= b_{i}^{(l)} - \alpha \frac{\partial}{\partial b_{i}^{(l)}} J(W,b)
\end{align}
给定一个样例$ (x,y)$,我们首先进行“前向传导”运算,计算出网络中所有的激活值,包括 $ h_{W,b}(x) $的输出值。之后,针对第 l 层的每一个节点 i,我们计算出其“残差” $ \delta^{(l)}_i$,该残差表明了该节点对最终输出值的残差产生了多少影响。对于最终的输出节点,我们可以直接算出网络产生的激活值与实际值之间的差距,我们将这个差距定义为 $ \delta^{(n_l)}_i $(第 $n_l$ 层表示输出层)。对于隐藏单元我们如何处理呢?我们将基于节点(第$ l+1$ 层节点)残差的加权平均值计算 $ \delta^{(l)}_i$,这些节点以$ a^{(l)}_i$ 作为输入。下面将给出反向传导算法结论,具体推导可以看这里:
参考文献
http://ufldl.stanford.edu/wiki/index.php/UFLDL\_Tutorial
因为我们是朋友,所以你可以使用我的文字,但请注明出处:http://alwa.info