基础概念
1、 Contrastive Multiview Coding(CMC)
1.1 正负样本的定义方式

给定一组视图,通过将同一场景的视图在嵌入空间中聚集在一起,同时将不同场景的视图分开来学习deep representation。每个视图的encoding可以串联起来形成场景的完整表示。
- 正样本:同一个图片/场景的不同视图互为正样本
- 负样本:不同图片/场景的视图都互为负样本
1.2 Loss函数的定义方式

其中, h ( ⋅ ) h(·) h(⋅)函数对正样本对输出高值,对负样本对输出为低值。该函数从包含k个负样本的集合S = { x , y 1 , y 2 , . . , y k x,y_1,y_2,..,y_k x,y1,y2,..,yk }中正确选择单个正样本x。
双视图的改进: 
其中k为负样本个数。
-
如何解决K负样本个数过大的问题?
- 1.MemoryBank:随机采样m个负样本和一个正样本共同组成 m + 1 m+1 m+1个数量的样本。
- 2.采用噪声对比估计(NCE-Loss):将k+1个数据理解为k+1个类别进行计算
-
h ( ⋅ ) h(·) h(⋅)函数如何计算?

- 采用两个编码器分别计算输入样本对的representation
- 采用余弦相似度计算输入样本对的representation的相似度得分
- 采用超参数动态调整相似度得分的范围
-
双视图的计算方式

- 对称的计算方式:给定视图V1,枚举计算V2;给定视图V2,枚举计算V1
2、Momentum Contrast for Unsupervised Visual Representation Learning(MOCO)
2.1 正负样本的定义方式

提出动量对比( MoCo )作为一种构建大、一致的字典的方法,用于无监督学习中的对比损失。
- 队列机制:将字典维护为数据样本的队列:当前mini - batch的编码representation进入队列,时间最老的representation的minibatch离开队列。队列将字典大小与小批量样本的大小解耦,允许该字典很大。
- 动量更新机制:由于字典key来自前面的几个小批量,为了保持一致性,文章提出了一个缓慢更新的key编码器,作为q编码器的基于动量的移动平均实现。
2.2 Loss函数的定义方式
2.2.1 将对比学习理解为字典查询问题

- 考虑一个编码查询q和一组编码样本{ k 0 , k 1 , k 2 , . . k_0,k_1,k_2,.. k0,k1,k2,.. },它们是字典的键key。假设字典中存在q个匹配的单键key(记为 k + k^+ k+)。
- infoNCE:对比损失是一个函数,当q与它的正样本 k + k^+ k+相似而与所有其他key(考虑q的负样本key)不相似时,它的值很低。
2.2.2 动量机制下的对比学习
-
队列机制
- 方法的核心是维护字典作为数据样本的队列。这使得我们可以重用从紧前的小批量中编码的密钥。队列的引入使得字典规模与小批量规模解耦。我们的字典规模可以远大于典型的小批量规模,并且可以作为超参数灵活地独立设置。
- 队列更新:
- 逐步替换字典中的样本。将当前小批量送入字典,并删除队列中最老的小批量key
- 字典中的数据样本始终代表所有数据的采样子集
- 删除最旧的mini - batch是有益的,因为它的编码key对应的representation是最过时的,因此与最新的key的representation最不一致
-
动量更新机制

- 队列机制带来的问题:梯度应该反向传播到队列中的所有样本,大的字典使得更新key编码器变得困难。一个简单的解决方案是从查询编码器fq中复制密钥编码器fk,忽略这个梯度。但是这个解决方案在实验中降低了key的representation的一致性。
- 解决办法:
- 复制q的编码器到key编码器中
- 引入动量机制m。式中: m ∈ ( 0 , 1 ) m∈ (0,1 ) m∈(0,1)为动量系数。仅对参数 θ q θ_q θq进行反向传播更新
- 解决办法:
2.2.3 MOCO与过去对比学习方法的比较

- 端到端的学习方式(end to end)
- 优点:
- 数据的编码一致性
- 缺点:
- 字典的大小和batchsize的大小一致,受GPU内存大小限制,batchsize的大小不能设置过大
- Memory Bank
- 优点:每个小批量的字典从内存库中随机采样,不需要反向传播,因此可以支持较大的字典大小。
- 缺点:由于Memorybank不及时进行反向传播(更新),导致库中的key的representation是与当前batchsize的representation差异较大,所以,样本一致性差
- Moco
- 队列机制:解决因GPU现存导致字典不能过大问题
- 动量更新机制:解决样本一致性问题
3、A Simple Framework for Contrastive Learning of Visual Representations(SimCLR)
3.1 正负样本的定义

