AI-神经网络中的三个基本概念:梯度下降、反向传播、损失函数
文章参考:神经网络中的三个基本概念
2.0 通俗地理解三大概念
这三大概念是:反向传播,梯度下降,损失函数。
神经网络训练的最基本的思想就是:先“猜”一个结果,称为预测结果
在神经网络训练中,我们把“猜”叫做初始化,可以随机,也可以根据以前的经验给定初始值。即使是“猜”,也是有技术含量的。
下面我们举几个例子来直观的说明下这三个概念。
2.0.1 例一:猜数
甲乙两个人玩儿猜数的游戏,数字的范围是
甲:我猜5
乙:太小了
甲:50
乙:有点儿大
甲:30
乙:小了
…
在这个游戏里:
- 目的:猜到乙心中的数字;
- 初始化:甲猜5;
- 前向计算:甲每次猜的新数字;
- 损失函数:乙在根据甲猜的数来和自己心中想的数做比较,得出“大了”或“小了”的结论;
- 反向传播:乙告诉甲“小了”、“大了”;
- 梯度下降:甲根据乙的反馈中的含义自行调整下一轮的猜测值。
这里的损失函数是什么呢?就是“太小了”,“有点儿大”,很不精确!这个“所谓的”损失函数给出了两个信息:
- 方向:大了或小了
- 程度:“太”,“有点儿”,但是很模糊
2.0.2 例二:黑盒子
假设有一个黑盒子:
我们只能看到输入和输出的数值,看不到里面的样子,当输入1时,输出2.334,然后黑盒子有个信息显示:我需要输出值是4。然后我们试了试输入2,结果输出5.332,一下子比4大了很多。那么我们第一次的损失值是
这里,我们的损失函数就是一个简单的减法,用实际值减去目标值,但是它可以告诉你两个信息:1)方向,是大了还是小了;2)差值,是0.1还是1.1。这样就给了我们下一次猜的依据。
- 目的:猜到一个输入值,使得黑盒子的输出是4;
- 初始化:输入1;
- 前向计算:黑盒子内部的数学逻辑;
- 损失函数:在输出端,用输出值减4;
- 反向传播:告诉猜数的人差值,包括正负号和值;
- 梯度下降:在输入端,根据正负号和值,确定下一次的猜测值。
2.0.3 例三:打靶
小明拿了一支步枪,射击100米外的靶子。这支步枪没有准星,或者是准星有问题,或者是小明眼神儿不好看不清靶子,或者是雾很大,或者风很大,或者由于木星的影响而侧向引力场异常…反正就是遇到各种干扰因素。
第一次试枪后,拉回靶子一看,弹着点偏左了,于是在第二次试枪时,小明就会有意识地向右侧偏几毫米,再看靶子上的弹着点,如此反复几次,小明就会掌握这支步枪的脾气了。图2-2显示了小明的5次试枪过程。
在有监督的学习中,需要衡量神经网络输出和所预期的输出之间的差异大小。这种误差函数需要能够反映出当前网络输出和实际结果之间一种量化之后的不一致程度,也就是说函数值越大,反映出模型预测的结果越不准确。
这个例子中,小明预期的目标是全部命中靶子的中心,最外圈是1分,之后越向靶子中心分数是2,3,4分,正中靶心可以得10分。
- 每次试枪弹着点和靶心之间的差距就叫做误差,可以用一个误差函数来表示,比如差距的绝对值,如图中的红色线。
- 一共试枪5次,就是迭代/训练了5次的过程 。
- 每次试枪后,把靶子拉回来看弹着点,然后调整下一次的射击角度的过程,叫做反向传播。注意,把靶子拉回来看和跑到靶子前面去看有本质的区别,后者容易有生命危险,因为还有别的射击者。一个不恰当的比喻是,在数学概念中,人跑到靶子前面去看,叫做正向微分;把靶子拉回来看,叫做反向微分。
- 每次调整角度的数值和方向,叫做梯度。比如向右侧调整1毫米,或者向左下方调整2毫米。如图中的绿色矢量线。
上图是每次单发点射,所以每次训练样本的个数是1。在实际的神经网络训练中,通常需要多个样本,做批量训练,以避免单个样本本身采样时带来的误差。在本例中,多个样本可以描述为连发射击,假设一次可以连打3发子弹,每次的离散程度都类似,如图2-3所示。
- 如果每次3发子弹连发,这3发子弹的弹着点和靶心之间的差距之和再除以3,叫做损失,可以用损失函数来表示。
那小明每次射击结果和目标之间的差距是多少呢?在这个例子里面,用得分来衡量的话,就是说小明得到的反馈结果从差9分,到差8分,到差2分,到差1分,到差0分,这就是用一种量化的结果来表示小明的射击结果和目标之间差距的方式。也就是误差函数的作用。因为是一次只有一个样本,所以这里采用的是误差函数的称呼。如果一次有多个样本,就要叫做损失函数了。
其实射击还不这么简单,如果是远距离狙击,还要考虑空气阻力和风速,在神经网络里,空气阻力和风速可以对应到隐藏层的概念上。
在这个例子中:
- 目的:打中靶心;
- 初始化:随便打一枪,能上靶就行,但是要记住当时的步枪的姿态;
- 前向计算:让子弹飞一会儿,击中靶子;
- 损失函数:环数,偏离角度;
- 反向传播:把靶子拉回来看;
- 梯度下降:根据本次的偏差,调整步枪的射击角度。
损失函数的描述是这样的:
- 1环,偏左上45度;
- 6环,偏左上15度;
- 7环,偏左;
- 8环,偏左下15度;
- 10环。
这里的损失函数也有两个信息:
- 距离;
- 方向。
所以,梯度,是个矢量! 它应该即告诉我们方向,又告诉我们数值。
2.0.4 黑盒子的真正玩法
以上三个例子比较简单,容易理解,我们把黑盒子再请出来:黑盒子这件事真正的意义并不是猜测当输入是多少时输出会是4。它的实际意义是:我们要破解这个黑盒子!于是,我们会有如下破解流程:
- 记录下所有输入值和输出值,如表2-1。
表2-1 样本数据表
样本ID | 输入(特征值) | 输出(标签) |
---|---|---|
1 | 1 | 2.21 |
2 | 1.1 | 2.431 |
3 | 1.2 | 2.652 |
4 | 2 | 4.42 |
- 搭建一个神经网络,给出初始权重值,我们先假设这个黑盒子的逻辑是:
; - 输入1,根据
得到输出为2,而实际的输出值是2.21,则误差值为 ,小了; - 调整权重值,比如
,再输入1.1,得到的输出为2.86,实际输出为2.431,则误差值为 ,大了; - 调整权重值,比如
,再输入1.2…… - 调整权重值,再输入2……
- 所有样本遍历一遍,计算平均的损失函数值;
- 依此类推,重复3,4,5,6过程,直到损失函数值小于一个指标,比如
,我们就可以认为网络训练完毕,黑盒子“破解”了,实际是被复制了,因为神经网络并不能得到黑盒子里的真实函数体,而只是近似模拟。
从上面的过程可以看出,如果误差值是正数,我们就把权重降低一些;如果误差值为负数,则升高权重。
2.0.5 总结
简单总结一下反向传播与梯度下降的基本工作原理:
- 初始化;
- 正向计算;
- 损失函数为我们提供了计算损失的方法;
- 梯度下降是在损失函数基础上向着损失最小的点靠近而指引了网络权重调整的方向;
- 反向传播把损失值反向传给神经网络的每一层,让每一层都根据损失值反向调整权重;
- Go to 2,直到精度足够好(比如损失函数值小于
)。
2.1 线性反向传播
2.1.1 正向计算的实例
假设有一个函数:
其中:
计算图如图2-4。
注意这里
当
最终的
2.1.2 反向传播求解
求 的偏导
目前
如果想解决这个问题,最笨的办法是可以在输入端一点一点的试,把
从
因为
所以:
其中:
图2-6其实就是链式法则的具体表现,
根据公式1、2、3,我们有:
对上式求
公式4和公式6的结果完全一致!所以,请大家相信链式法则的科学性。
求 的具体变化值
公式4和公式6的含义是:当
既然:
则:
所以:
我们一下子就成功地让
【课堂练习】推导 对 的偏导数,结果在下一小节中使用
2.1.3 反向传播求解
求 的偏导
这次我们令
注意,在上一小节中,求
- 从
到 到 ; - 从
到 到 。
从复合导数公式来看,这两者应该是相加的关系,所以有:
其中:
我们不妨再验证一下链式求导的正确性。把公式5再拿过来:
对上式求b的偏导:
结果和公式7的链式法则一样。
求 的具体变化值
公式7和公式8的含义是:当
既然:
则:
所以:
这个结果也是与 1e-4
时,我们就可以结束迭代了,对于计算机来说,这些运算的执行速度很快。
【课题练习】请自己尝试手动继续迭代两次,看看误差的精度可以达到多少?
这个问题用数学公式倒推求解一个二次方程,就能直接得到准确的b值吗?是的!但是我们是要说明机器学习的方法,机器并不会解二次方程,而且很多时候不是用二次方程就能解决实际问题的。而上例所示,是用机器所擅长的迭代计算的方法来不断逼近真实解,这就是机器学习的真谛!而且这种方法是普遍适用的。
2.1.4 同时求解 和 的变化值
这次我们要同时改变
已知
【课堂练习】用Python代码实现以上双变量的反向传播计算过程
容易出现的问题:
- 在检查
时的值时,注意要用绝对值,因为有可能是个负数 - 在计算
和 时,第一次时,它们对 的贡献值分别是 和 ,但是第二次时,由于 值的变化,对 的贡献值也会有微小变化,所以要重新计算。具体解释如下:
所以,在每次迭代中,要重新计算下面两个值:
以下是程序的运行结果。
没有在迭代中重新计算
1 | single variable: b ----- |
在每次迭代中都重新计算
1 | single variable new: b ----- |
从以上两个结果对比中,可以看到三点:
factor_b
第一次是63
,以后每次都会略微降低一些- 第二个函数迭代了3次就结束了,而第一个函数迭代了5次,效率不一样
- 最后得到的结果是一样的,因为这个问题只有一个解
对于双变量的迭代,有同样的问题:
没有在迭代中重新计算 factor_b
和factor_w
每次都保持63
和18
):
1 | double variable: w, b ----- |
在每次迭代中都重新计算 factor_b
和factor_w
每次都变化):
1 | double variable new: w, b ----- |
这个与第一个单变量迭代不同的地方是:这个问题可以有多个解,所以两种方式都可以得到各自的正确解,但是第二种方式效率高,而且满足梯度下降的概念。
参考资料
http://colah.github.io/posts/2015-08-Backprop/
2.2 非线性反向传播
2.2.1 提出问题
在上面的线性例子中,我们可以发现,误差一次性地传递给了初始值
下面我们看一个非线性的例子,如图2-8所示。
其中
正向过程
- 第1个人,输入层,随机输入第一个
值, 的取值范围 ,假设第一个数是 ; - 第2个人,第一层网络计算,接收第1个人传入
的值,计算: ; - 第3个人,第二层网络计算,接收第2个人传入
的值,计算: ; - 第4个人,第三层网络计算,接收第3个人传入
的值,计算: ; - 第5个人,输出层,接收第4个人传入
的值
反向过程
- 第5个人,计算
与 的差值: ,传回给第4个人 - 第4个人,接收第5个人传回
,计算 - 第3个人,接收第4个人传回
,计算 - 第2个人,接收第3个人传回
,计算 - 第1个人,接收第2个人传回
,更新 ,回到第1步
提出问题:假设我们想最后得到
2.2.2 数学解析解
2.2.3 梯度迭代解
因此得到如下一组公式,可以把最后一层
根据式3
根据式2
根据式1
我们给定初始值
表2-2 正向与反向的迭代计算
方向 | 公式 | 迭代1 | 迭代2 | 迭代3 | 迭代4 | 迭代5 |
---|---|---|---|---|---|---|
正向 | 2 | 4.243 | 7.344 | 9.295 | 9.665 | |
正向 | 4 | 18.005 | 53.934 | 86.404 | 93.233 | |
正向 | 1.386 | 2.891 | 3.988 | 4.459 | 4.535 | |
正向 | 1.177 | 1.700 | 1.997 | 2.112 | 2.129 | |
标签值y | 2.13 | 2.13 | 2.13 | 2.13 | 2.13 | |
反向 | -0.953 | -0.430 | -0.133 | -0.018 | ||
反向 | -2.243 | -1.462 | -0.531 | -0.078 | ||
反向 | -8.973 | -26.317 | -28.662 | -6.698 | ||
反向 | -2.243 | -3.101 | -1.951 | -0.360 |
表2-2,先看“迭代-1”列,从上到下是一个完整的正向+反向的过程,最后一行是
运行示例代码可以得到如下结果:
1 | how to play: 1) input x, 2) calculate c, 3) input target number but not faraway from c |
为节省篇幅只列出了第一步和最后一步(第5步)的结果,第一步时c=1.177410
,最后一步时c=2.129577
,停止迭代。
2.3 梯度下降
2.3.1 从自然现象中理解梯度下降
在大多数文章中,都以“一个人被困在山上,需要迅速下到谷底”来举例,这个人会“寻找当前所处位置最陡峭的地方向下走”。这个例子中忽略了安全因素,这个人不可能沿着最陡峭的方向走,要考虑坡度。
在自然界中,梯度下降的最好例子,就是泉水下山的过程:
- 水受重力影响,会在当前位置,沿着最陡峭的方向流动,有时会形成瀑布(梯度下降);
- 水流下山的路径不是唯一的,在同一个地点,有可能有多个位置具有同样的陡峭程度,而造成了分流(可以得到多个解);
- 遇到坑洼地区,有可能形成湖泊,而终止下山过程(不能得到全局最优解,而是局部最优解)。
2.3.2 梯度下降的数学理解
梯度下降的数学公式:
其中:
:下一个值; :当前值; :减号,梯度的反向; :学习率或步长,控制每一步走的距离,不要太快以免错过了最佳景点,不要太慢以免时间太长; :梯度,函数当前位置的最快上升点; :函数。
梯度下降的三要素
- 当前点;
- 方向;
- 步长。
为什么说是“梯度下降”?
“梯度下降”包含了两层含义:
- 梯度:函数当前位置的最快上升点;
- 下降:与导数相反的方向,用数学语言描述就是那个减号。
亦即与上升相反的方向运动,就是下降。
图2-9解释了在函数极值点的两侧做梯度下降的计算过程,梯度下降的目的就是使得x值向极值点逼近。
2.3.3 单变量函数的梯度下降
假设一个单变量函数:
我们的目的是找到该函数的最小值,于是计算其微分:
假设初始位置为:
假设学习率:
根据公式(1),迭代公式:
假设终止条件为
1 | x=0.480000, y=0.230400 |
上面的过程如图2-10所示。
2.3.4 双变量的梯度下降
假设一个双变量函数:
我们的目的是找到该函数的最小值,于是计算其微分:
假设初始位置为:
假设学习率:
根据公式(1),迭代过程是的计算公式:
根据公式(1),假设终止条件为
表2-3 双变量梯度下降的迭代过程
迭代次数 | x | y | J(x,y) |
---|---|---|---|
1 | 3 | 1 | 9.708073 |
2 | 2.4 | 0.909070 | 6.382415 |
… | … | … | … |
15 | 0.105553 | 0.063481 | 0.015166 |
16 | 0.084442 | 0.050819 | 0.009711 |
迭代16次后,
上面的过程如表2-4所示,由于是双变量,所以需要用三维图来解释。请注意看两张图中间那条隐隐的黑色线,表示梯度下降的过程,从红色的高地一直沿着坡度向下走,直到蓝色的洼地。
表2-4 在三维空间内的梯度下降过程
2.3.5 学习率η的选择
在公式表达时,学习率被表示为learning_rate
,或者eta
。针对上面的例子,试验不同的学习率对迭代情况的影响,如表2-5所示。
表2-5 不同学习率对迭代情况的影响
代码示例
1 | class NeuralNet(object): |