?
论文地址:https://arxiv.org/pdf/1810.04805.pdf
Bert 采用双向 Transformer 编码器,没有用解码器。
Bert 主要是 双向,论文中对比了 GPT、ELMo。
GPT 是单向(左至右)的语言模型,主要关注于给定前文下生成下一个单词。
ELMo 也考虑了双向上下文,但其并不是在每个层级同时考虑两个方向的上下文,因此不如 BERT 的上下文表示能力强。
想象你在玩捉迷藏,Bert是一个聪明的孩子,他站在中间,同时向左和向右看,能够很好地观察到左边和右边的一切动静。
而GPT就像只往一个方向看的孩子,比如他只看左边,就可能会错过右边的同学。
ELMo虽然会左右看,但是他每次只能看一个方向,不能像Bert那样同时看两边。
要么只看一个方向,要么不能同时看两个方向,所以它们可能会错过一些重要的线索。
?
把词语转换为向量,通过图中 3 中 Embeddings 方式做的,用于捕捉词语间的语义关系
Token Embeddings: 每个词语首先被分割成更细小的单元,然后每个token被转换成基本的词向量。
Segment Embeddings: BERT可以接受两个句子作为输入,用来区分两个不同的句子。
帮助BERT区分哪些词语来自于第一句,哪些来自于第二句。
就可以更好地理解句子之间的关系,比如哪些词语是回答问题中的答案,哪些是问题本身。
Position Embeddings: 由于 Transformer 模型本身不具备顺序感知能力,BERT引入了位置嵌入来给模型提供单词在句子中位置的信息。
这一步是不断迭代出来的。
想象一下,我们给电脑出了一个填空题,电脑要猜每个空格里的单词是什么。
但如果我们告诉电脑每个空格里原来的单词是什么,那这个游戏就太简单了,对吧?
电脑会很轻松地每次都猜对,因为它知道所有答案。
该网络事先知道它需要预测什么,因此它可以很容易地学习权值,以达到100%的分类精度。
那我们在句子中随机遮住一些单词,就像玩“填空游戏”时用笔遮住一些单词一样。
电脑的任务是猜出这些遮住的单词。
这样的话,电脑就不能作弊了,因为它不知道被遮住的单词是什么,必须要仔细看周围的单词来猜测答案。
但是,这种方法有一个问题。
电脑只学会了猜测遮住的单词(也就是标记为[MASK]的地方),而在实际使用时,我们不会告诉电脑哪些单词是被遮住的。
那我们不再总是用[MASK]标记来遮住单词,而是有时候用其他随机的单词来替换。
这样一来,电脑就不能只猜测[MASK]的地方了,它需要对所有的单词都有所判断。
不过,这个方法也有问题。
电脑会学到,如果输入的是一个随机的单词,那么它通常不是答案。
原句:I have a cat.
随机:I have a dog.
其中 “dog” 是一个随机选取的词,替换了 “cat”。
在绝大多数情况下,这些随机生成的词并不是原本句子中应该出现的词。
如果输入中的某个词是随机放置的,那么这个词几乎不可能是正确答案。
因此,模型会形成一个偏见,即倾向于忽略那些随机单词,并认为它们不重要。
从训练数据生成器随机选择句子中大约 15% 的令牌位置。
对于这些被选中的令牌,将会被替换,以帮助模型更好地学习上下文信息:
通过混合这三种方法,模型在训练时无法确定遇到的单词是否是原文中的单词、一个随机单词还是一个遮盖的单词,从而迫使模型必须学习和理解语言的深层规律,这样它在面对新的、未见过的文本时,能够更好地理解和回答问题。
在这种情况下,模型不能只依赖于单词的变化与否来猜测答案。
模型必须更多地依赖于对句子的整体理解和上下文的分析来做出预测。
因此,当模型看到 “I have a dog.” 时,它需要判断 “dog” 是不是原始文本中的单词,还是一个用来混淆其判断的随机单词。
输入:俩个A、B句子,有 50% 的 B 是 A 的下一句(他们必须属于同文档)
输出:模型需要预测 B 是不是 A 的下一句
通常只会更新最后一层。
图a:句子对分类。就是在768尺寸的 CLS 输出之上添加一个Linear + Softmax层(图中没显示)。
图b:单独句子分类。就是在768尺寸的 CLS 输出之上添加一个Linear + Softmax层(图中没显示)。
图c:问答任务。只需在BERT模型的输出上添加一个额外的线性层和softmax层来为每个单词预测其对应的词性类别。
图d:单句标注任务
BERT在理解文本中双向上下文和处理细粒度的自然语言处理任务上更强,但在连续文本生成和处理大规模数据集方面不如GPT。
细粒度的自然语言处理任务,主要包括: