bert细节解读和记录
Q&A:
- Q:BERT输如和输出是什么?
A:输入是句子,每个句子由n个单词组成,也就是输入的形状是[batch_size, sentence_len]。这里每个单词用一个整数来表示,输入后对每个单词进行embbding,之后的维度是[batch_size, sentence_len, emb_dim],这里每个单词用一个emd_dim维的向量来表示。
输出是[batch_size, sentence_len, emb_dim],也就是对每个单词输出了一个编码,这个编码和原来的编码维度是一样的,因为要做残差连接,所以要一样。
注意,是每个单词都对应一个encode输出向量。
- Q:BERT预训练时的NSP任务和MLM任务是从哪里获得输出值的?
A:假设输入是<cls>, I, have , an , apple ,<sep> ,he, has, a , pair, <sep>
,那么,每个单词/token都会对应一个encode输出向量,这个是emb_dim维的向量。
对于NSP,在<cls>
的输出值上做一个线性层(emb_dim, 2)映射到2维来表示它是否是相邻的两个句子。也就是只用到<cls>
的encoding输出
对于MLM,在对应的要预测的单词的输出encoding向量上添加一个线性层(emb_dim, vocab_size),最大的作为预测词。损失函数是CrossEntropyLoss。
注意一点,MLM这里输出size是(n, vocab_size),n表示有几个单词需要预测。实际的标签size是(n),这两个维度不同是无法做交叉熵的,需要转成ont-hot编码,这步pytorch的CrossEntropyLoss自动做了。详见https://www.jianshu.com/p/f5f458c9f37a