大名鼎鼎的BERT模型

前言

大家吼,狗头这个假期在做NLP相关的工作,作为一个刚入门的小白,最近真的是在狂补相关的模型算法。要说到NLP模型,就不得不提具有里程碑一般地位的BERT模型,刚一出来就刷爆了各类NLP任务的榜单,也给后来的一些模型提供了重要思路。狗头也是上周花了一些时间重点研究了一下,今晚有时间,和大家分享一些思路,然后本文是基于BERT的论文(我会贴在文末)来介绍的,也会穿插一些别的内容。网上关于BERT的文章和视频其实很多,大家可以选择性的查漏补缺,最后欢迎探讨。

BERT是什么?

BERT是Bidirectional Encoder Representations from Transformers的缩写,它是2018年谷歌团队提出来的新型语言表征模型(language representation model)。
ps. 它也是芝麻街的人物,就长下面这样
bert

对比其它语言表征模型

为什么说它是新型的呢?让我们来对比一下其它两个比较有名的语言模型:

BERT v.s. OpenAI的GPT模型

BERT和GPT都是采用了Transformer的编码器(encoder),但是两者的区别是GPT是单向的,而BERT是双向的,这意味着每个token既可以看到前面的信息也可以看到后面的。如果你还不了解Transformer的话,可以看一下论文Attention is all you need,也可以看我的笔记

BERT v.s. ELMo模型

不同于BERT采用的Transformer,ELMo使用的是LSTM长短期记忆,它也做到了“双向”时序性,但是EMLo的双向其实是伪双向,因为他是将向左的和向右的两组embedding直接拼接起来的,两者相互独立。想要具体了解EMLo的同学也可以参考原论文Deep contextualized word representations

BERT可以解决什么问题?

根据论文概括,BERT主要可以解决两个层面的问题:
1.token-level tasks 例如,词性标注
2.sentence-level tasks 例如,QA

如何完成这两个任务呢?

BERT其实是一种预训练模型,整个BERT模型分为两个部分:1)pre-train;2)fine-tuning

预训练阶段(pre-training)

在这个阶段,BERT使用了两个无监督任务:

Masked LM(MLM)

核心思想是,随机mask 15% 的token,让模型来预测这个位置的token,这个预测是可以通过对该位置的final hidden vector做softmax来得到的。那么,这里有个问题,fine-tuning阶段是没有[MASK]这个token的,就造成了不匹配,怎么办呢?BERT就是采用了一个方法,对这个15%的token有80%的概率用[MASK]替代,10%概率用随机token替代,最后10%概率不改变这个token。然后,既然是做预测,这里就产生了一个损失 Loss(MLM)

Next Sentence Prediction(NSP)

模型中的数据形式是这样的:[CLS] Tok1 Tok2 ...Tokn [SEP] Tok1 Tok2 ... Tokm [SEP] 用CLS做开头,SEP用于分隔两个句子
这个任务的目的是预测两个句子是否为上下句,Label=IsNext 或 NotNext,然后就会产生第二个损失 Loss(NSP)

两个任务下来,总损失 Total_Loss = Loss(MLM)+Loss(NSP)

要注意的是,到后面的backward阶段,BERT采用的是Adam Optimizer来降低loss。oh,如果不了解这个优化过程,可以参考论文Adam: A method for stochastic optimization,没有耐心也可以直接谷歌一波公式。

fine-tuning阶段

预训练结束后,我们就有了预训练的模型,因为这个过程非常耗时费钱,通常个人或是小公司是不会去自己训练的,不过谷歌已经提供了几个预训练的模型(也有中文的),我们可以直接拿过来,然后结合下游任务去做fine-tuning,常见的下游任务有language inference、情感分析、语义相似度、问答等。整个fine-tuning阶段其实很简单,例如在分类任务上,基本上只需要在对应位置接一个全连接层,做一个Linear classifier就可以了。这里就不展开了,有兴趣的可以对应不同的下游任务去看代码实现。

我放个手写草稿在下面,意思一下。
fine-tuning

模型的输入

由三个部分构成(相加):
1)Token embedding 这个没什么好说;
2)Segment embedding 每个token所在句子的index,来区分句子1和句子2;
3)Position embedding 每个token所在的位置计算得到

补充几个知识点

1.Padding Mask 为了使用矩阵运算,需要对句子的长度保持一致,长句子要截,短句子要补,补就是用[PAD]这个token来补,同时为了减少attention机制对[PAD]的过度关注,[PAD]对应的值一般是一个绝对值非常大的负数,这样在经过softmax后就变为了0。

2.BERT使用了一种激活函数Gelu,公式:\(Gelu(x) = xP(X \leq x)=x \Phi(x)\)

3.在Tokeniation阶段,这里使用的是WordPiece Token,比一般的按word分更加细。例如,‘playing’ 可以继续分为 ‘play’ 和 ‘##ing’。

Reference

1.Devlin, J., Chang, M. W., Lee, K., & Toutanova, K. (2018). Bert: Pre-training of deep bidirectional transformers for language understanding. arXiv preprint arXiv:1810.04805.
2.Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., ... & Polosukhin, I. (2017). Attention is all you need. In Advances in neural information processing systems (pp. 5998-6008).
3.Peters, M. E., Neumann, M., Iyyer, M., Gardner, M., Clark, C., Lee, K., & Zettlemoyer, L. (2018). Deep contextualized word representations. arXiv preprint arXiv:1802.05365.
4.Kingma, D. P., & Ba, J. (2014). Adam: A method for stochastic optimization. arXiv preprint arXiv:1412.6980.
5.源代码 https://github.com/google-research/bert

posted @ 2019-12-13 00:13  MrDoghead  阅读(1039)  评论(0编辑  收藏  举报