【机器学习算法推导】BP神经网络

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hemk340200600/article/details/85222567

非线性问题

对于一张汽车图片,如何将其识别为汽车呢?我们人可能看一眼就能识别出来,但是如何让计算机也拥有同样的技能呢?我们知道,一张图片在计算机中都是以像素矩阵的形式存储的,无论是一辆汽车,还是一辆飞机,在计算机中都是一个个矩阵,并无法直观地感受到这个矩阵代表是汽车还是飞机。用逻辑回归似乎也无法分出一个很好的决策边界。为了尝试解决这种问题,学者们模仿人的大脑,提出了神经元模型的概念。

神经元模型

输入特征x1,x2,x3,……到若干个神经元中,神经元记过计算后输出结果,这个结果再经过非线性函数 h θ ( x ) = a c t i v a t i o n ( x ) h_\theta(x)=activation(x) 。这里的激活函数可以是 s i g m o i d ( x ) = 1 1 + e θ T x sigmoid(x)=\frac{1}{1+e^{-\theta^Tx}} ,也可以是其他。

激活函数

对于非线性函数g(z)的一个学术称呼。如之前学习过的 h ( x ) = 1 1 + e x h(x)=\frac{1}{1+e^{-x}} 就是一个激活函数,也叫做Sigmoid函数。它的作用是让整个模型可以适应非线性的情况。

模型概念介绍

在这里插入图片描述

输入层的每一个神经元对应一个样本特征的输入,比如 x 0 , x 1 , x 2 , x 3 x0,x1,x2,x3 等特征。
输出层的神经元输出模型的输出结果,通常只有一个神经元。
隐藏层的神经元并不存在于模型中,通常用来学习隐藏的特征。
对于输入层的神经元,接受特征输入后直接输出到所有隐含层神经元,不做任何处理。
对于每个隐藏层的神经元,接受所有的特征输入后,经过权重矩阵的线性组合后,经过激活函数得到相应的输出。
对于输出层的神经元,接受所有来自隐藏层的输出后,经过权重矩阵的线性组合后,经过激活函数得到相应的输出。

前向传播算法

其实就是一步一步计算的过程。
类似逻辑回归,但是逻辑回归的输入是特征,而这里的输入是隐藏元的输出。而隐藏元的输出是通过特征进行学习得到的。
a i ( j ) a_i^{(j)} 表示第j层的第i个神经元, θ ( j ) \theta^{(j)} 表示从第j到第j+1层的权重矩阵
对于输入层有4个神经元,隐藏层有4个神经元,输出层有1个神经元,兵并且层与层之间是全连接的情况,有如下的公式
a 1 ( 2 ) = g ( θ 10 ( 1 ) x 0 + θ 11 ( 1 ) x 1 + θ 12 ( 1 ) x 2 + θ 13 ( 1 ) x 3 ) a 2 ( 2 ) = g ( θ 20 ( 1 ) x 0 + θ 21 ( 1 ) x 1 + θ 22 ( 1 ) x 2 + θ 23 ( 1 ) x 3 ) a 3 ( 2 ) = g ( θ 30 ( 1 ) x 0 + θ 31 ( 1 ) x 1 + θ 32 ( 1 ) x 2 + θ 33 ( 1 ) x 3 ) h θ ( x ) = a 1 ( 3 ) = g ( θ 10 ( 2 ) a 0 ( 2 ) + θ 11 ( 2 ) a 1 ( 2 ) + θ 12 ( 2 ) a 2 ( 2 ) + θ 13 ( 2 ) a 3 ( 2 ) ) \begin{aligned} &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)}) \end{aligned}

算法推导

