zoukankan      html  css  js  c++  java
  • BP神经网络

      秋招刚结束,这俩月没事就学习下斯坦福大学公开课,想学习一下深度学习(这年头不会DL,都不敢说自己懂机器学习),目前学到了神经网络部分,学习起来有点吃力,把之前学的BP(back-progagation)神经网络复习一遍加深记忆。看了许多文章发现一PPT上面写的很清晰,就搬运过来,废话不多说,直入正题:

    单个神经元

      神经网络是由多个“神经元”组成,单个神经元如下图所示:

      这其实就是一个单层感知机,输入是由ξ1 ,ξ2 ,ξ3和Θ组成的向量。其中Θ为偏置(bias),σ为激活函数(transfer function),本文采用的是sigmoid函数,功能与阶梯函数(step function)相似控制设神经元的输出,它的优点是连续可导。

    是神经元的输出,结果为

    可以看得出这个“神经元”的输入-输出映射其实就是一个逻辑回归,常用的激活函数还有双曲正切函数 。

     激活函数

    sigmoid:函数

    取值范围为[0,1],它的图像如下:

    求导结果为:

    tanh函数:

     

    取值范围为[-1,1],图像如下:

     求导数结果为。本文采用的是sigmoid函数作为激活函数。

    神经网络模型

    神经网络将许多“神经元”联结在一起,一个神经元的输出可以是另一个“神经元”的输入,神经元之间的传递需要乘法上两个神经元对应的权重,下图就是一个简单的神经网络:

    这是一个三层的神经网络,使用圆圈来表示神经元的输入,“+1”被称为偏置节点,从左到右依次为输入层、隐藏层和输出层,从图中可以看出,有3个输入节点、3个隐藏节点和一个输出单元(偏置不接受输入)。

    本例神经网络的参数有,其中 是第l层第 j 单元与 l+1层第  	extstyle i 单元之间的联接参数,即:节点连线的权重,本图中 是第l+1 层第i单元的偏置项。

    向前传播

      机器学习(有监督)的任务无非是损失函数最小化,BP神经网络的原理是前向传播得到目标值(分类),再通过后向传播对data loss进行优化求出参数。可见最优化部分

       	extstyle a^{(l)}_i 表示	extstyle l 层第 	extstyle i 单元激活值(输出值)。当 	extstyle l=1 时, 	extstyle a^{(1)}_i = x_i ,也就是第 	extstyle i 个输入值。对于给定参数集 	extstyle W,b ,	extstyle h_{W,b}(x) 来表示神经网络最后计算输出的结果。上图神经网络计算步骤如下:


     可以看出,神经网络的核心思想是这一层的输出乘上相应的权重加上偏置,带入激活函数后的输出又是下一层的输入。用 	extstyle z^{(l)}_i 表示第	extstyle l层第	extstyle i 单元输入加权和 ,则 。使用向量化表示方法表示,上面的公式可以简写为:

    这些计算步骤就是前向传播,将计算过程进行推广,给定第 	extstyle l 层的激活值 	extstyle a^{(l)},第 	extstyle l+1层的激活值	extstyle a^{(l+1)}的计算过程为:

    反向传播

    在前向传播中,我们得到了神经网络的预测值	extstyle h_{W,b}(x),这时候可以通过反向传播的方法计算出参数

    符号定义

    神经网络21.png:第l层第j个节点的输入。

    神经网络22.png:从第l-1层第i个节点到第l层第j个节点的权值。

    神经网络23.png:Sigmoid激活函数。

    神经网络24.png::第l层第j个节点的偏置。

    神经网络25.png::第l层第j个节点的输出。

    神经网络26.png::输出层第j个节点的目标值(label)。

    使用梯度下降的方法求解参数,在求解的过程中需要对输出层和隐藏层分开计算

    输出层权重计算

      给定样本标签神经网络28.png和模型输出结果神经网络29.png,输出层的损失函数为:

    神经网络27.png

    这其实就是均方差项,训练的目标是最小化该误差,使用梯度下降方法进行优化,对上式子对权重W进行求导:

    神经网络31.png

    ,整理神经网络32.png

    其中神经网络37.png=神经网络36.png带入神经网络34.png,对sigmoid求导得:

    神经网络35.png

    输出层第k个节点的输入神经网络38.png等于上一层第j个节点的输出神经网络39.png乘上神经网络100.png,即神经网络38.png=神经网络39.png神经网络100.png,而上一层的输出神经网络39.png与输出层的权重变量神经网络100.png无关,可以看做一个常数,所以直接求导可以得到:

    所以将神经网络36.png=神经网络37.png带入式子中就得到:

    神经网络43.png

    为了方便表示将上式子记作:

    神经网络44.png

    其中:

     隐藏层权重计算

    采用同样方法对隐藏层的权重进行计算,与前面不同的是关于隐藏层和前一层权重的调整

    神经网络46.png

    整理

    神经网络47.png

    替换sigmoid函数

    神经网络48.png

    对sigmoid求导

    神经网络49.png

    带入进去,使用求导的链式法则:

    神经网络51.png

    输出层的输入等于上一层的输入乘以相应的权重,即:于是得到

    神经网络54.png

    进行求导(神经网络37.png=神经网络36.png,同样适用于j),

    神经网络56.png

    同输出层计算的方法一样,再次利用,j换成i,k换成j同样成立,带入进去:

    神经网络57.png

    整理,得到:

    神经网络59.png

    其中:神经网络45.png

     我们还可以仿照神经网络58.png的定义来定义一个神经网络60.png,得到:

    神经网络61.png

    其中:神经网络70.png

     偏置调整

      从上面的计算步骤中可以看出:例如,偏置节点是不存在对应的权值参数,也就是不存在关于权值变量的偏导数。

    对偏置直接求导:

    神经网络68.png

    又有

    神经网络63.png

     得到:

    神经网络65.png,其中:神经网络45.png

    BP算法步骤

    1. 随机初始化W和b,需要注意的是,随机初始化并是不是全部置为0,如果所有参数都是用相同的值初始化,那么所有隐藏单元最终会得到与输入值相关、相同的函数(也就是说,对于所有 	extstyle i	extstyle W^{(1)}_{ij}都会取相同的值,那么对于任何输入 	extstyle x 都会有: ),随机初始化的目的是使对称失效

    2.对每个输出节点按照这个公式计算delta:

    神经网络71.png

    3.对每个隐藏节点按照这个公式计算delta:

    神经网络72.png

    4.更新W和b的公式为:

    神经网络73.png

    并更新参数神经网络74.png,这里的η是学习率。

    Reference

    1.反向传播神经网络极简入门

    2.反向传导算法

  • 相关阅读:
    diary and html 文本颜色编辑,行距和其它编辑总汇
    bash coding to changeNames
    virtualbox ubuntu 网络连接 以及 连接 secureCRT
    linux 学习6 软件包安装
    linux 学习8 权限管理
    vim 使用2 转载 为了打开方便
    ubuntu
    linux 学习15 16 启动管理,备份和恢复
    linux 学习 14 日志管理
    linux 学习 13 系统管理
  • 原文地址:https://www.cnblogs.com/wxshi/p/6077734.html
Copyright © 2011-2022 走看看