梯度下降 怎么工作
假设你站在一座浓雾笼罩的山坡上。你想去最低的山谷,可太远了,看不见。不过,脚下往哪边倾斜,你还是感觉得到。朝倾斜的方向走一步,再走一步,最后总能到达谷底。减小损失的学习,也是这样一步一步地修正,这个办法叫梯度下降。
走下雾中的山坡
上一课说过,损失是衡量模型错得多厉害的数,越小越好。那么,怎样减小损失?把模型的某个值放在横轴上,把这个值对应的损失放在纵轴上画出来,就是一个中间凹下去的山谷形状。
谷底就是损失最小的地方。朝那里走下去就行,可在实际的模型里,没法事先看到这整张图。能知道的,只有你现在站的地方的坡度。
点走下一步。球会朝脚下坡度指向的低处滚去,损失随之减小。
每往下走一步,球的高度,也就是损失,就降低一些。看不见谷底也没关系,只要知道脚下往哪边倾斜,就总知道该往哪边走。
右边是下坡,就把值调大;左边是下坡,就把值调小。方向知道了,接下来是值到底要改多少。
一点点地改值
这里的值,就像一个可以拧的旋钮。前面看到的直线的斜率和截距,正是这样的旋钮。拧动旋钮,损失就会升降;看看脚下的坡度,就知道该往哪边拧才能让损失变小。
朝那个方向,把值改动一点点。用话来说,新的值就是现在的值,减去坡度乘以一个小数。也就是往坡度相反的方向,也就是下坡方向挪。不断重复这件事,就是关键。
点把值改一点。值会朝坡度指的方向稍微变一点,损失也相应减小。
每走一步,值就向谷的中间靠近一些,损失条也越来越短。坡度陡的地方,一次就动得多;越靠近谷底,坡度越缓,步子也越小。
这是因为修改的量和坡度成正比。不过,还剩一件事要定:乘在坡度上的那个小数,也就是一步迈多大,该定多少?
步子太大会跨过头
决定一步多大的这个数,叫学习率。学习率大,好像下得更快,可这里有个陷阱:在谷底附近步子太大,就会直接越过谷底,爬到对面的坡上去。
接着可能左右来回晃,损失反而变大。反过来,学习率太小虽然稳妥,走到谷底却要花很长时间。
选小步幅或大步幅走走看。步幅小,就一步步稳稳走向谷底;太大,就跨过谷底,弹到对面去。
小步幅稳稳地往下走,太大的步幅越过谷底,左右乱弹,离得越来越远。所以,学习率要选得不大不小。
实际中,会试几个值再挑;也有随着训练进行,把学习率一点点调小的做法。现在,用合适的步幅一直走到底吧。
反复迈步,走到谷底
现在办法齐了:用坡度定方向,用合适的步幅迈一步,再看坡度,再迈一步。一直这样重复下去,值就会靠近谷底。
越靠近谷底,坡度越接近平坦,步子也自然变小,最后几乎不动了。像这样稳定在一个地方,就叫收敛。
一直点一步。越靠近谷底步子越小,最后收敛到损失最小的那一点。
一步接一步,球落在了谷底,损失条也最短了。就算在雾里,只要相信脚下的坡度,一步步往下走,也能到达谷底。
实际模型的损失,往往不像这张图那样只有一个山谷。山谷有好几个时,可能停在附近较浅的山谷里,而不是最深的谷底。而且旋钮有几百万个,所以要分别量出每个旋钮的坡度,再一起修改。把数据分成一小批一小批,每次量一下坡度的做法,也用得很广。
小结
归纳起来是这样:把损失随值的变化画出来,就是山谷的形状。谷底看不见,但能量出脚下的坡度,所以朝倾斜的方向把值改一点,损失就会减小。不断重复这一步,就会靠近谷底。
一步的大小,也就是学习率,太大会跨过谷底,太小又走得慢。量出坡度,一步步往下走,这就是梯度下降。
依次点要点回顾一下。(损失是山谷 → 用坡度定方向 → 一步步改值 → 步幅要紧 → 收敛到谷底)
现在你知道了减小损失最基本的办法。量出坡度、一步步修正,这正是机器自己学习的诀窍。
那么,这些旋钮实际上装在哪儿?下一课来看构成神经网络的最小单位,神经元,看看它怎样修改权重和偏置这些旋钮来学习。