s l s_l 表示神经网络第l层的神经元个数, h θ ( x ) h_\theta(x) 是K维列向量,令 ( h θ ( x ) ) k (h_\theta(x))_k 表示第k个输出,则神经网络的损失函数如下:
J ( W , b ; x , y ) = 1 m i = 1 m ( 1 2 h W , b ( x ( i ) y ( i ) ) 2 ) + λ 2 l = 1 L 1 i = 1 s l j = 1 s l + 1 ( W j i ( l ) ) 2 J(W,b;x,y)=\frac{1}{m}\sum_{i=1}^m\left(\frac{1}{2}||h_{W,b}(x^{(i)}-y^{(i)})||^2\right)+\frac{\lambda}{2}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_{l+1}}(W{ji}^{(l)})^2
梯度下降法中每一次迭代都按照如下公式对W和b进行更新:
W i j ( l ) = W i j ( l ) α W i j ( l ) J ( W , b ) W_{ij}^{(l)}=W_{ij}^{(l)}-\alpha\frac{∂}{∂W_{ij}^{(l)}}J(W,b)
b i ( l ) = b i ( l ) α b i ( l ) J ( W , b ) b_{i}^{(l)}=b_{i}^{(l)}-\alpha\frac{∂}{∂b_{i}^{(l)}}J(W,b)
其中的关键步骤是计算偏导数。
W i j ( l ) J ( W , b ) = [ 1 m i = 1 m W i j ( l ) J ( W , b ; x ( i ) , y ( i ) ) ] + λ W i j ( l ) \frac{∂}{∂W_{ij}^{(l)}}J(W,b)=\left[\frac{1}{m}\sum_{i=1}^m\frac{∂}{∂W_{ij}^{(l)}}J(W,b;x^{(i)},y^{(i)})\right]+\lambda W_{ij}^{(l)}
b i ( l ) J ( W , b ) = [ 1 m i = 1 m b i ( l ) J ( W , b ; x ( i ) , y ( i ) ) ] \frac{∂}{∂b_{i}^{(l)}}J(W,b)=\left[\frac{1}{m}\sum_{i=1}^m\frac{∂}{∂b_{i}^{(l)}}J(W,b;x^{(i)},y^{(i)})\right]
这里需要使用反向传播算法,它是计算偏导数的有效方法。

反向传播算法

给定一个样本,我们首先对它进行前向传播,算出网络中所有的激活值以及左后的预测值。令 L a y e r i Layer_i 表示神经网络的第i层,no表示输出层, δ i ( l ) \delta_i^{(l)} 表示第l层的第i个节点的误差(也称为“残差”), α i ( l ) \alpha_i^{(l)} 表示第l层第i个节点的激励值。
反向传播算法的流程如下:

  1. 对样本 < x ( i ) , y ( i ) > <x^{(i)},y^{(i)}> 输入到网络中,进行前向传播,得到 L a y e r 2 L a y e r 3 , . . . Layer_2,Layer_3,... 直到输出层 L a y e r n o Layer_{no} 的激活值。
  2. 对于最后一层,我们使用 δ n o = z i ( n o ) 1 2 y h θ ( x ) 2 = ( y i a i ( n o ) ) f ( z i ( n o ) ) \delta^{no}=\frac{∂}{∂_{z_i^{(no)}}}\frac{1}{2}||y-h_\theta(x)||^2=-(y_i-a_i^{(no)})·f'(z_i^{(no)})
  3. 对于 l = n o 1 , n o 2 , n o 3... l=no-1,no-2,no-3... 的每一层,有 δ i ( l ) = ( j = 1 s l + 1 θ j i l δ j ( l + 1 ) ) f ( z i ( l ) ) \delta_i^{(l)}=(\sum_{j=1}^{s_{l+1}}\theta_{ji}^{l}\delta_j^{(l+1)})f'(z_i^{(l)})
  4. 计算偏导数, θ i j l J ( θ ) = a j ( l ) δ i ( l + 1 ) \frac{∂}{∂\theta_{ij}^l}J(\theta)=a_j^{(l)}\delta_i^{(l+1)}

