预训练BERT

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

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

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

1 Like


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的麻烦。

1 Like

法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个百分点。

在用bert表示文本中,请问为什么我对相同语境相同单词进行表示,多次实验结果是不同的(同样的代码运行多次)?

小白来自己回答自己的问题,是因为在使用bert生成词向量时,我没有加net.eval(),没进入评估模式,导致每次输入net内部的权重都会发生变化,希望其他小白引以为戒,不要和我犯相同的错误。 :sob:

1 Like

这个net.eval()要设置在哪里呀,我看书上用BERT表示文本的时候也没有net.eval()呀?

要加在生成向量之前,不然每次生成都是不一样的向量

感觉应该是法一的方法,前面那期介绍MLM任务的时候的示例就是用的reduce=“None”