## 梯度和 EMA,更新的是不同对象 ## 解释、算例与证据 # P16 · 两个编码器,不同的更新方式 两种参数更新解决不同任务:query学当前选择,key维持较平滑的编码规则。 图内标签与数值:P16 学习表示机制图,状态 2;查询视图;查询编码器 θq;q;对比损失;键视图;键编码器 θk;k⁺;梯度更新;键分支停止梯度;参数 EMA;θk ← m θk + (1−m) θq;0.9 × 1 + 0.1 × 2 = 1.1;这里的平均对象是网络参数;m = 0.9 仅用于教学算例。 query分支接受损失梯度,key分支停止梯度且参数由EMA跟随;算例0.9×1+0.1×2=1.1。 - 查询视图 - 查询编码器 θq - q - 对比损失 - 键视图 - 键编码器 θk - k⁺ - 梯度更新 - 键分支停止梯度 - 参数 EMA - θk ← m θk + (1−m) θq - 0.9 × 1 + 0.1 × 2 = 1.1 - 这里的平均对象是网络参数;m = 0.9 仅用于教学算例。query分支接受损失梯度,key分支停止梯度且参数由EMA跟随;算例0.9×1+0.1×2=1.1。 [查看对应图解状态](/#/l3-r2-p16/1)[查看完整图解](/course/figures/l3-r2-p16-1.html) ## 课堂讲述 查询编码器用梯度学习;键编码器不直接通过这条对比损失反向更新,而是用查询编码器参数的移动平均来跟随。 例如只看一个参数分量,旧的键参数是 1,当前查询参数是 2,平均系数取 0.9,那么键参数会变成 1.1,而不是立刻跳到 2。真实网络是对所有参数作这样的更新,这个小数字只是帮助我们看清“缓慢跟随”是什么意思。 这里的 momentum 平均的是网络参数,不是优化器里累积梯度的动量。较慢变化的键编码器,让跨批次保存的键更一致,但旧特征依然不是被神奇地刷新为今天的结果。队列和参数平均,分别回应“大”和“相对一致”两个要求。 ### 梯度更新和 EMA 更新作用在不同地方 [独立阅读](/course/blocks/moco-two-parameter-updates.html) query编码器从当前损失接收梯度,例如 $\theta_q\leftarrow\theta_q-\eta\nabla_{\theta_q}L$。key编码器不沿当前loss反传,而通过参数移动平均跟随query:$\theta_k\leftarrow m\theta_k+(1-m)\theta_q$。 令旧key参数为(0,2),当前query参数为(2,4),m=0.9,则key变为(0.2,2.2)。若query下一次仍不变,再更新得到(0.38,2.38)。平均的是网络参数,不是历史队列向量;也不同于优化器保存的梯度动量。 较慢的key变化减轻历史向量的坐标系漂移。它并不把历史key全部校正为新参数下的值,也不保证任意队列容量都合适。m=0立即追上query,m=1彻底冻结;这两个极端帮助理解时间尺度,但通常不是希望采用的默认方案。 ## 沿这个问题继续 手算两次EMA,并在图上指出梯度箭头与EMA箭头的落点;再到P17串完整一步。 **出处:**[MoCo 原论文(2019 / CVPR 2020)](https://arxiv.org/html/1911.05722v3) #### 图示条件与公式约定 EMA 算例 m=.9、旧 θk=1、当前 θq=2,结果1.1。真实网络对参数张量更新;这不是优化器梯度动量。 #### 这条线索的展开与后续阅读 - [查询编码器学得快,键编码器缓慢跟随](/supplement.html?return=l3-r2-p16/0#/l3-moco-ema/0) 本页说明