一、稳定有收益的,祖传老方子
- RNN based model 包括LSTM和GRU,使用双向结构
- embedding之后使用dropout
- ensemble集成
- 尽可能找到还原语义的pretrained embedding,实际情况是oov千奇百怪,拼写检查,基本上是100倍的努力,一点点收益,或者拆词,拆字能一定程度上缓解(比如说你要训练一个某个领域(量化投资)的人短信文本分类,有条件下尽量自己拿相近的行业比较大的语聊训练一个词向量,实际上线的遇见比如investvanguard(OOV)【假设一个投资公司的名称】可能就要用到n-gram(一般二元就成)去切割成invest和 vanguard【其切完后的有可能就是强特征的invest,如果将这个OOV直接赋值零向量可能会损失强特征】)
二、有可能有负作用,跟具体的配方有关,考验炼丹水平,看运气
- embedding是否参与训练(Yoon Kim论文的结论是训练好,然而实际中基本对半)
- BN和dropout,以及他们的相对位置和顺序
- meta-feature的使用,比如说词性,情感,还有各种语言学特征和元信息等
- 要用CNN的话,用空洞版本,大窗口
- 数据增强,drop,shuffle,replace,近义词,扩充,截取
- 循环学习率(这个base max step 调的好,能巨大加速收敛速度)
- char/subword level的使用
- 词元化,词干化(有收益的比较少)怼好分词
- 不均衡下的采样,梯度放缩,focal loss
- 伪标签,半监督
- 去停用词(基本都是负作用),标点保留还是去掉
- 过拟合后冻层finetune
- 长短文本各适合什么模型呢,仅在一个数据集上发现,ngram+svm可以吊打深度模型,文本挺长的,结论应该不可以泛化
- 多embedding concat,mean,收益不稳定,有时候能发现加速收敛
- 加宽加深(知乎看山杯)
- boosting(知乎看山杯)
- vocab的数量,是否统一替换或者过滤低频词(kaggle avito)
- 网络增加冗余的激活然后concat(kaggle mecri)
- Maxlen覆盖百分之99就可以了,不需要最大
- 还有一招,换种子
总结一下,数据量足够的情况下,强行破坏分布的行为,都有可能是无用功,比如清洗。但是小数据,或者分布有偏,就考验你能不能往正确的方向上改了。文本分类的论文,除了textCNN,fasttext,bert(顺路碾压下)。恕我直言,其他的哈哈哈哈,故事讲的一个比一个好看。就普适性(10个以上数据集的表现)来看,几乎所有的吊炸天structure可以被精调的两层lstm干掉。
参考链接
|