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

非线性问题

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

神经元模型

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

激活函数

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

BP模型介绍

在这里插入图片描述

  • 输入层的每一个神经元对应一个样本特征的输入,比如 x 0 , x 1 , x 2 , x 3 x0,x1,x2,x3 x0,x1,x2,x3等特征。
  • 输出层的神经元输出模型的输出结果,通常只有一个神经元。
  • 隐藏层的神经元并不存在于模型中,通常用来学习隐藏的特征。

   对于输入层的神经元,接受特征输入后直接输出到所有隐含层神经元,不做任何处理。
   对于每个隐藏层的神经元,接受所有的特征输入后,经过权重矩阵的线性组合后,经过激活函数得到相应的输出。
   对于输出层的神经元,接受所有来自隐藏层的输出后,经过权重矩阵的线性组合后,经过激活函数得到相应的输出。

前向传播算法

  其实就是一步一步计算的过程。
  类似逻辑回归,但是逻辑回归的输入是特征,而这里的输入是隐藏元的输出。而隐藏元的输出是通过特征进行学习得到的。
   a i ( j ) a_i^{(j)} ai(j)表示第j层的第i个神经元, θ ( j ) \theta^{(j)} θ(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} a1(2)=g(θ10(1)x0+θ11(1)x1+θ12(1)x2+θ13(1)x3)a2(2)=g(θ20(1)x0+θ21(1)x1+θ22(1)x2+θ23(1)x3)a3(2)=g(θ30(1)x0+θ31(1)x1+θ32(1)x2+θ33(1)x3)hθ(x)=a1(3)=g(θ10(2)a0(2)+θ11(2)a1(2)+θ12(2)a2(2)+θ13(2)a3(2))

算法推导

   s l s_l sl表示神经网络第l层的神经元个数, h θ ( x ) h_\theta(x) hθ(x)是K维列向量,令 ( h θ ( x ) ) k (h_\theta(x))_k (hθ(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 J(W,b;x,y)=m1i=1m(21hW,b(x(i)y(i))2)+2λl=1L1i=1slj=1sl+1(Wji(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) Wij(l)=Wij(l)αWij(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) bi(l)=bi(l)αbi(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)} Wij(l)J(W,b)=[m1i=1mWij(l)J(W,b;x(i),y(i))]+λWij(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] bi(l)J(W,b)=[m1i=1mbi(l)J(W,b;x(i),y(i))]
  这里需要使用反向传播算法,它是计算偏导数的有效方法。

反向传播算法

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

  1. 对样本 &lt; x ( i ) , y ( i ) &gt; &lt;x^{(i)},y^{(i)}&gt; <x(i),y(i)>输入到网络中,进行前向传播,得到 L a y e r 2 , L a y e r 3 , . . . Layer_2,Layer_3,... Layer2Layer3,...直到输出层 L a y e r n o Layer_{no} Layerno的激活值。
  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&#x27;(z_i^{(no)}) δno=zi(no)21yhθ(x)2=(yiai(no))f(zi(no))
  3. 对于 l = n o − 1 , n o − 2 , n o − 3... l=no-1,no-2,no-3... l=no1,no2,no3...的每一层,有 δ i ( l ) = ( ∑ j = 1 s l + 1 θ j i l δ j ( l + 1 ) ) f ′ ( z i ( l ) ) \delta_i^{(l)}=(\sum\limits_{j=1}^{s_{l+1}}\theta_{ji}^{l}\delta_j^{(l+1)})f&#x27;(z_i^{(l)}) δi(l)=(j=1sl+1θjilδj(l+1))f(zi(l))
  4. 计算偏导数, ∂ ∂ θ i j l J ( θ ) = a j ( l − 1 ) δ i ( l ) \frac{∂}{∂\theta_{ij}^l}J(\theta)=a_j^{(l-1)}\delta_i^{(l)} θijlJ(θ)=aj(l1)δi(l), ∂ J ( W , b ) ∂ b j l = δ j ( l ) \frac{\partial J(W,b)}{\partial b_{j}^l}=\delta_j^{(l)} bjlJ(W,b)=δj(l)

  对于上面第二步的公式,推导如下:
δ 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} &amp;=\frac{∂}{∂_{z_i^{(no)}}}\frac{1}{2}||y-h_\theta(x)||^2\\ &amp;=\frac{∂}{∂_{z_i^{(no)}}}\frac{1}{2}\sum_{j=1}^{S_{no}}(y_j-a_j^{no})^2\\ &amp;=\frac{∂}{∂_{z_i^{(no)}}}\frac{1}{2}\sum_{j=1}^{S_{no}}(y_j-f(z_j^{no}))^2\\ &amp;=-(y_i-f(z_i^{no}))·f&#x27;(z_i^{no})\\ &amp;=-(y_i-a_i^{no}))·f&#x27;(z_i^{no}) \end{aligned} δino=zi(no)21yhθ(x)2=zi(no)21j=1Sno(yjajno)2=zi(no)21j=1Sno(yjf(zjno))2=(yif(zino))f(zino)=(yiaino))f(zino)

对于上面第三步的公式,推导如下:
δ 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 − 1 ) ( 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 ) ⋅ θ k j n o − 1 ) = ∑ j = 1 S n o δ j n o ⋅ θ i j n o − 1 ⋅ f ′ ( z i n o − 1 ) = ( ∑ j = 1 S n o θ i j n o − 1 δ j n o ) ⋅ f ′ ( z i n o − 1 ) \begin{aligned} \delta_i^{(no-1)} &amp;=\frac{∂}{∂_{z_i^{(no-1)}}}\frac{1}{2}||y-h_\theta(x)||^2\\ &amp;=\frac{∂}{∂_{z_i^{(no-1)}}}\frac{1}{2}\sum_{j=1}^{S_{no}}(y_j-a_j^{no})^2\\ &amp;=\frac{1}{2}\sum_{j=1}^{S_{no}}\frac{∂}{∂_{z_i^{(no-1)}}}(y_j-f(z_j^{no}))^2\\ &amp;=\sum_{j=1}^{S_{no}}-(y_j-f(z_j^{no}))·f&#x27;(z_j^{no})\frac{∂_{z_j^{(no)}}}{∂_{z_i^{(no-1)}}}\\ &amp;=\sum_{j=1}^{S_{no}}\delta_j^{no}\frac{∂_{z_j^{(no)}}}{∂_{z_i^{(no-1)}}}\\ &amp;=\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_{kj}^{no-1}\right)\\ &amp;=\sum_{j=1}^{S_{no}}\delta_j^{no}·\theta_{ij}^{no-1}·f&#x27;(z_i^{no-1})\\ &amp;=\left(\sum_{j=1}^{S_{no}}\theta_{ij}^{no-1}\delta_j^{no}\right)·f&#x27;(z_i^{no-1})\\ \end{aligned} δi(no1)=zi(no1)21yhθ(x)2=zi(no1)21j=1Sno(yjajno)2=21j=1Snozi(no1)(yjf(zjno))2=j=1Sno(yjf(zjno))f(zjno)zi(no1)zj(no)=j=1Snoδjnozi(no1)zj(no)=j=1Sno(δjnozi(no1)k=1Sno1f(zkno1)θkjno1)=j=1Snoδjnoθijno1f(zino1)=(j=1Snoθijno1δjno)f(zino1)
  将no和no-1的关系换为l和l+1的关系得
