BrikerMan / Kashgari

Kashgari is a production-level NLP Transfer learning framework built on top of tf.keras for text-labeling and text-classification, includes Word2Vec, BERT, and GPT2 Language Embedding.
http://kashgari.readthedocs.io/
Apache License 2.0
2.39k stars 441 forks source link

[Question] 如何优化模型效果 #12

Closed lvouran closed 5 years ago

lvouran commented 5 years ago

小白一枚,训练完以后效果不是很理想,有没有什么可配置化的参数来提高准确性呢

BrikerMan commented 5 years ago

可以更加具体点,用什么什么 embedding + 模型,是分类还是标注?

lvouran commented 5 years ago

没有用词向量,CNNMode,参考楼主第一个例子(lets run a text classification with CNN model )写的,,分类问题

BrikerMan commented 5 years ago

可以尝试换成 BLSTM 模型,效果会好一些,如果还不够好,那就使用词向量。这些提升会比较高。

lvouran commented 5 years ago

好的,,我去试试,谢谢啦!

BrikerMan commented 5 years ago

请问有改善么?

lvouran commented 5 years ago

有明显的区分度的文章,分类的准确对还是非常满意的,,但是区分度不大的文章(例如要对文化大方向,分出来文化贸易,交流活动这样的类别的话)结果就不是很理想了

BrikerMan commented 5 years ago

可以考虑使用 class_weight 增加这些效果不好的分类的权重来训练试试,具体方法如下

class_weight = {
        0: 1.,
        1: 1.,
        2: 10.,  # 有问题的类别权重调高
        3: 10.
    }

model = CNNModel()
model.fit(train_x,
          train_y,
          val_x,
          val_y,
          batch_size=100,
          fit_kwargs={'class_weight': class_weight})

参考:How to set class weights for imbalanced classes in Keras?

BrikerMan commented 5 years ago

还有可以先使用自己的全部语聊+近似领域的语聊训练出自己的词向量,然后使用这个词向量作为 WordEmbedding 层再训练 BLSTM 模型试试。

lvouran commented 5 years ago

好的,我再去试试,,如果在分词那步加载自定义的词典,对结果的影响会很大吗?感谢楼主指导

BrikerMan commented 5 years ago

如果你的分词效果还可以,能一定程度提高。不过自定义分词需要注意一下几点

  1. 训练和预测分词要一致。
  2. 如果加载预训练的词向量,确保你的分词颗粒度和词向量的一致。比如你把电影 我们结婚吧 美国队长 加到字典了,但是词向量没有这些词,最终都会转成 UNK 来处理,会失去重要信息。
melansediao commented 5 years ago

可以尝试换成 BLSTM 模型,效果会好一些,如果还不够好,那就使用词向量。这些提升会比较高。 你用的cnews数据集,数据量下采样到5000,1000,500之后,用CNNLSTM模型,模型震荡,loss降不下去,是正常现象吗?

BrikerMan commented 5 years ago

你用的cnews数据集,数据量下采样到5000,1000,500之后,用CNNLSTM模型,模型震荡,loss降不下去,是正常现象吗?

你的意思是,你用少量数据 + CNNLSTM 模型后,优化不到很好的效果是么?

melansediao commented 5 years ago

你用的cnews数据集,数据量下采样到5000,1000,500之后,用CNNLSTM模型,模型震荡,loss降不下去,是正常现象吗?

你的意思是,你用少量数据 + CNNLSTM 模型后,优化不到很好的效果是么?

train下采样到5000,val1000,test500:CNN的test precision有95%左右;BLSTM90%左右;CNNLSTM也有90%左右,但收敛需要的epoch比以上两种多;

train下采样到500,val100,test500:CNN的test auc有80%左右;BLSTM70%左右;CNNLSTM很难收敛,只能有10%(瞎猜的程度);

BrikerMan commented 5 years ago

数据少的的情况下,收敛难很正常呀,特征不够啊。可以考虑用预训练词向量快速收敛。