靴徘讦劭
O. 术语
讲一些神秘的术语。
one-hot
:“变量”也可以被看作“变量字典集合”中单一元素的子集。集合的子集可以用布尔向量描述,那么一个变量对应的 one-hot 向量就是该单一元素子集对应的仅在一个位置上为一的向量。zero-shot
:零样本。即,在某个数据集上训练完成的模型直接迁移到另一个数据集上跑。linear-protocol
:训练一个骨干网络后,冻结其中的参数,然后只对各个数据集跑最后的全连接层。
I. MLP
Affine-ReLU/Sigmoid 叠加即是 MLP。
II. CNN
CNN 网络的构造基本上就是 卷积-(BatchNorm)-ReLU-MaxPool 层的叠加,最后接上几层 Affine。卷积也可以使用多层,即 [卷积-ReLU-卷积-ReLU-卷积] 搭配 shortcut 来替代单个卷积。
III. ResNet
ResNet 就是 shortcut 构建。shortcut 在两端维数相同时可以用恒等映射,否则要用 Affine 层,有时效果不是很好(指层数很多)。
IV. RNN
RNN 有一个隐藏状态 , 由 和输入 经过某些层(这些层的参数在一切时刻均是共享的)得到,然后 进一步变成输出 。
反向传播有时需要梯度剪裁,即若梯度超过阈值 则将其模长手动放缩为阈值。这样可以避免梯度爆炸。
IV.I. GRU
GRU 的隐藏状态并非直接由 与 得到,而是先算遗忘门 和更新门 , 衡量 贡献给候选隐藏态 的部分, 衡量 和 贡献给 的部分。
IV.II. LSTM
忘记门:将值向 减少。
输入门:是否忽略输入。
输出门:是否使用隐藏态。
候选记忆状态:。
记忆单元:。
隐藏态:。
V. Attention
词向量可以描述一个词汇,距离衡量两个词汇的相似之处。然而存在一词多义,且一个词可能经由其它成分修饰并拥有完全不同的含义,因此上下文有关。
首先假定我们知道的词向量仅仅包含两个信息:词汇本身,与词汇所在位置。我们的目的是将其转为考虑完上下文后的结果。
词汇位置 可以加上例如下方的向量加以表示:
使用统一的 矩阵( 是模型参数),可以由词向量 生成 。同理,有 矩阵自 生成 。然后作 softmax 归一化,归一化后的矩阵即为注意力矩阵。同理,可以用 生成 。生成背景信息向量 后,将其加到原本的词向量 即可让该词向量与上下文结合。
词向量的维数常常是万级别的,而注意力矩阵的维数仅仅是百级别。 的长宽均为词向量的维数,这意味着一大堆参数。而如果把 的 换成 的两个矩阵,则参数数目立刻就能剧烈减少。
以上部分是单自注意力头的实现。多头的话,就是无数个 矩阵并行,得到很多背景信息向量,然后全部把它加到词向量上。
VI. Transformer
Transformer 是 Encoder-Decoder 的结构。Encoder 由若干 encoder block 组成,一个 block 包含一次多头连接、一次 Add&Norm、一次 Feed Forward、又一次 Add&Norm。
Add&Norm 是 shortcut 连接后作 Batch-Norm 归一化。
Feed Forward 是 Affine-ReLU-Affine 层。
Decoder block 由三部分组成:第一部分是 Masked 多头+Add&Norm,第二部分是多头+Add&Norm,第三部分是 Feed Forward+Add&Norm,最后作 Softmax 输出。
VII. 对比学习
“监督”指人工对数据的标注。对比学习是一种无监督(有时也认为是自监督)算法。
其思想为:两张图片的相似是不依赖于图片实现的。因此若能将图片转成向量,即可用向量的距离衡量向量的相似,正如 attention 机制尝试将 token 转成向量。事实上,图片也是一种 token,也即这其实属于一种广义的嵌入(真的是广义的吗?狭义的嵌入好像就是这个意思了)。
对比学习需要有衡量相似的方式,而这一“衡量”其实就是一种监督。一般使用“代理任务”作为监督。
有监督学习中,将模型输出与 ground truth 作比计算误差;而对比学习中,定义正负样本,在样本和样本间计算误差。
最基础的代理任务是“个体判别”,所有图像均自成一类,希望将所有图片输入尽量地分开。用一个图片的所有数据增强作为正样本,与其它图片及其数据增强的配对作为负样本。
VII.I. InstDisc
InstDisc 模型采取的任务即为个体判别。使用 CNN 将图片转成初步向量嵌入后,使用数据集中所有图片的嵌入向量(它们的维数不能过高)建立一个 memory bank,每次从 memory bank 中随机一批作负样本,用其修正当前 batch 的嵌入向量后,更新 memory bank。
VII.II. InvaSpread
对于输入的一个 batch,对 batch 中的所有图片数据增强得到一份副本,则一份原本的正样本是其副本,负样本是所有其它图片的原本和副本。缺点:负样本太少了!!!
VII.III. CPC
数据是一个序列。编码器将其转成向量列。向量列输入 RNN 得到隐藏状态,隐藏状态记录了上文的一些信息;如果隐藏态足够优秀,则其理应可以被用于预测下文。因此用“隐藏态-将来态”配对作为正样本,负样本较为随意,例如随机生成 token 通过编码器得到的输出与隐藏态的配对即可作为负样本。
VII.IV. CMC
同一个物体不同的视角下互为正样本。例如,原始图像、深度信息、图像分割等,应具有相似嵌入向量。
VII.V. MoCo
最牛的一集。
MoCo 认为,Transformer 之类的自然语言学习之所以能做到无监督,是因为自然语言的语素是离散的、可以建立字典的,建立字典就等同于为所有 token 打上了字典的标签。然而视觉领域的图像是高维的、连续的,故而相似的方法无法奏效。
本质上其实就是 InstDisc。建立字典后,要求嵌入向量尽量靠近正样本并远离负样本。
用 表示“anchor
”,即样本本身;anchor
经过数据增强得到 positive
正样本 ; 经过编码器得到嵌入 ,看作询问 query
; 得到一堆嵌入 ,看作键值 key
。键值构成字典。
字典首先要大,才能更好学习特征。还有一个要求是字典要尽量保持一致。
原因:字典小时容易有过拟合的 shortcut。字典不一致(采取了不一样或不类似的编码器)时也许会导致寻找到采取同一个编码器的 shortcut。
但是显卡无法存储过大的字典。因此采用队列处理字典,随着 batch 扫过整个数据集,队列跟着 push 和 pop。与此同时,不同 batch 会更新编码器的参数,因此要采取 momentum encoder,即令 为 的 encoder, 为 的 encoder,则更新为 ,使得队列中全体编码器均为相似编码器。
思想是这样,以下是一些细节:
- 误差函数怎么写?
常规误差:输出结果与 Ground Truth 间的误差。
对比式误差:算嵌入向量间的距离。
对抗式误差:算两个概率分布的差。
先别急。
对于询问 ,假定有唯一的 与其配对。我们希望让误差函数在下述两点同时满足时,较低:
- 与 相近。
- 与全体其它 均不相近。
于是可以定义 InfoNCE-loss,即 noise contrastive estimation,公式为
可以想见,其与 softmax 公式很像。其是把唯一的 当作数据,然后其它的所有 均是噪声。estimation 意味着 可以选择一组抽样来拟合【这组抽样包含 与其它 个抽样的 】。
是温度超参数,用来调整曲线平滑度的。过大的 会导致所有负样本被一视同仁,难以区分;过小的 会强调那些困难的负样本,而困难的负样本正是那些长得很像锚样本的样本,也即潜在的正样本,因此也并非好的学习策略。
- 其本质还是一个 类的交叉熵误差,目标是把 分到 的类别中。
误差函数之外,还要研究将 与 的编码器。编码器可以相同(在 的场合共享参数)、部分共享参数,或是完全独立。
什么是 MoCo(Momentum Contrast)?
- 使用队列维护字典。若干个 batch 共用一批相似的字典,新 batch 投入时,一段时间以前的旧字典元素会被丢弃。
- 的编码器是需要更新的。但是如果每次更新均对字典中所有元素更改编码器,这代价很高。因此允许字典中元素使用不同编码器,为了保证编码器的相似性使用 。为保证一致性, 取很大,如 。
VII.VI. CLIP
CLIP 是多模态的对比学习。其输入是“图片-描述”对,二者分别经过独立 encoder 后,得到的嵌入向量被看作是正样本,所有来自不同对的配对向量被看作是负样本。也即,大小为 的 batch 中包含 个正样本对和 个负样本对。矩阵形式下,则对角线元素为正样本。
对比学习完成后,依赖 prompt 处理细分任务。也即,如果图像识别,每个 class 是一种动物,则可以按照 a picture of a ___, a kind of animal
这样的自然语言方法对整句话 encode 后寻找与图片最接近的描述。
“图片-描述”的对,使得迁移性大大增强,添加新类别的工作变得容易。
Loss 函数,从图像的角度,则有 个正样本和 负样本,可以同上交叉熵算;从文本同理,两个误差求和取平均得到总平均误差。
VII.VII. ImageBind
省流:CLIP 加大加量版本。
将各种模态绑在一起,在它们的嵌入直接建立联系。涉及到的模态包括文本、音频、视频、深度图像、IMU(惯性单元?)等。该方法以 image 或 video 为核心,其它模态是可选的,因此对数据集质量的要求不高。因此该方法被称作 ImageBind,即尝试把 image 与其它模态对齐。其应用有:
- 跨模态检索,例如给定音频寻找相关图片。
- 嵌入增加,例如海浪声嵌入可以在图片中增加海的背景。
- 音频到图像的生成,通过 DALLE 解码器实现。
ImageBind 要求模态对齐,即两个模态下数据的配对。常见的对齐模态有 (image,text);(audio,text);(image,depth);(video,audio)
等对齐。CLIP 仅支持双模态对齐,而 IB 若训练 (A,B)
和 (B,C)
同时对齐,则有理由相信 (A,C)
也对齐了。
对于两个模态下的数据 ,通过 encoder 得到嵌入 ,然后使用 InfoICE 衡量误差。
训练完成后,嵌入增加可以直接将嵌入向量求和,然后在数据库里检索相近图片。图像生成是 DALLE 相关。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通