机器学习算法--BP神经网络

1、神经网络model

先介绍个三层的神经网络,如下图所示

输入层(input layer)有三个units({x_0}为补上的bias,通常设为1

a_i^{(j)}表示第j层的第i个激励,也称为为单元unit

{\theta ^{(j)}}为第j层到第j+1层映射的权重矩阵,就是每条边的权重

 enter description here

所以可以得到:

隐含层:
a_1^{(2)} = g(\theta _{10}^{(1)}{x_0} + \theta _{11}^{(1)}{x_1} + \theta _{12}^{(1)}{x_2} + \theta _{13}^{(1)}{x_3})
a_2^{(2)} = g(\theta _{20}^{(1)}{x_0} + \theta _{21}^{(1)}{x_1} + \theta _{22}^{(1)}{x_2} + \theta _{23}^{(1)}{x_3})
a_3^{(2)} = g(\theta _{30}^{(1)}{x_0} + \theta _{31}^{(1)}{x_1} + \theta _{32}^{(1)}{x_2} + \theta _{33}^{(1)}{x_3})

输出层
{h_\theta }(x) = a_1^{(3)} = g(\theta _{10}^{(2)}a_0^{(2)} + \theta _{11}^{(2)}a_1^{(2)} + \theta _{12}^{(2)}a_2^{(2)} + \theta _{13}^{(2)}a_3^{(2)}) 其中,S型函数g(z) = \frac{1}{{1 + {e^{ - z}}}},也称为激励函数

可以看出{\theta ^{(1)}} 为3x4的矩阵,{\theta ^{(2)}}为1x4的矩阵

{\theta ^{(j)}} ==》j+1的单元数x(j层的单元数+1)

2、代价函数

假设最后输出的{h_\Theta }(x) \in {R^K},即代表输出层有K个单元

J(\Theta ) =  - \frac{1}{m}\sum\limits_{i = 1}^m {\sum\limits_{k = 1}^K {[y_k^{(i)}\log {{({h_\Theta }({x^{(i)}}))}k}} }  + (1 - y_k^{(i)})\log {(1 - {h\Theta }({x^{(i)}}))_k}] 其中,{({h_\Theta }(x))_i}代表第i个单元输出

与逻辑回归的代价函数J(\theta ) =  - \frac{1}{m}\sum\limits_{i = 1}^m {[{y^{(i)}}\log ({h_\theta }({x^{(i)}}) + (1 - } {y^{(i)}})\log (1 - {h_\theta }({x^{(i)}})]差不多,就是累加上每个输出(共有K个输出)

3、正则化

L-->所有层的个数,{S_l}-->第l层unit的个数

正则化后的代价函数
enter description here

\theta共有L-1层,然后是累加对应每一层的theta矩阵,注意不包含加上偏置项对应的theta(0)

4、反向传播BP

上面正向传播可以计算得到J(θ),使用梯度下降法还需要求它的梯度

BP反向传播的目的就是求代价函数的梯度

假设4层的神经网络,\delta _{\text{j}}^{(l)}记为-->l层第j个单元的误差

\delta _{\text{j}}^{(4)} = a_j^{(4)} - {y_i}《===》{\delta ^{(4)}} = {a^{(4)}} - y(向量化)

{\delta ^{(3)}} = {({\theta ^{(3)}})^T}{\delta ^{(4)}}.*{g^}({a^{(3)}})

{\delta ^{(2)}} = {({\theta ^{(2)}})^T}{\delta ^{(3)}}.*{g^}({a^{(2)}})

没有{\delta ^{(1)}},因为对于输入没有误差

因为S型函数{\text{g(z)}}的导数为:{g^}(z){\text{ = g(z)(1 - g(z))}},所以上面的{g^}({a^{(3)}}){g^}({a^{(2)}})可以在前向传播中计算出来

反向传播计算梯度的过程为:

\Delta _{ij}^{(l)} = 0\Delta是大写的\delta

for i=1-m:
-{a^{(1)}} = {x^{(i)}}
-正向传播计算{a^{(l)}}(l=2,3,4...L)
-反向计算{\delta ^{(L)}}{\delta ^{(L - 1)}}...{\delta ^{(2)}}
-\Delta _{ij}^{(l)} = \Delta _{ij}^{(l)} + a_j^{(l)}{\delta ^{(l + 1)}}
-D_{ij}^{(l)} = \frac{1}{m}\Delta _{ij}^{(l)} + \lambda \theta _{ij}^l\begin{array}{c}    {}& {(j \ne 0)}  \end{array}
D_{ij}^{(l)} = \frac{1}{m}\Delta _{ij}^{(l)} + \lambda \theta _{ij}^lj = 0\begin{array}{c}    {}& {j = 0}  \end{array}

最后\frac{{\partial J(\Theta )}}{{\partial \Theta {ij}^{(l)}}} = D{ij}^{(l)},即得到代价函数的梯度。

5、BP可以求梯度的原因

实际是利用了链式求导法则

因为下一层的单元利用上一层的单元作为输入进行计算

大体的推导过程如下,最终我们是想预测函数与已知的y非常接近,求均方差的梯度沿着此梯度方向可使代价函数最小化。可对照上面求梯度的过程。 enter description here

求误差更详细的推导过程: enter description here

6、梯度检查

检查利用BP求的梯度是否正确,

利用导数的定义验证: \frac{{dJ(\theta )}}{{d\theta }} \approx \frac{{J(\theta  + \varepsilon ) - J(\theta  - \varepsilon )}}{{2\varepsilon }}

求出来的数值梯度应该与BP求出的梯度非常接近

验证BP正确后就不需要再执行验证梯度的算法了。

7、权重的随机初始化

神经网络不能像逻辑回归那样初始化theta0,因为若是每条边的权重都为0,每个神经元都是相同的输出,在反向传播中也会得到同样的梯度,最终只会预测一种结果。

所以应该初始化为接近0的数。

参考文章:https://github.com/lawlite19/MachineLearning_Python

猜你喜欢

转载自blog.csdn.net/rongpeisheng666/article/details/81806591
今日推荐