本文结构为:
- 为什么FastText结构简单效果也能不错
- Bert优化方向
- 常用的文本预处理tricks
一,为什么FastText结构简单效果也能不错
fastText简而言之,就是把文档中所有词通过lookup table变成向量,取平均后直接用线性分类器得到分类结果。对于短文本,特别是线性成分较大、非线性成分较小的文本分类任务,fastText可以很好的学习到其中的知识,效果不会比Bert差太多,但速度上有绝对的优势。
对于一些包含讽刺、反语的文本分类任务,包含的非线性成分更大,相比于fastText,注意力模型可以更好的捕获上下文信息。总结来说,对简单的任务,用简单的网络结构基本就够了,但是对比较复杂的任务,还是需要更复杂的网络结构来学习sentence representation的。
目前我在fastText的实验中主要优化方向为:
- 以下几个参数的调优:
dim 词向量维度 default 100
ws 上下文窗口大小 default 5
lr 学习率 default 0.05
epoch epochs 数量 default 5
min_count 最低词频 default 5
word_ngrams n-gram 设置 default 1
loss 损失函数 {ns,hs,softmax} default ns
- 文本预处理(见👇第三点);
- kfold交叉验证;
- 结合其他一些业务上的特征(将特征和文本一同作为fastText输入);
- 集成策略;
- Active learning(扩充训练集,减少人工标注的成本)。
二,Bert优化方向
从算法上和业务上,有以下几点优化方向(其他神经网络模型也类似):
- max_length,batch_size等参数,对文本整体进行分析,选择合适的max_length尽量减少信息损失,并把有限的机器资源留给别的参数;
- 如果验证集上效果比训练集上差很多,说明出现了过拟合,加入dropout层;
- 优化方法的选择;
- 损失函数的选择;
- 基于验证集的自适应learning rate;
- Learning rate加入warmup阶段;
- Bert最后一个输出层后接入CRF、LSTM、BiLSTM等结构。(Bert、Roberta已经很大了,不建议后面再接复杂的结构,Albert可以考虑);
- 对训练数据加入与Bert同样模式的mask(随机选择15%的token做mask,80%替换成’[MASK]’, 10%保持不变,10%替换成任意token),缩小预训练与微调阶段的差异(这一点也是XLNet论文中指出的Bert的缺点),并且提升泛化能力;
- 集成策略;
- Active learning(扩充训练集,减少人工标注的成本);
- 文本的预处理;
- 增加其他业务特征,经过特征工程后,与Bert最后一个输出层的结果拼接,共同进行下一步的预测;
- (机器资源不足的情况,也可以只对Bert的后N层进行微调)。
三,常用的文本预处理tricks
- 分词
- wordpiece (针对英文)
- 去停用词
- 词性筛选
- 文本泛化(链接、电话号码、邮箱、命名实体的统一替换)
- 异常数据的去除