tensorflow-bert-seq2seq-dream-decoder
tensorflow-bert-seq2seq-dream-decoder copied to clipboard
Bert训练时出现问题
为什么使用了Bert模型以后所有的回答都变成了同一种??是我这边运行的问题还是loss设定的问题??准确率和loss显示都很不错,但是最后生成的回答只有一种
你好,对bert的初始化代码进行了更新。见 seq2seq.py line 49。
不使用bert模型收敛较快,使用bert收敛相对慢些。
在小样本测试,模型在 accuracy>0.9 之后才会有一定的预测效果。accuracy < 0.9 预测结果都是一样,效果不佳。
可以再试一下,问题是否还存在呢。
您好, 问题解决的. 是我这边模型还没学会. 有的还是您之前的模型,. 请教几个问题, 为什么使用Bert会出现acc<0.9时预测一样的结果? 还有就是后来的模型是不是只调用了Bert的embedding作为初始化, 不对Bert进行训练? 非常感谢
1、关于预测结果一样的问题,我也找了下原因,可以参考:
- What to do when Seq2Seq network repeats words over and over in output?
- keras - seq2seq model predicting same output for all test inputs
第一种解释提到应该是主要原因,模型中使用的 greedy search (seq2Seq.py 107)
2、模型调用bert的embedding后,会对 embedding 进行迭代更新,可以 在model.py line125 打印,看到更新后的结果。 后来的模型对解码的起始和结束标识符进行优化:
predicting_helper = tf.contrib.seq2seq.GreedyEmbeddingHelper(
embedding=self.decoder_embedding,
start_tokens=tf.tile(tf.constant([self.tokenizer.vocab["[unused1]"]], dtype=tf.int32), [batch_size]),
end_token=self.tokenizer.vocab["[unused2]"])
将"[unused1]" ,"[unused2]"分别作为<GO>,<EOS>标识符。
https://www.jianshu.com/p/004869fce12c
关于第一点,我这边实验也发现经常会出现预测结果完全一样的情况,这时把greedy search换成BeamSearch会不会好一些?