bert细节解读和记录

Q&A:

  1. Q:BERT输如和输出是什么?
    A:输入是句子,每个句子由n个单词组成,也就是输入的形状是[batch_size, sentence_len]。这里每个单词用一个整数来表示,输入后对每个单词进行embbding,之后的维度是[batch_size, sentence_len, emb_dim],这里每个单词用一个emd_dim维的向量来表示。
    输出是[batch_size, sentence_len, emb_dim],也就是对每个单词输出了一个编码,这个编码和原来的编码维度是一样的,因为要做残差连接,所以要一样。

注意,是每个单词都对应一个encode输出向量。

  1. 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
posted @ 2022-05-16 20:30  王冰冰  阅读(67)  评论(0编辑  收藏  举报