对于上面第二步的公式,推导如下:
δ i n o = z i ( n o ) 1 2 y h θ ( x ) 2 = z i ( n o ) 1 2 j = 1 S n o ( y j a j n o ) 2 = z i ( n o ) 1 2 j = 1 S n o ( y j f ( z j n o ) ) 2 = ( y i f ( z i n o ) ) f ( z i n o ) = ( y i a i n o ) ) f ( z i n o ) \begin{aligned} \delta_i^{no} &=\frac{∂}{∂_{z_i^{(no)}}}\frac{1}{2}||y-h_\theta(x)||^2\\ &=\frac{∂}{∂_{z_i^{(no)}}}\frac{1}{2}\sum_{j=1}^{S_{no}}(y_j-a_j^{no})^2\\ &=\frac{∂}{∂_{z_i^{(no)}}}\frac{1}{2}\sum_{j=1}^{S_{no}}(y_j-f(z_j^{no}))^2\\ &=-(y_i-f(z_i^{no}))·f'(z_i^{no})\\ &=-(y_i-a_i^{no}))·f'(z_i^{no}) \end{aligned}

对于上面第三步的公式,推导如下:
δ i ( n o 1 ) = z i ( n o 1 ) 1 2 y h θ ( x ) 2 = z i ( n o 1 ) 1 2 j = 1 S n o ( y j a j n o ) 2 = 1 2 j = 1 S n o z i ( n o ) ( y j f ( z j n o ) ) 2 = j = 1 S n o ( y j f ( z j n o ) ) f ( z j n o ) z j ( n o ) z i ( n o 1 ) = j = 1 S n o δ j n o z j ( n o ) z i ( n o 1 ) = j = 1 S n o ( δ j n o z i ( n o 1 ) k = 1 S n o 1 f ( z k n o 1 ) ) θ j k n o 1 ) = j = 1 S n o δ j n o θ j i n o 1 f ( z i n o 1 ) = ( j = 1 S n o θ j i n o 1 δ j n o ) f ( z i n o 1 ) \begin{aligned} \delta_i^{(no-1)} &=\frac{∂}{∂_{z_i^{(no-1)}}}\frac{1}{2}||y-h_\theta(x)||^2\\ &=\frac{∂}{∂_{z_i^{(no-1)}}}\frac{1}{2}\sum_{j=1}^{S_{no}}(y_j-a_j^{no})^2\\ &=\frac{1}{2}\sum_{j=1}^{S_{no}}\frac{∂}{∂_{z_i^{(no)}}}(y_j-f(z_j^{no}))^2\\ &=\sum_{j=1}^{S_{no}}-(y_j-f(z_j^{no}))·f'(z_j^{no})\frac{∂_{z_j^{(no)}}}{∂_{z_i^{(no-1)}}}\\ &=\sum_{j=1}^{S_{no}}\delta_j^{no}\frac{∂_{z_j^{(no)}}}{∂_{z_i^{(no-1)}}}\\ &=\sum_{j=1}^{S_{no}}\left(\delta_j^{no}·\frac{∂}{∂_{z_i^{(no-1)}}}\sum_{k=1}^{S_{no-1}}f(z_k^{no-1}))·\theta_{jk}^{no-1}\right)\\ &=\sum_{j=1}^{S_{no}}\delta_j^{no}·\theta_{ji}^{no-1}·f'(z_i^{no-1})\\ &=\left(\sum_{j=1}^{S_{no}}\theta_{ji}^{no-1}\delta_j^{no}\right)·f'(z_i^{no-1})\\ \end{aligned}
将no和no-1的关系换为l和l+1的关系得
δ i ( l ) = ( j = 1 S l + 1 θ j i ( l ) δ j ( l + 1 ) ) f ( z i ( l ) ) \delta_i^{(l)}=\left(\sum_{j=1}^{S_{l+1}}\theta_{ji}^{(l)}\delta_j^{(l+1)}\right)·f'(z_i^{(l)})
在上述流程中,令激活函数f(x)=Sigmoid(x)函数,那么 f ( z i ( l ) ) = a i ( l ) ( 1 a i ( l ) ) f'(z_i^{(l)})=a_i^{(l)}(1-a_i^{(l)}) ,而其中的 a i ( l ) a_i^{(l)} 是在前向传播的过程中就计算出来了的。可以很方便地直接得到。最终我们将利用残差计算出了偏导数,更新了权重矩阵里面的每个权重的值,从而完成了一次反向传播。最终我们通过梯度下降算法不停迭代,降低代价函数的值,从而得到最终的神经网络。

猜你喜欢

转载自blog.csdn.net/Hemk340200600/article/details/85222567
今日推荐