## 沿着一个 key,走完当前步与下一步 ## 解释、算例与证据 # P17 · 把一次学习完整走通 本页把前两页对象放回一条可追踪过程。纸面步骤与Notebook时序有细微差异,说明已明确标注。 图内标签与数值:P17 学习表示机制图,状态 3;同一输入;视图 a;视图 b;query 编码器;key 编码器;q;k⁺ = k₅;L = −ln p⁺;比较用旧字典;k₁ … k₄;q 与所有候选比较;k⁺ 是本轮正确项;梯度 → θq;EMA;k₅ 入队;k₁ 退队;k₂ k₃ k₄ k₅;下一批的字典;按原文算法 1:更新 query,再平均 key 参数并维护下一批的字典。 一对同源视图、query/key编码、正键与旧字典、损失、query梯度、key EMA和下一批字典在同图逐步接齐。 - 同一输入 - 视图 a - 视图 b - query 编码器 - key 编码器 - q - k⁺ = k₅ - L = −ln p⁺ - 比较用旧字典 - k₁ … k₄ - q 与所有候选比较 - k⁺ 是本轮正确项 - 梯度 → θq - EMA - k₅ 入队;k₁ 退队 - k₂ k₃ k₄ k₅ - 下一批的字典 - 按原文算法 1:更新 query,再平均 key 参数并维护下一批的字典。一对同源视图、query/key编码、正键与旧字典、损失、query梯度、key EMA和下一批字典在同图逐步接齐。 [查看对应图解状态](/#/l3-r2-p17/2)[查看完整图解](/course/figures/l3-r2-p17-2.html) ## 课堂讲述 现在把刚才拆开的部件接起来。同一图片产生两个视图,分别形成查询和正键;再加上队列中的其他键,构成这次需要区分的候选。 比较产生损失,损失通过查询分支改变参数。键编码器按自己的平均规则跟随,新的键进入队列,旧键离开。下一批数据到来时,网络参数和字典内容都已经不是上一批的状态。 请沿着箭头看:视图关系提供答案,损失提供更新方向,字典组织提供更多比较对象,慢编码器支持跨步复用。我们不需要在课堂手写整个训练框架,但要能够说明每个部件解决什么问题。否则拿掉一个部件以后,连实验在检验哪项假设都说不清楚。 ### 把一次学习走通,也读清实现顺序 [独立阅读](/course/blocks/moco-one-step-paper-and-code.html) 沿当前图逐项走:本批原图产生两视图;query/key编码器分别给出q、k⁺;q与k⁺及旧队列比较;loss更新query;key按EMA跟随;本次已经算出的k⁺入队、最老key出队。旧队列不因本步更新重算。 主讲画面按原论文Algorithm 1排列。当前LAB 07教学代码则在计算本批key之前执行EMA,再计算loss和query更新。这是训练步内的时序约定差异,读代码时必须跟着实际顺序,不要声称逐行相同。两者共享的关键机制是:query接受梯度、key停止梯度并平滑跟随、队列复用历史特征。 LAB 07另外在队列保存源图ID,屏蔽同源旧key,避免同一图片再次出现时成为自己的负例;不同源图仍可能属于同一类别。它没有论文的分布式ShuffleBN,训练15轮的效果也不用于论文排名。学生完成本节后,应能指出一条key何时生成、何时用于比较、何时离开。 **出处:**[MoCo 原论文 §3、§4.2、Table 2](https://arxiv.org/html/1911.05722v3) ### 模拟问答:旧 key 还能比较吗? [独立阅读](/course/blocks/moco-point-at-the-figure-dialogue.html) 以下为备课用模拟对话,不是实际课堂记录。 **学生:**“你说是前面算过的特征,图上到底哪几个?” **教师:**“队列里的k1到k4是本步开始前就存在的。正在两视图分支里生成的k5是这次的新key。比较结束后k1离开,k5进入;你看下一批字典仍有k2、k3、k4。” **学生:**“编码器已经变了,它们为什么还能比?” **教师:**“这是设计需要处理的困难。query可以随梯度更新,key参数用EMA缓慢跟随,减少相邻批之间的变化。旧向量没有重算,所以只能说缓和漂移,不能说完全一致。队列越长,最旧条目越老,取舍就更明显。” **学生:**“那EMA是不是改了队列里面的数?” **教师:**“没有。看箭头:EMA连的是两套网络参数,FIFO操作连的是向量槽位。把这两条箭头分开,整步就清楚了。” ## 沿这个问题继续 先读模拟对话并指着图回答,再读LAB 07真实训练函数;检查key无梯度、FIFO和源图ID屏蔽。 **出处:**[MoCo 原论文(2019 / CVPR 2020)](https://arxiv.org/html/1911.05722v3) #### 图示条件与公式约定 本图按 MoCo 原文 Algorithm 1 理解一次循环:两分支编码并对 key 停止梯度,使用旧字典计算损失,反传更新 query,EMA 更新 key 参数,再将本批键入队并移除最旧键。本页单样本教学循环:正键k+=k5,新字典为[k2,k3,k4,k5],只移出k1。P15另用双样本说明入队批量,二者规模明确区分。字典旧向量不被追溯重算。