神经网络和反向传播算法学习

本文是对《零基础入门深度学习》的简单归纳和学习总结,原文地址详见:https://www.zybuluo.com/hanbingtao/note/476663#an1

神经网络和反向传播算法

  神经元和感知器本质上是一样的,只不过感知器的激活函数是阶跃函数;神经元往往选用sigmoid函数或tanh函数,sigmoid函数图像如下:

                

  对于一个神经网络来说:输入向量的维度和输入层神经元个数相同,输出向量的维度和输出层神经元个数相同,为了举例说明神经网络的输出计算过程,为一个全连接网络每个单元编号如下:

  为了计算节点4的输出值a4,必须计算出所有上游节点的输出值,节点1、2、3是输入层的节点,所以,他们的输出值就是输入X向量本身,则a4的计算方法如下:

             a_4&=sigmoid(\vec{w}^T\centerdot\vec{x})=sigmoid(w_{41}x_1+w_{42}x_2+w_{43}x_3+w_{4b})

  w41、w42、w43分别为节点1、2、3到节点4连接的权重,在给权重wij编号时,我们把目标节点的编号j放在前面,把源节点的编号i放在后面。

  同理我们可以计算出输出层所有节点的输出值,我们就得到了输入\vec{x}=\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix}时对应的输出\vec{y}=\begin{bmatrix}y_1\\y_2\end{bmatrix}

神经网络的矩阵表示

  定义网络的输入向量x和隐藏层每个节点的权重向量:

                     \vec{x}&=\begin{bmatrix}x_1\\x_2\\x_3\\1\end{bmatrix}\\ \vec{w}_4&=[w_{41},w_{42},w_{43},w_{4b}]\\ \vec{w}_5&=[w_{51},w_{52},w_{53},w_{5b}]\\ \vec{w}_6&=[w_{61},w_{62},w_{63},w_{6b}]\\ \vec{w}_7&=[w_{71},w_{72},w_{73},w_{7b}]\\ f&=sigmoid

  代入式子得到:

                       \\a_4&=f(\vec{w_4}\centerdot\vec{x})\\ a_5&=f(\vec{w_5}\centerdot\vec{x})\\ a_6&=f(\vec{w_6}\centerdot\vec{x})\\ a_7&=f(\vec{w_7}\centerdot\vec{x})\\

  现在,我们把上述计算a4、a5、a6、a7的四个式子写到一个矩阵里面,每个式子作为矩阵的一行,就可以利用矩阵来表示它们的计算了。令

        \vec{a}= \begin{bmatrix} a_4 \\ a_5 \\ a_6 \\ a_7 \\ \end{bmatrix},\qquad W= \begin{bmatrix} \vec{w}_4 \\ \vec{w}_5 \\ \vec{w}_6 \\ \vec{w}_7 \\ \end{bmatrix}= \begin{bmatrix} w_{41},w_{42},w_{43},w_{4b} \\ w_{51},w_{52},w_{53},w_{5b} \\ w_{61},w_{62},w_{63},w_{6b} \\ w_{71},w_{72},w_{73},w_{7b} \\ \end{bmatrix} ,\qquad f( \begin{bmatrix} x_1\\ x_2\\ x_3\\ .\\ .\\ .\\ \end{bmatrix})= \begin{bmatrix} f(x_1)\\ f(x_2)\\ f(x_3)\\ .\\ .\\ .\\ \end{bmatrix}

  代入前面的一组式子,得到:

                    \vec{a}=f(W\centerdot\vec{x})\qquad (2)

  在式2中,f是激活函数,在本例中是sigmoid函数;W是某一层的权重矩阵;x是某层的输入向量;a是某层的输出向量。式2说明神经网络的每一层的作用实际上就是先将输入向量左乘一个数组进行线性变换,得到一个新的向量,然后再对这个向量逐元素应用一个激活函数。

  每一层算法都是一样的,如下图的计算方式:

             

  则每一层的输出向量的计算可以表示为:

 

 

 

                      \\&\vec{a}_1=f(W_1\centerdot\vec{x})\\ &\vec{a}_2=f(W_2\centerdot\vec{a}_1)\\ &\vec{a}_3=f(W_3\centerdot\vec{a}_2)\\ &\vec{y}=f(W_4\centerdot\vec{a}_3)\\

 

