TensorFlow深度学习实战——自监督学习
0. 前言
监督学习 (Supervised Learning
) 技术面临的最大问题是收集带标签的训练数据所需的时间和成本,因此,带标签的数据集通常相对较小。虽然深度学习能够自动完成特征工程,而无需像传统模型那样手动选择数据特征,但深度学习模型通常需要比传统(非深度学习)模型更多的数据进行训练。深度学习模型往往更复杂,拥有更多的可学习参数,然而,更复杂的模型也需要更多的数据来进行训练。由于构建带标签的训练数据的成本很高,这在一定程度上限制了使用监督学习扩展深度学习模型的能力。
自监督学习 ( Self-Supervised Learning
) 是重用数据中隐含的标签的过程,自监督技术利用数据的结构来生成标注数据,供监督学习模型使用,从而提供了一种折衷的解决方案。在本节中,我们将学习多种自监督技术及其在自然语言处理、计算机视觉和音频信号处理领域的应用。
1. 自监督学习历史
自监督学习并不是一个新概念,然而,随着基于 Transformer 的模型的出现,自监督学习重新受到关注,基于 Transformer
的模型在大量未标注的文本上以半监督的方式进行训练。过去,自监督学习通常称为无监督学习。早期有许多模型试图利用输入数据中的规律,产生与监督学习相当的结果,主要包括:
- 受限玻尔兹曼机 (Restricted Boltzmann Machine, RBM):生成神经模型,可以学习其输入的概率分布,可以在监督或无监督模式下进行训练,能够应用于许多下游任务,如降维、分类等
- 自编码器 ( Autoencoder, AE):无监督学习模型,通过学习重建输入数据来学习输入数据的有效潜表示。潜表示可以用于对下游任务进行编码
- Word2Vec 模型:自监督学习模型,
CBOW
和skip-gram
模型用于构建语料库中单词的潜在表示,试图学习单词与其邻近单词之间的映射,潜表示可以作为词嵌入用于各种下游任务;GloVe
模型也是一个自监督模型,利用词共现和矩阵分解生成用于下游任务的词嵌入 - 自回归 (
Autoregressive
,AR
) 模型:基于过去的行为预测未来的行为,AR
模型源于统计学中的时间序列分析、自然语言处理中的隐藏马尔可夫模型,以及循环神经网络 (Recurrent Neural Network, RNN) - 对比学习 (
Contrastive Learning
,CL
) 模型:学习数据表示,使得相似的项目对聚集在一起,而不相似的项目对彼此远离;自组织映射 (Self Organizing Map, SOM) 和孪生网络使用了类似的思想,可以视为CL
模型的前身
2. 自监督学习
在自监督学习中,网络通过监督学习进行训练,但标签是通过利用数据的某些属性自动获得的,无需人工标注。通常,这种自动化是通过利用数据样本的相互作用并学习预测来实现的。换句话说,数据本身为学习过程提供了监督。
其中一种技术利用同一数据样本内部分内容的共现或在不同时间点上相同数据样本之间的共现,这类技术称为自预测 (Self-prediction
)。
另一类技术利用给定数据样本的共现模态,例如,文本与其相关的音频流之间,或图像与其语言描述之间,这类技术称为多模态(联合)学习。
还有一种自监督学习技术利用数据样本对之间的关系。这些样本对是基于启发式技术从数据集中选择的这类技术称为对比学习 (Contrastive learning
)。
这些技术可以用来训练模型直接解决实际任务(如情感分析、分类等),或者学习数据的潜表示(嵌入),随后可以用来生成特征以解决下游实际任务。后者用于间接学习数据潜表示,称为代理任务 (Pretext task
)。
自监督学习的优势包括以下两个方面。首先,监督学习需要手动标注数据,因此难以获得大规模高质量的标注数据。其次,自监督任务可能不会直接解决实际任务,但可以用于学习数据的潜表示,然后将这些潜表示应用在实际任务中。
3. 自预测
自预测的思想是给定数据样本的一部分来预测另一部分。为了预测,假设要预测的部分是隐藏的或缺失的,并学习如何预测。但实际上,两个部分都是已知的,待预测的部分作为数据标签。模型以监督方式训练,使用非隐藏部分作为输入,隐藏部分作为标签,学习准确预测隐藏部分。实质上,就是假装有一部分输入是不知道的,并对此进行预测。
这个思想还可以反向扩展,例如,在图像中添加噪声,并使用原始图像作为标签,而将带有噪声的图像作为输入。
3.1 自回归生成
自回归 (Autoregressive
, AR
) 模型试图基于过去的事件、行为或属性预测未来的事件、行为或属性。任何具有内在顺序的数据都可以使用自回归生成模型。与变分自编码器或生成对抗网络等潜变量模型不同,自回归模型不做独立性假设。
3.1.1 PixelRNN
PixelRNN
自回归模型使用二维循环神经网络建模图像。其思想是利用当前像素 x i x_i xi 左侧和上方的所有像素来学习生成像素 x i x_i xi。使用卷积操作一次性计算每个维度的所有状态,PixelRNN
使用的长短期记忆 (Long Short Term Memory
, LSTM
) 层有两种类型——行 LSTM
和对角双向 LSTM
。在行 LSTM
中,卷积应用于每一行,而在对角双向 LSTM
中,卷积应用于图像的对角线:
3.1.2 Image GPT
Image GPT
(IPT
) 类似于 PixelRNN
,但它处理的是图像块,每个图像块可以视为一个单词。Image GPT
基于 Transformer
模型,并在 ImageNet
数据集上进行训练。图像以多种不同方式(超分辨率、双三次插值、添加噪声等)破坏,并训练以预测原始图像。IPT
模型的核心包括一个 Transformer
编码器-解码器对,但使用多个网络头和尾用于从破坏的输入图像中提取特征,并将解码器输出格式化为输出图像,不同头和尾专门用于 IPT
训练的不同任务(去噪、去雨、x2
和 x4
超分辨率等):
3.1.3 GPT-3
GPT-3
,由 OpenAI
开发的生成式预训练 Transformer
模型,能够生成人类水平文本的自回归语言模型。根据人类提供的提示生成单词、代码和其他数据的序列。GPT
的第一个版本使用了 1.1
亿个学习参数,GPT-2
使用了 15
亿个,GPT-3
使用了 1750
亿个参数。模型在未标记的文本(如 Wikipedia
)上进行训练,最初以英文为主,后来扩展到其他语言。GPT-3
模型有广泛的应用场景,包括摘要、翻译、语法纠正、问答、聊天机器人和电子邮件撰写等。
GPT-3
的流行催生了一个新职业——称为提示工程 (prompt engineering
),即创建最有效的提示以启动 GPT-3
执行各种任务。
3.1.4 XLNet
XLNet
与 GPT-3
类似,是一个广义的自回归模型。然而,它利用了自回归语言建模和自编码技术,同时避免了它们的局限性。与仅使用左侧或右侧上下文中的词元来预测下一个词元不同,XLNet
使用来自左侧和右侧上下文的所有可能词元排列进行预测,从而在预测时使用来自左右上下文的词元。其次,与 BERT
等自编码方法不同,XLNet
不依赖于输入的破坏(如掩码语言建模),因为它是一个广义的自回归语言模型。
3.1.5 WaveNet
WaveNet
是一种基于 PixelCNN
架构的自回归生成模型,但其操作对象是原始音频波形。与 PixelCNN
类似,WaveNet
在特定时间点的音频样本是基于所有先前时间步的样本。条件概率分布通过卷积层堆叠来建模,WaveNet
的独特之处在于因果卷积。模型在某一时间步的预测不能依赖于任何未来的时间步。当应用于文本转语音时,WaveNet
展现出先进性能,人类听众评价其在生成结果的自然程度显著优于其它模型。
3.1.6 WaveRNN
WaveRNN
是一种自回归生成模型,通过将数据分布分解为每个样本的条件概率的乘积来学习数据的联合概率。WaveNet
架构中的卷积层使用单层 RNN
替代,还使用了更高效的采样技术,从而总体上减少了执行操作的数量,速度大约比 WaveNet
提升了 4
倍。
3.2 掩码生成
掩码生成模型掩盖了数据自身的某些随机部分,假装这些部分是缺失的,模型学习使用未掩盖信息来预测被掩盖的信息。与自回归模型不同,掩码生成模型不要求被掩盖的信息位于未掩盖信息的前面或后面;它可以位于输入中的任何位置。
3.2.1 BERT
BERT
(Bidirectional Encoder Representation from Transformers
) 是一种基于 Transformer
的语言模型,由 Google
团队利用互联网文本进行训练。在预训练阶段使用两个目标——掩码语言建模 (Masked Language Modeling
, MLM
) 和下一句预测 (Next Sentence Prediction
, NSP
)。在训练过程中,15%
的输入词元会被掩盖,模型学习预测掩盖的词元。由于模型基于 Transformer
,可以利用句子中的任意上下文来帮助预测掩盖的词元。BERT
模型在预训练后,可以使用较小的监督数据集进行微调,以完成各种下游任务,如分类、情感分析等。
可以通过 Hugging Face Transformers
库中的预训练 BERT
模型查看 BERT 的掩码生成效果。在本节中,我们使用预训练的 BERT
模型预测句子 “The capital of France is [MASK].
” 中的掩码词元 [MASK]
。
from transformers import BertTokenizer, TFBertForMaskedLM
import tensorflow as tf
tokenizer = BertTokenizer.from_pretrained("bert-base-cased")
model = TFBertForMaskedLM.from_pretrained("bert-base-cased")
inputs = tokenizer("The capital of France is [MASK].", return_tensors="tf")
logits = model(**inputs).logits
# retrieve index of [MASK]
mask_token_index = tf.where(inputs.input_ids == tokenizer.mask_token_id)[0][1]
# predicted_token_id = tf.math.argmax(logits[0, mask_token_index], axis=-1)
predicted_token_id = tf.math.argmax(logits[:, mask_token_index], axis=-1)
tokenizer.convert_ids_to_tokens(predicted_token_id)[0]
输出结果为 Paris
。
3.2.2 堆叠去噪自编码器
堆叠去噪自编码器 (autoencoder
, AE
) 在图像中添加随机噪声,并将其作为输入传递给去噪 AE
以预测原始图像。多个去噪AE层分别进行训练并堆叠,得到多个非线性层的组合,这是实现更好泛化性能的关键。使用这种完全无监督的方式学习的高层次表示可以用作图像特征,以提升下游图像分类器的性能。堆叠去噪自编码器每一层的功能类似于普通 AE
,即接受图像作为输入,并在通过瓶颈层后尝试重建图像。瓶颈层学习输入图像的紧凑特征表示。但 AE
通常仅学会如何压缩图像,而没有学习语义上有意义的表示。去噪 AE
通过破坏输入并要求网络进行恢复,从而能够学习更好的输入图像语义表示。
3.2.3 上下文自编码器
上下文自编码器会遮盖图像的一个区域,并训练一个卷积神经网络(上下文自编码器),填充缺失的像素值来预测原始图像。上下文自编码器的任务比去噪AE更难,因为它必须填补更大的缺失区域,并且不能使用邻近像素的信息。这需要对图像有更深层次的语义理解,并能够在较大的空间区域生成高层次特征。从某种意义上说,上下文自编码器是一个更强大的生成模型,因为它需要在保持与提供上下文的一致性的同时填补缺失区域。
因此,上下文自编码器使用重建损失和对抗损失的组合进行训练,比仅使用重建损失训练得到的预测更清晰:
上下文不一定是图像特征,也可以是颜色。
3.2.4 着色
着色可以作为学习图像表示的一种方法。彩色图像首先转换为灰度图像,然后用这个灰度图像作为输入来预测原始彩色图像。模型可以自动为灰度图像着色,并且学习到的表示可以帮助下游任务,如图像分类和分割。从功能上讲,模型根据灰度通道 (L
) 预测 Lab
编码中的 a
和 b
(颜色信息)通道。在 ImageNet
数据集上的实验结果表明,模型在不使用 ImageNet
标签的情况下,在语义分割和图像分类数据集上表现出色,甚至超越了一些在 ImageNet
上使用监督学习训练的早期模型。
3.3 内在关系预测
使用内在关系预测 (Innate relationship prediction
) 技术的模型试图通过利用输入图像的各部分之间的内在关系来学习视觉任务,学习到的模型权重可以用于生成图像的语义表示,以便用于其他下游任务。
3.3.1 相对位置
预测图像中一个区域相对于另一个区域的相对位置。实际上,这种方法利用空间上下文作为自监督的来源来训练视觉表示。在给定的大量未标记图像集合中,从每张图像中随机提取出一对区域,如下图所示。每对区域根据第二个区域相对于中心区域的方向进行标记。训练卷积网络以预测第二个区域相对于第一个区域的位置。学习到的特征表示能够捕捉图像之间的视觉相似性。这种表示能够应用于视觉数据挖掘,即发现描述相同语义对象的图像片段。
3.3.2 解决拼图
通过解决图像的拼图来学习图像的视觉表示。将从输入图像中提取出的区域打乱形成拼图。网络学习从拼图中重建原始图像,即解决拼图。使用的网络是无上下文网络 (Context Free Network
, CFN
),一种 n
路孪生网络。每个区域对应于 n
路 CFN
中的一列,每列中的共享层与 AlexNet
中的实现完全相同。分类头预测区域的原始索引(打乱之前的索引)。
3.3.3 旋转
RotNet
模型通过使用旋转作为自我监督信号来学习图像表示。输入图像被旋转 0
、90
、180
和 270
度,然后训练一个卷积网络 RotNet
来预测旋转角度。事实证明,这个简单的任务为语义特征学习提供了非常强大的监督信号。RotNet
特征用于图像分类输入,在 CIFAR-10
数据集上的分类准确率仅比使用监督学习获得的最佳性能低 1.6%
。还在一些分类任务(如 ImageNet
)和一些目标检测任务(如 Pascal VOC
)上获得了优异结果。
3.4 混合自预测
在混合自预测模型中,自预测不是通过单一策略而是通过多种自预测策略来实现。例如, Jukebox
和 DALL-E
首先使用一种自监督技术 VQ-VAE
将输入数据减少为更易处理的格式,然后在缩减后的图像上使用另一种技术 AR
来生成最终预测。VQ-VAE
组件的预测通过使用对抗训练的判别器进一步优化。
3.4.1 VQ-VAE
VQ-VAE
(Vector Quantized Variational AutoEncoder
) 在所有混合自预测模型中都是通用的。自编码器试图通过将输入编码到较小的维度,然后从较小维度解码输出,来学习重构输入。然而,自编码器通常只是将输入压缩,而没有学习到良好的语义表示。变分自编码器 (Variational AutoEncoder
, VAE
) 则通过强制施加概率先验(通常是标准高斯分布)并最小化重构损失以及先验分布与后验分布(潜空间中的实际分布)之间的 KL
散度。
VAE
学习的是连续潜分布,而 VQ-VAE
学习的是离散潜分布。这一点十分重要,因为 Transformer
接受离散数据作为输入。VQ-VAE
通过向网络添加离散编码表组件来扩展 VAE
,该组件用于通过选择与每个潜向量在欧几里得距离上最接近的离散编码表中的向量来量化编码器输出的潜向量。然后,VQ-VAE
解码器负责从离散化的潜向量中重构输入。
3.4.2 Jukebox
Jukebox
是一种音乐生成模型,给定一个音乐提示,Jukebox
可以创作出可能满足该提示的音乐。早期的音频生成模型尝试以乐谱形式进行符号音乐生成,因为直接生成原始音频的问题在于其包含的信息量极其庞大,因此需要建模极其长距离的依赖关系。VQ-VAE
通过学习音频的低维编码来解决这个问题,目标是尽量减少不重要的信息,同时保留大部分有用的信息。 Jukebox
使用分层 VQ-VAE
将输入信号离散化为不同的时间粒度,然后在每个粒度下生成一个新的序列,最后将每个层级生成的序列合并为最终预测。
3.4.3 DALL-E
DALL-E
也可以被分类为联合学习(多模态)模型,因为它通过将文本-图像对作为训练输入,根据文本创建图像。本节将其分类为混合预测模型,是因为它与 Jukebox
一样,使用 VQ-VAE
来处理图像信息的高维度性(与相关文本的维度相比)。
DALL-E
接收文本和图像作为单一数据流,DALL-E
使用两阶段训练机制。在第一阶段中,训练一个 VQ-VAE
,将每个输入的 RGB
图像(大小为 (256, 256, 3)
)压缩为大小为 (32, 32)
的图像词元 (token
) 网格,每个元素可以取 8,192
个可能的离散值之一。这将图像输入的大小缩小了 192
倍,而并不损失相应的图像质量。
在第二阶段中,文本被 BPE
编码并截断为 256
个词元。字节对编码 (Byte Pair Encoding
, BPE
) 是一种混合字符/词编码方式,通过编码常见的字节对来用相对较小的词汇表表示大规模语料库。然后,将这种编码与展平的 1,024
(32 x 32
) 图像标记序列连接在一起。这个组合序列用于训练自回归 Transformer
,以建模文本和图像标记的联合分布。第一阶段学习 VQ-VAE
中的视觉编码表,第二阶段学习文本和图像标记的离散潜分布的先验分布。训练后的 DALL-E
模型可以用于根据文本提示生成图像。
DALL-E 2
是 DALL-E
的改进版本,有 350
亿个参数,相比之下 DALL-E
只有 120
亿个参数。尽管名称相似,但 DALL-E
是一种训练用于从文本描述生成图像的 GPT-3
版本,而 DALL-E 2
是一个编码器-解码器 Transformer
,使用 CLIP
将文本描述编码为 CLIP
嵌入,然后使用扩散模型将嵌入解码回图像,DALL-E 2
生成的图像比 DALL-E
更逼真和准确。
Google Research
提出的 Imagen
与 DALL-E 2
类似,使用 T5-XXL
编码器将输入文本映射到嵌入中,并使用扩散模型将嵌入解码为图像。
3.4.4 VQ-GAN
VQ-GAN
使用编码器-解码器框架,其中编码器使用 VQ-VAE
风格的编码器来学习离散潜表示,但解码器是生成对抗网络 (Generative Adversarial Network
, GAN
) 的判别器组件。与 VQ-VAE
使用的 L2
损失不同,VQ-GAN
使用了感知损失和判别器损失的组合,这有助于在提高压缩率的同时保持良好的感知质量。使用 GAN
架构而非传统的 VAE
解码器有助于提高训练效率。
与 VQ-VAE
类似,VQ-GAN
学习一个上下文丰富的视觉组件编码表,这些组件用于为训练自回归组件组合序列。研究表明,VQ-GAN
在使用 Fréchet Inception Distance
(FID
) 度量(该指标衡量真实图像与伪造图像的特征向量之间的距离)时,尽管它使用的参数数量大约少了 10
倍,在 ImageNet
图像上的表现仍优于 VQ-VAE-2
模型。
接下来,我们将介绍一种流行的自监督学习技术——对比学习 (Contrastive Learning
)。
4. 对比学习
对比学习 (Contrastive Learning
, CL
) 试图预测一对输入样本之间的关系。CL
的目标是学习一个嵌入空间,在这个空间中,相似的样本距离较近,而不相似样本距离较远。训练 CL
模型的输入是成对的数据样本,CL
可以用于监督学习和无监督学习设置。
在无监督学习设置中,可以作为一种非常强大的自监督学习方法。相似的样本对从现有数据中以自监督的方式找到,而不相似的样本对则通过对比相似样本对来发现。模型学习预测一对数据点是否相似。
4.1 损失函数
早期的 CL
模型使用由单一正样本和单一负样本组成的数据样本进行学习,但最近的 CL
模型趋势是从单个批次中的多个正样本和负样本中进行学习。在本节中,我们将介绍一些常用于训练 CL
模型的损失函数。
4.1.1 对比损失 (Contrastive Loss)
对比损失是最早用于 CL
技术的损失函数之一。它试图将数据编码到一个嵌入空间,使得同一类别的样本具有相似的嵌入,而不同类别的样本具有不同的嵌入。因此,给定两个数据对 ( x i , y i ) (x_i, y_i) (xi,yi) 和 ( x j , y j ) (x_j, y_j) (xj,yj),对比损失可以用以下公式描述:
L ( x i , x j , θ ) = [ y i = y j ] ∣ ∣ f θ ( x i ) − f θ ( x j ) ∣ ∣ 2 2 + [ y i ≠ y j ] m a x ( 0 , ϵ − ∣ ∣ f θ ( x i ) − f θ ( x j ) ∣ ∣ 2 ) 2 \mathcal L(x_i,x_j,\theta)=[y_i=y_j]||f_{\theta} (x_i)-f_{\theta}(x_j)||_2^2+[y_i\neq y_j]max(0,\epsilon - ||f_{\theta} (x_i)-f_{\theta}(x_j)||_2)^2 L(xi,xj,θ)=[yi=yj]∣∣fθ(xi)−fθ(xj)∣∣22+[yi=yj]max(0,ϵ−∣∣fθ(xi)−fθ(xj)∣∣2)2
第一项在 i i i 和 j j j 对相似时被激活,第二项在样本对不相似时被激活。目标是最大化第一项种差异的平方,并最小化第二项中的差异的平方(从而在不相似样本对情况下最大化第二项)。其中, ϵ \epsilon ϵ 是一个超参数,表示不同类别样本之间允许的最小距离的边界。
4.1.2 三元组损失 (Triplet Loss)
三元组损失是对比损失的一种改进,它使用三个数据样本而不是两个,锚点 (anchor point
)、正样本 (positive point
) 和负样本 (negative point
)。因此,给定一个锚点 x x x,选择一个正样本 x + x^+ x+ 和一个负样本 x − x^- x−,其中 x x x 和 x + x^+ x+ 属于同一类别,而 x x x 和 x − x^- x− 属于不同类别。三元组损失学习最小化锚点 x x x 和正样本 x + x^+ x+ 之间的距离,同时最大化 x x x 和负样本 x − x^- x− 之间的距离:
三元组损失公式如下,与对比损失类似, ϵ \epsilon ϵ 是一个超参数,表示相似样本对和不相似样本对之间允许的最小距离差异。基于三元组损失的模型通常需要具有挑战性的值 x − x^{-} x−,即困难负样本,以提供良好的表示:
L ( x , x + , x − ) = ∑ x ∈ X m a x ( 0 , ∣ ∣ f ( x ) − f ( x + ) ∣ ∣ 2 2 − ∣ ∣ f ( x ) − f ( x − ) ∣ ∣ 2 2 + ϵ ) \mathcal L(x,x^+,x^-)=\sum_{x\in X}max(0,||f(x)-f(x^+)||_2^2-||f(x)-f(x^-)||_2^2+\epsilon) L(x,x+,x−)=x∈X∑max(0,∣∣f(x)−f(x+)∣∣22−∣∣f(x)−f(x−)∣∣22+ϵ)
4.1.3 N-对损失 (N-pair Loss)
N-对损失将三元组损失推广到与多个负样本进行比较,而不仅仅是一个负样本。因此,给定一个 N + 1 N+1 N+1 元组的训练样本 { x , x + , x 1 − , x 2 − , … , x N + 1 − } \{x, x^+, x_{1}^-, x_{2}^-, \ldots, {x_{N+1}}^-\} {x,x+,x1−,x2−,…,xN+1−},其中包含一个正样本和N-1个负样本,N-对损失定义如下:
L ( x , x + , { x i − } i = 1 N − 1 ) = − l o g ( e x p ( f ( x ) T f ( x + ) ) e x p ( f ( x ) T f ( x + ) ) + ∑ i = 1 N − 1 e x p ( f ( x ) T f ( x i − ) ) \mathcal L(x,x^+,\{x_i^-\}_{i=1}^{N-1})=-log(\frac{exp(f(x)^Tf(x^+))}{exp(f(x)^Tf(x^+))+\sum_{i=1}^{N-1}exp(f(x)^Tf(x_i^-)}) L(x,x+,{xi−}i=1N−1)=−log(exp(f(x)Tf(x+))+∑i=1N−1exp(f(x)Tf(xi−)exp(f(x)Tf(x+)))
4.1.4 提升结构损失 (Lifted Structural Loss)
提升结构损失是三元组损失的另一种变体,它在训练批次中使用所有成对的边,可以提高训练性能。下图展示了提升结构损失的思想以及它如何改进对比损失和三元组损失,红色边连接相似的样本对,蓝色边连接不相似的样本对。
4.1.5 噪声对比估计损失 (NCE Loss)
噪声对比估计 (Noise Contrastive Estimation
, NCE
) 损失使用逻辑回归来区分正样本和负样本(噪声样本)。NCE
损失试图最大化正样本 x x x 的对数概率 (logits
),并最小化负样本 x − x^- x− 的对数概率。NCE
损失公式如下:
L = − 1 N ∑ i = 1 N [ l o g ( s i g m o i d ( l o g i t ( x i ) ) ) + l o g ( 1 − s i g m o i d ( l o g i t ( x i − ) ) ) ] \mathcal L=-\frac 1N\sum_{i=1}^N[log(sigmoid(logit(x_i)))+log(1-sigmoid(logit(x_i^-)))] L=−N1i=1∑N[log(sigmoid(logit(xi)))+log(1−sigmoid(logit(xi−)))]
4.1.6 InfoNCE 损失 (InfoNCE Loss)
InfoNCE
损失受 NCE
损失的启发,使用分类交叉熵损失从一组无关噪声样本中识别正样本。给定一个上下文向量 c c c,正样本应该从条件概率分布 p ( x ∣ c ) p(x|c) p(x∣c) 中采样,而 N − 1 N-1 N−1 个负样本可以从与上下文 c c c 无关的分布 p ( x ) p(x) p(x) 中采样。InfoNCE
损失优化正确分类正样本的负对数概率,公式如下,其中 f ( x , c ) f(x, c) f(x,c) 估计密度比 p ( x ∣ c ) p ( x ) \frac {p(x|c)}{p(x)} p(x)p(x∣c):
L = − E [ l o g f ( x , c ) ∑ x ′ ∈ X f ( x ′ , c ) ] \mathcal L=-E[log\frac{f(x,c)}{\sum_{x'\in X}f(x',c)}] L=−E[log∑x′∈Xf(x′,c)f(x,c)]
4.1.7 软最近邻损失 (Soft Nearest Neighbors Loss)
软最近邻损失进一步扩展了对比损失,考虑了已知标签的多个正样本。给定一个样本批次 { ( x i , y i ) } i = 1 B \{(x_i, y_i)\}_{i=1}^{B} {(xi,yi)}i=1B,其中 y i y_i yi 是 x i x_i xi 的类别标签, f f f 是用于度量两个输入之间相似性的函数,则软最近邻损失可以通过以下公式表示:
L = − 1 B ∑ i = 1 B l o g ( ∑ i ≠ j , y i = y j , j = 1 , ⋯ , B e x p ( − f ( x i , x j ) / τ ) ∑ i ≠ k , k = 1 , ⋯ , B e x p ( − f ( x i , x k ) / τ ) ) \mathcal L=-\frac 1B\sum_{i=1}^Blog(\frac {\sum_{i\neq j,y_i=y_j,j=1,\cdots,B}exp(-f(x_i,x_j)/\tau)}{\sum_{i\neq k,k=1,\cdots,B}exp(-f(x_i,x_k)/\tau)}) L=−B1i=1∑Blog(∑i=k,k=1,⋯,Bexp(−f(xi,xk)/τ)∑i=j,yi=yj,j=1,⋯,Bexp(−f(xi,xj)/τ))
温度 τ \tau τ 是一个超参数,用于调节特征在表示空间中的集中度。因此,在 τ \tau τ 较低时,表示空间中距离较远的样本对软最近邻损失的贡献也较小。
4.2 实例变换
使用实例变换的 CL
模型通常依赖于数据增强技术生成正样本对,并通过负样本挖掘技术从正样本对中生成负样本对。许多此类模型依赖于生成批内负样本 (in-batch negative
)和创新技术来挖掘困难负样本。
数据增强技术用于创建原始数据点及其噪声版本的样本对,在不改变语义意义的情况下向样本中引入非必要变化,从而使模型在训练过程中学习这些变化。
批内负样本采样是一种通过结合单个批次中样本的信息来生成负样本的技术。对于批次中的每个正样本对 ( x i , y i ) (x_i, y_i) (xi,yi),所有样本对 ( x i , y j ) (x_i, y_j) (xi,yj) 和 ( x j , y i ) (x_j, y_i) (xj,yi) 都可以被视为负样本对。实际上,负样本对是通过组合同一批次中的两个随机正样本对的元素创建的。这种技术非常实用且可以高效地在 GPU
上实现,因此被广泛使用。
某些模型需要困难负样本来学会更好地执行任务。困难负样本是指具有不同标签但嵌入特征非常接近的样本对。可以将它们视为在嵌入空间中非常接近但位于决策边界两侧的样本点。对于监督学习,识别困难负样本相对容易。对于无监督学习,一种方法是增加批大小,这将引入更多的困难负样本。另一种技术是通过其与锚点样本的相似性增加候选负样本的采样概率。
4.2.1 SimCLR
SimCLR
模型提供了一个简单的视觉表示对比学习框架。每个输入图像 x x x 使用相同的图像增强策略以两种不同方式增强 ( x i ) (x_i) (xi) 和 ( x j ) (x_j) (xj),从而生成 2 N 2N 2N 个正样本对。
使用批内负样本采样,因此对于每个正样本,有 2 N − 1 2N-1 2N−1 个负样本。基础编码器 f f f 应用于每个数据样本对,而投影头 g g g 尝试最大化正样本对的相似度并最小化负样本对的相似度。为了获得良好的性能,SimCLR
需要使用较大的批大小,以便在训练中包含足够的负样本。SimCLR
在 ImageNet
上实现了自监督和半监督模型,取得了优异结果,SimCLR
模型架构如下:
4.2.2 Barlow Twins
Barlow Twins
模型的理念源于神经科学,即感官处理的目标是将高度冗余的感官输入重新编码为一个因子编码,或一个具有统计独立成分的编码。在该模型中,一张图像扭曲为两个版本,这两个扭曲版本被输入到同一网络中以提取特征,并学习使这两个特征之间的互相关矩阵尽可能接近单位矩阵。与神经科学理念一致,该模型的目标是通过减少这些向量之间的冗余来降低样的本两个扭曲版本之间的冗余。这体现在其独特的损失函数中,在第一个方程中,第一项表示单位矩阵与互相关矩阵之间的差异,第二项表示冗余减少项,第二个方程定义了互相关矩阵 C C C 的每个元素:
L = ∑ i ( 1 − C i i ) 2 + λ ∑ i ∑ j ≠ i C i j 2 \mathcal L=\sum_i(1-C_{ii})^2+\lambda\sum_i\sum_{j\neq i}C_{ij}^2 L=i∑(1−Cii)2+λi∑j=i∑Cij2
Barlow Twins
模型与该类型其他模型之间的区别在于,它不需要大量负样本,因此可以在较小的批次上运行,并且受益于高维嵌入。Barlow Twins
模型在 ImageNet
上的表现优于早期的半监督模型,并与一些监督式 ImageNet
模型相当。
4.2.3 BYOL
BYOL
(Bootstrap Your Own Latent
) 模型的独特之处在于它完全不使用负样本。它依赖于两个神经网络:在线网络和目标网络,这两个网络相互作用并从彼此中学习, BYOL
的目标是学习一个可以用于下游任务的表示 y θ y_{\theta} yθ。在线网络由权重 θ \theta θ 参数化,包含三个阶段——编码器 f θ f_\theta fθ、投影器 g θ g_\theta gθ 和预测器 q θ q_\theta qθ。目标网络的结构与在线网络相同,但使用不同的权重 ξ \xi ξ。目标网络提供回归目标以训练在线网络,其参数 ξ \xi ξ 是在线参数 θ \theta θ 的指数移动平均 (exponential moving average
, EMA
)。每个训练步骤后,执行以下更新:
ξ ← τ ξ + ( 1 − τ ) θ \xi\leftarrow\tau\xi+(1-\tau)\theta ξ←τξ+(1−τ)θ
BYOL
为每个图像生成两个增强视图。在线网络从第一个增强视图输出表示 y θ y_\theta yθ 和投影 z θ z_\theta zθ。类似地,目标网络输出表示 y ξ y_\xi yξ 和投影 z ξ z_\xi zξ。BYOL
旨在最小化 L2
归一化的在线投影 z θ z_\theta zθ 和目标投影 z ξ z_\xi zξ 之间的误差。训练结束时,只保留在线网络(编码器)。
BYOL
在 ImageNet
上与半监督学习或迁移学习模型性能相当,并且与该类型的其他模型相比,对批大小和图像增强类型的变化不太敏感。但后续研究表明,BYOL
中的批归一化组件可能通过数据重新分配隐式地创建负样本,从而形成某种形式的对比学习。
4.2.4 特征聚类
特征聚类 ( Feature clustering
) 通过聚类找到相似的数据样本。当数据增强技术不可行时,这种方法非常有用。其基本思想是使用聚类算法为样本分配伪标签,以便能够进行样本内对比学习 (intra-sample CL
)。尽管类似,但特征聚类与 CL
的不同之处在于,它扩展了实例区分问题,特征聚类学习区分具有相似特征的图像组,而不是学习区分单一输入图像上的两种变换。
4.2.5 DeepCluster
DeepCluster
的核心思想是,用于监督学习的数据集(如 ImageNet
)“过小”,无法涵盖超出图像分类的通用特征。为了学习通用特征,有必要在互联网中的数十亿张图片上进行训练。然而,对如此大规模的数据集进行标记并不可行,因此 DeepCluster
提出了一种聚类方法,该方法联合学习神经网络的参数和结果特征的聚类分配。DeepCluster
通过 K-Means
聚类算法迭代地对这些特征进行分组,并将聚类分配用作伪标签来学习卷积神经网络 (ConvNet
) 的参数。训练最终得到 ConvNet
的权重,研究表明,这些权重是有用的通用视觉特征,并在许多下游任务中具有优异的性能表现。
4.2.6 SwAV
在 SwAV
(SWapping Assignments between multiple Views
) 模型中,通过预测来自另一个视图的表示的聚类分配(伪标签)来学习特征,SwAV
使用了 CL
模型中使用的架构的变体。图像 x 1 x_1 x1 和 x 2 x_2 x2 是同一输入图像 x x x 的变换,经过编码器 f θ f_\theta fθ 生成表示 z 1 z_1 z1 和 z 2 z_2 z2。在 SwAV
中, z 1 z_1 z1 和 z 2 z_2 z2 用于通过将其特征匹配到一组 K K K 个原型向量 { c 1 , … , c K } \{c_1, \ldots, c_K\} {c1,…,cK} 来计算 q 1 q_1 q1 和 q 2 q_2 q2,然后分别用来预测 x 2 x_2 x2 和 x 1 x_1 x1 的聚类分配。
与 DeepCluster
不同,SwAV
进行在线聚类(对不断流入的数据进行聚类),因此可以扩展到潜在的无限数据量,SwAV
在大批次和小批次大小下均表现良好。SwAV
还提出了一种新的多裁剪策略,以增加图像视图的数量而不增加计算或内存开销。
4.2.7 InterCLR
InterCLR
是一种混合模型,通过利用图像内部和图像之间的不变性来联合学习视觉表示。它在数据管道中有两个不变性学习分支,一个用于图像内部,另一个用于图像之间。图像内部分支通过标准的对比学习方法构建对比对,例如生成输入图像的变换对。图像之间分支使用从聚类中获得的伪标签来构建对比对——同一集群中的两项构成正样本,不同集群中的两项构成负样本。采用 InfoNCE
损失函数的变体计算对比损失,通过反向传播训练网络。
InterCLR
还讨论了伪标签维护、采样策略和跨图像分支的决策边界设计,InterCLR
模型在多个标准基准测试上表现出色。
4.3 多视图编码
多视图编码 (Multiview coding
) 已成为主流的对比学习方法,使用同一对象的两个或多个视图来构建正样本对对比数据。对于正样本而言,其目标是最大化多个视图表示之间的互信息,最小化负样本之间的互信息,这要求模型学习具有跨多个视图影响的高级特征。
4.3.1 AMDIM
AMDIM
(Augmented Multiscale Deep InfoMax
) 是一种基于局部深度信息最大化方法的自监督表示学习模型,旨在最大化依赖于整个输入的全局总结特征与从编码器中间层提取的局部特征之间的互信息。AMDIM
通过预测每个输入的独立增强特征以及跨多个尺度的特征来扩展 DIM
,同时使用更强大的编码器。
AMDIM
还探讨了其他生成对比对的方法,例如实例转换和多模态,但它主要考虑了使用多试图编码构建对比对,AMDIM
模型在自监督学习目标的多个基准测试中表现优异。
4.3.2 CMC
对比多视图编码 (Contrastive Multiview Coding
, CMC
) 模型的核心思想在于,当一个对象通过多个视图进行表示时,这些视图都是带有噪声和不完整的,但重要的因素(如物理学、几何学和语义)通常在所有视图中是共享的。CMC
的目标是学习一个紧凑的对象表示,捕捉这些重要因素。CMC
通过使用对比学习来实现这一点,使得同一场景的视图映射到邻近的点,而不同场景的视角映射到相距较远的点。
5. 多模态模型
多模态模型涉及使用来自同一数据的两种或多种模态的配对输入,此类模型的输入可以是图像和描述、视频和文本、音频片段及其转录等。这些模型学习跨多种模态的联合嵌入,我们将以 CLIP
和 CodeSearchNet
模型为例进行介绍。另一类多模态模型是可以用于跨多个模态进行自监督学习的框架,Data2Vec
模型是其中的典型代表。
5.1 CLIP
CLIP
模型通过学习预测哪张图像与哪条描述相匹配来学习图像表示,使用来自互联网的 4
亿对图像-文本对进行预训练。预训练后,模型可以使用自然语言查询来引用学习到的视觉概念。CLIP
可以在零样本模式下用于下游任务,如图像分类、文本到图像生成和图像到图像搜索。模型在自然图像上表现出色,CLIP
的表现能够与监督模型相竞争,而无需任何额外的微调。例如,CLIP
在零样本模式下的准确率与原始 ResNet50
在 ImageNet
上的准确率相当,无需额外的微调。CLIP
还可以通过特定的图像数据集进行微调,以适应特定的下游任务,例如学习卫星图像的视觉表示。
CLIP
模型的训练和推理架构如下图所示。图像和文本编码器都是基于 Transformer
的编码器。预训练的目标是解决预测哪个文本与哪个图像配对的任务。给定一批 N N N 个图像-文本对,CLIP
学习预测 N x N N x N NxN 个可能的图像-文本对中实际发生的配对。CLIP
通过最大化批次中 N N N 个真实配对的图像和文本嵌入的余弦相似度,同时最小化其余 N 2 − N N² - N N2−N 个错误配对的余弦相似度,来学习一个多模态的联合嵌入空间。在推理过程中,一种模态的输入可以用于预测另一种模态的输出,例如给定一张图像,可以预测图像内容信息作为文本。
接下来,观察 CLIP
模型比较图像和文本的能力。将一张包含两只猫的图像与两个文本字符串进行比较:“a photo of a cat
” 和 “a photo of a dog
”。CLIP可以将图像与这两个文本字符串进行比较,并正确判断图像与字符串 “a photo of a cat
” 相似的概率为 0.995
,而与字符串 “a photo of a dog
” 相似的概率为 0.005
:
import tensorflow as tf
from PIL import Image
import requests
from transformers import CLIPProcessor, TFCLIPModel
model = TFCLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
image
inputs = processor(
text=["a photo of a cat", "a photo of a dog"],
images=image, return_tensors="tf", padding=True)
outputs = model(**inputs)
logits_per_image = outputs.logits_per_image # this is the image-text similarity score
probs = tf.nn.softmax(logits_per_image, axis=1) # we can take the softmax to get the label probabilities
probs.numpy()
CLIP
模型通过将文本和图像投影到一个共同的嵌入空间来实现这一目标。使用这种共同的嵌入方法,CLIP
还能计算两张图像和一段文本之间的相似性,还提供了提取文本和图像编码的功能。
5.2 CodeSearchNet
CodeSearchNet
模型使用多种编程语言(如 Go
、Java
、JavaScript
、Python
、PHP
和 Ruby
) 中函数或方法的代码片段,并将其与描述代码的(手动增强的)自然语言注释配对,以创建正样本。该语料库包含大约 200
万个跨语言的代码-注释对。与 CLIP
类似,CodeSearchNet
模型的目标是学习代码和注释的联合嵌入空间,然后可以查询以返回满足某些自然语言查询的适当代码片段(函数或方法)。代码和自然语言查询使用两个独立的编码器进行编码,模型尝试学习一个联合嵌入,使正样本对的代码和查询编码的内积最大化,而负样本对的内积最小化。
5.3 Data2Vec
Data2Vec
提出了一个通用框架,用于跨多个模态进行自监督学习。它使用掩码预测方法来应用相同的学习方法于语音、语言或计算机视觉。其核心思想是基于输入的掩码视图预测完整输入的潜表示。它不是预测特定模态的目标,如单词、视觉标记等,而是预测包含整个输入信息的上下文潜表示。使用教师-学生架构,首先建立完整输入数据的表示,作为学习任务的目标(教师模式)。然后对掩码版本的输入样本进行编码,并预测完整数据表示(学生模式)。教师的参数通过学生的指数衰减平均权重进行更新。在训练结束时,使用教师的权重作为学习到的嵌入。
使用这一框架在语音识别、图像分类和自然语言理解等主要基准测试中显示出领先的性能。
6. 代理任务
代理任务 (Pretext task
) 是自监督学习模型通过利用训练数据中固有的一些模式来尝试解决的任务。这些任务本身不一定有用,但它们帮助系统学习有用的潜表示(嵌入),这些嵌入可以直接用于下游任务或在微调后用于下游任务。为了解决代理任务进行的训练通常是构建实际模型的前置步骤,因此也称为预训练。
我们在本节讨论的几乎所有技术都是代理任务。虽然一些任务本身可能有用,如图着色或超分辨率,但它们也会产生学习到模型权重(嵌入),从中学习未标记数据的语义分布,这些权重可以应用于下游任务。
这并不是一个新颖的概念——例如,Word2Vec
算法基于一个嵌入空间,其中处于相似上下文中的单词聚集在一起,使用 skip-gram
或 CBOW
算法进行训练,尝试根据一个词预测上下文词,这些目标本身并无直接用处,但在此过程中,网络最终学到了输入数据中词汇的良好潜表示。这个表示可以直接用于寻找单词的“同义词”或进行单词的类比,也可以用于生成单词和词序列(如句子和文档)的向量表示,以便用于下游任务,例如文本分类或情感分析。
代理任务的最大优势在于,下游任务模型的训练可以使用相对较少的标记数据。模型通过利用大量现成的未标记数据解决代理任务,基于大量易得的未标记数据,学习了领域的广泛特征。然后只需相对较少的标记数据就可以学习解决更具体的下游任务。由于标记数据难以获得且创建成本高,这种两阶段法往往可以使某些机器学习模型成为可能且更具实用性。
小结
在本节中,我们讨论了利用数据学习数据分布的各种自监督策略,获得数据的嵌入空间,用于解决下游任务。介绍了自预测、对比学习和代理任务作为自监督学习的具体方法。
系列链接
TensorFlow深度学习实战(1)——神经网络与模型训练过程详解
TensorFlow深度学习实战(2)——使用TensorFlow构建神经网络
TensorFlow深度学习实战(3)——深度学习中常用激活函数详解
TensorFlow深度学习实战(4)——正则化技术详解
TensorFlow深度学习实战(5)——神经网络性能优化技术详解
TensorFlow深度学习实战(6)——回归分析详解
TensorFlow深度学习实战(7)——分类任务详解
TensorFlow深度学习实战(8)——卷积神经网络
TensorFlow深度学习实战(9)——构建VGG模型实现图像分类
TensorFlow深度学习实战(10)——迁移学习详解
TensorFlow深度学习实战(11)——风格迁移详解
TensorFlow深度学习实战(12)——词嵌入技术详解
TensorFlow深度学习实战(13)——神经嵌入详解
TensorFlow深度学习实战(14)——循环神经网络详解
TensorFlow深度学习实战(15)——编码器-解码器架构
TensorFlow深度学习实战(16)——注意力机制详解
TensorFlow深度学习实战(17)——主成分分析详解
TensorFlow深度学习实战(18)——K-means 聚类详解
TensorFlow深度学习实战(19)——受限玻尔兹曼机
TensorFlow深度学习实战(20)——自组织映射详解
TensorFlow深度学习实战(21)——Transformer架构详解与实现
TensorFlow深度学习实战(22)——从零开始实现Transformer机器翻译
TensorFlow深度学习实战(23)——自编码器详解与实现
TensorFlow深度学习实战(24)——卷积自编码器详解与实现
TensorFlow深度学习实战(25)——变分自编码器详解与实现
TensorFlow深度学习实战(26)——生成对抗网络详解与实现
TensorFlow深度学习实战(27)——CycleGAN详解与实现
TensorFlow深度学习实战(28)——扩散模型(Diffusion Model)