神经网络--反向传播

以监督学习为例,假设我们有训练样本集(x,y),那么神经网络算法能够提供一种复杂且非线性的假设模型h_{w,b}(x),模型具有参数w,b,可以以此参数来拟合我们的数据。

为了描述神经网络,我们从最简单的神经网络讲起,这个神经网络仅由一个“神经元”构成,输入x=[x_1,x_2,x_3],偏置b=1

这里我们把激活函数f选择成sigmoid函数,其导数计算比较简单f'(z)=f(z)(1-f(z)),模型输出为

h_{w,b}(x)=f(wx+b)=sigmoid(\sum_{i=1}^{3}w_ix_i+b),

比较复杂的神经网络模型是由许多单一的“神经元”联接在一起的,

简单起见,用z_i^l表示第L层第i单元的输入加权和(包含偏置),比如

z_i^2=\sum _{j=1}^nw_{ij}^1x_j+b_i^1

a_i^l=f(z_i^l)表示第L层第i单元的输出。则网络模型输出为

h_{w,b}(x)=a^3=f(z^3)

其中,注意下面的指数2,3表示2,3层,而不是平方或立方

z^3=w^2a^2+b^2\\ a^2=f(z^2)\\ z^2=w^1x+b^1

我们将上面的计算步骤叫作前向传播。通常,我们用a^1=x表示输入层的激活值,那么给定第L层的激活值a^l后,第L+1层的激活值a^{l+1}就可以按照下面步骤计算得到:

z^{l+1}=w^la^l+b^l\\ a^{l+1}=f(z^{l+1})

反向传播算法

假设我们有一个样本集(x,y),可以用批量梯度下降法来更新神经网络,具体来讲,对于样本集(x,y),可以计算其损失函数为

J(w,b;x,y)=0.5*||h_{w,b}(x)-y||^2

可以看出这是一个二次函数,会有全局最小值0存在,函数变量为样本(x,y),函数参数为(w,b),我们期望网络性能很好,理想情况就是J=0,拿什么时候能够取到这个极值呢,自然就是在偏导数=0处,即能够让下面两个

\frac{\partial J(w,b;x,y) }{\partial w_{ij}^l}=0\\ ~~~~~\frac{\partial J(w,b;x,y) }{\partial b_{i}^l}=0                         (1)

当然,求解上面的方程计算量很大,而且有可能无解或有无穷多个解。那么换个方式,比如按照下面的公式对参数w,b进行更新

w_{ij}^l=w_{ij}^l-\alpha \frac{\partial J(w,b) }{\partial w_{ij}^l}\\ ~~~~~b_{i}^l=b_{i}^l-\alpha \frac{\partial J(w,b) }{\partial b_{i}^l}

其中\alpha是学习率。可以看出,若网络模型已经学习的足够好了,那么就会有(1)成立,则会有

w_{ij}^l=w_{ij}^l\\ ~~~~~b_{i}^l=b_{i}^l

即网络模型的参数不再更新的情况。