Base-llm 1.5.1 BERT结构及应用

一、BERT的设计原理与预训练策略

Bert(Bidirectional Encoder Representations from Transformers))是纯编码器架构。

回顾一下传统的向量生成的方式: 都是静态词向量。
主题模型;SVD矩阵分解。 通过构建“词-文档”矩阵,进行矩阵分解。生成两个矩阵,一个是“词-主题”,一个是“文档-主题”矩阵。其中“词-主题”矩阵,就是词向量矩阵。
Word2Vec: 通过用上下文预测中心词(CBOW)或者用当前词预测上下文。线性层实现, 是静态词向量。通过无监督预训练生成的查询表作为词向量表示。
缺点都是无法理解当前语境,无法解决一词多义问题。

Bert出现之前,像Word2Vec这样的模型能够为词语生成一个固定的向量(静态词向量),但无法解决一词多义的问题。例如,“破防”在“我除了一件破防装备”和“NLP算法给我学破防了”中的含义完全不同,但在Word2Vec中他们的向量是相同的。
BERT设计的目标是生成动态的、与上下文相关的词向量,不仅仅是一个词向量生成工具,更是一个强大的预训练语言模型。工作范式分为预训练和微调两个主要阶段。

(1)预训练: 在文本语料库上,通过特定的无监督任务来训练一个深度神经网络模型。目标不是为了完成某个具体的NLP任务,而是让模型学习语言本身的规律,比如语法结构、词语间的语义关系、上下文依赖等。训练完成后,就得到了一个包含了丰富语言知识的、参数已经训练好的预训练模型
(2)微调: 针对具体的下游任务, 通过预训练好的Bert模型,加载已经学习到的所有参数初始值。在Bert模型之上增加一个小的、任务相关的输出层,最后在自己的任务数据集上对整个模型进行训练。

这种“预训练+微调”的训练范式,属于迁移学习的一种实现,也是BERT的训练框架。能够从海量数据中学到的通用语言知识,迁移到数据量有限的特定任务中。

与RNN/LSTM的区别
BERT是基于自注意力机制的,实现真正的深度双向,bi-RNN/LSTM是浅层连接,一个正向和一个反向拼接而成,视野有限。

二、BERT架构详解

2.1 BERT的模型规模

Bert提供了不同规模的预训练模型,以适应不同的计算资源和性能需求。

image.png

2.2 BERT的输入表示

Bert的输入表示由三部分的嵌入向量逐元素相加而成。


image.png

(1)词元嵌入: WordPieces的分词方法,拆分成更小的子词单元,有效处理未登录词的问题。对于bert-base-chiness模型,词表以单字为主,也包含少量常用词,处理中文时效果接近于按字分词,但是准确描述是子词切分。
(2)片段嵌入:为了处理句子对任务(判断两个句子是否是连续的),用于区分输入中的不同句子。
(3)位置嵌入: 使用的可学习的位置嵌入。创建[max_position_embeddings, hidden_size]的嵌入表,让模型在预训练过程中自己学习每个位置的最佳向量表示。

image.png

2.3 特殊词元

image.png

三、BERT的预训练任务

3.1 任务一: 掩码语言模型(MLM)

image.png

思路是在输入文本中随机遮盖掉一部分词元,然后训练模型去根据上下文预测这些被遮盖的词元。这就想做完形填空,迫使模型学习词元之间深层次的语义关系和句法结构。
MLM执行策略:
(1)随机选择: 在每一个训练序列中,随机挑选15%的词元作为预测目标
(2)特殊替换策略: 为了缓解预训练(有[MASK]标记)与微调(没有[MASK]标记)阶段的数据差异,对于这15%被选中的词元,采用如下“80/10/10”的替换方法。假设如图5-3中My son is a good stu的son 词元被替换:

  • 80%的情况: 将选中的词替换为[MASK]
  • 10%的情况: 将选中的词替换成一个随机的其他词元。 相当于引入噪声,一方面要求模型能理解上下文,同时能纠正错误词元,增强模型的鲁棒性,另一方面促使模型学习每一个输入词元的分布式特征关系,而不是仅仅依赖[MASK]去出发预测
  • 10%的情况: 保持词元不变。为了上模型看到真实词元,也去预测他自己。让模型更好的学习每一个真实词元的上下文表示,减轻预训练和微调阶段数据不匹配问题。

MLM的局限
因为是随机Mask单个字或子词,可能会割裂一个完整词语的内部语义联系。后续提出了WWW 全词掩码,如果一个的一部分被选中进行mask,那么这个词的所有部分都会被一起mask。

3.2 任务二: 下一句预测

image.png

NSP任务目标是让模型理解句子与句子之间的逻辑关系。
训练时,模型会接收一对句子A和B,并判断句子B是否是句子A在原文中的下一句。
做法: 准备句子对【[CLS] A [SEP] B】这样的句子对,50%的情况B是A的下一句,50%B是语料库中随机的句子。通过预测B是不是A得下一句,从[CLS]位置的隐状态送入一个二分类器,判断IsNext还是NotNext, 通过悬链[CLS]向量学习句子级别的聚合特征。

NSP的有效性:后续研究如RoBERTa,ALBERT等,在更大规模预训练下,移除它或other任务替代(如句子顺序预测)会带来更好的结果。
但是BERT原始论文中,消融实验证明,当时的训练设置下,移除NSP会导致在问答和自然语言推断等任务下性能明显下家,说明NSP任务能帮助原始BERT学习到句子级别的关系,特定场景下依然有价值。

四、BERT的应用与实践

4.1 微调下游任务

(1)文本分类任务: 对于文本分类任务(如情感分析、意图识别),输入语句格式化(添加[CLS]和[SEP]),利用[CLS]词元的聚合表示能力,提取[CLS]词元对应最终输出向量,在这之上添加分类器,在任务数据上进行训练,同时以最小的学习率微调BERT模型的参数。
(2)词元分类任务:如命名实体识别、分词、词性标注,需要对输入序列中每一个词元进行分类,与文本分类类似。所有词元的最终向量后添加全连接层,作为词的分类器。
(3)其他任务: 几乎可以适配所有NLP任务。例如问答任务中,可以将问题和段落作为句子输入BERT,然后悬链模型去预测答案在段落中的起始和结束位置。

4.2 实践技巧和生态

进行BERT微调时,需要注意链各个细节:

  1. 最大长度限制,标准BERT模型,最大输入长度为512个token。因为有句子读限制,实际上最大只能是510个。
  2. 特殊token的添加,输入开头必须添加[CLS],结尾必须添加[SEP]。 统称Tokenizer会自动添加这些特殊token,但在手动构建输入是需要自己加上。

Bert不同层级学习到的特征有所侧重,其中底层更偏向于捕捉词法、语法等表层信息,高层更偏向于捕捉语义、语境等深层信息,所以一些任务通常用最后几层的向量进行拼接或相加,有时效果比单独使用最后一层更好。

Hugging Face提供开源的transformers库,无需自己从头实现BERT模型。

五、BERT代码实战

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容