把梯度下降讲给外婆听
外婆八十二岁,识字不多,但她会腌最好的萝卜干,知道什么时候下雨。上个月她问我:你每天对着电脑,到底在做什么?
我想了很久。说「训练神经网络」是不行的,说「优化损失函数」更不行。最后我说:外婆,我在教一台机器下山。
山和雾
想象你站在一座山上,起了很浓的雾,你什么都看不见,只能看见自己脚下这一小块地。你想下山,怎么办?
外婆说:那就看哪边往下斜,就往哪边走呗。
对,这就是全部了。这就是梯度下降。机器每一步都摸一摸脚下的坡度,朝最陡的下坡方向挪一小步。挪一步,再摸一摸,再挪一步。几百万次以后,它就到了谷底——虽然它从头到尾都没看见过整座山。
聪明不是看得远,是每一步都踩得准。——外婆听完之后说的,我记在了实验日志第一页。
那一小步有多大
外婆接着问:步子迈多大呢?这个问题让我愣住了——她一句话问到了学习率。
步子太大,会从山谷这边直接跨到那边,永远在两侧震荡;步子太小,天黑了你还在半山腰。调参数的人一辈子都在跟这件事较劲。
# 整个深度学习,本质上就是这几行
for step in range(1_000_000):
loss = criterion(model(x), y) # 我现在站在哪,多高
loss.backward() # 摸一摸脚下的坡度
optimizer.step() # 朝下坡挪一小步
optimizer.zero_grad() # 忘掉刚才的坡,重新摸外婆看不懂这些字母。但她说:哦,就是摸着石头下山嘛,你外公修水库那会儿就这么干。
那天之后我常想,我们这行的大部分黑话,其实都能翻译成一个八十二岁的人早就知道的道理。翻译不出来的那部分,多半是我们自己也没真懂。