- 随机数据增强模块:它将任意给定的数据示例随机转换为同一样本的两个相关视图,记为" x i x_i xi “和” x j x_j xj ",将其视为正对(正样本对)。
- 编码器模块:从增广数据实例中提取representation向量的神经网络基编码器 f ( ⋅ ) f ( · ) f(⋅)
- 预测模块:一个神经网络投影头 g ( ⋅ ) g ( · ) g(⋅),将representation映射到应用对比损失的空间。该模块具有隐藏层的MLP、RELU函数。
- 正负样本的定义:
- 从N个样本中随机抽取一个小批量数据,并将对比预测任务定义在由小批量数据导出的增广样本对上,产生2N个数据点。给定一个正例对,将小批量数据中的*2( N-1)*的其他数据视为负例。
3.2 损失函数的定义

- s i m ( ⋅ ) sim(·) sim(⋅):定义为相似度函数,如余弦相似度
- 1 ∈ 0 , 1 1 ∈{ 0,1 } 1∈0,1 :定义为指示函数
- τ τ τ:定义为温度参数。
- 最后的损失是在一个小批量中计算所有的正对,包括 ( i , j ) ( i , j) (i,j)和 ( j , i ) ( j , i) (j,i)。
4、Learning Transferable Visual Models From Natural Language Supervision(CLIP)
4.1 模型总览
当标准图像模型联合训练一个图像特征提取器和一个线性分类器来预测某个标签时,CLIP联合训练一个图像编码器和一个文本编码器来预测一批(图像、文字)训练样本的正确配对。
在测试时刻,学习的文本编码器通过嵌入目标数据集类的名称或描述,合成一个零样本线性分类器
-
对比学习预训练
-
text encoder
-
image encoder
-
相似性矩阵
矩阵中对角线的位置为1,其余位置全为0
-
-
从标签文本中生成数据集类别描述
- 为了提高model泛化性,作者提出新办法,从 text 中提取监督信号。(正是有了监督信号(覆盖范围广)的存在,model 的泛化能力得到提高)作者利用4亿 text-image-pair-dataset ,选择自监督训练方式,进而训练模型。
- 出发点:
- 单个单词的标签可能对图像的描述有歧义,比如一词多义;而将标签单词放入具体的语境时,单词的语义受到语境的限制,不会出现一词多义的情况
- 出发点:
- 为了提高model泛化性,作者提出新办法,从 text 中提取监督信号。(正是有了监督信号(覆盖范围广)的存在,model 的泛化能力得到提高)作者利用4亿 text-image-pair-dataset ,选择自监督训练方式,进而训练模型。
-
用’‘0样本’'进行预测
-
什么是’‘0样本迁移学习’'?
在计算机视觉中,零样本学习通常是指将图像分类中的不可见目标类别泛化的研究。在无监督学习领域的大量研究关注机器学习系统的表示学习能力的同时,作者将零样本迁移作为衡量机器学习系统任务学习能力的一种方式。在这种观点下,使用未知数据集评估模型在特定数据分布上的任务的性能。 -
什么是linear-probe? (与微调的概念相反)
在训练下游任务时,不微调训预训练模型的模型参数(冻住骨干网络的模型参数),而是用预训练好的模型提取数据特征,利用该特征训练一个线性/非线性层去做分类任务(MLP层)
-
5、SYNCOBERT: Syntax-Guided Multi-Modal Contrastive Pre-Training for Code Representation
5.1 模型总览图

5.2正负样本的定义方式
-
正样本:
- NL和PL - AST构成了一个正样本对
为了弥补自然语言和代码片段之间的差距,将一个NL和PL-AST视为一对正样本 - NL-PL-AST和NL-AST-PL构成一个正样本对:为了更好地学习PL和AST在相同NL条件下的语义等价性,提出将
{
w
,
c
,
a
}
\{w,c,a\}
{w,c,a}的顺序翻转为
{
w
,
a
,
c
}
\{w,a,c\}
{w,a,c}来构造另一组正样本。
- 首先用不同的随机种子对原始输入三元组进行掩码。这一步旨在增加正对之间的差异
- 其次对掩码后的PL-AST交换顺序。
- 对于非配对数据,仅考虑PL - AST vs AST - PL构建正样本对。该方案与前面介绍的不考虑NL注释的NL - PL - AST 和 NL - AST - PL的设置相同。
- NL和PL - AST构成了一个正样本对
-
负样本:
- 为了获得负样本,采用了批内采样和跨批采样。对于一批大小为N的训练数据b1 = [ x 1 . . . x N ] [ x_1 ... x_N] [x1...xN],首先可以利用前面描述的方案得到另一批大小为N的正数据b2 = [ x 1 + . . . x N + ] [ x_1^+ ... x_N^+] [x1+...xN+],其中{ x i x_i xi, x i + x_i^+ xi+ }为正对。对于 x i x_i xi,批内负样本和跨批负样本均为 x j x_j xj,其中 j ≠ i j≠i j=i。这样可以得到每个 x i x_i xi的2N - 2个负样本的集合。
5.3 Loss函数的定义方式
5.3.1 多模态屏蔽语言建模(MMLM)
将NLP任务Masked Language Model ( MLM )扩展到多个模态。给定一个NL - PL - AST三元组{
w
,
c
,
a
w,c,a
w,c,a }的数据点作为输入,从NL、PL和AST的串联中随机选择15 %的token。我们将其中80 %替换为[ MASK ]token,10 %替换为随机token,其余10 %不变

