🔍
What is backpropagation really doing? | Chapter 3, Deep learning - YouTube
Channel: 3Blue1Brown
[4]
本期我们来讲反向传播
[6]
也就是神经网络学习的核心算法
[9]
稍微回顾一下我们之前讲到哪里之后
[11]
首先我要撇开公式不提 直观地过一遍
[15]
这个算法到底在做什么
[17]
然后如果你们有人想认真看里头的数学
[20]
下一期视频我会解释这一切背后的微积分
[23]
如果你看了前两期视频
[25]
或者你已经有足够背景 直接空降来这一期视频的话
[27]
你一定知道神经网络是什么 以及它如何前馈信息的
[31]
这里我们考虑的经典例子就是手写数字识别
[35]
数字的像素值被输入到网络第一层的784个神经元里
[39]
这里 我展示的是有2层16个神经元隐含层
[44]
10个神经元的输出层 代表网络最终给出的选择
[50]
我也假设你们已经理解了上期说到的梯度下降法
[54]
理解了所谓学习就是指
[56]
我们要找到特定的权重偏置 从而使一个代价函数最小化
[62]
稍许提醒一下 计算一个训练样本的代价
[65]
你需要求出网络的输出
[68]
与期待的输出
[71]
之间每一项的差的平方和
[75]
然后对于成千上万个训练样本都这么算一遍 最后取平均
[80]
这就得到了整个网络的代价值
[82]
如果你嫌这还不够复杂的话 上集内容也讲到了
[86]
我们要求的是代价函数的负梯度
[90]
它告诉你如何改变所有连线上的权重偏置
[95]
才好让代价下降得最快
[102]
本集的中心 反向传播算法
[105]
正是用来求这个复杂到爆的梯度的
[109]
我希望大家能够把上集中提到的一点牢牢记住
[114]
毕竟13000维的梯度向量
[118]
说它是难以想象都不为过
[122]
所以这里大家请记住另一套思路
[124]
梯度向量每一项的大小是在告诉大家
[127]
代价函数对于每个参数有多敏感
[131]
比如说 你走了一段我讲的过程
[134]
计算了负梯度
[136]
对应这条线上这个权重的一项等于3.2
[141]
而对应这条边上的一项等于0.1
[146]
你可以这么来理解
[148]
第一个权重对代价函数的值有32倍的影响力
[153]
如果你稍微改变一下第一个权重
[155]
它对代价值造成的变化
[158]
就是改变第二个权重同等大小下的32倍
[168]
就我个人而言 我刚开始学习反向传播的时候
[171]
我觉得最容易搞混的部分就是各种符号和上标下标
[176]
不过 一旦你捋清了算法的思路
[179]
算法的每一步其实都挺直观的
[183]
其实就是把许许多多微小的调整一层进一层地进行下去而已
[187]
所以 开始讲解时 我将完全抛弃所有的符号
[191]
给大家一步步解释
[193]
每一个训练样本会对权重偏置的调整造成怎样的影响
[197]
因为代价函数牵扯到
[198]
对成千上万个训练样本的代价取平均值
[203]
所以我们调整每一步梯度下降用的权重偏置
[208]
也会基于所有的训练样本
[211]
原理上是这么说
[213]
但为了计算效率 之后咱们会讨个巧
[215]
从而不必每一步都非得要计算所有的训练样本
[219]
还需要说明一点
[221]
我们现在只关注一个训练样本 就这张2
[226]
这一个训练样本会对调整权重和偏置造成怎样的影响呢?
[232]
现在假设网络还没有完全训练好
[235]
那么输出层的激活值看起来就很随机
[237]
也许就会出现0.5 0.8 0.2 等等等等
[242]
我们并不能直接改动这些激活值 只能改变权重和偏置值
[247]
但记住我们想要输出层出现怎样的变动 还是很有用的
[253]
因为我们希望图像最终的分类结果是2
[256]
我们希望第三个输出值变大 其他数值变小
[262]
并且变动的大小应该与现在值和目标值之间的差呈正比
[266]
并且变动的大小应该与现在值和目标值之间的差呈正比
[270]
举个例子 增加数字”2”神经元的激活值
[274]
就应该比减少数字”8”神经元的激活值来得重要
[278]
因为后者已经很接近它的目标了
[281]
那好 我们更进一步 就来关注下这一个神经元
[285]
我们要让这里面的激活值变大
[288]
还记得这个激活值是
[290]
把前一层所有激活值的加权和 加上一个偏置
[296]
再通过sigmoid ReLU之类的挤压函数 最后算出来的吧
[301]
所以要增加这个激活值 我们有三条大路可走
[307]
一增加偏置 二增加权重
[310]
或者三改变上一层的激活值
[314]
先来看如何调整权重
[317]
各个权重它们的影响力各不相同
[321]
连接前一层最亮的神经元的权重 影响力也最大
[325]
因为这些权重会与大的激活值相乘
[331]
所以至少对于这一个训练样本而言
[333]
增大了这几个权重值 对最终代价函数造成的影响
[337]
就比增大连接黯淡神经元的权重所造成的影响
[340]
要大上好多倍
[344]
请记住当我们说到梯度下降的时候
[346]
我们并不只看每个参数是该增大还是减小
[350]
我们还看该哪个参数的性价比最高
[355]
顺便一提 这有一点点像描述生物中
[359]
神经元的网络如何学习的一个理论
[361]
“赫布理论” 总结起来就是“一同激活的神经元关联在一起”
[367]
这里 权重的最大增长 即连接变得更强的部分
[372]
就会发生在已经最活跃的神经元
[374]
和想要更多激发的神经元之间
[378]
可以说 看见一个2时激发的神经元
[381]
会和”想到一个2”时激发的神经元联系地更紧密
[385]
这里解释一下 我个人对人工神经网络是否真的在
[388]
模仿生物学上大脑的工作 没有什么发言权
[393]
“一同激活的神经元关联在一起”这句话是要打星号注释的
[397]
但作为一个粗略的对照 我觉得还是挺有意思的
[401]
言归正传 第三个能够增加这个神经元激活值的方法
[406]
就是改变前一层的激活值
[409]
更具体地说 如果所有正权重连接的神经元更亮
[414]
所有负权重连接的神经元更暗的话
[418]
那么数字2的神经元就会更强烈地激发
[422]
和改权重的时候类似 我们想造成更大的影响
[426]
就要依据对应权重的大小 对激活值做出呈比例的改变
[432]
当然 我们并不能直接改变激活值
[435]
我们手头只能控制权重和偏置
[438]
但就光对最后一层来说 记住我们期待的变化还是很有帮助的
[444]
不过别忘了 从全局上看 这只不过是数字2的神经元所期待的变化
[449]
我们还需要最后一层其余的神经元的激发变弱
[454]
但这其余的每个输出神经元
[456]
对于如何改变倒数第二层 都有各自的想法
[463]
所以 我们会把数字2神经元的期待
[466]
和别的输出神经元的期待全部加起来
[470]
作为对如何改变倒数第二层神经元的指示
[473]
这些期待变化不仅是对应的权重的倍数
[476]
也是每个神经元激活值改变量的倍数
[481]
这其实就是在实现”反向传播”的理念了
[485]
我们把所有期待的改变加起来
[488]
就得到了一串对倒数第二层改动的变化量
[494]
有了这些
[495]
我们就可以重复这个过程
[497]
改变影响倒数第二层神经元激活值的相关参数
[501]
从后一层到前一层 把这个过程一直循环到第一层
[509]
放眼大局
[510]
还记得我们只是在讨论
[511]
单个训练样本对所有权重偏置的影响吗?
[517]
如果我们只关注那个“2”的要求
[519]
最后 网络只会把所有图像都分类成是“2”
[524]
所以你要对其他所有的训练样本 同样地过一遍反向传播
[529]
记录下每个样本想怎样修改权重与偏置
[533]
最后再取一个平均值
[542]
这里一系列的权重偏置的平均微调大小
[546]
不严格地说 就是上期视频提到的代价函数的负梯度
[551]
至少是其标量的倍数
[554]
这里的不严格 指的是我还没有准确地解释如何量化这些微调
[559]
但如果你清楚我提到的所有改动
[562]
为什么有些数字是其他数字的好几倍
[564]
以及最后要怎么全部加起来
[567]
你就懂得了反向传播的真实工作原理
[574]
顺带一提 实际操作中 如果梯度下降的每一步
[577]
都用上每一个训练样本来计算的话 那么花的时间就太长了
[583]
所以我们一般会这么做
[585]
首先把训练样本打乱 然后分成很多组minibatch
[590]
每个minibatch就当包含100个训练样本好了
[593]
然后你算出这个minibatch下降的一步
[596]
这不是代价函数真正的梯度
[599]
毕竟计算真实梯度得用上所有的样本 而非这个子集
[603]
所以这也不是下山最高效的一步
[606]
然而 每个minibatch都会给你一个不错的近似
[608]
而且更重要的是 你的计算量会减轻不少
[612]
你如果想把网络沿代价函数的表面下山的路径画出来的话
[616]
它看上去会有点像醉汉漫无目的地遛下山 但起码步伐很快
[622]
而不像是细致入微的人 踏步之前先准确地算好下坡的方向
[627]
然后再向那个方向谨小慎微地慢慢走一步
[631]
这个技巧就叫做“随机梯度下降”
[636]
内容挺多的 我们先小结一下好不好
[640]
反向传播算法算的是
[642]
单个训练样本想怎样修改权重与偏置
[647]
不仅是说每个参数应该变大还是变小
[649]
还包括了这些变化的比例是多大 才能最快地降低代价
[656]
真正的梯度下降
[658]
得对好几万个训练范例都这么操作
[661]
然后对这些变化值取平均
[664]
但算起来太慢了
[666]
所以你会先把所有的样本分到各个minibatch中去
[670]
计算一个minibatch来作为梯度下降的一步
[673]
计算每个minibatch的梯度 调整参数 不断循环
[677]
最终你就会收敛到代价函数的一个局部最小值上
[681]
此时就可以说 你的神经网络对付训练数据已经很不错了
[687]
总而言之 我们实现反向传播算法的每一句代码
[692]
其实或多或少地都对应了大家已经知道的内容
[697]
但有时 了解其中的数学原理只不过是完成了一半
[700]
如何把这破玩意儿表示出来又会搞得人一头雾水
[704]
那么 在座的如果想深入探讨的话
[707]
下一期视频中我们会把本期的内容用微积分的形式呈现出来
[710]
下一期视频中我们会把本期的内容用微积分的形式呈现出来
[712]
希望看过以后再看其他资料时会更容易接受一些吧
[717]
收尾之前 我想着重提一点
[719]
反向传播算法在内 所有包括神经网络在内的机器学习 要让它们工作
[724]
咱需要一大坨的训练数据
[726]
我们用的手写数字的范例之所以那么方便
[729]
是因为存在着一个MNIST数据库
[732]
里面所有的样本都已经人为标记好了
[735]
所以机器学习领域的人 最熟悉的一个难关
[739]
莫过于获取标记好的训练数据了
[742]
不管是叫别人标记成千上万个图像
[745]
还是去标记别的类型的数据也罢
[747]
于是这里就可以顺势隆重介绍今天的赞助商 CrowdFlower
[753]
为数据科学家 机器学习团队创建训练数据而专门打造的软件平台
[754]
为数据科学家 机器学习团队创建训练数据而专门打造的软件平台
[758]
他们允许你上传文本音频或者图像数据
[761]
然后让真人为你标记
[764]
你可能听说过Human-in-the-loop“人为介入”法
[766]
这里其实正是如此
[769]
利用人类的智慧来训练出机器的智能
[773]
这里他们还部署了很多智能的质量控制机制
[776]
保证数据干净准确
[778]
他们已经协助测试过上千次AI项目数据了
[782]
更好玩的是 这回大家能领到一件免费T恤
[786]
访问3b1b.co/crowdflower
[790]
或者是屏幕上简介中的唯一指定链接
[793]
你注册完新账号 建立好新项目
[796]
你们就可以获得一件免费的T恤了
[799]
这件我还挺喜欢的 很cool的
[801]
那么感谢CrowdFlower对本期的支持
[803]
也感谢所有Patreon上的资助人一路对本系列的资助
Most Recent Videos:
You can go back to the homepage right here: Homepage





