最后更新于
最后更新于
设为迭代步数, 为当前步学习率, 是损失函数, 是待优化参数, 是防止溢出的小正数.
Adam优化器的更新过程如下:
作为目前最常用的优化器, 有一个缺点是占用的显存较大. 要省显存, 就首先得知道显存花在哪里的. 首先最后计算得到的梯度是占用显存的, 且这部分是任何优化器都无法节省的.
除此之外, Adam优化器使用了一阶梯度和二阶梯度, 且在每一步使用滑动平均计算, 需要进行缓存, 这两部分也要占用缓存, 且各自占用的大小同上面的梯度一致.
Adam性能优秀, 很重要的一个点是每一个参数都有自适应学习率, 从上面的公式中也可以看出:
从上式中可以看出, 每个参数的自适应学习率为, 即通过SGD+二阶动量来实现的.
因此AdaFactor使用了新的度量标准, 广义KL散度, 形式为:
因此作为节省缓存的第一步, 考虑直接抛弃一阶动量, 这样显存的占用直接节省了1/3.
然后继续尝试压缩二阶动量的大小. AdaFactor使用到了低秩分解.
Adam中每个参数都会有各自独立的学习率, 但SGD中所有的参数共用一个学习率, 且SGD在很多任务或数据集中也能取得不错的效果, 带来的一个思路是精调每一个参数自己的学习率不是特别重要, 因此启发我们将换一种参数更少的近似可能也就足够了. 因此使用低秩分解来实现.
对于大小的矩阵, 希望找到大小为的矩阵和大小为的矩阵, 使得:
使用一个比较小的值, 这样矩阵和中的参数之和会远小于原来中参数的数量, 且仍能取得近似的效果, 这就是上面说的不再精调每个参数的学习率, 让参数之间共享部分信息.
AdaFactor中取, 将显存节省到了极致, 即寻找和, 使得:
为了达到近似的效果, 需要一个距离度量标准来进行约束, 容易想到欧式距离, 但这样没有解析解, 且在优化过程中, 即对应于更新中的二阶梯度应当是非负的, 但通过上面的目标函数优化得到的无法保证非负.
这个度量标准来自不等式, 当且仅当时等号成立. 将带入到不等式当中, 然后两端乘以, 则有:
当且仅当时, 等号成立. 将替换成, 替换成, 并且对所有的分量进行求和, 就得到了上面的广义KL散度的公式. 由于有取最小值的条件, 在将, , 带入后, 刚好有解析解:
解析解也很形象, 就是行, 列分别求和, 然后相乘, 再除以全体的和. 推导过程参考.
因此我们就可以维护两组缓存变量, 代表低秩分解后的结果, 解析解保证了点乘于原始二阶动量之间在广义KL散度度量下的最大近似性. 因此AdaFactor优化器的计算流程如下:
两变量的更新逻辑, 保证了两变量的非负性, 使得不等式始终满足条件, 解析解成立, 得到理论保证的近似效果, 进一步保证了优化的效果.