局网站建设招标深圳网站建设 卓
news/
2025/9/24 7:27:59/
文章来源:
局网站建设招标,深圳网站建设 卓,个体商户取名字推荐,wordpress多域名模板多Transformer的双向编码器表示法
Bidirectional Encoder Representations from Transformers#xff0c;即Bert#xff1b;
第二部分 探索BERT变体 从本章开始的诸多内容#xff0c;以理解为目标#xff0c;着重关注对音频相关的支持#xff08;如果有的话#xff09;…多Transformer的双向编码器表示法
Bidirectional Encoder Representations from Transformers即Bert
第二部分 探索BERT变体 从本章开始的诸多内容以理解为目标着重关注对音频相关的支持如果有的话 BERT变体ALBERT、RoBERTTa、ELECTRA、SpanBERT、基于知识蒸馏 ALBERTA Lite version of BERT意为BERT模型的精简版它对BERT的架构做了一些改变以尽量缩短训练时间 RoBERTTaRobustly Optimized BERT Pretraining Approach意为稳健优化的BERT预训练方法是目前比较流行的BERT变体被应用到许多先进系统其工作原理与BERT类似但预训练步骤商有一些变化 ELECTRAEfficiently Learning an Encoder that Classifies Token Replacements Accurately意为高效训练编码器如何准确分类替换标记特别的ELECTRA使用一个生成器generator和一个判别器discriminator并使用替换标记检测这一新任务进行预训练 SpanBERT它被广泛应用于问答任务和关系提取任务
ALBERT
《ALBERTA Lite BERT for Self-supervised Learning of Language Representations》
BERT-base有1.1亿个参数这使得它很难训练且推理时间较长
ALBERT的参数量更少它通过跨层参数共享、嵌入层参数因子分解来减少参数量
这两种方式可以有效缩短BERT模型训练时间和推理时间
跨层参数共享
我们知道BERT-base由12层编码器组成所有编码器层的参数将通过训练获得但在跨层参数共享的情况下不是学习所有编码器层的参数而是只学习第一层编码器的参数然后将第一层编码器的参数与其他所有编码器层共享
应用跨层参数共享时的几种方式
全共享其他编码器的所有子层共享编码器1的所有参数默认所使用的共享前馈网络层只将编码器1的前馈网络层的参数与其他编码器的前馈网络层共享共享注意力层只将编码器1的多头注意力层的参数与其他编码器的多头注意力层共享
嵌入层参数因子分解
BERT使用WordPiece词元分析器创建WordPiece标记WordPiece标记的嵌入大小被设定为与隐藏层嵌入的大小特征大小相同但WordPiece嵌入式无上下文信息的特征它是从词表的独热one-hot编码向量中习得的而隐藏层嵌入是由编码器返回的有上下文信息的特征
使用
V表示词表大小BERT词表大小为30000H表示隐藏层嵌入大小E表示WordPiece嵌入的大小
为了将更多信息编码到隐藏层嵌入中通常将隐藏层嵌入的大小设置为较大的一个数BERT-base是768
WordPiece嵌入和 隐藏层嵌入都是通过训练学习的将二者大小设置的相同会增加需要学习的参数数量为避免这种情况可以使用“嵌入层参数因子分解方法”将嵌入矩阵分解成更小的矩阵
通过分解
我们将独热编码向量投射到低维嵌入空间V x E然后将这个低维嵌入投射到隐藏空间 E x H即不是直接将词表的独热编码向量投射到隐藏空间V x H
也就是说我们不是直接投射V x H而是将这一步分解为 V x E和 E x H
V 30000、E 128、H 768可以通过如下步骤投射 V x H
将词表V的独热编码向量投射到低维WordPiece嵌入的大小E即V x E再将WordPiece嵌入大小E投射到隐藏层H中即E x H
ALBERT的训练
ALBERT使用了掩码语言模型构建任务进行了预训练但并没有用下句预测任务而是使用“句序预测任务”sentence order predictionSOP这一新任务 研究人员指出相比掩码语言模型下句预测并不是一个难的任务句序预测是基于句子间连贯性而不是基于主题预测 句序预测也是一个二分类任务在给定句子对中两个句子的顺序是否被调换模型的目标是分析句子对事属于正例句子顺序没有互换还是负例句子顺序互换
相比BERTALBERT的参数比较少ALBERT-xxlarge配置的模型在多个语言基准数据集上的性能表现明显优于BERT-large可以作为BERT的一个很好的替代品
# 可以像使用BERT那样使用ALBERT模型
from transformers import AlbertTokenizer, AlbertModelmodel AlbertModel.from_pretrained(albert-base-v2)
tokenizer AlbertTokenizer.from_pretrained(albert-base-v2)sentence I am good
imputs tokenizer(sentence, reutrn_tensors pt)# inputs
# {
# input_ids:
# token_type_ids:
# attention_mask:
# }hidden_rep, cls_head model(**inputs)
RoBERTTa
《RoBERTaA Robustly Optimized BERT Pretraining Approach》
RoBERTTa本质还是BERT只是在预训练过程中有如下变化
在掩码语言模型构建任务重使用动态掩码而非静态掩码不执行下句预测任务以大批量的方式进行训练使用字节级字节对编码作为子词词元化算法
静态掩码指在预处理阶段完成随机掩盖15%标记的处理只做了一次在多次迭代训练中预测的都是相同的掩码标记 复制10次句子并进行随机掩盖然后在多轮遍历训练中依次使用每个掩盖后的句子 研究发现下句预测任务对预训练BERT模型并不是真的有用因此RoBERTa中只用了掩码语言模型构建任务来训练模型输入是一个完整的句子它是从一个或多个文件中连续采样而得得输入最多由512个标记组成如果输入达到一个文件的末尾那么就从下一个文件开始采样
BERT的预训练有100万步批量大小为256而RoBERTa的批量大小为8000共30万步用较大的批量进行训练可以提高模型的速度和性能
字节级字节对编码使用字节级序列所使用的词表有50000个标记
from transformers import RobertaConfig, RobertaModel, RobertaTokenizermodel RobertaModel.from_pretrained(roberta-base)
model.config
tokenizer RobertaTokenizer..from_pretrained(roberta-base)tokenizer.tokenize(I am good)
ELECTRA
ELECTRA没有使用掩码语言模型构建任务作为预训练目标而是使用一个叫做替换标记检测的任务进行预训练并且仅使用了这个任务下句预测也没用
使用另一个标记进行替换并训练模型判断标记是实际标记还是替换后的标记
之所以这样做是因为掩码语言模型构建使用了[MASK]标记但在下有任务中这个标记并不存在这导致了预训练和微调之间的不匹配使用替换标记检测的任务解决了预训练和微调之间的不匹配问题
“判断标记是实际标记还是替换后的标记”的模型成为判别器仅做分类
将一个句子随机使用[MASK]标记进行替换然后送入另一个BERT模型以预测被掩盖的标记这个模型叫生成器它会返回标记的概率分布使用生成器生成的标记 替换给定句子中的[MASK]标记训练判别器训练它对标记进行分类使用判别器每个标记都会得到一个判别/分类结果表示各个表示是替换标记还是实际标记
基本上来说判别器就是ELECTRA模型训练结束后生成器可以移除
生成器执行的是 掩码语言模型构建任务生成器使用sigmoid函数的前馈网络层返回标记是实际标记还是替换标记
为了更高效的训练ELECTRA模型可以在生成器和判别器之间共享权重前提是二者大小相同如果不同的话可以使用较小的生成器仅共享生成器和判别器之间的嵌入层标记嵌入和位置嵌入
from transformers import ElectraTokenizer, ElectraModel# electra-small判别器
model ElectraModel.from_pretrained(google/electra-small-discriminator)# electra-small生成器
model ElectraModel.from_pretrained(google/electra-small-generator)
SpanBERT预测文本段
SpanBERT主要用于文本区间的问答任务
区别与随机掩盖SpanBERT是随机地对连续区间进行掩码然后将其送入SpanBERT返回每个标记的特征
为了预测[MASK]所代表的标记使用掩码语言模型构建目标和区间边界目标span boundary objective SBO来训练SpanBERT模型
区间边界标记特征使用[MASK]的位置嵌入
SpanBERT使用两个目标
一个是掩码语言模型构建目标为预测掩码标记只使用相应的标记特征另一个是区间边界目标为预测掩码标记只使用区间边界标记特征和掩码标记的位置嵌入
# pipeline API 用于无缝地执行从文本分类任务到问答任务等各类复杂任务
from transformers import pipelineqa_pipeline pipeline(question-answering,model mrm8488/spanbert-large-finetuned-squadv2,tokenizer SpanBERT/spanbert-large-cased
)# 输入问题和上下文 即可得到答案
results qa_pipeline({question: What is AI?,context: AI is ....
})results[answer]
基于知识蒸馏
使用知识蒸馏法可以实现 将知识从预训练的大型BERT模型迁移到小型BERT模型本章将了解基于知识蒸馏的BERT变体
知识蒸馏DistilBERT——BERT模型的知识蒸馏版本TunyBERT知识迁移到简单的神经网络
知识蒸馏
知识蒸馏knowledge distillation是一种模型压缩技术指训练一个小模型来重现大型预训练模型的行为也被称为师生学习大模型是老师小模型是学生
假设通过一个预训练大模型教师网络来预测句子中的下一个单词输入一个句子网络预测将返回词表中所有单词是下一个单词的概率分布softmax作用于输出层
从返回的概率分布中除了概率最高的词还有一些词的概率也相对较高这体现了相关单词与输入句子的相关性更高这就是所谓的隐藏知识在知识蒸馏过程中我们希望学生网络能从教师网络学到这些隐藏知识
但实际的可用模型往往会为正确的结果返回一个接近1的高概率而对其他单词概率都接近于0此时概率分布中已经没有太多信息了为此需要使用带有温度系数的softmax函数即softmax温度在输出层使用softmax温度来平滑概率分布增加T值可以是概率分布更平滑T1时即为标准的softmax函数
通过softmax温度就可以获得隐藏知识即先用softmax温度对教师网络进行预训练获得隐藏知识然后在知识蒸馏中将这些隐藏知识从教师网络迁移至学生网络
训练学生网络
经过预训练的教师网络在其预训练过程中使用了softmax温度
将句子送入教师网络和学生网络其中
教师网络返回的概率分布是我们的目标教师网络的输出称为软目标学生网络做出的预测称为软预测最后计算软目标和软预测之间的交叉熵损失并通过反向传播训练学生网络
软目标和软预测之间的交叉熵损失也被称为蒸馏损失 注意教师网络和学生网络中softmax层的T值需保持一致如T5且都大于1 除了蒸馏损失外我们还是用另一个损失称为学生损失
相比软目标硬目标就是将高概率设置为1其余概率设置为0相比软预测硬预测就是softmax T1得到的概率分布标准softmax函数
学生损失
即硬目标 与 硬预测之间的交叉熵损失
计算过程
教师网络 使用T5的softmax函数得到软目标对软目标将具有高概率的位置设置为1其余设置为0得到硬目标学生网络 使用T5的softmax函数得到软预测学生网络 使用T1的softmax函数得到硬预测软目标和软预测之间的交叉熵损失即蒸馏损失硬目标与硬预测之间的交叉熵损失即学生损失
最终的损失函数是 两个损失的加权和权重分别为α和β两个超参数
总结下在知识蒸馏中我们使用预训练网络作为教师网络训练学生网络通过蒸馏从教师中获得知识
DistilBERT模型
Hugging Face的研发开发了DistilBERT是一个更小、更快的轻量级BERT模型
使用BERT-base作为教师一个更少层数的BERT模型作为学生隐藏层大小保持在768可以使用相同的数据集进行训练
实际训练除了蒸馏损失和学生损失还需要计算余弦嵌入损失cosine embedding loss它是教师模型和学生模型所学的特征向量之间的距离最小化该损失将使学生网络的特征向量更加准确
损失函数是3中损失之和
蒸馏损失掩码语言模型损失学生损失余弦嵌入损失
通过最小化损失之和来训练学生BERT模型即DistilBERT模型他可以达到BERT-base 97%的准确度在8块V10016G上进行了大约90小时的训练该预训练模型Hugging Face也以公开模型大小仅207MB
TinyBERT模型
在TinyBERT模型除了从教师BERT模型的输出层预测层向学生BERT模型迁移知识还可以嵌入层和编码层迁移知识 具体内容略过 将知识从BERT模型迁移到神经网络中
《Distilling Tash-Specific Knowledge from BERT into Simple Neural Networks》
教师BERT模型
使用预训练的BERT-large模型需要注意的是要将特定任务的知识从教师迁移给学生需要先针对特定任务微调预训练的BERT-large模型然后再将其作为教师
学生网络
是一个简单的双向LSTM学生网络可以根据不同任务而变化
以句子的情感分析任务为例
将句子嵌入送入双向LSTM得到前向、后向的隐藏状态再将前向、后向的隐藏状态送入带有ReLU激活函数的全连接层返回logit向量作为输出将logit向量送入softmax函数得到该句是正面还是负面的概率
损失是 学生损失 和 蒸馏损失的加权和这里使用均方损失MSE 作为蒸馏损失因为它比交叉熵损失的表现更好学生损失还是硬目标和硬预测之间的标准交叉熵损失
第三部分 BERT模型的应用 这里我们略过第6章和第7章 第8章 Sentence-BERT模型和特定领域的BERT模型第9章 VideoBERT模型和BART模型
第8章 Sentence-BERT模型和特定领域的BERT模型 主要学习 ClinicalBERT模型其他内容略过 我们知道BERT模型是使用维基百科语料库进行的预训练对于特定领域也可以使用特定的语料库重新训练BERT
ClinicalBERT模型就是一个使用大型临床语料库MIMIC-III进行预训练的针对临床领域的BERT模型可以应用到死亡风险评估、诊断预测等下游任务
ClinicalBERT模型使用掩码语言模型构建任务penicillin和下句预测任务isNext进行预训练与BERT一致 对于超过最大标记长度512的长序列可以将其拆分成多个子序列然后使用公式计算分数 t分布随机邻域嵌入法t-SNE被用来绘制使用ClinicalBERT模型获得的医学术语特征以评估该模型所学到的特征
第9章 VideoBERT模型和BART模型
VideoBERT模型
是第一个联合学习视频特征及语言特征的模型可应用于图像字幕生成、视频字幕添加、预测视频下一帧等任务
预训练任务
掩码语言模型构建完形填空语言-视觉对其任务
旁白和视频画面的对应 有助于联合学习语言及视频的特征
提取视频中语言标记和视觉标记
使用自动语音识别ASR工具从视频中提取音频再将音频转换为文本对文本进行标记就形成了语言标记以20帧/秒的速度对视频中图像帧进行采样然后将图像帧转换成1.5s的视频标记
语言标记和视频标记结合使用特殊标记间隔
在语言标记开头添加[CLS]标记[SEP]标记在视觉标记末尾添加中间使用[]标记间隔使用[MASK]进行随机掩蔽送入VideoBERT返回所有标记特征
掩码语言模型构建完形填空我们已经了解对于语言-视觉对其任务
它也是一个分类任务预测的是语言标记和视觉标记是否在时间上吻合对齐即预测文本是否与视频画面匹配提取[CLS]标记特征送入一个分类器对是否一致进行分类
VideoBERT模型使用了三个目标进行预训练
纯文本纯视频文本-视频
最终预训练目标是上述3个目标的加权组合
数据源和预处理
使用YouTube教学视频时长少于15min共312000个23186小时使用YouTube API提供的自动语音识别工具返回文本和时间戳不同目标所使用的数据集不同
对于从视频中采样的图像帧使用预训练的视频卷积神经网络提取视觉特征并使用分层的K均值算法对视觉特征进行标记
VideoBERT模型应用
预测下一个视觉标记由文本生成视频生成视频字幕
BART模型
基于Transformer架构本质是一个降噪自编码器通过重建受损文本进行训练的
带有编码器和解码器的Transformer模型将受损文本送入编码器学习将学习得到的特征发送给解码器解码器获得编码器生成的特征重建原始文本
双向编码器自回归解码器单向的
BART模型通过最小化重建损失来训练也就是原始文本和解码器的生成文本之间的交叉熵损失 BART模型与BERT模型不同在BERT中只是将被掩盖的标记送入编码器然后将编码器的结果送入前馈网络层用前馈网络层来预测被掩盖的标记而在BART中将编码器的结果反馈给解码器由其生成或构建原始句子 集中破坏文本增噪方法
标记掩盖用[MASK]随机替换一些标记标记删除标记填充用一个[MASK]掩盖连续的标记句子重排随机打乱橘子顺序文档论换随机选择文档中的一个标记作为文档的开始然后将所选标记之前的所有标记添加到文档的末尾
# 文本摘要任务应用
from transformers import BartTokenizer, BartForConditionalGenerationmodel BartForConditionalGeneration.from_pretrained(facebook/bart-large-cnn)
tokenizer BartTokenizer.from_pretrained(facebook/bart-large-cnn)text
...
# 对文本进行标记
inputs tokenizer([text], max_length1025, return_tensorspt)# 获取摘要ids即模型生成的标记ID
summary_ids model.generate(inputs[input_ids], num_beams4, max_length100, early_stoppingTrue)# 对摘要进行解码
summary ([tokenizer.decode(i, skip_special_tokensTrue, clean_up_tokenization_spacesFalse) for i in summary_ids])print(summary)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/915201.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!