神经网络的训练

  神经网络是一个模型,那么这些权值就是模型的参数,也就是模型要学习的东西。然而,一个神经网络的连接方式、网络的层数、每层的节点数这些参数,则不是学习出来的,而是人为事先设置的。对于这些人为设置的参数,我们称之为超参数(Hyper-Parameters)。

反向传播算法(Back Propagation)

  我们假设每个训练样本为(向量x,向量t),其中向量x是训练样本的特征,而向量t是样本的目标值。

           

 

  首先,我们根据上一节介绍的算法,用样本的特征向量x,计算出神经网络中每个隐藏层节点的输出ai,以及输出层每个节点的输出yi。

我们按照下面的方法计算出每个节点的误差项:

  • 对于输出层节点i,计算方法如下:(其中,δi是节点i的误差项,yi是节点i的输出值,ti是样本对应于节点i的目标值)

                 \delta_i=y_i(1-y_i)(t_i-y_i)\qquad(3)

  举个例子,根据上图,对于输出层节点8来说,它的输出值是y1,而样本的目标值是t1,带入上面的公式得到节点8的误差项δ8应该是             \delta_8=y_1(1-y_1)(t_1-y_1)

  • 对于隐藏层节点:

               \delta_i=a_i(1-a_i)\sum_{k\in{outputs}}w_{ki}\delta_k\qquad(4)

  其中,ai是节点i的输出值,wki是节点i到它的下一层节点k的连接的权重,δk是节点i的下一层节点k的误差项。例如,对于隐藏层节点4来说,计算方法如下:

                \delta_4=a_4(1-a_4)(w_{84}\delta_8+w_{94}\delta_9)

  最后,更新每个连接上的权值:

                  w_{ji}\gets w_{ji}+\eta\delta_jx_{ji}\qquad(5)

  其中,wji是节点i到节点j的权重,η是一个成为学习速率的常数,δj是节点j的误差项,xji是节点i传递给节点j的输入。例如,权重w41的更新方法如下:

                   w_{41}\gets w_{41}+\eta\delta_4 x_1

  偏置项的输入值永远为1。例如,节点4的偏置项w4b应该按照下面的方法计算:

                    w_{4b}\gets w_{4b}+\eta\delta_4

  显然,计算一个节点的误差项,需要先计算每个与其相连的下一层节点的误差项。这就要求误差项的计算顺序必须是从输出层开始,然后反向依次计算每个隐藏层的误差项,直到与输入层相连的那个隐藏层。

小结:

  对于一个神经网络的输入层,每个节点有一个输入值和一个输出值,两值相等,该层的输入向量等于输出向量,没有误差向量(整层只有输入向量和输出向量,两向量相等);

  对于神经网络的隐藏层,每个节点有一个输入向量和一个权重向量,这两个向量的纬度等于上一层节点的个数,以及一个输出值和一个误差值,输出值等于输入向量和权重向量的内积加上偏置项,并通过激活函数计算得到。误差值等于:输出值*(1-输出值)*下一层的权重向量和下一层的误差值内积。整层的输出向量等于整层的权重矩阵乘以该层的输入向量并通过激活函数计算等到。(该层有一个输入向量、一个权重矩阵、一个输出向量、一个误差向量,整层偏置值的向量可以放入权重矩阵)

  对于神经网络的输出层,结构和隐藏层没有太大差异,仅仅是节点误差值的计算变为:输出值*(1-输出值)*(目标值-输出值)

  还有不要忘记激活函数!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值