1. 初识BERT
- BERT是Google开发的自然语言处理开源框架,是自然语言处通用的解决方案(所谓通用,就是可以基于BERT框架,做些微调,便可应用于多种NLP问题)。
2. word2vec的局限性(为什么引入BERT)
- 基于word2vec训练好的词向量不会再改变,也就是说,若某个单词位于不同上下文语境中,该单词的此向量表达都是一样的,其缺陷一是没有考虑到单词在不同语境中的含义可能不同,其缺陷二是计算机不能识别文本中重要、有价值的部分。
3. Transformer
- 理解BERT的核心在于Transformer。
- 以机器翻译为例,输入“我是一名学生。”,Transformer对这句话的每个词进行编码(Embedding)形成向量,然后对编码后的向量解码成目标语言:“I am a student.”
- Transformer的关键在于self-attention。
4. Self-attention
- attention就是关注的意思,在NLP中意为让计算机关注有价值的文本信息。
- self-attention加了个反身代词,意为让计算机自己根据上下文关系识别文本关键信息(对word2vec的改进)。
- Self-attention步骤:
- Input:输入n个单词 x 1 . . . x n x_1...x_n x1...xn
- Embedding: 对这n个单词分别编码为行向量, x 1 ( . . . . . . ) , x 2 ( . . . . . . ) . . . x_1(......), x_2(......) ... x1(......),x2(......)...
- 利用第二步形成的每个单词的行向量,分别都乘以三个权重矩阵 W q , W k , W v W^q, W^k, W^v Wq,Wk,Wv,得到 q 1 . . . q n , k 1 . . . k n , v 1 . . . v n q_1...q_n, k_1...k_n, v_1...v_n q1...qn,k1...kn,v1...vn(都为行向量)。
- 计算每个单词与其余单词的关系。如 x 1 x_1 x1与 x 2 . . . x n x_2...x_n x2...xn的关系,则将 x 1 x_1 x1对应的 q 1 q_1 q1分别与 k 2 . . . k n k_2...k_n k2...kn进行内积,若 q 1 ⋅ k 2 > q 1 ⋅ k 3 q_1·k_2 > q_1·k_3 q1⋅k2>q1⋅k3,则说明与 x 3 x_3 x3相比, x 1 x_1 x1与 x 2 x_2 x2关系更密切(这一步考虑了上下文关系)。
- 第四步计算的内积结果是数值,无法直观地对重要性进行衡量,因此需要将第四部得到的数值转化为百分比,softmax可以实现数值到百分比的转化。以三行一列的向量为例, [ 1 4 7 ] \left[ \begin{matrix} 1 \\ 4 \\ 7 \end{matrix} \right] ⎣⎡147⎦⎤softmax就是将其变为 [ e 1 e 4 e 7 ] \left[ \begin{matrix} e^1 \\ e^4 \\ e^7 \end{matrix} \right] ⎣⎡e1e4e7⎦⎤再变为 [ e 1 e 1 + e 4 + e 7 e 4 e 1 + e 4 + e 7 e 7 e 1 + e 4 + e 7 ] \left[ \begin{matrix} \frac {e^1}{ e^1+e^4+e^7} \\ \frac {e^4}{ e^1+e^4+e^7} \\ \frac {e^7}{ e^1+e^4+e^7} \end{matrix} \right] ⎣⎢⎡e1+e4+e7e1e1+e4+e7e4e1+e4+e7e7⎦⎥⎤实现了百分比化。
- 第五部得到了每个单词的百分比,然后每个单词 x i x_i xi的百分比分别乘以自己的 v i ( v 1 . . . v n ) v_i(v_1...v_n) vi(v1...vn)便得到每个单词最终的特征向量表达(该向量表达可以实现在不同上下文语境下变化的功能)。
5. multi-head
- multi-head就是说通过多组 q , k , v q, k, v q,k,v得到多组词特征表达。
- 得到多组词特征表达后,对多组词特征表达进行组合,然后再进行降维,最终可以得到更好的特征向量。
6. 多层堆叠
- 多层堆叠就是堆叠多层self-attention和multi-head,以期得到更好的特征向量。
7. 位置信息表达
- 因为transformer对词向量的训练考虑了每个词与上下文语境的关系,因此可能对词的位置信息不那么强调了。
- 位置信息表达就是在对词Embedding时加入一层位置信息编码,考虑到词的位置信息。
8. Transformer总体回顾
- Self-attention(最核心)
- multi-head(为了得到更好的最终向量)
- 多层堆叠与位置编码(为了得到更好的最终向量)
- 并行训练(并行完成多个向量生成任务,效率更高)
- 得到最终特征向量结果
9. BERT
- transformer是BERT的核心,理解了transformer就理解了BEERT。
- BERT就是指在transformer中做训练,是transformer中的Encoder部分。
- 如何训练BERT:
- 取15%的字(词),把它们mask掉,训练BERT去预测这些mask掉的部分。
- 训练BERT判断两个句子是否应该连在一起,[SEP]是两个句子间的连接符;[CLS]是要做分类的向量。BERT需要做的是通过[CLS]向量来判断两个句子是否应该连接在一起(二分类:是或否)
- BERT的特征向量生成与模型训练是放在一起的(这也体现出当今各种技术追求的是方便快速,能放一起解决的就放一起解决)。