神经网络示意
反向传播计算
对于每一个训练样本,进行如下循环:
- 正向传播计算出$a^{(2)}$、$z^{(2)}$、$a^{(3)}$、$z^{(3)}$等结果。正向传播计算的方法很简单,在此不再赘述。
- 计算$\delta_k^{(3)}=(a_k^{(3)}-y_k)$,这表明最后的计算结果和真实结果之间的误差。
- 根据$\delta_k^{(3)}$计算$\delta_k^{(2)}$,这里的计算公式为:$\delta_k^{(2)} = (\theta^{(2)})^T\delta^{(3)}.*g’(z^{(2)})$
- 记$\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$了。
其它注意
神经网络还有很多需要注意的地方,试举出几例:
- 参数$\theta$的初始化不能跟线性回归的时候一样随便取0即可,而要进行随机化处理,因为如果所有的$\theta$值都相同,那么到时候进行计算的时候,所有的单元影响值都一样,进行的其实都是相同的计算,没有任何差别。
- 进行反向传播计算的时候,偏置单元是不需要计算在误差影响中的,因为偏置单元1作为一个常量,显然只是提供一个数值起点,对它进行误差调整没有意义。
- 反向传播算法由于比较复杂,所以结果的检验就显得特别重要。在《机器学习》课程中使用的验算方法是在目标点附近取极小的区间[$x-\epsilon,x+\epsilon$],计算近似导数$\frac{J(x+\epsilon)-J(x-\epsilon)}{2\epsilon}$($\epsilon$通常取很小的值,如$10^{-9}$),比较使用反向传播法计算的偏导是否和这个近似值相近。
神经网络是看《机器学习》在线课程到现在为止的一个难点,特此记录。