BERT模型
https://blog.csdn.net/qq_41898761/article/details/125017287
BERT一层层深究下去的路径是这样的:【BERT】<==【Transformer】<==【self-attention】<==【attention机制】<==【seq2seq】
BERT是一个多层双向的 Transformer encoder 模型。 BERT中的 Transformer 只有 encoder,没有decoder!!!
BERT的改进
1.BERT通过使用**masked language model (MLM)**预训练目标,缓解了单向性约束。masked language model从输入中随机地遮蔽一些标记,目标是仅根据其上下文来预测被遮蔽的单词的原始词汇ID。 与从左到右的语言模型预训练不同,MLM的目标是使表征融合左和右的语境,这使我们能够预训练一个深度的双向Transformer。
2.除了 masked language model,BERT还使用了一个 "next sentence prediction "任务,联合预训练文本对的表示。
https://blog.csdn.net/zag666/article/details/127817715
图1:BERT的整体预训练和微调程序。除了输出层之外,在预训练和微调中使用了相同的架构。相同的预训练模型参数被用来初始化不同下游任务的模型。在微调过程中,所有的参数都要进行微调。[CLS]是一个特殊的符号,加在每个输入例子的前面,[SEP]是一个特殊的分隔符。
BERT 的详细实现
在BERT中,有两个步骤:预训练和微调。
(1) 在预训练期间,模型在不同的预训练任务的无标签数据上进行训练。
(2) 对于微调,BERT模型首先用预训练的参数进行初始化,然后用下游任务的有标签数据对所有的参数进行微调。每个下游任务都有单独的微调模型,尽管它们是用相同的预训练参数初始化的。
BERT的一个显著特点是它在不同任务之间的统一架构。预训练的架构和最终的下游架构之间的差异很小。BERT的模型架构是一个多层双向Transformer encoder。
三个参数:
L:transformer encoder块的个数
H:隐藏层的大小
A:在自注意力机制里面那个多头的头的个数
两个模型:
BERTBASE(L=12, H=768, A=12, Total Parameters=110M)
BERTLARGE(L=24, H=1024, A=16, Total Parameters=340M)
https://blog.csdn.net/zag666/article/details/127817715
BERT Transformer 使用的是双向的 self-attention,而GPT Transformer使用的是受限的self-attention,每个token只能关注其左边的上下文。
输入/输出表示
为了使BERT能够处理各种下游任务,我们的输入表示能够在一个标记序列中表示单个句子和一对句子(例如,〈问题,答案〉)。一个 "序列 "指的是输入到BERT的标记序列,它可能是一个单独的句子或两个句子挤在一起。
我们使用WordPiece嵌入,有30,000个标记词汇。 每个序列的第一个令牌总是一个特殊的分类令牌([CLS])。 与该标记相对应的最终隐藏状态被用作分类任务的集合序列表示。 句子对被打包成单一序列。
因为两个句子可能在一起,所以可以用两种方式来区分这些句子。 1.我们用一个特殊的标记([SEP])将它们分开。2.我们给每个标记添加一个学习过的嵌入标记,表明它是属于A句还是B句。
对于一个给定的标记,其输入表示是通过将相应的标记、段和位置嵌入相加而构建的。 图2是这种结构的可视化图。
预训练BERT
BERT整体是一个自编码语言模型(Autoencoder LM),它设计了两个任务来预训练该模型。第一个任务是采用 MaskLM 的方式来训练语言模型,随机屏蔽一定比例的输入标记,然后预测这些被屏蔽的标记。
第二个任务在双向语言模型的基础上额外增加了一个句子级别的连续性预测任务,即预测输入 BERT 的两段文本是否为连续的文本,引入这个任务可以更好地让模型学到连续的文本片段之间的关系。
AR:autoregressive,自回归模型;只考虑单侧的信息,典型的就是GPT。
AE:autoencoding,自编码模型;从损坏的输入数据中预测重建原始数据,可以使用上下文的信息,BERT用的就是AE。
AR模型,auto regressive,自回归模型。 自回归模型可以类比为早期的统计语言模型(Statistical Language Model),也就是根据上文预测下一个单词,或者根据下文预测前面的单词,只能考虑单侧信息,典型的如GPT,而ELMo 是将两个方向(从左至右和从右至左)的自回归模型进行了拼接,实现了双向语言模型,但本质上仍然属于自回归模型
AE模型,auto encoding,自编码模型。 从损坏的输入数据(相当于加入噪声)中预测重建原始数据,可以使用上下文的信息。BERT使用的就是AE。劣势是在下游的微调阶段不会出现掩码词,因此[MASK] 标记会导致预训练和微调阶段不一致的问题。
https://blog.csdn.net/codelady_g/article/details/124678760
任务1:Masked LM(带掩码的语言模型)
深度双向模型严格来说比从左到右的模型或从左到右的模型和从右到左的模型的浅层串联更强大。不幸的是,标准的条件语言模型只能从左到右或从右到左进行训练,因为双向调节将允许每个词间接地 “看到自己”,并且该模型可以在多层次的背景下简单地预测目标词。
为了训练深度双向表征,我们只需随机屏蔽一定比例的输入标记,然后预测这些被屏蔽的标记。我们把这个过程称为 “masked LM”(MLM),常被称为Cloze任务。
在这种情况下,对应于掩码标记的最终隐藏向量被送入词汇的输出softmax,就像在标准LM中一样。在我们所有的实验中,我们随机屏蔽了每个序列中15%的所有WordPiece标记。我们只预测被屏蔽的词,而不是重建整个输入。
尽管这使我们能够得到一个双向的预训练模型,但缺点是我们在预训练和微调之间产生了不匹配,因为[MASK]标记在微调期间没有出现。
为了缓解这种情况,我们并不总是用实际的[MASK]标记来替换 "被屏蔽 "的单词。训练数据生成器随机选择15%的标记位置进行预测。如果选择了第i个令牌,我们就用(1)80%的概率替换成[MASK]标记(2)10%的概率随机标记(3)10%的概率未改变。然后,Ti将被用来预测具有交叉熵损失的原始标记。
80%的时间是采用[mask],my dog is hairy → my dog is [MASK]
10%的时间是随机取一个词来代替mask的词,my dog is hairy -> my dog is apple
10%的时间保持不变,my dog is hairy -> my dog is hairy
https://blog.csdn.net/zag666/article/details/127817715
为什么使用这个策略?
这是因为transformer要保持对每个输入token分布式的表征,否则Transformer很可能会记住这个[MASK]就是"hairy"(这个地方的理解,强行记住了位置和masked的分布,而没有真正理解上下文),从而导致若训练样本和微调的样本mask不一致的情况下,模型预测出现很大的偏差。
如果仅使用[MASK]或者随机的词,那么模型可能学习到的信息都是错误的单词(认为这个地方的单词就是不正确的);
若仅使用正确的单词,那么模型学到的方法就是直接copy(根据学到的上下文,直接断定),从而学不到完整的上下文信息。
综上三个特点,必须在正确的信息(10%)、未知的信息(80% MASK,使模型具有预测能力)、错误的信息(加入噪声10%,使模型具有纠错能力)都有的情况下,模型才能获取全局全量的信息。
链接:https://blog.csdn.net/codelady_g/article/details/124678760
任务二:下一句预测(NSP)
许多重要的下游任务,如问答(QA)和自然语言推理(NLI)都是基于对两个句子之间关系的理解,而语言建模并不能直接捕捉到这种关系。 为了训练一个能够理解句子关系的模型,我们对一个二进制的下一句预测任务进行了预训练,该任务可以从任何单语语料库中简单地生成。 具体来说,在为每个预训练例子选择句子A和B时,50%的概率B是A后面的实际下一句(标记为IsNext),50%的概率是语料库中的一个随机句子(标记为NotNext)。 针对这一任务的预训练对QA和NLI都非常有益。
https://blog.csdn.net/zag666/article/details/127817715
图2:BERT输入表示。输入嵌入是标记嵌入、分段嵌入和位置嵌入的总和。
token embedding :将各个词转换成固定维度的向量。在BERT中,每个词会被转换成768维的向量表示。在实际代码实现中,输入文本在送入token embeddings 层之前要先进行tokenization处理。此外,两个特殊的token会被插入到tokenization的结果的开头 ([CLS])和结尾 ([SEP])
segment embedding: 用于区分一个token属于句子对中的哪个句子。Segment Embeddings 层只有两种向量表示。前一个向量是把0赋给第一个句子中的各个token, 后一个向量是把1赋给第二个句子中的各个token。如果输入仅仅只有一个句子,那么它的segment embedding就是全0 。
position embedding:Transformers无法编码输入的序列的顺序性,所以要在各个位置上学习一个向量表示来将序列顺序的信息编码进来。加入position embeddings会让BERT理解下面下面这种情况,“ I think, therefore I am ”,第一个 “I” 和第二个 “I”应该有着不同的向量表示。
这3种embedding都是768维的,最后要将其按元素相加,得到每一个token最终的768维的向量表示。
链接:https://blog.csdn.net/codelady_g/article/details/124678760
微调BERT
微调是直接的,因为Transformer中的自我注意机制允许BERT通过替换适当的输入和输出来模拟许多下游任务,无论它们涉及单个文本还是文本对。对于涉及文本对的应用,一个常见的模式是在应用双向交叉注意力之前对文本对进行独立编码。
BERT则使用自我注意机制来统一这两个阶段,因为用自我注意对串联的文本对进行编码,有效地包括两个句子之间的双向交叉注意力。
对于每个任务,我们只需将特定任务的输入和输出插入BERT,并对所有参数进行端到端的微调。在输入端,预训练中的句子A和句子B类似于(1)转述中的句子对,(2)必然性中的假设-前提对,(3)问题回答中的问题-段落对,和(4) 文本分类或序列标签中的退化文本-∅对。在输出层,标记表征被送入输出层,用于标记级任务,如序列标签或问题解答,而[CLS]表征被送入输出层,用于分类,如包含关系或情感分析。
与预训练相比,微调的成本很低。从完全相同的预训练模型开始,最多只需1小时就可以在一个独立的云TPU上完成所有的结果,或者在一个GPU上多花几个小时。
链接:https://blog.csdn.net/zag666/article/details/127817715
BERT最终输出的就是句子中每个token的768维的向量,第一个位置是[CLS],它的向量表示蕴含了这个句子整体的信息,用于做文本分类等句子级任务;对于序列标注等token级任务,就需要使用到每一个token的向量表示。只要将768维向量通过一个线性层映射到最终的分类空间中即可。
文链接:https://blog.csdn.net/codelady_g/article/details/124678760
https://blog.csdn.net/zag666/article/details/127817715
https://zhuanlan.zhihu.com/p/46652512
https://baijiahao.baidu.com/s?id=1711778702724114051&wfr=spider&for=pc
BERT视频:
https://www.bilibili.com/video/BV1PL411M7eQ/?spm_id_from=333.337.search-card.all.click&vd_source=6292df769fba3b00eb2ff1859b99d79e BERT 论文逐段精读【论文精读】李沐
https://www.bilibili.com/video/BV1yU4y1E7Ns/?spm_id_from=333.337.search-card.all.click&vd_source=6292df769fba3b00eb2ff1859b99d79e 李沐 69 BERT预训练【动手学深度学习v2】 有代码
https://www.bilibili.com/video/BV15L4y1v7ts/?spm_id_from=333.788.recommend_more_video.0&vd_source=6292df769fba3b00eb2ff1859b99d79e 李沐 70 BERT微调【动手学深度学习v2】有代码
https://www.bilibili.com/video/BV1LA411n73X?p=20&vd_source=6292df769fba3b00eb2ff1859b99d79e 【莫烦Python】机器要说话 NLP 自然语言处理教程 W2V Transformer BERT Seq2Seq GPT
https://www.bilibili.com/video/BV1NJ411o7u3?p=10&vd_source=6292df769fba3b00eb2ff1859b99d79e 【新全】2019 NLP(自然语言处理)之Bert课程 【个别地方有错误】
https://www.bilibili.com/video/BV1Kq4y1H7FL/?spm_id_from=333.788.recommend_more_video.1&vd_source=6292df769fba3b00eb2ff1859b99d79e 68 Transformer【动手学深度学习v2】