BERT
迁移学习在自然语言处理(NLP)领域同样也是一种强大的技术。由这种技术训练出来的模型,我们称之为预训练模型。
预训练模型首先要针对数据丰富的任务进行预训练,然后再针对下游任务进行微调,以达到下游任务的最佳效果。迁移学习的有效性引起了理论和实践的多样性,
两者相结合,高效地完成了各种NLP的实际任务
1. 预训练模型
BERT的结构是来自Transformers模型的Encoder。
Transformer的内部结构由Self-Attention Layer和Layer Normalization的堆叠而产生。
Bert定义:BERT被设计为通过在所有层的双向上下文上共同进行条件化来预训练未标记文本的深层双向表示
(可以理解为:用未标记的一个文本去训练一个模型,对所有的问题都有很强的泛化性)
我们可以在仅一个附加输出层的情况下对经过预训练的BERT模型进行微调,以创建适用于各种任务( 例如问题解答和语言推断)的最新模型,进而减少了对NLP任务精心设计特定体系结构的需求
通俗易懂来讲就是我们只需要把BERT当成一个深层次的Word2Vec预训练模型,对于一些特定的任务,我们只需要在BERT之后下接一些网络结构就可以出色地完成这些任务。
2. Self-Attention Layer 原理
BERT的结构是来自Transformers模型的Encoder
Transformer的内部结构由Self-Attention Layer和Layer Normalization的堆叠而产生。
Self-Attention Layer的出现原因:为了解决RNN、LSTM等常用于处理序列化数据的网络结构无法在GPU中并行加速计算的问题。
BERT的内部结构: Self Attention Layer的输入
因为有时候训练样本是由两句话组成,因此“[CLS]”是用来分类输入的两句话是否有上下文关系,而“[SEP]"则是用以分开两句话的标志符。
[CLS] 标志放在第一个句子的首位,经过 BERT 得到的的表征向量 C 可以用于后续的分类任务。
[SEP] 标志用于分开两个输入句子,例如输入句子 A 和 B,要在句子 A,B 后面增加 [SEP] 标志。
Input = token embedding + segment embedding + position embedding
因为这里的Input是英文单词,所以在灌入模型之前,需要用BERT源码Tokenization工具对每一个单词进行分词。
分词后的形式:“ Playing”转换成“Play"+“# #ing”,因为英文词汇表是通过词根与词缀的组合来新增单词语义的,所以我们选择用分词方法可以减少整体的词汇表长度。
如果是中文字符的话,输入就不需要分词,整段话的每-一个字用“空格”隔开即可。
注意:模型是无法处理文本字符的,所以不管是英文还是中文,我们都需要通过预训练模型BERT自带的字典vocab.txt将每一一个字
或者单词转换成字典索引(即id) 输入。
segment embedding的目的:有些任务是两句话一起放入输 入x,而segment便是用 来区分这两句话的。在Input那里就是用“[SEP]”作为标志符号。而“[CLS]”用 来分类输入的两句话是否有上下文关系。
position embedding的目的:因为我们的网络结构没有RNN或者LSTM,因此我们无法得到序列的位置信息,所以需要构建一个position embedding。
构建position embedding有两种方法:
- BERT是 初始化一个position embedding,然后通过训练将其