- 其中 M = w m ∪ c m ∪ a m M = w^m∪c^m∪a^m M=wm∪cm∪am是 N L ( w m ) , P L ( c m ) , A S T ( a m ) NL ( w^m ),PL ( c^m ),AST ( a^m ) NL(wm ),PL(cm ),AST(am )的masked的token的集合.
- V表示词汇大小
- y i M M L M y_i^{MMLM} yiMMLM表示masked的token的标签, p i M M L M p_i^{MMLM} piMMLM 表示masked的token的预测概率。
5.3.2 标识符预测
对于源代码中的每个token,如果是标识符则使用标签1,否则使用标签0 。因此,IP损失函数是一个二分类损失

- 其中 p i I P p_i^{IP} piIP是第i个代码token的预测标识符概率, y i I P y_i^{IP} yiIP是第i个代码token的标签(如果是标识符则标签为1;否则为0)。
什么是标识符

5.3.3 AST边预测(AST Edge Prediction)
受Graph Code BERT 中提出的数据流图边屏蔽技术的启发,作者设计了一个AST边预测目标,在不引入额外模块的情况下,简单直接地将树结构信息编码到模型中。为了融入这些树结构信息,作者在AST中屏蔽了边,并要求模型预测这些边。

- N a N_a Na表示所有AST节点对的集合,一个节点对 ( n o d e i , n o d e j ) (node_i,node_j) (nodei,nodej) 。
- y ( i , j ) T E P y_{(i,j)}^{TEP} y(i,j)TEP 如果 n o d e i node_i nodei和第 n o d e i node_i nodei之间在AST中存在边,则 y ( i , j ) T E P y_{(i,j)}^{TEP} y(i,j)TEP 为1;否则为 0。
- p ( i , j ) T E P p_{(i,j)}^{TEP} p(i,j)TEP 为 n o d e i node_i nodei和 n o d e j node_j nodej之间存在边的概率。采用sigmoid激活函数对 p ( i , j ) T E P p_{(i,j)}^{TEP} p(i,j)TEP 的值进行0 ~ 1的归一化处理。
5.3.4 多模态对比学习
- 定义对比学习的损失函数如下:
- v i ⋅ v j v_i·v_j vi⋅vj的计算方式见原论文
- 2 N − 2 2N-2 2N−2个负样本的原因是文章采用了批内采样和跨批采样。批内采样有 x − 1 x-1 x−1个负样本;跨批采样同样有 x − 1 x-1 x−1个负样本,和为 2 N − 2 2N-2 2N−2
- 下式计算了相同的一对样本在两次顺序切换时的损失,即由于
x
i
x_i
xi和
x
i
+
x_i^+
xi+的点积不同,(
x
i
x_i
xi ,
x
i
+
x_i^+
xi+)变为(
x
i
+
x_i^+
xi+ ,
x
i
x_i
xi)。最后,整体多模态对比学习的损失定义如下:

5.3.5 总目标函数

- 其中 Θ Θ Θ包含模型的所有可训练参数,
- λ λ λ是用于防止过拟合的 L 2 L_2 L2正则化系数
6、UniXcoder: Unified Cross-Modal Pre-training for Code Representation
6.1 模型总览

- 该模型在代码注释上应用N个Transformer层,并将带有前缀的AST序列化以产生隐藏状态
h
N
h^N
hN= {
h
0
N
,
h
1
N
,
.
.
,
h
n
−
2
N
,
h
n
−
1
N
h_0^N,h_1^N,..,h_{n-2}^N,h_{n-1}^N
h0N,h1N,..,hn−2N,hn−1N },其中前缀Prefix∈{
[
E
n
c
]
[ Enc ]
[Enc],
[
D
e
c
]
[ Dec ]
[Dec],
[
E
2
D
]
[ E2D ]
[E2D] }表示模型的行为。
- [ E 2 D ] [ E2D ] [E2D]表示UniXcoder作为编码器-解码器模型。每个Transformer层包含一个结构完全相同的Transformer,它使用多头自注意力操作( Vaswani等, 2017),然后在上一层的输出上使用前馈层。对于第i个Transformer层,计算多头自注意力的输出。

