赞
踩
随着以GPT、BERT为代表的预训练语言模型的提出,很多的工作集中在进一步优化预训练语言模型,使之在各类自然语言处理任务上获得更好的效果。
BERT存在的问题
语言模型通常被分为两大类:自回归语言模型(Auto-Regressive Language Model,ARLM)和自编码语言模型(Auto-Encoding Language Model,AELM)
自回归语言模型是一种最常用的语言模型,需要基于给定的历史文本序列预测下一个单词的概率。
对于自编码语言模型,其目标是通过上下文重构被掩码的单词,BERT就属于这个类别。
XLNet是一种基于Transformer-XL的自回归语言模型,并集成了自编码语言模型的优点。
XLNet的特点:
XLNet引入的两个重要改进方法——排列语言模型
XLNet的主体结构仍然是一个自回归语言模型。因此,如何将双向上下文引入自回归语言模型中是首要问题。
假设句子x=x1x2x3x4包含四个词,整个句子的建模为:
当预测x4时,需要依赖x2和x3。而当预测x1时,需要依赖x2、x3和x4,即实现了双向上下文的建模方式。
XLNet引入的两个重要改进方法——双流自注意力机制
如何构造排列语言模型中的构造方法,双流自注意力机制使用两套表示方法
内容表示
即原始的Transformer表示方法,可以同时建模单词及其上下文
查询表示
能建模上下文信息 以及目标位置,但不能看到单词
通过改变注意力掩码(Attention Mask)矩阵实现。
除了排列语言模型和双流自注意力机制,XLNet还引入了部分预测进一步提升排列语言模型的收敛速度,使用了相对块编码技术提升模型对不同输入形式的泛化能力。
RoBERTa在BERT的基础上引入了动态掩码技术,同时舍弃了NSP任务。同时,RoBERTa采用了更大规模的预训练数据,并以更大的批次和BPE词表训练了更多的步数。
动态掩码
决定掩码位置和方法是在模型的训练阶段实时计算的。
舍弃NSP任务
在原始BERT的分析实验中,去掉NSP任务会显著降低自然语言推断任务、自然语言推断任务和阅读理解任务的效果。
文本对输出+NSP
原始BERT的输入形式,即由一对文本构成,每个文本由多个自然句子组成,整体长度不超过512个标记。
句子对输出+NSP
由一对句子构成输入序列。
跨文档整句输入
由一对文本构成输入序列。
文档内整句输入
与“跨文档整句输入”类似,但当达到文档末端时,不允许继续从下个文档中抽取句子。
其他优化
ALBERT(A Lite BERT)降低内存的消耗并且提高BERT的训练速度。主要包含两项技术:词向量参数因式分解和跨层参数共享。
词向量因式分解
解耦合词向量维度E和Trans-former隐含层维度 H。
跨层参数共享
在BERT中,多层Transformer的参数是不共享的,即每一层Transformer都保留自己的参数。
跨层参数共享(Cross-layer Parameter Sharing)机制使得每一层Transformer的权重都是一样的。
句子顺序预测
ALBERT引入了一个新的预训练任务——句子顺序预测(Sentence Or-der Prediction,SOP)取代BERT中的NSP任务。
ELECTRA(Ef-ficientlyLearning an Encoder that Classifies Token Replacements Accurately)采用了一种“生成器–判别器”结构,其与生成式对抗网络(Generative Adversarial Net,GAN)的结构非常相似。
ELECTRA是由生成器(Generator)和判别器(Discrimi-nator)串联起来的一个模型。
建模方法:
生成器
目的是将带有掩码的输入文本x= x1··· xn,通过多层Transformer模型学习到上下文语义表示 hh1··· hn,并还原掩码位置的文本,即BERT中的MLM任务。
判别器
目标是从采样后的句子中识别出哪些单词是和原始句子x对应位置的单词一样的,即替换词检测任务。
模型训练
生成器和判别器分别使用以下损失函数训练:
其他改进
更小的生成器
减小生成器中Transformer的隐含层维度、全连接层维度和注意力头的数目。
参数共享
只限于输入层权重,其中包括词向量和位置向量矩阵。
为了解决“预训练–精调”不一致的问题,哈工大讯飞联合实验室提出了MacBERT[19]。MacBERT中应用了一种基于文本纠错的掩码语言模型(MLM as cor-rection,Mac)。
该方法不需要对现有结构做任何改动,只需改变掩码方式,因此极大限度地保留了BERT的原始特性,并可以无缝迁移到任何使用BERT的下游任务精调代码中。
MacBERT针对掩码语言模型任务进行了如下修改:
以自注意力机制为核心的 Transformer 模型是各种预训练语言模型中的主要组成部分。
传统处理长文本的方法一般是切分输入文本,其中每份的大小设置为预训练语言模型能够单次处理的最大长度,最终将多片文本的决策结果进行综合或者拼接得到最终结果。
然而,这种方法不能很好地构建文本块之间的联系,挖掘长距离文本依赖的能力较弱。因此,更好的方法需要从根本上提高预训练语言模型单次能够处理的最大文本长度,从而能够更加充分地利用自注意力机制。
为了优化对长文本的建模,Transformer-XL提出了两种改进策略——状态复用的块级别循环和相对位置编码。
状态复用的块级别循环
应用于语料库中每两个连续的片段,本质上是在隐含状态下产生一个片段级的循环。在这种机制下,Transformer利用的有效上下文可以远远超出两个块。
相对位置编码
传统方法中对于不同的块,使用的位置向量是一样的。为了解决这个问题,Transformer-XL引入了相对位置编码策略。位置信息的重要性主要体现在注意力矩阵的计算上,用于构建不同词之间的关联关系。
Reformer主要引入了局部敏感哈希注意力和可逆Transformer技术,有助于减少模型的内存占用,进一步提升了模型对长文本的处理能力。
局部敏感哈希注意力
可逆Transformer
为了进一步降低模型的内存占用空间,Reformer中还引入了可逆Transformer技术。任意一层的激活值都可以通过后续层的激活值进行还原。
Longformer将输入文本序列的最大长度扩充至4096,同时提出了三种稀疏注意力模式降低计算复杂度,分别是滑动窗口注意力、扩张滑动窗口注意力和全局注意力。
滑动窗口注意力
每个词只会与其相邻的k个词(以当前词为中心,左右窗口长度均为k/2)计算注意力。
扩张滑动窗口注意力
借鉴卷积神经网络中的扩张卷积(Dilated Convolution)。在扩张滑动窗口中,并不是利用
窗口内所有的上下文单词信息,而是引入了扩张率(Dilation Rate)d,即每间隔d−1采样一次。
全局注意力
特别关注一些预先选定的位置,使这些位置能够看到全局信息。
BigBird进一步优化了Transformer对长文档的处理能力,也同样借鉴了稀疏注意力的方法。
随机注意力
针对每一个词,随机选取r个词参与注意力的计算。
滑动窗口注意力
与Longformer相同,即只利用当前词周围的k个词计算注意力。
全局注意力
与Longformer基本相同,即从输入序列中选择g个词,使其能够见到所有词,反之亦然。
BigBird结合了以上三种不同的注意力模式。
预训练语言模型虽然在众多自然语言任务中取得了很好的效果,但通常这类模型的参数量较大,很难满足实际应用中的时间和空间需求。
目前主流的预训练语言模型压缩方法是知识蒸馏技术。知识蒸馏(Knowledge Distillation,KD)是一种常用的知识迁移方法,通常由教师(Teacher)模型和学生(Student)模型构成。
DistilBERT应用了基于三重损失(Triple Loss)的知识蒸馏方法。相比BERT 模型,DistilBERT 的参数量压缩至原来的40%,同时带来 60%的推理速度提升,并且在多个下游任务上达到BERT模型效果的97%。
基本结构
学生模型(即DistilBERT)的基本结构是一个六层 BERT 模型,同时去掉了标记类型向量和池化模块。教师模型是直接使用了原版的BERT-base模型。
知识蒸馏方法
为了将教师模型的知识传输到学生模型,DistilBERT采用了三重损失:有监督MLM损失、蒸馏MLM损失和词向量余弦损失。
有监督MLM损失(硬标签(Hard Label)训练方法)
利用掩码语言模型训练得到的损失,即通过输入带有掩码的句子,得到每个掩码位置在词表空间上的概率分布,并利用交叉熵损失函数学习。
蒸馏MLM损失(软标签(Soft Label)训练方法)
利用教师模型的概率作为指导信号,与学生模型的概率计算交叉熵损失进行学习。
词向量余弦损失
词向量余弦损失用来对齐教师模型和学生模型的隐含层向量的方向,从隐含层维度拉近教师模型和学生模型的距离。
TinyBERT主要使用了额外的词向量层蒸馏和中间层蒸馏进一步提升知识蒸馏的效果。TinyBERT利用两段式蒸馏方法,即在预训练阶段和下游任务精调阶段都进行知识蒸馏,进一步提升了下游任务的性能表现。
知识蒸馏方法
TinyBERT针对预训练语言模型的不同部分采用了不同的蒸馏方法,具体可分为三部分:
词向量层蒸馏
计算学生模型的词向量vs和教师模型的词向量vt之间的均方误差损失。
中间层蒸馏
在Transformer的主体部分,TinyBERT引入了隐含层蒸馏损失和注意力蒸馏损失,统称为中间层匹配损失。
预测层蒸馏
TinyBERT也使用了软标签蒸馏方法,将教师模型的概率作为软标签,并利用交叉熵损失函数进行学习。
两段式蒸馏
在预训练阶段和下游任务精调阶段均进行蒸馏。
通用蒸馏
在预训练阶段,知识蒸馏能够将教师模型中丰富的知识传输到学生模型,提升学生模型的通用表示能力。
特定任务蒸馏
在下游任务精调阶段,知识蒸馏进一步将下游任务数据中的领域知识传输到学生模型,提升学生模型在特定任务上的表示能力,使学生模型与目标任务更加契合。
数据增广
TinyBERT 引入了数据增广的方法进一步扩充下游任务数据。
MobileBERT可以看作一个“瘦身”后的BERT-large模型,使用了瓶颈结构,并且在自注意力和前馈神经网络的设计上也有一定的改进。
知识蒸馏方法
MobileBERT的损失函数由四部分组成:有监督MLM损失、有监督NSP损失、隐含层蒸馏损失和注意力蒸馏损失。
渐进式知识迁移策略
概述
为了方便研究人员快速实现模型的知识蒸馏,哈工大讯飞联合实验室推出了一款基于PyTorch的知识蒸馏工具包TextBrewer。
特点:
架构与设计
TextBrewer主要分为Configurations、Distillers和Utilities三部分。
Distillers。
Distillers是TextBrewer的核心,用来训练蒸馏模型、保存模型和调用回调函数。
Configurations。
Distillers训练或蒸馏模型的具体方式由两个配置对象——TrainingConfig和DistillationConfig指定。
TrainingConfig:定义了深度学习实验的通用配置
DistillationConfig:定义了和知识蒸馏密切相关的配置
Utilities。
包含一些辅助的功能,如模型参数统计等
代码实现
步骤:
定义相关配置(TrainingConfig和DistillationConfig),并用该配置初始化Distiller
定义适配器(adaptor)和回调函数(callback)
适配器
Distiller是模型无关的。
回调函数
在训练模型期间,常常需要每隔一定步数在开发集上验证模型的性能。
调用Distiller的train方法开始蒸馏
import torch from datasets import load_dataset import textbrewer from textbrewer import GeneralDistiller, TrainingConfig, DistillationConfig from transformers import BertTokenizerFast, BertForSequenceClassification, DistilBertForSequenceClassification # 加载数据并构建Dataloader dataset = load_dataset('glue', 'sst2', split='train') tokenizer = BertTokenizerFast.from_pretrained('bert-base-cased') def encode(examples): return tokenizer(examples['sentence'], truncation=True, padding='max_length') dataset = dataset.map(encode, batched=True) encoded_dataset = dataset.map(lambda examples: {'labels': examples['label']}, batched=True) columns = ['input_ids', 'attention_mask', 'labels'] encoded_dataset.set_format(type='torch', columns=columns) def collate_fn(examples): return dict(tokenizer.pad(examples, return_tensors='pt')) dataloader = torch.utils.data.DataLoader(encoded_dataset, collate_fn=collate_fn, batch_size=8) # 定义教师和学生模型 teacher_model = BertForSequenceClassification.from_pretrained('bert-base-cased') student_model = DistilBertForSequenceClassification.from_pretrained('distilbert-base-cased') # 打印教师模型和学生模型的参数量(可选) print("\nteacher_model's parameters:") result, _ = textbrewer.utils.display_parameters(teacher_model, max_level=3) print(result) print("student_model's parameters:") result, _ = textbrewer.utils.display_parameters(student_model, max_level=3) print(result) # 定义优化器 optimizer = torch.optim.AdamW(student_model.parameters(), lr=1e-5) device = 'cuda' if torch.cuda.is_available() else 'cpu' if device == 'cuda': teacher_model.to(device) student_model.to(device) # 定义adaptor、训练配置、蒸馏配置 def simple_adaptor(batch, model_outputs): return {'logits': model_outputs[1]} train_config = TrainingConfig(device=device) distill_config = DistillationConfig() # 定义distiller distiller = GeneralDistiller( train_config=train_config, distill_config=distill_config, model_T=teacher_model, model_S=student_model, adaptor_T=simple_adaptor, adaptor_S=simple_adaptor) # 开始蒸馏! with distiller: distiller.train( optimizer, dataloader, scheduler_class=None, scheduler_args=None, num_epochs=1, callback=None)
静态词向量学习模型、动态词向量模型和BERT等预训练语言模型都可以归纳为对于语言表示学习的预训练技术,其主要目的是获得具有更强表达能力以及泛化性的编码器。这些模型在语言理解类任务(如文本分类、自动问答)上取得了卓越的效果。
在自然语言处理中还有另外一大类任务——文本生成,例如机器翻译、文本摘要等。
BART模型使用标准的基于Transformer的序列到序列结构,主要区别在于用GeLU激活函数替换了原始结构中的 ReLU,以及参数根据正态分布进行初始化。
BART 结合双向的 Transformer 编码器与单向的自回归Transformer解码器,通过对含有噪声的输入文本去噪重构进行预训练,是一种典型的去噪自编码器。
预训练任务
BART模型考虑了以下五种噪声引入方式:
模型精调
序列分类与序列标注
对于序列分类任务(如文本情感分类),BART模型的编码器与解码器使用相同的输入,将解码器最终时刻的隐含层状态作为输入文本的向量表示,并输入至多类别线性分类器中,再利用该任务的标注数据精调模型参数。
文本生成
BART模型可以直接用于条件式文本生成任务,例如抽象式问答以及文本摘要等。
机器翻译
将BART模型编码器的输入表示层替换为一个小型Transformer编码器,用来将源语言中的词汇映射至目标语言的输入表示空间,从而适配BART模型的预训练环境
不同于BART模型的编码器–解码器结构,UniLM只需要使用一个Transformer网络,便可以同时完成语言表示以及文本生成的预训练,进而通过模型精调应用于语言理解任务与文本生成任务。
核心思想是通过使用不同的自注意力掩码矩阵控制每个词的注意力范围,从而实现不同语言模型对于信息流的控制。
预训练任务
UniLM模型提供了一个统一的框架,可以利用双向语言模型、单向语言模型和序列到序列语言模型进行预训练。
双向语言模型
输入序列由两个文本片段组成,由特殊标记[EOS]相隔。与BERT模型类似,在输入文本中随机采样部分单词,并以一定概率替换为[MASK]标记,最后在输出层的相应位置对正确词进行预测。
单向语言模型
包括前向(自左向右)与后向(自右向左)的自回归语言模型。
序列到序列语言模型
利用掩码矩阵,还可以方便地实现序列到序列语言模型,进而应用于条件式生成任务。
模型精调
分类任务
对于分类任务,UniLM的精调方式与BERT类似。
生成任务
对于生成任务,随机采样目标文本片段中的单词并替换为[MASK]标记,精调过程的学习目标是恢复这些被替换的词。
谷歌公司的研究人员提出的T5(Text-to-Text Transfer Transformer)模型采用了一种与前述模型截然不同的策略:将不同形式的任务统一转化为条件式生成任务。
使用同一套模型参数完成多项不同的条件式生成任务有两个很关键的要素:
与T5模型相似,OpenAI提出的GPT-3模型(第三代GPT)也是通过将不同形式的自然语言处理任务重定义为文本生成实现模型的通用化。
GPT-3模型不需要任何额外的精调,就能够在只有少量目标任务标注样本的情况下进行很好的泛化。
除了作为预训练模型用于语言表示、条件式生成等下游任务,语言模型的另一个重要的功能是“写作”,或定向文本生成。
CTRL
CTRL模型可以根据指定的领域、风格、主题、实体和实体关系等属性生成相应的文本。
CTRL模型从结构上仍然是一个基于Transformer的自回归语言模型。它之所以能够实现可控文本生成,其核心思想是从海量无标注数据中定位文章所在的领域或其他属性,并作为控制代码放在输入文本的头部,以指导后续文本的生成。
PPLM
PPLM模型提供了一种无须重新训练,且即插即用的方法实现可控的文本生成。
核心思想是对于预训练语言模型(GPT-2)以及目标属性a(例如情感、主题等),利用当前的生成结果是否满足属性a(即条件概率P (a|x))对生成进行修正,使其朝着满足该属性的方向变化。
-3
与T5模型相似,OpenAI提出的GPT-3模型(第三代GPT)也是通过将不同形式的自然语言处理任务重定义为文本生成实现模型的通用化。
GPT-3模型不需要任何额外的精调,就能够在只有少量目标任务标注样本的情况下进行很好的泛化。
除了作为预训练模型用于语言表示、条件式生成等下游任务,语言模型的另一个重要的功能是“写作”,或定向文本生成。
CTRL
CTRL模型可以根据指定的领域、风格、主题、实体和实体关系等属性生成相应的文本。
CTRL模型从结构上仍然是一个基于Transformer的自回归语言模型。它之所以能够实现可控文本生成,其核心思想是从海量无标注数据中定位文章所在的领域或其他属性,并作为控制代码放在输入文本的头部,以指导后续文本的生成。
PPLM
PPLM模型提供了一种无须重新训练,且即插即用的方法实现可控的文本生成。
核心思想是对于预训练语言模型(GPT-2)以及目标属性a(例如情感、主题等),利用当前的生成结果是否满足属性a(即条件概率P (a|x))对生成进行修正,使其朝着满足该属性的方向变化。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。