Open bucm-tcm-tool opened 2 years ago
GPlink的这种设计思路非常棒,很有启发。 问题 但是GPlink的代码在训练过程中,有可能出现loss突然变为nan(inf)的情况。特别是小样本训练中(如2000个句子,每个句子平均包含3个三元组的数据集),loss经常出现nan。 原因 一个直观的原因是:在sparse_multilabel_categorical_crossentropy函数中,某些样本被反复学习多个epoches后,基于这些样本计算的K.exp(aux_loss - all_loss)=1,从而使K.log(1 - K.exp(aux_loss - all_loss))-->inf,致使loss为nan。 解决 对于该问题,或许可以在引发nan的代码中,加一个epslon,以避免出现inf,例如:K.log(1 - K.exp(aux_loss - all_loss)+epslon)。
以下是原始的sparse_multilabel_categorical_crossentropy函数,以及该函数引发nan的关键代码(加粗的部分):
def sparse_multilabel_categorical_crossentropy(y_true, y_pred, mask_zero=False): """稀疏版多标签分类的交叉熵 说明:
谢谢提议,已加 https://github.com/bojone/bert4keras/commit/2e1bc3495789cdaa682c014b31e8425a0efeaac3#diff-fbe4e655d7da485d9313ca966df4bf963c294e0716fb6693e2a3af51a3afb7d7
GPlink的这种设计思路非常棒,很有启发。 问题 但是GPlink的代码在训练过程中,有可能出现loss突然变为nan(inf)的情况。特别是小样本训练中(如2000个句子,每个句子平均包含3个三元组的数据集),loss经常出现nan。 原因 一个直观的原因是:在sparse_multilabel_categorical_crossentropy函数中,某些样本被反复学习多个epoches后,基于这些样本计算的K.exp(aux_loss - all_loss)=1,从而使K.log(1 - K.exp(aux_loss - all_loss))-->inf,致使loss为nan。 解决 对于该问题,或许可以在引发nan的代码中,加一个epslon,以避免出现inf,例如:K.log(1 - K.exp(aux_loss - all_loss)+epslon)。
以下是原始的sparse_multilabel_categorical_crossentropy函数,以及该函数引发nan的关键代码(加粗的部分):
def sparse_multilabel_categorical_crossentropy(y_true, y_pred, mask_zero=False): """稀疏版多标签分类的交叉熵 说明: