关于Keras中Adam优化器代码的偏差修正与epsilon缩放疑问
1. 该代码确实执行偏差修正
你提到的代码行:
alpha = lr * tf.sqrt(1 - beta_2_power) / (1 - beta_1_power)
本质是将Adam算法中的偏差修正逻辑合并到了学习率的缩放系数中。
原始Adam算法里,偏差修正针对一阶矩估计(m)和二阶矩估计(v)分别进行:
- 修正后一阶矩:$\hat{m}_t = m_t / (1 - \beta_1^t)$
- 修正后二阶矩:$\hat{v}_t = v_t / (1 - \beta_2^t)$
参数更新公式为:$\theta_{t+1} = \theta_t - \eta * \hat{m}_t / (\sqrt{\hat{v}_t} + \epsilon)$($\eta$为原始学习率)
而Keras的写法,相当于把原始学习率$\eta$乘以$\sqrt{1 - \beta_2^t}/(1 - \beta_1^t)$,将两个修正项的影响整合到新的alpha中。后续参数更新时直接使用未修正的m和v计算,最终结果和原始算法完全等价。
2. 关于epsilon的隐式缩放
你的理解完全正确,这种写法确实对epsilon做了隐式的$\sqrt{1 - \beta_2^t}$因子缩放。
原始算法的更新项展开后是:
$$\frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} = \frac{m_t/(1-\beta_1t)}{\sqrt{v_t/(1-\beta_2t)} + \epsilon} = \frac{m_t * \sqrt{1-\beta_2t}}{(1-\beta_1t)(\sqrt{v_t} + \epsilon * \sqrt{1-\beta_2^t})}$$
Keras的更新逻辑代入alpha后是:
$$\text{alpha} * \frac{m_t}{\sqrt{v_t} + \epsilon} = \eta * \frac{\sqrt{1-\beta_2t}}{1-\beta_1t} * \frac{m_t}{\sqrt{v_t} + \epsilon} = \eta * \frac{m_t * \sqrt{1-\beta_2t}}{(1-\beta_1t)(\sqrt{v_t} + \epsilon)}$$
对比两者可见,Keras的写法相当于把原始算法中的$\epsilon$替换成了$\epsilon / \sqrt{1-\beta_2^t}$,也就是对epsilon进行了缩放。
正如你所说,由于epsilon本身是极小的常数(通常取1e-8量级),这种缩放在实际训练中几乎不会影响模型性能,它的核心作用始终是避免除零错误。
内容的提问来源于stack exchange,提问作者Yandle

