1 微调

  • 混合精度训练
  • 伪标签理论及实现
  • 改进textCNN和Fasttext,争取破0.80
  • trim_String ==200
  • 网络初始化
  • 数据预处理
  • 删除特殊符号
  • 数字泛化
  • 不删除停用词
  • 随机替换的数据增强0.84+
  • 损失函数focal loss 失败,没有变化
  • 伪标签 0.8735
  • Embedding_size =(128) ==>200 300 128 iter = 20
  • 单个词向量训练窗口调参 默认
  • concat三种词向量
  • word2vec 128 0.8735
  • Fasttext 128 0.8618
  • glove 128 0.8619
  • Dropout
  • 0.4
  • 0.3
  • 0.5
  • 单词矫正
  • 网络结构
  • LSTM
  • Attention
    • Batch_size = 1000 ==>500==>200==>100
  • 10W随机替换数据增强训练
    • 改进ML代码

2 实验记录过程

2.1 TextCNN

(1)互译数据增强

TextCNN 互译增强:线上:0.7515 线下:0.8149

(2)原始数据

  • 线下:0.8301

    TextCNN 原始数据,线下:0.8301 Embedding_size = 128 Batch_size = 1000 Max_len 限制 100 学习率0.001 无网络初始化

  • 线下:0.8508

    Embedding_size = 128 Batch_size = 1000 Max_len 限制 200 学习率0.001 无网络初始化

  • 线下:0.8566

    Embedding_size = 128 Batch_size = 1000 trim_string = 200 学习率0.001 有网络初始化

  • 线下:0.847

    删除特殊符号 for punct in ‘&’:

    1. x = x.replace(punct, f' {punct} ')

    for punct in ‘?!.,”#$%()*+-:;<=>@[\]^_`{|}~“”‘’’:

  • 线下:0.8602

    不去除循环前缀 删除换行符,替换 ‘ /为空格

  • 线下:0.8606

    数字泛化

  • 线下:0.8595

    不采用论文停用词

  • 线下:0.84+

    数据增强(随机替换、删除)

  • 线下:0.8735==>0.8709

    Embedding_size =128 iter =20 0.8735 Embedding_size =200 iter =20 0.8709

  • 线下

    glove: Iter20 (伪标签+原始数据+test) 0.8572 glove: iter 50 (原始数据) 0.8584 glove: iter 50 (原始数据+添加test) 0.8589 glove: iter 40 (原始数据+test) 0.8584 glove:iter 200(原始数据+test)0.8619 glove iter 200(伪标签+test)

  • 对比

    word2vec 128 原始model batch_size = 1000 0.864 word2vec 128 原始model batch_size = 100 0.8603 word2vec 128 原始model batch_size = 500 0.8619

  • 对比

    用伪标签的数据训练词向量 iter =20 0.8647

2.2 Fasttext

epoch 5 0.8213 epoch 10

3 NLP文本分类技巧

  1. 数据预处理时vocab的选取(前N个高频词或者过滤掉出现次数小于3的词等等)
  2. 词向量的选择,可以使用预训练好的词向量如谷歌、facebook开源出来的,当训练集比较大的时候也可以进行微调或者随机初始化与训练同时进行。训练集较小时就别微调了
  3. 结合要使用的模型,这里可以把数据处理成char、word或者都用等
  4. 有时将词性标注信息也加入训练数据会收到比较好的效果
  5. 至于PAD的话,取均值或者一个稍微比较大的数,但是别取最大值那种应该都还好神经网络结构的话到没有什么要说的,可以多试几种比如fastText、TextCNN、RCNN、char-CNN/RNN、HAN等等。哦,对了,加上dropout和BN可能会有意外收获。反正模型这块还是要具体问题具体分析吧,根据自己的需求对模型进行修改(比如之前参加知乎竞赛的时候,最终的分类标签也有文本描述,所以就可以把这部分信息也加到模型之中等等)超参数的话,推荐看看之前TextCNN的一篇论文,个人感觉足够了“A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification”之前还见别人在文本领域用过数据增强的方法,就是对文本进行随机的shuffle和drop等操作来增加数据量
  6. 循环学习率(这个base max step 调的好,能巨大加速收敛速度)(kaggle QIQC)
  7. 梯度放缩,focal loss
  8. Maxlen覆盖百分之99就可以了,不需要最大
  9. 迁移特征,尝试从公开的语料库去训练模型,然后可以将模型分类的标签向量作为自己分类模型的输入特征,当然要考虑任务的相关性。
  10. 文本预处理,必须归一化
  11. 如果要用pretrain+finetune的策略,注意一下学习率schedule问题,三角学习率和warmup策略一般比生跑稳定的多
  12. 语言学特征如POS、NER、SRL等,对于短文本分类经常有奇效
  13. 英文文本处理:https://www.cnblogs.com/pinard/p/6756534.html