文章目录
1. BERT的工作原理
B e r t Bert Bert名称解读:B i d i r e c t i o n a l idirectional idirectional E n c o d e r ncoder ncoder R e p r e s e n t a t i o n s epresentations epresentations f r o m from from T r a n s f o r m e r s ransformers ransformers
说白了就是 t r a n s f o r m e r transformer transformer的 e n c o d e r encoder encoder部分。
1.1 为什么需要BERT?
在2018年末,谷歌开源了BERT。BERT可以使用大量无标记文本来预训练通用语言表示模型。然后,这些通用的预训练模型可以在较小的特定于任务的数据集上进行微调。使用BERT模型的最大好处就是不仅可以从文本数据中提取高质量的语言功能,也可以根据特定任务(例如情感分析)微调这些模型并使用我们自己的数据回答问题,以产生最新的预测。
1.2 BERT框架:预训练+微调
BERT使用Transformer体系结构对句子进行编码。原始形式的Transformer包含两种独立的机制-读取文本输入的Encoder和为任务生成预测的Decoder。由于BERT的目标是生成语言模型,因此仅需要Encoder机制。BERT通过接受两项不同的任务而学习了有用的文本表示形式:
- 基于上下文的文本预测语言模型(Masked LM)训练:随便遮住两个单词,对BERT进行训练以预测这两个单词是什么。
- 下一个句子预测任务(NSP)训练:给定两个句子,BERT经过训练后以确定这些句子中的一个句子在一段文本中是否紧随另一个句子,或者它们仅仅是两个不相关的句子。
使用这两个任务进行预训练的好处在于,可在网络上使用大量无标记的文本来训练通用语言表示模型,在此过程中学习丰富的语言表示形式,而这些语言表示形式对于小型标签数据集是无法学习的。然后,可以根据选择的任务对BERT的最后几层进行微调。
1.3 模型细节
1-WordPiece embeddings理解:
WordPiece,就是word片段。最小分词单位不是单词word,而是字符来初始化词汇表,然后将词汇表中符号的最频繁/最有可能的组合迭代添加到词汇表中。这能极大减少词汇量,以及一定程度上解决稀有词问题。
e.g. playing -> play + ##ing ,player -> play + ##er , played -> play + ##ed , playable -> play + ##able 。也许在任务文本中playing可能没出现过,但是在训练文本中player,played等词却出现好几次。这些词都拥有play这个共同点,模型在处理时会拆分为play+##ing的word piece形式。而##ing形式可能会从其他具有这种形式的word那里学习到。模型把playing,player,playable等词拆分为wordpiece,极大减少了词汇量,这也在一定程度上解决了稀有词(Out-Of-Vocabulary)问题。
对于中文来说,传统的最小分词单位是词。因为词能表达语境中的意思(e.g.我是一个学生 -> 学生是词单位,学和生拆分开来是字,理解意思就不同了)。那么把Bert应用到中文上,所谓的wordpiece对应中文,存储到词汇表中的最小单位就是字了。
2-BERT使用Transformer体系结构作为其基础模型
与定向模型(顺序读取文本输入(从左到右或从右到左),RNN等)相反,Transformer Encoder一次性读取整个单词序列,也就是所谓的双向模型。此特征使模型可以基于单词的所有周围环境(单词的左右)来学习单词的上下文。
使用多层Transformer Encoder堆叠起来,每层Encoder不共享权重参数。使用多层Encoder堆叠的目的大致是为了提取层次结构特征并为复杂问题建模(类似CNN多层卷积提取多层特征一样)。
Transformer Encoder使用多头self-attention 用于文本建模。单个 attention 所能注意到的信息是有限的,通过 multi-head attention 提取更完善的信息。
3-BERT Embedding层(输入向量)表示:Input = Token embeddings + Segment embeddings +Positional embeddings
Token embeddings,也就是word Embeddings。英文分词用的是subwords的形式,中文分词则是以字为单位。需要注意的是:在第一个句子开头添加[CLS]符号,在每个句子的末尾插入[SEP]符号。
e.g.“Here is the sentence I want embeddings for.”
分词之后可以表示为:[’ [CLS]’ , ‘here’ , ‘is’ , ‘the’ , ‘sentence’ , ‘i’ , ‘want’ , ‘em’ , ‘##bed’ , ‘##ding’ , ‘##s’ , ‘for’ , ‘.’ , ‘[SEP]’ ]
Segment embeddings,用来区分两句话。同样在开头添加[CLS]符号(表示用于分类任务),第二个句子的末尾插入[SEP]符号。同时句子之间添加[SEP]符号(表示句子分隔)。当用于句子区分的时候,直接加0,1区分。
- 一个句子输入的时候:[CLS] The man went to the store. [SEP]
这个句子分词之后加上特殊符号,总共有9个token。其Segment ID(相当于label)可以表示为