预训练BERT

http://zh-v2.d2l.ai/chapter_natural-language-processing-pretraining/bert-pretraining.html

为什么都要放在0上的gpu?放在1上可以吗,有什么区别?

image
已经是一维,没必要再转一维。


mlm其实用loss(mlm_Y_hat.reshape(-1, vocab_size), mlm_Y.reshape(-1))就可以了,用后面几步,有点多余,而且结果一样。这里我觉得写代码的人想把weight为0的过滤掉,但不是这么写的。这么写还是没有过滤掉。因为loss用的均值,是不行的,要么法1:应该用nn.CrossEntropyLoss(reduction=none),而不是nn.CrossEntropyLoss()。法2:去掉bert数据集中_pad_bert_inputs函数中的max_num_mlm_preds,即不预测max_len的15%, 而是实际有几个,就预测几个,省掉后面weight的麻烦。

法2可能会导致不能用矩阵进行批量计算(pred_positions的shape是[batch, num_pred_positions])

为什么cls编码后shape不一样,查了一下encode没发现对特殊词元的处理

第二问,我测试了一下保持batch_size=512的情况下,使用BERT_base或BERT_large都出现了CUDA_out of memory. 修改了batch_size的大小为128后,可以运行了,但随之train的loss的升高了0.5个百分点。