全称:Bidirectional Encoder Representations from Transformers,即双向 transformer的encoder 表示。
bert 的结构图
中间的神经网络为 transformer。
Embedding
embedding 由 3 种 embedding 求和而成:
Token Embeddings:词向量
Segment Embeddings:句向量
Position Embeddings:位置向量
Pre-training
Pre-training Task 1:Masked LM
俗称完形填空任务。利用上下文信息预测出缺失的单词,是不是和 word2vec 中的 CBOW 很像?在训练过程中速记 mask 15 % 的 token,最终的损失函数只计算被 mask 掉的那个 token。
随机 mask 的时候 10% 的单词会被替代成其他单词,10% 的打车你不提换,80%的单词1被替换成 [MASK]。
- 该任务的目的是什么?
充分利用上下文信息。因为单项预测不能理解整个句子的语义。捕捉词语级别的表示 - 为什么会有10%,10%,80% 的替代情况而不是全部用 mask 替代?
全部用 mask替代的话,模型会将 mask 当作一个固定的词,这不是我们想要的。
Pre-traing Task 2:Next Sentence Prediction
训练的输入是 句子 A 和 B,B 有一半的几率是 A 的下一句,模型预测 B 是不是 A 的下一句。
- 该任务的目的是什么?
捕捉句子级别的表示。可以应用在问答或阅读理解上,效果奇佳。
两个 loss 都是 cross entropy loss
Fine-tuning
在 pre-training 的基础上
分类:直接取第一个 token(即 CLS) 的 hidden-state C,对其进行一个线性变换,再经过 softmax 转换得到 label probability。
文本匹配:输出为 label: [0,1] (是否匹配),输入为 待匹配的两个文本 text_a 和 text_b。
还可以用于标注、问答等任务上。
源码分析
相关代码如下:
create_pretraining_data.py
extract_features.py
modeling.py
modeling_test.py
optimization.py
optimization_test.py
run_classifier.py
run_classifier_with_tfhub.py
run_pretraining.py
run_squad.py
tokenization.py
tokenization_test.py
tokenization.py
功能:对原始文本进行预处理,分词。
主要分为 BasicTokenizer.py 和 WordpieceTokenizer 两类,以及对包含它们