本篇文章8651字,读完约22分钟
雷锋。这篇文章的原作者回忆了甄。这篇文章最初发表在作者的智虎专栏《机器学习算法和自然语言处理》中。雷锋网(公开号:雷锋网)已经作者授权。
学习过神经网络的人都知道神经网络,它是一种常用的训练方法,即bp训练算法。通过bp算法,我们可以不断地训练网络,最终使网络无限逼近我们想要拟合的函数。最后,经过训练的网络可以在训练集和测试集上都表现良好!
那么什么是bp算法呢?为什么我们可以通过bp算法逐步达到最优值(即使有可能是局部最优值,而不是全局最优值,我们也可以通过其他方法达到全局最优值),有什么数学原理支持吗?在过去的几天里,我已经梳理了这方面的知识点并写了下来。首先,我可以记录它们。第二,我可以和你分享,防止误解,一起学习和交流。
什么是bp算法?你可以参考我的智虎专栏(详细介绍bp流程以加深你的理解)。然后在下面解决这个问题。为什么我们可以通过bp算法逐步得到更好的结果?首先,从神经网络的工作原理来看,如果有如下简单的网络,如图所示:
amp;amp;amp;amp;lt;img src= amp;amp;amp;amp;quot;getimg.jrj/images/2017/08/leiphone/one_20170804180620438.png amp;amp;amp;amp;quot; data-rawwidth= amp;amp;amp;amp;quot;675 amp;amp;amp;amp;quot; data-rawheight= amp;amp;amp;amp;quot;396 amp;amp;amp;amp;quot; >
我们定义符号说明如下:amp。amp。amp。amp。lt。img src= amp。amp。amp。amp。quot。geting . jrj/images/2017/08/leiphone/one _ 20170804180620438 . png amp;amp。amp。amp。quot。数据-rawwidth= amp。amp。amp。amp。quot。675安培。amp。amp。amp。quot。数据-rawheight= amp。amp。amp。amp。quot。396安培。amp。amp。amp。quot。>我们定义符号如下:
amp;amp;amp;amp;lt;img src= amp;amp;amp;amp;quot;getimg.jrj/images/2017/08/leiphone/one_20170804180612767.png amp;amp;amp;amp;quot; data-rawwidth= amp;amp;amp;amp;quot;743 amp;amp;amp;amp;quot; data-rawheight= amp;amp;amp;amp;quot;413 amp;amp;amp;amp;quot; >
则我们正向传播一次可以得到下面公式:amp。amp。amp。amp。lt。img src= amp。amp。amp。amp。quot。geting . jrj/images/2017/08/leiphone/one _ 20170804180612767 . png amp;amp。amp。amp。quot。数据-rawwidth= amp。amp。amp。amp。quot。743安培。amp。amp。amp。quot。数据-rawheight= amp。amp。amp。amp。quot。413安培。amp。amp。amp。quot。>然后我们可以通过传播一次得到以下公式:
amp;amp;amp;amp;lt;img src= amp;amp;amp;amp;quot;getimg.jrj/images/2017/08/leiphone/one_20170804180609438.png amp;amp;amp;amp;quot; data-rawwidth= amp;amp;amp;amp;quot;292 amp;amp;amp;amp;quot; data-rawheight= amp;amp;amp;amp;quot;228 amp;amp;amp;amp;quot; >
amp;amp;amp;amp;lt;img src= amp;amp;amp;amp;quot;getimg.jrj/images/2017/08/leiphone/one_20170804180625439.png amp;amp;amp;amp;quot; data-rawwidth= amp;amp;amp;amp;quot;174 amp;amp;amp;amp;quot; data-rawheight= amp;amp;amp;amp;quot;64 amp;amp;amp;amp;quot; >
amp;amp;amp;amp;lt;img src= amp;amp;amp;amp;quot;getimg.jrj/images/2017/08/leiphone/one_20170804180607180.png amp;amp;amp;amp;quot; data-rawwidth= amp;amp;amp;amp;quot;547 amp;amp;amp;amp;quot; data-rawheight= amp;amp;amp;amp;quot;153 amp;amp;amp;amp;quot; >
amp;amp;amp;amp;lt;img src= amp;amp;amp;amp;quot;getimg.jrj/images/2017/08/leiphone/one_20170804180622442.png amp;amp;amp;amp;quot; data-rawwidth= amp;amp;amp;amp;quot;547 amp;amp;amp;amp;quot; data-rawheight= amp;amp;amp;amp;quot;99 amp;amp;amp;amp;quot; >
如果损失函数 c 定义为amp。amp。amp。amp。lt。img src= amp。amp。amp。amp。quot。geting . jrj/images/2017/08/leiphone/one _ 20170804180609438 . png amp;amp。amp。amp。quot。数据-rawwidth= amp。amp。amp。amp。quot。292安培。amp。amp。amp。quot。数据-rawheight= amp。amp。amp。amp。quot。228安培。amp。amp。amp。quot。> amp。amp。amp。amp。lt。img src= amp。amp。amp。amp。quot。geting . jrj/images/2017/08/leiphone/one _ 20170804180625439 . png amp;amp。amp。amp。quot。数据-rawwidth= amp。amp。amp。amp。quot。174安培。amp。amp。amp。quot。数据-rawheight= amp。amp。amp。amp。quot。64安培。amp。amp。amp。quot。> amp。amp。amp。amp。lt。img src= amp。amp。amp。amp。quot。geting . jrj/images/2017/08/leiphone/one _ 20170804180607180 . png amp;amp。amp。amp。quot。数据-rawwidth= amp。amp。amp。amp。quot。547安培。amp。amp。amp。quot。数据-rawheight= amp。amp。amp。amp。quot。153安培。amp。amp。amp。quot。> amp。amp。amp。amp。lt。img src= amp。amp。amp。amp。quot。geting . jrj/images/2017/08/leiphone/one _ 20170804180622442 . png amp;amp。amp。amp。quot。数据-rawwidth= amp。amp。amp。amp。quot。547安培。amp。amp。amp。quot。数据-rawheight= amp。amp。amp。amp。quot。99安培。amp。amp。amp。quot。>如果损失函数c定义为
amp;amp;amp;amp;lt;img src= amp;amp;amp;amp;quot;getimg.jrj/images/2017/08/leiphone/one_20170804180618437.png amp;amp;amp;amp;quot; data-rawwidth= amp;amp;amp;amp;quot;206 amp;amp;amp;amp;quot; data-rawheight= amp;amp;amp;amp;quot;69 amp;amp;amp;amp;quot; >
那么我们希望训练出来的网络预测出来的值和真实的值越接近越好。我们先暂时不管 sgd 这种方法,最暴力的我们希望对于一个训练数据,c 能达到最小,而在 c 表达式中,我们可以把 c 表达式看做是所有 w 参数的函数,也就是求这个多元函数的最值问题。那么成功的将一个神经网络的问题引入到数学中最优化的路上了。amp。amp。amp。amp。lt。img src= amp。amp。amp。amp。quot。geting . jrj/images/2017/08/leiphone/one _ 20170804180618437 . png amp;amp。amp。amp。quot。数据-rawwidth= amp。amp。amp。amp。quot。206安培。amp。amp。amp。quot。数据-rawheight= amp。amp。amp。amp。quot。69安培。amp。amp。amp。quot。>然后,我们希望经过训练的网络预测的值将尽可能接近真实值。让我们暂时忽略sgd。最暴力的事情是我们希望C能达到一个训练数据的最小值。在C表达式中,我们可以把C表达式看作是所有W参数的函数,即求这个多元函数的最大值。然后将神经网络问题成功地引入到数学优化中。
分界线。
现在,我们已经成功地将神经网络要解决的问题转化为多元函数的优化。现在的问题是如何修改w,使c更接近最小值。我们可以采用梯度下降法作为一种常用的方法(为什么梯度下降法中梯度的反向是最快的方向,请参考我的下一篇文章,这不是本文的主题)。这里可能有点抽象。这里有一个非常简单的例子。
假设我们的网络非常简单,如下图所示(符号描述同上):
amp;amp;amp;amp;lt;img src= amp;amp;amp;amp;quot;static.leiphone/uploads/new/article/pic/201708/84c0a988d8e05428a3ec5c169824b00d.png amp;amp;amp;amp;quot; data-rawwidth= amp;amp;amp;amp;quot;366 amp;amp;amp;amp;quot; data-rawheight= amp;amp;amp;amp;quot;329 amp;amp;amp;amp;quot; >
其中 amp;amp;amp;amp;lt;img src= amp;amp;amp;amp;quot;static.leiphone/uploads/new/article/pic/201708/97d02f2a25bcf78362f4e20b04316cdd.png amp;amp;amp;amp;quot; data-rawwidth= amp;amp;amp;amp;quot;601 amp;amp;amp;amp;quot; data-rawheight= amp;amp;amp;amp;quot;62 amp;amp;amp;amp;quot; >
只有 w 参数是未知的,那么 c 就可以看做是关于 w 的二元函数(二元函数的好处就是我们可以在三维坐标上将它可视化出来,便于理解~)。 图片来自于网络:amp。amp。amp。amp。lt。img src= amp。amp。amp。amp。quot。static . leiphone/uploads/new/article/pic/201708/84c 0 a 988 D8 e 05428 a3 EC 5c 169824 b 00d . png amp;amp。amp。amp。quot。数据-rawwidth= amp。amp。amp。amp。quot。366安培。amp。amp。amp。quot。数据-rawheight= amp。amp。amp。amp。quot。329安培。amp。amp。amp。quot。>放大器。amp。amp。amp。lt。img src= amp。amp。amp。amp。quot。static . leiphone/uploads/new/article/pic/201708/97d 02 F2 a 25 BCF 78362 F4 e 20 b 04316 cdd . png amp;amp。amp。amp。quot。数据-rawwidth= amp。amp。amp。amp。quot。601安培。amp。amp。amp。quot。数据-rawheight= amp。amp。amp。amp。quot。62安培。amp。amp。amp。quot。>只有w参数是未知的,那么c可以看作是关于w的二元函数(二元函数的优点是我们可以在三维坐标中可视化它以便于理解~)。网络图像:
amp;amp;amp;amp;lt;img src= amp;amp;amp;amp;quot;static.leiphone/uploads/new/article/pic/201708/d2f6ec1dfb62c65f9009b6498c0c9c02.jpg amp;amp;amp;amp;quot; data-rawwidth= amp;amp;amp;amp;quot;660 amp;amp;amp;amp;quot; data-rawheight= amp;amp;amp;amp;quot;518 amp;amp;amp;amp;quot; >
下面走一遍算法过程:amp。amp。amp。amp。lt。img src= amp。amp。amp。amp。quot。static . leiphone/uploads/new/article/pic/201708/d2f 6 ec1 DFB 62 c 65 f 9009 b 6498 c 0 c 9 c 2 . jpg amp;amp。amp。amp。quot。数据-rawwidth= amp。amp。amp。amp。quot。660安培。amp。amp。amp。quot。数据-rawheight= amp。amp。amp。amp。quot。518安培。amp。amp。amp。quot。>完成以下算法流程:
我们开始随机初始化w参数,这意味着我们可以对应于图上的点a。
接下来,我们的目标是到达最低点f,所以我们沿着梯度的相反方向移动,公式如下:
amp;amp;amp;amp;lt;img src= amp;amp;amp;amp;quot;static.leiphone/uploads/new/article/pic/201708/8c615feed3f4d0c723a3d8b8f0a71e21.png amp;amp;amp;amp;quot; data-rawwidth= amp;amp;amp;amp;quot;229 amp;amp;amp;amp;quot; data-rawheight= amp;amp;amp;amp;quot;169 amp;amp;amp;amp;quot; >
那么好了,上面我们给出二元函数这种简单例子,从分析到最后求出结果,我们能够直观可视化最后的步骤,那么如果网络复杂后,变成多元函数的最优值求法原理是一模一样的!到此,我结束了该文要讲的知识点了。 欢迎各位朋友指错交流~amp。amp。amp。amp。lt。img src= amp。amp。amp。amp。quot。static . leiphone/uploads/new/article/pic/201708/8c 615 feed 3 F4 d 0 c 723 a 3d 8 b 8 f 0 a 71 e 21 . png amp;amp。amp。amp。quot。数据-rawwidth= amp。amp。amp。amp。quot。229安培。amp。amp。amp。quot。数据-rawheight= amp。amp。amp。amp。quot。169安培。amp。amp。amp。quot。>好,上面我们给出了二元函数的一个简单例子,从分析到最终结果,我们可以直观地形象化最后一步,所以如果网络是复杂的,寻找多元函数的最优值的原理是完全一样的!至此,我已经完成了本文的知识点。欢迎朋友参考错误的交流~
分界线。
当我在学习的时候,我已经理解了上面的知识,但是我在想,既然我最终得到了一个关于W的多元函数,为什么我不直接取每个W的偏导数,然后直接更新它呢?为什么神经网络需要bp算法来恢复?我的问题是,为什么我们不能直接找到偏导数,但只有在bp算法出现后,神经网络才能如此适用?这是我的想法和理解(欢迎交流~)
1.为什么我们不能直接得到导数?
在神经网络中,由于激活函数的存在,很多时候我们在最后的代价函数的时候,包含 w 参数的代价函数并不是线性函数,比如最简单的 amp;amp;amp;amp;lt;img src= amp;amp;amp;amp;quot;static.leiphone/uploads/new/article/pic/201708/e23ef5fe5d4f3d0cd77192101630cb0e.png amp;amp;amp;amp;quot; data-rawwidth= amp;amp;amp;amp;quot;308 amp;amp;amp;amp;quot; data-rawheight= amp;amp;amp;amp;quot;95 amp;amp;amp;amp;quot; >
这个函数对 w 进行求导是无法得到解析解的,那么说明了无法直接求导的原因。在神经网络中,由于激活函数的存在,大多数时候当我们处于最终的代价函数时,包含w参数的代价函数不是线性函数,比如最简单的ampamp。amp。amp。lt。img src= amp。amp。amp。amp。quot。static . leiphone/uploads/new/article/pic/201708/e23 ef 5 Fe 5d 4f 3d 0 CD 77192101630 CB 0 e . png amp;amp。amp。amp。quot。数据-rawwidth= amp。amp。amp。amp。quot。308安培。amp。amp。amp。quot。数据-rawheight= amp。amp。amp。amp。quot。95安培。amp。amp。amp。quot。>这个函数在求w的微分时不能得到解析解,这就解释了为什么不能直接求微分。
2.既然我们不能直接推导,我们能近似导数吗?例如,可以使用它
根据这个公式,我们可以近似每个参数的导数,距离越小,越接近。那么为什么不能这样做,我们必须等到bp算法被提出来?思考...
答:由于计算机数量的问题,假设我们的网络中有100万个权值,每次我们计算权值的偏导数时,都需要重新计算变化值,而变化值必须经过一个完整的前向传播。然后,对于每个训练示例,我们需要一百万次向前传播(一次,我们需要计算C),而我们的bp算法只需要一次向后传播来找到所有参数的偏导数,总时间是两倍。在这里,我想我已经解决了为什么我们不能使用近似方法,因为速度太慢,计算复杂度太大~如果每个传动中有很多参数,矩阵计算非常大,以前的机器速度根本无法承受~所以神经网络的应用速度加快,直到锋利的工具bp可用。
以上只是个人理解。感谢德川的帮助!欢迎朋友提问和交流~
以下是我研究中使用的材料和博客:
“神经网络与深度学习”需要一个中文欢迎信箱。
基于零基础的深度学习(1)——感知器
雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。
标题:神经网络和数学之间的联系在哪里?看完你就明白
地址:http://www.hcsbodzyz.com/hcxw/11057.html