在计算机视觉领域,你可以把一个模型在 ImageNet 上训练,训练完后仅需一些架构的微调就能够处理一些下游任务。而在 NLP 领域,在这一方面缺乏能实现这样功能的模型。BERT 模型主要用于解决这样的一个问题,利用大量无标注数据进行预训练,然后在下游任务中,例如文本情感分析、问答、命名实体识别等,仅需要修改输入,添加一下输出层就能有不错的效果。
在 BERT 主要借鉴了这样的两个工作:
- ELMo(Embeddings from Language Models,来自语言模型的嵌入):ELMo 模型主要解决一个词会受到上下文的影响导致其含义不同的问题。ELMo 模型采用双向长短期网络的架构,为每个单次添加一个附加特征,然后再运用到下游任务的有监督学习中。
- GPT(Generative Pre Training,生成式预训练):GPT 采用单向 Transformer 作为架构,即在进行训练的时候只能看前面的信息。同时在运用到下游任务中时,与 ELMo 不同是,GPT 不会去冻结模型的参数,而是进行微调。
ELMo 需要为下游任务重新精心设计网络,GPT 仅使用单向网络。BERT 对其两者进行了综合,使用双向 Transformer 架构,同时设计了一套预训练方法使得在下游任务中仅需要一些微调就能有很好的效果。
预训练
BERT 预训练任务有两个:
- “遮蔽语言模型” :类似于完型填空
- “下一句预测”:给定两句话判定两句话是不是连续的两句话
前者希望模型能理解一句话的语义,后者希望模型能够处理句子与句子之间的关系。
网络架构
BERT 的嵌入层分为三个部分:
- 词元嵌入
- 段嵌入:使用可学习的嵌入,用于区分第一句话和第二句话
- 位置嵌入:使用可学习的位置编码
嵌入层的输出将这三个地方的输出求和。
接着堆叠了若干个 Transformer 块,得到最终学习到的特征
遮蔽语言模型
这个任务内容是随机挖掉原来的语句中一些空,将这些位置标记为需要预测的位置,然后让 BERT 利用上下文的信息预测这个位置的词。
具体实现是先随机选取 位置将其替换为特殊词元 <mask>
,然后再将其输入进 BERT,再根据 BERT 的数据添加几层全连接层和激活层,再进行 softmax 操作,由此得到预测的词。
但是特殊词元 <mask>
不会在实际的下游任务中出现,为了使得更好地在下游问题中得到应用,实际的替换操作是这样的:
- 的时候将其替换为
<mask>
- 的时候将其替换为随机词元
- 的时候不修改它
但仍将这个位置标记为需要预测的位置
下一句预测
在这个任务中, 的数据使用正例,剩下 的数据随机在语料库中选取第二句话,作为反例,然后进行二分类问题的有监督训练。
具体实现中将两个语句用特殊词元 <sep>
连接在一起输入 BERT 模型,然后再对输出添加一个全连接层就可以了。
实现
应该会补上,但是现在先咕咕咕