CLS 01 · 学习信号、表示与迁移
主线阅读与优先实验
标签供给、文本目标接口、视图/队列/MAE图与表示迁移证据
对应课堂(9 页)
可先阅读已有结果,再决定是否运行。重算时请核对各节记录的数据、参数、环境与日期。
学习路径: 表示怎样迁移到新任务
从已有分类器出发,依次问:训练答案从哪里来,两张视图如何构成训练题,遮挡图像怎样提供目标,学到的表示又怎样用于新任务。先顺着同源视图、队列、16块位置图读完这条线。多设备更新与分片状态已移入第六讲,不构成学习对比与重建的前置要求。
1. 训练闭环没有换,先问答案从哪里来
第二讲用一个具体闭环连接图像、网络、类别预测、人工标签、损失和参数更新。ImageNet 分类预训练让同一个网络读过大量图像,并从分类错误中调整表示。今天先保留这个闭环,把注意力放到标签:更多图片,是否意味着我们已经获得更多合适的训练题?
一张桌面图可以被标为“室内”,也可以要求框出两个杯子,还可以要求逐像素区分杯与桌面。这三种答案需要不同的判断与标注劳动。把粗类别集合拼在一起也不会自动得到细粒度答案:只标“杯子”的数据无法直接告诉我们哪一个是红杯。
2016 年的同期访谈中,Scale 共同创始人 Lucy Guo 与 Alexandr Wang 介绍了将人工任务、人员组织与质量控制包装成可调用服务的做法;任务包括分类、数据提取等。这段经历说明,监督供给也有组织与工程问题。同期访谈
一条路线是把人的判断组织得更有效;另一条路线是重新设计训练任务,让已有数据提供一部分答案。我们先借文字看看后一条路线怎样成立。
2. 同一段文字,两种可见条件
使用同一句话:The red cup is on the table.。这里用 The / red / cup / is / on / the / table / . 作为教学 token;实际 tokenizer 未必这样切。位置决定“当前预测的是哪一项”,可见条件决定模型能利用哪些信息。
| 任务 | 本次看见什么 | 目标从哪里取得 | 反馈怎样产生 |
|---|---|---|---|
| 从左到右预测 | The / red / cup |
原文下一个 token is |
提高正确 token 的预测概率 |
| 遮词预测 | The / red / [MASK] / is / on / the / table / . |
原文被遮住的 cup |
比较遮住位置的预测与目标 |
遮词可利用左右两侧,左到右预测不能提前看后文。两者都从已有文本构造目标;人仍参与文本写作、数据选择和任务设计。
回到从左到右预测:一个输出 token,成为下一步条件。 使用时,先由 The / red / cup 预测一个 token;选出 is 后,将它接到前文,再预测 on。训练时原文已经给出目标,使用时接入的是模型选出的 token,这两种过程要区分。
这里不需要展开 Q/K/V:先抓住 token、位置、可见条件、目标和逐步输出。自回归语言建模:GPT-2 技术报告 · BERT
3. 有了很多训练题,怎样把它们学完?
扩大数据与模型以后,能否把训练完成也影响方法设计。第三讲先把资源问题连到两项具体取舍:MoCo 复用近期 key,MAE 让昂贵编码器只看可见块。
训练目标也在分配计算解释这层接口。梯度归并、分片与通信的算例已集中到第六讲:训练目标与资源账本。接下来继续问:同一幅图的两种观察,怎样构成一个可学习的训练题?
继续研究训练资源
两个设备如何归并梯度、不同样本数怎样加权,已集中到第六讲:训练资源与同一次更新。本讲继续追踪资源约束怎样影响表示学习的具体选择:MoCo 保存近期 key,MAE 让昂贵编码器只读取可见块。
展开完整实现代码
# 多设备更新示例已迁至第六讲:https://deepnote.com/project/2ff4b87b-2904-4b9c-b9e9-bdbd72962691/notebook/e2c2fce2f81b40d59356bfe7a63361b0?utm_source=openai&utm_medium=mcp&utm_campaign=openaimcp&utm_content=e2c2fce2f81b40d59356bfe7a63361b0&utm_term=get_notebook计算条件怎样影响训练题
资源足够执行一次更新,还没有回答“图像里应该学什么”。接下来固定同一张图的两种观察,把一个视图作为查询、另一个作为正确配对,观察候选怎样进入损失。MoCo 的历史字典和 MAE 的可见位置,是本讲要逐项指认的资源取舍。
4. 第一条视觉路线:同一图像的两个视图
源场景

裁剪 A

裁剪 B

同一源场景的裁剪与变换,用于观察训练配对;图中的相似关系是任务设定。
对一张桌面照片做两种变换,产生查询视图 q 与对应的 key 视图 k⁺。同一照片提供正配对,不要求先写“杯子”标签。来自另一张照片的 key 可以进入比较字典,但它也可能拍了同一种杯子;“不同图像”不等于“不同语义类别”。
对归一化向量,点积可作相似度。MoCo 的目标让正确配对在字典里得到较高相对分数:
τ 决定分数进入 softmax 后的尖锐程度。目标关心的不是所有向量无条件相同,而是指定正配对相对候选更容易找回。MoCo
看图后先预测: 若两个裁剪都保留杯子但桌面背景不同,系统被要求忽略什么?若其中一张只剩桌面,正配对又要求了什么?
活动 B:队列身份与参数更新分开看
八个槽位 [a0,a1,b0,b1,c0,c1,d0,d1] 加入 [e0,e1] 后,最老的两项离开。保存的是旧特征,不是旧图片完整计算图。下面代码只追踪身份和EMA,不训练图像模型。
先预测第二批 [f0,f1] 入队后剩下谁,再算m=0.9时key参数从[0,2]向query [2,4]靠近两次的结果:[0.38,2.38]。平均的是网络参数,旧队列向量不会自动刷新。
完整解释归并到 队列保存的是带历史身份的 key、梯度更新和 EMA 更新作用在不同地方;指着画面走一步用 P17 本页说明。想看真正图像训练,再选 LAB 07 · MoCo:历史 key、队列与两种更新。
展开完整实现代码
# 独立 CPU 机制;追踪特征身份,不进行图像模型训练。
from collections import deque
queue = deque(['a0','a1','b0','b1','c0','c1','d0','d1'], maxlen=8)
m = 0.9
key_theta = [0.0,2.0]
query_theta = [2.0,4.0]
print('更新前:', list(queue))
for batch in (['e0','e1'], ['f0','f1']):
key_theta = [m*k+(1-m)*q for k,q in zip(key_theta,query_theta)]
queue.extend(batch)
print('加入',batch,'→',list(queue),'key参数',[round(x,4) for x in key_theta])
assert list(queue)==['c0','c1','d0','d1','e0','e1','f0','f1']
assert all(abs(a-b)<1e-12 for a,b in zip(key_theta,[0.38,2.38]))同一目标可以采用不同的候选组织
SimCLR主要比较当前批的双视图;MoCo把历史key放进字典。前者获得一致的当前编码,后者让候选容量与batch部分解耦,代价是旧特征陈旧性。方法组件可以组合,不是一条“新方法淘汰旧方法”的封闭家谱。
训练路径 x → f → h → g → z → loss 中,损失在z计算,梯度仍经过g回到f。迁移时读取h是另一种接口,而不是保证h保留全部颜色。在 z 上比较,为什么 h 仍会学习? 给出完整构造,已有图像训练给出了一次明确的取舍 给出相反直觉也可能出现的实际读出结果。
想深读此线,只需继续 CLS 05 · 对比学习:视图、投影与历史字典;暂时不必再从所有Notebook目录重新选择。
5. 第二条视觉路线:只看四块,预测其余位置
4×4,位置 0–15

仅位置 0/3/9/14 可见

16 块位置示意:可见位置为 0、3、9、14;其余是要预测的位置。完整源图提供目标,图中不展示虚构模型补全。
MAE 把图像分成 4×4 的 16 块。这个教学例子保留 4 块,遮住 12 块:编码器只读取可见块及其位置;轻量解码器将可见表示放回正确位置,再在缺失处插入 mask token,构成完整位置序列。隐藏位置的预测与原图相应位置比较,形成训练损失。训练之后主要保留编码器服务识别任务。MAE
先预测: 如果把相同四块的位置信息拿走,解码器还知道它们来自左上还是右下吗?把可见集合改为相邻四块,对推测全图会有什么影响?
对比目标强调变换后的关系;遮挡目标要求可见内容支持缺失内容预测。两种路线都有可能得到可复用表示,也都有选择代价:强变换可能删掉任务线索,重建可能把资源用在下游并不关心的纹理上。
展开完整实现代码
# 独立 CPU 练习:改变 visible 或 crop,观察位置与目标集合。
visible = {0,3,9,14}
crop = (0,0,4,4) # 网格坐标 (左,上,右,下),右/下边界不含;可改为 (0,0,2,4)
assert visible <= set(range(16))
left,top,right,bottom = crop
assert 0 <= left < right <= 4 and 0 <= top < bottom <= 4
retained = {4*r+c for r in range(top,bottom) for c in range(left,right)}
encoder_positions = sorted(visible & retained)
masked_positions = sorted(retained-visible)
print('编码器读入位置:',encoder_positions)
print('损失比较位置:',masked_positions)
print('解码器位置表:')
for r in range(4):
print(['OUT' if 4*r+c not in retained else (str(4*r+c) if 4*r+c in visible else 'MASK') for c in range(4)])
if crop == (0,0,4,4):
assert len(encoder_positions)==4 and len(masked_positions)==12
print('这些是输入/目标位置;这里没有训练或执行重建模型。')6. 什么变化应该忽略,哪些差别必须留下?
原始红零件

同一零件,减弱光强

同一几何,受控红蓝变化

同型号红蓝零件的增强情境;受控光强和色相变换用于讨论任务答案是否保持。
设下游要区分红色与蓝色的同型号零件。轮廓、孔位都一样,颜色才决定标签。整体无色光强变化可以改变“有多亮”而保持颜色关系;强色相变化却可能把红变蓝。把它们都统称为“颜色增强”,会掩盖两者对任务的不同含义。
现在固定编码器,只给少量标签训练一个线性读出。问题可以拆为三步:
- 结构是否允许保存颜色差异?一个多通道张量可以容纳它。
- 训练实际是否保留颜色差异?要求强色相不变的目标可能使它被忽略。
- 读出器能否使用已保留的信息?信息存在,不保证一条线性边界就能取出来。
先作判断: 对这个任务选哪一种变换?然后说明用什么误例或读出比较来改变判断。答案不依赖“增强越强越好”,而依赖最终要保留的差别。
四点 XOR:读不出来,不一定是没留下
四个表示 h 为 (−1,−1)、(−1,+1)、(+1,−1)、(+1,+1)。同号的两点标签为 0,异号的两点为 1。每一点都不同,标签信息并未因碰撞而消失,但这两组对角点不能被一条直线完全分开。
加一个确定性非线性特征 z=h₁×h₂ 后,同号为 +1、异号为 −1,一维阈值就能分开。这只构造了“表示与读出一起决定可用性”的例子;它不主张真实 SimCLR 的投影头必然学成这个乘法。
静态结果:原四点各有身份;新特征为 [+1,−1,−1,+1],用 z<0 读取标签得到 [0,1,1,0]。这也解释为什么需要同时报告冻结线性评价与允许非线性适配的评价。
展开完整实现代码
# 独立 CPU XOR 检查;这里的变换是手工构造。
h = [(-1,-1),(-1,1),(1,-1),(1,1)]
y = [0,1,1,0]
z = [a*b for a,b in h]
prediction = [int(v<0) for v in z]
assert prediction == y
assert tuple((h[0][j]+h[3][j])/2 for j in (0,1)) == (0,0)
assert tuple((h[1][j]+h[2][j])/2 for j in (0,1)) == (0,0)
print('h:',h,'手工非线性特征:',z,'阈值读出:',prediction)
print('两类凸包都包含原点;因此原空间不存在严格分开两类的直线。')7. 表示确实可以复用:看一个下游例子
MoCo 原论文 Table 2(b) 将在 ImageNet-1M 上预训练的 ResNet-50-C4 接入 Faster R-CNN,再用 PASCAL VOC trainval07+12 的检测标注全层微调 24k 次。在 test2007 上取 5 次实验平均,COCO 式 box AP 为:有监督预训练 53.5,MoCo 预训练 55.9。原文 Table 2(b) 与 §4.2.1
这里的积极证据是:通过视图对比学习的编码器可以适配对象检测,在这套明确协议下提供了有用起点。两组下游微调方案相匹配;检测头和主干都接受目标任务监督,这不是“冻结后自动会检测”,也不表示预训练与下游合计预算被完全配平。
这也自然引出下一部分:用哪一种目标预训练,与最后要输出类别、框还是掩码,是可以分别设计的两个问题。
选择一个使用问题,做一次完整比较
| 你的问题 | 首选实验 | 应保持的条件 |
|---|---|---|
| 现成表示里能读出什么? | LAB 01 · 固定表示:标签预算与读出 | 编码器、样本划分、预处理不变;改变标签预算或读出 |
| 允许改参数后是否值得? | LAB 02 · 参数迁移:冻结、局部与全量微调 | 同一源checkpoint、新任务与划分;比较冻结、局部、全量和scratch |
两本都使用已有有监督CNN及数字任务,不冒充自监督视觉预训练。LAB01显示固定表示下kNN与线性读出的差别;LAB02的默认历史协议中scratch验证CE更低,保留这个负结果是为了让判断由证据决定。
冻结读出与微调分别在问什么? 解释两种协议的含义;解冻更多参数,不保证更好 解释怎样读负结果。主线完成后再按需要读XOR或域变化,避免把所有短实验变成额外必做任务。
8. 从可用表示,转向对象的位置与边界
我们已经看到几种训练表示的方法:人工标签、从文本构造目标、图像视图关系、遮挡重建。计算组织使训练可实施,用途检验表示价值。
现在固定一份可用的视觉表示,改变要求:不只判断画面里有什么,还要找到每个对象的位置与边界。 历史上的 R-CNN 从有监督分类预训练出发,再用检测数据适配;检测并不以自监督为前提。
接下来追问:哪些计算可以复用,哪些空间信息必须留下,新的输出需要怎样的训练?
选择一个继续入口: 到 L03-CLS 02 看同一桌面场景的四种输出;到 L03-LAB 01 / 02 阅读已有真实结果;对无标签学习的前史感兴趣,可打开 LAB 05,看 Lloyd 如何实际拟合 patch 词典。