可以做公众号背景图的网站,文档怎么做网页,盘锦市城乡建设厅网站,wordpress增加自定义栏目多Transformer的双向编码器表示法
Bidirectional Encoder Representations from Transformers#xff0c;即Bert#xff1b;
第2章 了解Bert模型#xff08;掩码语言模型构建和下句预测#xff09;
文本嵌入模型Bert#xff0c;在许多自然语言处理任务上表现优秀#…多Transformer的双向编码器表示法
Bidirectional Encoder Representations from Transformers即Bert
第2章 了解Bert模型掩码语言模型构建和下句预测
文本嵌入模型Bert在许多自然语言处理任务上表现优秀本节主要包括
了解Bert及与其他嵌入模型的区别分析Bert工作原理和基础配置两个任务场景掩码语言模型构建和下句预测Bert训练过程
Bert基本理念
问答任务、文本生成、句子分类的自然语言处理任务重都有良好表现其成功在于它是基于上下文的嵌入模型有别于通过建立词在语言空间中的向量映射的模型
有上下文嵌入模型 vs 无上下文嵌入模型
对于一词多义同一个词的词嵌入在不同场景这里指上下文中应不同如果是无上下文嵌入的话那么词嵌入就会相同
而Bert就是一个基于上下文的模型先理解语境Bert会将词与句子中的所有单词联系起来然后根据上下文生成该词的嵌入值
BERT是基于Transformer模型的可以把BERT看做是只有编码器的Transformer
我们已经知道Transformer编码器会输出句子中每个词的特征值且Transformer编码器是双向的它可以从两个方向读取一个句子
一个句子送入编码器编码器就会利用多头注意力层来理解每个单词在句中的上下文并输出特征值每个单词的特征向量大小是前馈网络层的大小即隐藏神经元的个数假设是768那么每个单词的特征向量大小也是768这个768同样也应该是用于生成QKV矩阵的权重矩阵中权重向量的维度
Bert的两种标准配置
BERT-baseBERT-large
BERT-base
L由12层编码器叠加A每层编码器都使用12个注意力头H隐藏神经元数量768其总参数量达到1.1亿个
BERT-large
L24A16H1024网络参数量达3.4亿个
其他的一些小型配置
BERT-tinyL2、H128BERT-miniL4、H256BERT-smallL4、H512BERT-mediumL8、H512 更小配置的BERT可以适配到更有限的资源但标准BERT可以得到更准确的结果 BERT 模型预训练
对模型m使用一个大型数据集针对某个具体任务进行训练并保存训练模型再对一个新任务使用已经训练过的模型权重来初始化m不使用随机初始化从头训练并根据新任务调整微调其权重
BERT模型在一个巨大的语料库上针对两个特定任务进行预训练掩码语言模型构建、下句预测训练得到的模型在一个新任务中比如问答任务载入预训练参数微调权重即可
WordPiece
一种特殊的词元分析器遵循子词词元化规律
示例Let us start pretraining the model使用WordPiece标记的结果为
tokens [let, us, start, pre, ##train, ##ing, the, model]具体过程
检查该词是否存在于词表中在则作为一个标记不在则继续分成子词检查子词是否在词表中在则作为一个标记不在则继续分割子词通过这种方式不断进行拆分检查子词是否在词表中直到字母级别无法再分这在处理未登录词时是有效的
BERT词表有3万个标记本例中词表中没有pretraining这个词因此将该词进行拆分##表示该词是一个子词其前面还有其他的词
对输入数据的处理
在将数据输入BERT前需要使用3个嵌入层将输入转换为嵌入标记嵌入层、分段嵌入层、位置嵌入层
标记嵌入层
对于一个文本段落添加[CLS]标记到第一个分词并掩码后的句子开头只在第一个开头加添加[SEP]标记到每个分词并掩码后的句子末尾每一句结尾都要加[CLS]用于分类任务[SEP]表示每个句子结束使用标记嵌入层将标记后的文本转换为嵌入注意标记嵌入的值将通过训练学习获得的
分段嵌入层
用来区分两个给定的句子分段嵌入层只输出EA或EB即如果输入的标记属于句子A那么该标记将被映射到嵌入EA 如果只有一个句子句子的所有标记都将被映射到嵌入EA 位置嵌入层
用来获得句子中每个标记的位置嵌入的
输入[CLS]Pairsisacity[SEP]Iloveit[SEP]标记嵌入E[CLS]EPairsEisEaEcityE[SEP]EIEloveEitE[SEP]分段嵌入EAEAEAEAEAEAEBEBEBEB位置嵌入E0E1E2E3E4E5E6E7E8E9
现在就可以将结果送入BERT了
预训练策略
BERT模型在一个巨大的语料库上针对两个特定任务进行预训练
掩码语言模型构建下句预测
语言模型构建
语言模型构建任务是指通过训练模型来预测一连串单词的下一个单词可以把语言模型分两类
自动回归式语言模型自动编码式语言模型
自动回归式语言模型有以下两种方法
正向从左到右预测反向从右到左预测
举例Pairs is a city. I love it.
将city用空白代替如果使用正向预测那么模型就会从左到右读取所有单词直到空白处然后进行预测若使用反向预测那么模型就会从右到左完成这个过程
自动回归式语言模型本质上是单向的它只能沿着一个方向阅读句子
自动编码式语言模型自动编码式语言模型是双向的可以同时利用正向预测和反向预测的优势预测时同时从两个方向阅读句子这样能更清晰地理解句子能输出更好的结果
掩码语言模型构建
BERT是自动编码式语言模型在掩码语言模型构建任务中给定一个输入句随机掩盖其中15%的单词并训练模型来预测被掩盖的单词
工作原理
依旧用之前例句使用[MASK]替换了city就可以训练BERT模型来预测被掩盖的词
这里会引入一个小问题
BERT预训练模型是通过预测[MASK]来训练BERT但在下游任务微调时输入中不会有任何[MASK]标记这将导致BERT的预训练方式和用于微调的方式不匹配
解决办法是使用80-10-10规则
对于随机覆盖的15%标记再做如下处理在80%的情况下使用[MASK]标记来替换实际词标记10%的数据使用一个随机标记随机词来替换实际词标记剩余10%的数据不做任何改变
在分词和掩码后将标记列表送入标记嵌入层、分段嵌入层和位置嵌入层得到嵌入向量再将嵌入向量送入BERTBERT将输出每个标记的特征向量
输入[CLS]Pairsisacity[SEP]Iloveit[SEP]输入[CLS]Pairsisa[MASK][SEP]Iloveit[SEP]标记嵌入E[CLS]EPairsEisEaEcityE[SEP]EIEloveEitE[SEP]分段嵌入EAEAEAEAEAEAEBEBEBEB位置嵌入E0E1E2E3E4E5E6E7E8E9输出标记R[CLS]RPairsRisRaRcityR[SEP]RIRloveRitR[SEP]
若使用BERT-base配置12层编码器、12个注意力头、768个隐藏神经元输出的每个标记的特征向量大小也是768
那么如何使用这些特征向量来预测被掩盖的词呢
将BERT计算的 被掩盖的词的特征向量 R[MASK]送入使用softmax激活函数的前馈网络层输出词表中所有单词为掩盖单词的概率通过多次训练迭代更新优化BERT的前馈网络层和编码器层权重使之最优这样模型才能返回正确的概率
掩码语言模型构建任务也被称为完形填空任务除了对输入标记进行掩码处理还可以使用另一种方法即全词掩码
全词掩码
在全词掩盖中如果子词被掩盖那么该子词对应的单词也将被掩盖如果掩码率超过15%那么可以忽略掩盖其他词
下句预测
下句预测next sentence prediction是一个用于训练BERT模型的策略它是一个二分类任务
在该任务重我们想BERT模型提供两个句子预测第二个句子是否是第一个句子的下一句通过执行下句预测任务BERT模型可以理解两个句子之间的关系
可以从任何一个单一语言语料库中生成数据集
从一个文档抽取任意两个连续句子标为isNext从一个文档中抽取一个句子并从一个随机文档中抽取另一个句子标为notNext注意要保证isNext类别与notNext类别数据各占50% 输入句子对预测标签 具体过程
使用wordpiece添加标记[CLS] 第一个句子分词 [SEP] 第二个句子分词 [SEP]然后将标记送入 标记嵌入层、分段嵌入层和位置嵌入层得到嵌入值再将嵌入值送入BERT模型得到每个标记的特征值根据特征值进行分类只需将[CLS]标记的特征值通过softmax激活函数将其送入前馈网络层然后返回句子对分别是isNext和notNext的概率 这里之所以只需要取[CLS]标记的嵌入是因为该标记基本上汇总了所有标记的特征所以它可以表示句子的总特征 同样需要通过多次训练迭代更新优化BERT的前馈网络层和编码器层权重使之最优这样模型才能返回正确的概率
预训练过程
BERT使用多伦多图书语料库Toronto BookCorpus和维基百科数据集进行预训练我们已将了解了两种训练任务掩码语言模型完形填空和下句预测任务现在需要准本数据集
从语料库中抽取两个句子A和B句子的标记数之和 应小于或等于512对两个句子进行采样时需保证句子B作为句子A的下一句和非下一句比例为1比1使用wordpiece添加标记将[CLS]标记在第一句开头将[SEP]标记在每句结尾根据80-10-10规则随机掩盖15%的标记然后将得到嵌入的标记送入BERT模型并训练BERT模型预测被掩盖的标记同时对句子B是否是句子A的下一句进行分类
BERT使用256个序列批量Batchsize256进行100w步的训练使用Adam优化器lr1e-4、β10.9、β20.999预热步骤设置为1w 关于预热步骤我们知道在训练的初始阶段可以设置较高学习率使最初迭代更快接近最优点后续迭代中则调低学习率使结果更加准确因为在最初权重值远离收敛值较大幅度的lr变化是可接受的但后续如果已经接近收敛值仍采样相同的变化幅度就容易错过收敛值这就是学习率的调整策略而预热步骤是通过1w次迭代将学习率由0线性的提高到1e-41w之后的迭代再随着误差接近收敛线性地降低学习率 在训练中还对所有层使用了随机节点关闭dropout每层关闭节点概率为0.1激活函数使用GeLU即高斯误差线性单元Gaussian Error Linear Unit 看着有点像relu但是在小于0的一部分x轴的y值是较小的负值实际曲线像一个对号; 预训练后BERT模型就可以应用于各种任务
几种子词词元化算法
子词词元化算法BERT所使用的在处理未登录词方面非常有效
假设有一个训练数据集更具它我们创建一张词表分词 添加
一般的词表vocablary由许多单词标记组成在对句子进行标记时如遇到非词表单词可使用标识未知单词的标记UNK代替为避免词表过大可以通过子词词元化将单词分成子词将子词加入词表子词在标识时需要在前面添加两个#号表示和前面的词相关联子词词元化算法 可以决定哪些单词需要拆分哪些不需要
常见的三种子词词元化算法
字节对编码 BPE字节级字节对编码 BBPE每个Unicode字节都被转换为1字节一个字符可以有1~4个字节然后使用字节对编码算法使用字节级频繁对构建词表在对语言环境下很有用WordPiece与字节对编码稍有不同 字节对编码 从给定数据集中提取带有计数的单词然后将其拆分成字符序列再将具有高频率的符号进行合并不断迭代具有高频率的符号对直到满足词表的大小要求而在WordPiece中不根据频率合并符号对而是根据相似度合并符号对合并具有高相似度的符号对其相似度由在给定的数据集上训练的语言模型提供
对于出现最频繁的符号对合并检查每个符号对的语言模型在给定的训练集上训练的相似度合并相似度最大的符号对
算法步骤
从给定的数据集中提取单词并计算它们出现的次数确定词表大小将单词拆分成一个字符序列将字符序列中的所有非重复字符添加到词表中在给定的数据集训练集上构建语言模型选择合并具有最大相似度基于上一步中的语言模型的符号对重复上一步直到达到所设定的词表大小
词表构建后就可以用来做文本标记。