神经网络反向传播计算过程笔记
@ Shen Jianan · Monday, Sep 21, 2015 · 3 minute read · Update at Sep 21, 2015

神经网络示意

神经网络示例图1 神经网络示例图2

反向传播计算

对于每一个训练样本,进行如下循环:

  1. 正向传播计算出$a^{(2)}$、$z^{(2)}$、$a^{(3)}$、$z^{(3)}$等结果。正向传播计算的方法很简单,在此不再赘述。
  2. 计算$\delta_k^{(3)}=(a_k^{(3)}-y_k)$,这表明最后的计算结果和真实结果之间的误差。
  3. 根据$\delta_k^{(3)}$计算$\delta_k^{(2)}$,这里的计算公式为:$\delta_k^{(2)} = (\theta^{(2)})^T\delta^{(3)}.*g’(z^{(2)})$
  4. 记$\Delta^{(l)}$是一个$m*n$的矩阵,将$\delta^{(l+1)}(a^{(l)})^T$加到$\Delta^{(l)}$中。在这里,当前层共有n个元素,下一层共m个元素(不包括bias元素)。这里$\delta^{(l+1)}(a^{(l)})^T$中的第(i,j)个元素就表示在这个训练样本中第j个元素对下一层第i个元素误差的责任。

最后,$\frac{\Delta{i,j}^{(l)}}{m}$等于$\frac{\partial}{\partial{\theta_{ij}^{(l)}}}J(\theta)$,即是$J(\theta)$关于$\theta_{ij}^{(l)}$的偏导数。

正则化参数

上一部分,完成了最复杂的反向传播过程,到这个部分,只需要加上正则化参数$\frac{\lambda}{m}\sum_{j=1}^{end}{(\theta_{(ij)}^2)}$即可(依然要注意,这里bias单元的$\theta$不参与正则化)

$$\frac{\partial}{\partial{\theta_{ij}^{(l)}}}J(\theta) = \frac{\Delta_{ij}^{(l)}}{m},j=0$$ $$\frac{\partial}{\partial{\theta_{ij}^{(l)}}}J(\theta)=\frac{\Delta_{ij}^{(l)}}{m}+\frac{\lambda}{m}\sum_{j=1}^{end}{(\theta_{(ij)}^2)},j\geq1$$

到此,就完成了$J(\theta)$的偏导的计算了,有了这个结果之后,就可以使用梯度下降的思想来优化$\theta$了。

其它注意

神经网络还有很多需要注意的地方,试举出几例:

  1. 参数$\theta$的初始化不能跟线性回归的时候一样随便取0即可,而要进行随机化处理,因为如果所有的$\theta$值都相同,那么到时候进行计算的时候,所有的单元影响值都一样,进行的其实都是相同的计算,没有任何差别。
  2. 进行反向传播计算的时候,偏置单元是不需要计算在误差影响中的,因为偏置单元1作为一个常量,显然只是提供一个数值起点,对它进行误差调整没有意义。
  3. 反向传播算法由于比较复杂,所以结果的检验就显得特别重要。在《机器学习》课程中使用的验算方法是在目标点附近取极小的区间[$x-\epsilon,x+\epsilon$],计算近似导数$\frac{J(x+\epsilon)-J(x-\epsilon)}{2\epsilon}$($\epsilon$通常取很小的值,如$10^{-9}$),比较使用反向传播法计算的偏导是否和这个近似值相近。

神经网络是看《机器学习》在线课程到现在为止的一个难点,特此记录。

About Me

2018.02至今 杭州嘉云数据 算法引擎

2017.6-2017.12 菜⻦网络-⼈工智能部-算法引擎

2016.09-2018.06 南京大学研究生

2015.07-2015.09 阿里巴巴-ICBU-实习

2012.09-2016.06 南京大学本科