clvsit / bert-simple-use

关于 Google Bert 框架训练、验证、推断和导出的简单说明
9 stars 3 forks source link

学生模型选的是什么呢 #1

Open jnkr36 opened 4 years ago

jnkr36 commented 4 years ago

请问你老师模型和学生模型分别选择的是什么结构呢, 感觉你distill.sh和train_teacher_model.sh里--bert_config_file参数都是一样的, 应该要设置成不同的吧

clvsit commented 4 years ago

教师模型用的是 12 层,学生模型把 Transformer 层数调整成了 4 层,因为模型有点大就没有上传到 GitHub 里。当初是在公司的电脑上跑的,写博客的和上传到 GitHub 时调整了下路径,distill 和 train_teacher_model 写得有些问题,你可以设置两个 bert_config_file,一个设置成 12 层,另一个设置成 4 层。不好意思,我待会修改下。

clvsit commented 4 years ago

除了调整层数外,学生模型替换成 Albert_tiny 也是可以的,不过这就需要去改 Albert 的代码,幸运的是 Albert 的代码与 Bert 代码相差不大,依样画葫芦就好了。

jnkr36 commented 4 years ago

另外感觉还有一个地方可能有点小问题: run_classifier.py中line 509开始: if FLAGS.do_distill: probabilities = tf.nn.softmax(logits / FLAGS.temperature, axis=-1) log_probs = tf.nn.log_softmax(logits / FLAGS.temperature, axis=-1) per_example_loss = -FLAGS.temperature * 2 tf.reduce_sum(one_hot_labels log_probs, axis=-1) else: probabilities = tf.nn.softmax(logits, axis=-1) log_probs = tf.nn.log_softmax(logits, axis=-1) per_example_loss = -tf.reduce_sum(one_hot_labels log_probs, axis=-1) loss = tf.reduce_mean(per_example_loss)

    return (loss, per_example_loss, logits, probabilities)

run_classifier.py其实是在train老师模型,感觉没必要给per_example_loss乘上temperature 2,我估计你是想在train学生模型的时候,最终的loss中,老师和学生的交叉熵需要成temperature 2,但是感觉你在这里乘了应该不起作用,而应该在run_classifier.distill.py中line 528那里去乘temperature ** 2才对

clvsit commented 4 years ago

谢谢指出问题,刚看了下 run_classifier_distill.py 中遗漏了 temperature 2,应该加上保证 hard target 和 soft target 的数量级是一致的。关于 run_classifier.py 中添加 temperature 2,的确没有什么用,只是当时为了查看结果的 loss 值所以还是加上了。

xxxsssyyy commented 3 years ago

这样的学生模型配置,不如直接将bert前四层抽出来做分类器预测

xxxsssyyy commented 3 years ago

有试过其他的学生模型配置么,hidden_size,emb_size,head 数量、层数都变小,可以保持原来多少的精度呢