## 队列保留向量原值,同时更新成员 ## 解释、算例与证据 # P15 · MoCo:字典里保存的是特征 指认历史key的身份、加入与离开,先理解缓存到底存了什么,再问它是否仍一致。 图内标签与数值:P15 学习表示机制图,状态 2;容量 4 · 本轮新键 k₅、k₆ · FIFO 教学队列;当前图像 → key 编码器;k₅;k₆;入队的是特征;原图只说明来源;k3;k4;k5;k6;最旧;最新;k₅、k₆ 入队;k₁、k₂ 退队;队列中的旧键保持原值;更新编码器不会追溯重算它们。 四槽FIFO从k1—k4变为k3—k6;新键为已算向量,最旧两键移出。 - 容量 4 · 本轮新键 k₅、k₆ · FIFO 教学队列 - 当前图像 → key 编码器 - k₅ - k₆ - 入队的是特征 - 原图只说明来源 - k3 - k4 - k5 - k6 - 最旧 - 最新 - k₅、k₆ 入队 - k₁、k₂ 退队 - 队列中的旧键保持原值;更新编码器不会追溯重算它们。四槽FIFO从k1—k4变为k3—k6;新键为已算向量,最旧两键移出。 [查看对应图解状态](/#/l3-r2-p15/1)[查看完整图解](/course/figures/l3-r2-p15-1.html) ## 课堂讲述 MoCo 把对比学习看成查询字典。当前查询要在一组键中找到对应项,字典中的其他键可以来自前面的批次。 先看队列这一半。它保存的是已经计算出来的特征,不是每次都重新跑一遍网络的原图。本页容量为 4,旧队列是 [k1,k2,k3,k4];本轮有两个新键 k5、k6。每个查询先与自己的本轮正键和更新前的旧队列比较,再把两个新键按序加入,同时移走最旧的 k1、k2。下一批看到的字典是 [k3,k4,k5,k6]。P17 为便于跟完一整步,只用一个新键,所以只退一个旧键;两页的队列规则相同,示意批大小不同。 这样当前批次可以较小,候选字典仍然较大。数量问题有了办法,但假如编码器每步变化很快,队列里早些时候的特征和新特征就可能不太可比。旧键保存原值,不会自动刷新。MoCo 的另一半设计,正是控制生成键的那个编码器如何变化。 ### 队列保存的是带历史身份的 key [独立阅读](/course/blocks/moco-key-queue-identity.html) 沿本页的双样本示意,队列容量为 4,当前保存旧键 `[k1,k2,k3,k4]`。本轮两张图产生两个新键 k5、k6;每个查询先与自己的本轮正键及更新前的旧队列比较。比较完成后,将 k5、k6 按序加入,并移除最旧的 k1、k2;下一批使用的字典于是变为 `[k3,k4,k5,k6]`。这是“容量 4、每批 2 个新键”的教学设置。P17 为便于逐项跟踪,改用每批 1 个新键,得到 `[k2,k3,k4,k5]`;入队和出队遵守相同的先进先出规则。 每个槽保存的是当时算好的向量。k2不会因为查询编码器更新,就自动变成今天重新编码的k2;也没有保存一条可以反传回早先图像的完整计算图。队列的身份标签帮助我们看清“新信息进入、旧信息退出”,向量值则用于相似度计算。 容量更大可以提供更多比较对象,也使最旧条目来自更早的步骤。容量、batch大小和编码器变化速度因此互相影响。课堂图只画4个槽便于指认,不能把4当作MoCo论文的配置。 ### 沿着图解追问 以下是备课用的模拟师生对话,不是课堂实录。 **学生:**为什么这张图一次移走两个旧键,P17 却只移走一个? **教师:**本页一批放入 k5、k6 两个新键,所以容量不变时退掉最旧的 k1、k2,得到 [k3,k4,k5,k6]。P17 用 k5 一个新键跟完一整步,所以只退掉 k1,得到 [k2,k3,k4,k5]。队列规则没有改变,示意的批大小不同。 ## 沿这个问题继续 用4槽字典手推两步;LAB 07的trace是对应代码入口,不需要重训就能先理解对象。 **出处:**[MoCo 原论文(2019 / CVPR 2020)](https://arxiv.org/html/1911.05722v3) #### 图示条件与公式约定 容量 4、本轮 2 个新键仅为便于观察的教学队列,不是原论文超参数。比较使用本轮更新前队列;示意下一批的维护结果为 [k3,k4,k5,k6]。 P17 改用每批 1 个新键跟完一次学习,因而只移出 k1,下一批字典为 [k2,k3,k4,k5];两页示意批大小不同,先进先出规则相同。 #### 这条线索的展开与后续阅读 - [MoCo:让候选字典跨越当前批次](/supplement.html?return=l3-r2-p15/0#/l3-moco-queue/0) 本页说明