- 模型模式:
- 编码器模式:作者在输入前添加一个特殊的token [ E n c ] [ Enc ] [Enc]作为前缀,并将掩码矩阵的所有元素设置为0,以允许所有token相互关注。
- 解码器模式:使用前缀 [ D e c ] [ Dec ] [Dec],并将掩码的上三角部分设置为 − ∞ -∞ −∞,表示每个token只能关注自己和之前的token。
- 编码器-解码器模式:源输入中的token允许相互关注,而目标输入中的token只关注自身以及源和目标输入中的先前token
6.1.1 编码器模式
- 遮蔽语言建模(MLM):作者遵循Devlin et al . ( 2018 ),应用遮蔽语言建模( MLM )预训练任务。特别地,作者从输入序列中抽取15 %的令牌,然后将其中的80 % ( 10 % )替换为 [ M A S K ] [ MASK ] [MASK] ( random )令牌并保留另外10 %不变。
- 任务目标:根据掩码的双向上下文标记预测mased的原始标记,如图(a)所示。特别地,该模型可以利用来自注释的语义信息和来自AST的语法信息来推断屏蔽代码token**,这鼓励了模型从不同的知识资源中学习代码表示。目标计算如公式3所示,其中 X m a s k X^{mask} Xmask为掩码输入序列。

6.1.2 解码器模式
- 单向语言建模(ULM):作者使用单向语言建模( ULM )预训练任务来预训练解码器模式,以支持code conplement等自回归任务,如图( b )所示。
- 任务目标:该任务根据先前的token和自身{
x
0
,
x
1
,
.
.
.
,
x
i
−
1
x_0,x_1,. . .,x_{i-1}
x0,x1,...,xi−1 }逐一预测下一个token
x
i
x_i
xi,该任务可以使用一个三角矩阵进行注意力掩码。

模式的区别与联系: - MLM遮蔽语言模型是对数据本身进行替换,然后让模型对遮蔽词进行预测
- ULM单向语言模型是使用掩码矩阵对模型参数进行相加操作,使模型参数不变(掩码矩阵对应位置0)/无穷大(掩码矩阵对应位置为无穷大),起到遮蔽的作用
6.1.3 编码-解码器模式
-
Denosing_Objective语言模型(DNS):对于编码器-解码器模式,作者使用与T5类似的去噪目标,如图( c )所示。
- 首先将输入序列拆分为 m a x [ n × r / l , 1 ) ] max[ n × r/l , 1)] max[n×r/l,1)]个组块,
- 然后对每个组块随机掩码
1
1
1到
2
l
−
1
2l- 1
2l−1个令牌的跨度
- 其中n是输入的长度,r是corruption rate, l l l是掩码跨度的平均长度。作者分别设定r为15%和 l l l为5。第k个跨前所有带特殊标记 [ M A S K k ] [ MASK_k ] [MASKk]的掩码跨的级联{ y 0 , y 1 , . . . , y n − 1 y_0,y_1,. . .,y_{n-1} y0,y1,...,yn−1 }将作为输出
-
任务目标:随机生成任意长度的掩码跨度,然后在编码器-解码器模式下生成这些掩码跨度。

-
模式区别与联系:
- 与ULM的区别:
- DNS的掩码的长度是随机生成的
- 与ULM的区别:
6.1.4 多模态对比学习
- 对于多模态对比学习,作者遵循Gao et al . ( 2021 )的做法,将相同的输入使用不同的隐藏dropout掩码作为正例"
h
i
+
h_i^+
hi+ ",将同一批中的其他表征作为负例。损失计算如公式6所示,其中
b
b
b为批次大小,
τ
τ
τ为温度超参数,
c
o
s
(
⋅
,
⋅
)
cos ( · , ·)
cos(⋅,⋅)为两个向量之间的余弦相似度
- 正样本:相同输入,使用不同的 d r o p o u t dropout dropout后的掩码结果作为正例
- 负样本:同一批次其他的representation作为负例

6.1.5 跨模态代码注释生成
- 跨模态生成,作者要求模型生成其注释
W
W
W = {
w
0
,
w
1
,
.
.
,
w
m
−
1
w_0,w_1,..,w_{m-1}
w0,w1,..,wm−1 }。注释描述了代码的功能,以统一的自然语言描述为支点,不仅可以帮助模型理解代码语义,还可以对齐不同编程语言之间的表示

参考文献
[[2020_Tian_Contrastive Multivie_KEY-Q2M2WU4B]]
[[2020_He_Momentum Contrast fo_KEY-6P2QGU8F]]
[[2020_Chen_A Simple Framework f_KEY-58NQMCT6]]
[[2021_Radford_Learning Transferabl_KEY-DCHH5QKD]]
[[2021_Wang_SynCoBERT:Syntax-Gui_KEY-6GDNRK3U]]
[[2022_Guo_UniXcoder:Unified Cr_KEY-INVDZHC4]]

2万+

被折叠的 条评论
为什么被折叠?