δ i ( l ) = ( ∑ j = 1 S l + 1 θ i j ( l ) δ j ( l + 1 ) ) ⋅ f ′ ( z i ( l ) ) \delta_i^{(l)}=\left(\sum_{j=1}^{S_{l+1}}\theta_{ij}^{(l)}\delta_j^{(l+1)}\right)·f&#x27;(z_i^{(l)}) δi(l)=(j=1Sl+1θij(l)δj(l+1))f(zi(l))
  最终,损失对参数函数的梯度可以写为
∂ J ( W , b ) ∂ θ i j l = ∂ J ( W , b ) ∂ z i ( l ) ∂ z i ( l ) ∂ θ i j ( l ) = δ i ( l ) x j ( l ) = δ i ( l ) a j ( l − 1 ) ∂ J ( W , b ) ∂ b j l = δ j ( l ) \begin{aligned} &amp;\frac{\partial J(W,b)}{\partial \theta_{ij}^l}=\frac{\partial J(W,b)}{\partial z_i^{(l)}}\frac{\partial z_i^{(l)}}{\partial \theta_{ij}^{(l)}}=\delta_i^{(l)}x_j^{(l)}=\delta_i^{(l)}a_j^{(l-1)} \\ &amp;\frac{\partial J(W,b)}{\partial b_{j}^l}=\delta_j^{(l)} \end{aligned} θijlJ(W,b)=zi(l)J(W,b)θij(l)zi(l)=δi(l)xj(l)=δi(l)aj(l1)bjlJ(W,b)=δj(l)

  在上述流程中,令激活函数f(x)=Sigmoid(x)函数,那么 f ′ ( z i ( l ) ) = a i ( l ) ( 1 − a i ( l ) ) f&#x27;(z_i^{(l)})=a_i^{(l)}(1-a_i^{(l)}) f(zi(l))=ai(l)(1ai(l)),而其中的 a i ( l ) a_i^{(l)} ai(l)是在前向传播的过程中就计算出来了的。可以很方便地直接得到。最终我们将利用残差计算出了偏导数,更新了权重矩阵里面的每个权重的值,从而完成了一次反向传播。最终我们通过梯度下降算法不停迭代,降低代价函数的值,从而得到最终的神经网络。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值