经典的 Masked + Self-supervised learning 的模型方法
最近看论文看到了相关的内容,这里总结学习一下,方便以后查阅。
经典的 Masked + Self-supervised learning 的模型方法
- BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
- 1. 背景
- 2. BERT的核心思想
- 3. 架构
- 3.1 模型结构
- 3.2 输出
- 4. 预训练任务
- 4.1 掩码语言模型(MLM, Masked Language Model)
- 4.2 下一句预测(NSP, Next Sentence Prediction)
- 5. 微调
- 6. 应用
- 7. 优势 and 缺点
- 7.1 优势
- 7.2 缺点
- 8. 改进与衍生模型
- 9. 示例代码(使用Hugging Face)
- 10. 总结
- Masked Autoencoders Are Scalable Vision Learners
- 1. 背景
- 2. MAE的核心思想
- 3. 架构
- 3.1 输入处理
- 3.2 编码器(Encoder)
- 3.3 解码器(Decoder)
- 3.4 重建目标
- 3.5 模型规模
- 4. 预训练
- 5. 微调
- 6. 应用
- 7. 优势 and 缺点
- 7.1 优势
- 7.2 缺点
- 8. 与其他方法的对比
- 9. 改进与衍生模型
- 10. 代码示例(使用PyTorch)
- 11. 总结
- 参考资料
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
BERT(Bidirectional Encoder Representations from Transformers)是由Google在2018年提出的一种自然语言处理(NLP)模型,彻底改变了NLP领域对上下文理解的方式。
1. 背景
在BERT之前,许多NLP模型(如Word2Vec、GloVe、ELMo)在处理文本时存在局限性:
- 单向性:传统模型(如LSTM、RNN)通常是单向的(从左到右或从右到左),无法同时考虑上下文的双向信息。
- 静态词向量:Word2Vec和GloVe生成的词向量是静态的,无法根据上下文动态调整词的表示。
- 浅层上下文:即使是ELMo等双向模型,也仅在有限的上下文中捕捉信息,难以处理长距离依赖。
BERT通过引入双向Transformer架构和预训练+微调的范式,解决了这些问题,成为NLP任务的里程碑。
2. BERT的核心思想
BERT的核心在于:
- 双向性:通过同时考虑词语的左右上下文,生成更丰富的语义表示。
- 预训练+微调:先在大规模未标注文本上进行通用语言模型预训练,再针对特定任务进行微调。
- Transformer架构:基于Transformer的Encoder部分,利用自注意力机制(Self-Attention)捕捉词与词之间的关系。
3. 架构
BERT基于Transformer的Encoder模块,具体架构特点如下:
3.1 模型结构
- 输入表示:
- BERT的输入由三部分组成:
- Token Embedding:将输入的词或子词(WordPiece)转换为向量。
- Segment Embedding:区分不同句子(例如在问答任务中区分问题和答案)。
- Position Embedding:编码词在句子中的位置信息。
- 特殊标记:
[CLS]
:放在输入序列开头,用于表示整个句子的语义表示(常用于分类任务)。[SEP]
:用于分隔不同的句子或标记句子结束。
- 输入示例(以句子对为例):
[CLS] The cat is cute [SEP] It loves to play [SEP]
。
- BERT的输入由三部分组成:
- Transformer层:
- BERT由多个Transformer Encoder层堆叠而成,每层包括:
- Multi-Head Self-Attention:捕捉词 Moses and Aaron-like attention to different parts of the input.
- Feed-Forward Neural Network:两层全连接网络,带有GELU激活函数。
- 两个主要模型规模:
- BERT-Base:12层,12个注意力头,768维隐藏层,110M参数。
- BERT-Large:24层,16个注意力头,1024维隐藏层,340M参数。
- BERT由多个Transformer Encoder层堆叠而成,每层包括:
3.2 输出
- BERT为输入序列中的每个Token生成一个上下文相关的向量表示。
[CLS]
的输出通常用于句子级任务(如分类)。- 每个Token的输出可用于词级任务(如命名实体识别)。
4. 预训练任务
BERT通过两种无监督任务在大规模语料库(如Wikipedia和BookCorpus)上进行预训练:
4.1 掩码语言模型(MLM, Masked Language Model)
- 随机掩盖输入序列中15%的Token(用
[MASK]
替换、保持原词或随机替换)。 - 模型预测被掩盖的词。
- 目标:通过上下文学习词的语义和句法信息。
- 特点:
- 80%的掩盖Token用
[MASK]
替换。 - 10%保持原词不变。
- 10%替换为随机词。
- 80%的掩盖Token用
- 优点:双向上下文建模,区别于单向语言模型。
4.2 下一句预测(NSP, Next Sentence Prediction)
- 输入两个句子A和B,模型预测B是否是A的下一句。
- 数据构造:
- 50%正样本:B是A的下一句。
- 50%负样本:B是随机句子。
- 目标:学习句子之间的关系,适用于问答、推理等任务。
5. 微调
- 预训练后,BERT在特定任务上进行微调,只需少量标注数据即可达到SOTA(State-of-the-Art)性能。
- 微调方式:
- 分类任务:使用
[CLS]
的输出接一个分类层(如全连接层+Softmax)。 - 序列标注任务:对每个Token的输出进行分类(如NER)。
- 问答任务:预测答案的起始和结束位置。
- 分类任务:使用
- 微调通常只需调整少量参数(如分类层),甚至冻结BERT参数也能取得不错效果。
6. 应用
BERT在多种NLP任务中表现出色,包括但不限于:
- 文本分类:情感分析、垃圾邮件检测。
- 命名实体识别(NER):识别人名、地名等。
- 问答系统(QA):如SQuAD数据集上的答案抽取。
- 自然语言推理(NLI):判断句子之间的蕴含关系。
- 机器翻译、文本生成:通过衍生模型(如BART)扩展应用。
7. 优势 and 缺点
7.1 优势
- 双向上下文:捕捉更丰富的语义信息。
- 通用性:预训练模型可适配多种任务。
- 高效微调:少量标注数据即可达到高性能。
- 开源性:Google提供了预训练模型和代码,促进研究和应用。
7.2 缺点
- 计算成本高:
- 预训练需要大量计算资源(TPU集群)。
- 推理阶段对内存和算力要求高。
- 模型规模大:
- BERT-Large参数量巨大,部署到资源受限设备(如手机)困难。
- 黑箱性:
- Transformer的自注意力机制解释性较差。
- 静态输入长度:
- 最大输入长度512个Token,难以处理超长文本。
8. 改进与衍生模型
BERT的成功催生了许多改进模型,解决其局限性:
- RoBERTa:优化预训练(如移除NSP、更大批量、更大数据)。
- ALBERT:参数共享和分解嵌入,降低模型规模。
- DistilBERT:知识蒸馏,生成更小、更快的模型。
- ELECTRA:引入生成对抗网络思想,提高预训练效率。
- T5/BART:扩展到生成任务(如翻译、摘要)。
9. 示例代码(使用Hugging Face)
以下是一个简单的文本分类示例:
from transformers import BertTokenizer, BertForSequenceClassification
import torch# 加载预训练模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')# 输入文本
text = "This movie is amazing!"
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True, max_length=512)# 推理
model.eval()
with torch.no_grad():outputs = model(**inputs)logits = outputs.logitsprediction = torch.argmax(logits, dim=-1).item()# 输出结果
labels = ["Negative", "Positive"]
print(f"Sentiment: {labels[prediction]}")
10. 总结
BERT通过双向Transformer和预训练+微调的范式,显著提升了NLP任务的性能。其强大的通用性和灵活性使其成为NLP领域的基石。尽管存在计算成本和模型规模的挑战,BERT的衍生模型和优化技术(如蒸馏、量化)正在不断扩展其应用场景。
Masked Autoencoders Are Scalable Vision Learners
MAE(Masked Autoencoder)是一种基于自监督学习的视觉预训练模型,由Meta AI在2021年提出,旨在通过掩码图像建模(Masked Image Modeling, MIM)提升计算机视觉任务的性能。MAE的设计灵感来源于NLP中的BERT,但将其思想迁移到视觉领域,利用图像的局部冗余特性进行高效预训练。
1. 背景
在MAE之前,计算机视觉领域的主流预训练方法主要包括:
- 监督学习:在ImageNet等大规模标注数据集上进行分类预训练,依赖昂贵的标注成本。
- 自监督学习:如MoCo、SimCLR等基于对比学习的方法,通过构造正负样本对学习特征表示。
- 生成模型:如GAN或变分自编码器(VAE),但生成质量和下游任务性能有限。
这些方法存在局限性:
- 监督学习需要大量标注数据。
- 对比学习依赖复杂的负样本策略或大批量训练,计算成本高。
- 生成模型难以直接优化下游任务性能。
MAE借鉴了BERT的掩码语言建模思想,提出了一种简单而高效的掩码图像建模方法,通过随机掩盖图像块(patches)并重建原始图像,学习丰富的视觉表示。
2. MAE的核心思想
MAE的核心在于:
- 掩码图像建模:随机掩盖图像的大部分区域(通常75%),迫使模型通过剩余的可见区域重建原始图像。
- 自监督学习:无需标注数据,利用图像本身的结构信息进行预训练。
- 不对称编码-解码架构:使用轻量解码器重建图像,降低计算成本。
- 高效性:通过只对可见区域进行编码,显著减少预训练的计算开销。
MAE的目标是学习通用的视觉表示,适用于多种下游任务(如图像分类、目标检测、分割等)。
3. 架构
MAE基于Vision Transformer(ViT),采用编码器-解码器架构,具体结构如下:
3.1 输入处理
- 图像分块:
- 输入图像被划分为固定大小的非重叠块(patches,通常为16x16像素)。
- 每个patch被展平并通过线性层映射为一个向量(类似ViT的patch embedding)。
- 掩码策略:
- 随机选择75%的patches进行掩盖(丢弃),只保留25%的可见patches。
- 掩盖比例(mask ratio)是一个关键超参数,75%被证明效果最佳。
- 位置编码:
- 为每个patch添加位置编码(positional embedding),以保留空间信息。
3.2 编码器(Encoder)
- 结构:
- 基于ViT的Transformer编码器,包含多层Transformer块(Multi-Head Self-Attention + Feed-Forward Network)。
- 编码器仅处理可见patches,大幅降低计算量(相比ViT处理所有patches)。
- 输出:
- 为每个可见patch生成上下文相关的特征表示。
3.3 解码器(Decoder)
- 结构:
- 同样基于Transformer,但通常更轻量(层数少、隐藏维度小)。
- 解码器接收编码器的输出(可见patches的特征)以及掩盖patches的占位符(mask tokens)。
- 输入:
- 可见patches的编码特征。
- 掩盖patches的位置编码+可学习的mask token。
- 输出:
- 重建每个patch的像素值(通常输出归一化的RGB值)。
3.4 重建目标
- 损失函数:
- 均方误差(MSE)用于衡量重建图像与原始图像在掩盖区域的像素差异。
- 损失仅计算在掩盖patches上,忽略可见区域。
- 归一化:
- 输入图像的像素值通常归一化到[0,1],以稳定训练。
3.5 模型规模
- MAE支持多种ViT规模,如:
- ViT-Base:12层,12个注意力头,768维隐藏层。
- ViT-Large:24层,16个注意力头,1024维隐藏层。
- ViT-Huge:32层,16个注意力头,1280维隐藏层。
4. 预训练
MAE的预训练过程简单高效:
- 数据集:
- 通常在ImageNet-1K(约130万张无标注图像)上进行预训练。
- 也可扩展到更大规模的无标注数据集(如ImageNet-22K、JFT)。
- 掩码比例:
- 默认掩盖75%的patches,高掩码比例迫使模型学习更强的上下文建模能力。
- 训练目标:
- 重建掩盖区域的像素值,学习图像的局部和全局结构。
- 高效性:
- 编码器只处理25%的patches,计算量约为全图像处理的1/4。
- 解码器仅用于预训练,微调时可丢弃,进一步降低下游任务成本。
5. 微调
- 预训练后,MAE的编码器被用于下游任务,解码器被丢弃。
- 微调方式:
- 图像分类:在编码器输出(通常为
[CLS]
token或全局平均池化)后添加分类头,进行监督微调。 - 目标检测/分割:将编码器集成到检测框架(如Mask R-CNN)或分割模型(如UPerNet)中。
- 图像分类:在编码器输出(通常为
- 端到端微调:
- MAE支持直接微调整个编码器,也可冻结部分层以加速训练。
- 数据效率:
- MAE在低数据场景下表现优异,适合few-shot学习。
6. 应用
MAE的预训练表示适用于多种计算机视觉任务:
- 图像分类:如ImageNet-1K分类。
- 目标检测:如COCO数据集上的物体检测。
- 实例分割:如COCO的掩码预测。
- 语义分割:如ADE20K数据集。
- 视频理解:通过扩展到视频数据(如Kinetics数据集)。
- 生成任务:结合生成模型(如扩散模型)进行图像修复或生成。
7. 优势 and 缺点
7.1 优势
- 简单高效:
- 相比对比学习(如MoCo、SimCLR),MAE无需复杂的负样本或大批量训练。
- 高掩码比例减少编码器计算量,预训练速度快。
- 数据效率:
- 在无标注数据上预训练,微调时只需少量标注数据。
- 通用性:
- 预训练表示适用于多种视觉任务,性能媲美甚至超越监督预训练。
- 鲁棒性:
- 高掩码比例迫使模型学习全局上下文,增强模型对遮挡、噪声的鲁棒性。
- 可扩展性:
- 可轻松扩展到更大模型(如ViT-Huge)或更大数据集。
7.2 缺点
- 像素级重建局限性:
- 重建像素值可能忽略高级语义信息,适合低级特征学习但对高级任务(如分类)效果有限。
- 对Transformer依赖:
- MAE依赖ViT架构,难以直接应用于CNN等其他架构。
- 预训练成本:
- 虽然比对比学习高效,但仍需大量计算资源(GPU/TPU)进行预训练。
- 长序列处理:
- ViT对高分辨率图像的分块数量多,内存需求高。
8. 与其他方法的对比
- 对比BERT:
- 相似点:两者都使用掩码建模(MLM vs. MIM)。
- 不同点:
- BERT处理离散的词,MAE处理连续的像素。
- BERT重建词的概率分布,MAE重建像素值。
- MAE的掩码比例(75%)远高于BERT(15%)。
- 对比MoCo/SimCLR:
- MoCo/SimCLR基于对比学习,需构造正负样本对,训练复杂。
- MAE直接重建图像,训练更简单,计算成本更低。
- 对比BEiT:
- BEiT(另一掩码图像建模方法)使用离散化的视觉词表(visual tokens)重建,需额外训练分词器(如D-VAE)。
- MAE直接重建像素,省去分词步骤,更简单但可能丢失高级语义。
- 对比监督预训练:
- 监督预训练依赖标注数据,成本高。
- MAE利用无标注数据,性能接近甚至超越监督方法。
9. 改进与衍生模型
MAE的成功催生了多种改进和衍生工作:
- SimMIM:提出更简单的掩码建模框架,验证了低掩码比例的效果。
- CAE:结合对比学习和掩码建模,提升表示质量。
- VideoMAE:将MAE扩展到视频领域,通过掩码视频帧进行预训练。
- MAE with Semantic Guidance:引入语义先验(如CLIP特征)指导重建,增强高级特征学习。
- Efficient MAE:通过知识蒸馏或量化降低模型规模和推理成本。
10. 代码示例(使用PyTorch)
以下是一个简化的MAE推理示例(假设使用预训练模型):
import torch
from torchvision import transforms
from PIL import Image
from timm.models import create_model# 加载预训练MAE模型
model = create_model('vit_base_patch16_224.mae', pretrained=True)
model.eval()# 加载和预处理图像
image = Image.open("sample.jpg").convert("RGB")
transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
])
input_image = transform(image).unsqueeze(0) # [1, 3, 224, 224]# 推理
with torch.no_grad():reconstructed, mask = model(input_image)# reconstructed: 重建图像# mask: 掩码(指示哪些patches被掩盖)# 可视化结果
import matplotlib.pyplot as plt
plt.subplot(1, 3, 1)
plt.title("Original")
plt.imshow(image)
plt.subplot(1, 3, 2)
plt.title("Masked")
plt.imshow((input_image * (1 - mask)).squeeze().permute(1, 2, 0))
plt.subplot(1, 3, 3)
plt.title("Reconstructed")
plt.imshow(reconstructed.squeeze().permute(1, 2, 0))
plt.show()
(注:需安装timm
库并下载预训练权重,实际代码可能需根据具体实现调整。)
11. 总结
MAE通过掩码图像建模提供了一种简单、高效的自监督视觉预训练方法,显著降低了标注数据依赖,并在多种视觉任务中取得了SOTA性能。其高掩码比例、不对称架构和像素级重建目标使其在计算效率和表示能力之间取得了良好平衡。尽管存在像素级重建的局限性,MAE的衍生工作和优化正在不断扩展其应用前景。
参考资料
什么是 BERT?【知多少】
BERT 论文逐段精读【论文精读】
MAE 论文逐段精读【论文精读】
[论文解读] 何恺明新作 MAE!!! Masked Autoencoders Are Scalable Vision Learners
Paper explained: Masked Autoencoders Are Scalable Vision Learners