IT 论文精读 · PAPER 49

Adam:随机优化的默认解

Kingma & Ba · University of Amsterdam / University of Toronto · ICLR 2015

EN →

这篇论文干了什么?

2014 年底,两位研究者(Kingma 与 Ba)提出了一个叫 Adam 的「优化器」。训练一个神经网络(比如 ChatGPT 背后的模型),本质是让它一步步把几十亿个「旋钮」拧到刚好——优化器就是决定每一步该往哪拧、拧多大的那套规则。Adam 的贡献是:让这件事几乎不用手动调,拿默认设置就能稳稳跑起来。它简单、稳、好用到今天几乎每个深度模型都在用它训练。

先说个麻烦事

把训练想成蒙着眼下山:你只能用脚感觉脚下的坡度,然后朝下坡迈一步。迈多大,就是「学习率」。麻烦在于——整座山只让你用一个固定的步幅。可有的方向是陡崖,步子稍大就冲过头、来回弹;有的方向是平缓的长坡,步子太小就得爬到天荒地老。一个步幅同时伺候陡崖和平原,怎么都不对。于是调这个步子成了苦差事,像走钢丝:大一点就震荡发散,小一点就慢得没边。

那个点子

Adam 把两个朴素的想法合到一起。第一个是「惯性」:别只看当下这一步的坡度(它被随机的噪声搞得忽左忽右),而是记住「我最近一直大致朝哪个方向走」,顺着这个平均方向走——就像下坡的球有惯性,不会被每个小坑绊停。第二个是「给每个方向配自己的步幅」:不再全山一个步子,而是每个方向按它自己的脾气自动定步长——一直剧烈晃动的方向,就小步、谨慎;几乎不动的方向,就大步、大胆。

它怎么做到的?

Adam 给每个旋钮各记两本小账。第一本记「这个方向我平均在往哪走」(把最近几步的坡度做个带惯性的平均,抹掉抖动);第二本记「这个方向的坡有多大、多爱抖」(把最近几步坡度的大小也平均一下)。走的时候,它朝第一本账的方向迈步,但用第二本账去缩放步幅:这个方向一向坡大又抖,就把步子除小一点、走稳;一向平缓,就放开步子。

妙处在于:坡度整体是大是小、单位是什么,都被这一「除」自动抵消掉了——你不用再为每个方向、每个阶段手调步子,每一步大约都走「一个合适的距离」。还有个贴心设计:这两本账刚开局时是空的、会把人往「不敢动」的方向带偏,Adam 用一个小小的开局校正把这个偏差抹平,让最初几步也走得对。

带来了什么

结果是:训练一个新模型,从「先花几天调学习率」变成「用 Adam 默认值先跑起来」。它对设置不挑、开箱即用、又快又稳,于是成了深度学习十年里的默认选择——今天你听过的大模型,绝大多数是用 Adam(或它的改良版)训出来的。

也说句实在话:它不是万灵药。在某些任务上,老老实实调好的简单方法反而能得到泛化略好一点的模型;而且它每个旋钮要多记两本账,吃掉不少额外内存——模型越大越肉疼。

一句话记住

训练模型就是蒙眼下山、每步决定往哪迈多大。Adam 给每个方向各记两本账——「平均往哪走」(惯性)和「这里坡多大多抖」(幅度)——朝平均方向走、按幅度自动缩放步子,于是几乎不用手调就又快又稳。它是当代几乎所有深度模型的默认优化器。

想看更新公式、两个「矩」的滑动平均与偏差校正、以及后来发现的收敛漏洞? → 切到精读版