目录

  • 目的
  • 背景
    • 个人配置
    • 赛题要求
  • baseline提供的优化方向
  • 调优过程(随缘更新~)
    • 调整batchSize和epochs
    • noisy label
      • cleanlab(仍在尝试ing)
      • Symmetric Cross Entropy(SCE)
    • 多任务学习中设计loss权重
    • 更换预训练模型
  • 总结
  • 参考

目的

  前情提要
  根据Datawhale大佬们提供的baseline训练模型以及优化方向,对baseline进行改进以期提高分数。对于小白本白来说,very very hard,特此记录过程以鞭策自己,目前仍在艰难探索ing~再次感谢大佬们的指点!

背景

个人配置

  • 本机显卡:RTX3070;
  • 目前租用两块3090试一试水;
  • 以及第一次调baseline的小白~

赛题要求

  • 赛事信息:天池->全球人工智能技术创新大赛【热身赛二】
  • Datawhale提供的baseline(特别感谢~):地址

baseline提供的优化方向

  1. 修改 calculate_loss.py 改变loss的计算方式,从平衡子任务难度以及各子任务类别样本不均匀入手;
  2. 修改 net.py 改变模型的结构,加入attention层,或者其他层;
  3. 使用 cleanlab 等工具对训练文本进行清洗;
  4. 做文本数据增强,或者在预训练时候用其他数据集pretrain;
  5. 对训练好的模型再在完整数据集(包括验证集和训练集)上用小的学习率训练一个epoch;
  6. 调整batchSize和a_step,变更梯度累计的程度,当前是batchSize=16,a_step=16;
  7. 用 chinese-roberta-wwm-ext 作为预训练模型;

调优过程(随缘更新~)

调整batchSize和epochs

  在第一次跑baseline的时候,batchSize=16就已经爆破了我的8g显存,随即我调整batchSize=8成功跑通,结果如图:

  之后大幅度调小epoch=6,结果又有了一次提升。

  在往后的训练过程中,epoch基本在4~6之间浮动,batchSize4~8观察提交得分发现又回到了解放前。

noisy label

cleanlab(仍在尝试ing)

  开始尝试使用cleanlab清洗数据。简言之,就是通过某种方式(置信学习)自动清洗那些标注质量不过关的“脏数据”。而cleanlab就是来自于ICML2020的一篇由MIT和Google联合提出的paper(原文链接)中开源的数据清洗工具,只需要pip install cleanlab安装即可使用。详细讲解可以看这篇文章——> 夕小瑶:别让数据坑了你,写得灰常好!
  如果想找出标注错误的样本,我们仅需要提供两个输入:一个输入是原始的样本标签(由于原始标签可能有错误,这里称为噪声标签);另一个输入就是通过对训练集交叉验证,来预测的每一个样本在不同标签类别下的概率,这是一个n×mn\times mn×m的概率矩阵(nnn为数据集大小,mmm为标签类别总数)。

from cleanlab.pruning import get_noise_indices
# 输入
# s:噪声标签
# psx: n x m 的预测概率概率,通过交叉验证获得
ordered_label_errors = get_noise_indices(s=numpy_array_of_noisy_labels,psx=numpy_array_of_predicted_probabilities,sorted_index_method='normalized_margin', # Orders label errors)

如果我们不只是想找到错误标注的样本,还想把这些标注噪音clean掉之后重新继续学习:

from cleanlab.classification import LearningWithNoisyLabels
from sklearn.linear_model import LogisticRegression# 其实可以封装任意一个你自定义的模型.
lnl = LearningWithNoisyLabels(clf=LogisticRegression())
lnl.fit(X=X_train_data, s=train_noisy_labels)
# 对真实世界进行验证.
predicted_test_labels = lnl.predict(X_test)

  目前还在学习baseline代码结构,我一直在(数据准备阶段)generate_data.py做文章,经过几番尝试之后,并没有跑通代码。
  在写博客的时候,我发现可能是我对于数据清洗与模型训练的结合点不够清晰(错误地在数据集划分的时候做文章),而且需要进一步明确cleanlab的输入参数的来源和含义,也就是说需要再重新读一遍文章解析,然后参考一下源码解读。

Symmetric Cross Entropy(SCE)

  最近受到一个知乎大神回答的启发又发现了一个方法,该方法来自于论文:Symmetric Cross Entropy for Robust Learning with Noisy Labels,它提出一种针对noisy label的更加鲁棒的损失函数Symmetric Cross Entropy
lsce=αlce+βlrcel_{sce} = \alpha l_{ce} + \beta l_{rce} lsce​=αlce​+βlrce​
其中,lcel_{ce}lce​是传统的交叉熵损失函数(如pytorch内置的nn.CrossEntropyLoss())。 而lrcel_{rce}lrce​称作reverse cross entropy,它把lcel_{ce}lce​中的label和模型输出逆转,以模型输出作为监督信息,把label作为预测值来计算loss。由此,lrcel_{rce}lrce​大的样本大概率是noisy label样本。


  github上也找到了该论文复现的pytorch版:地址。可以参考一下~

多任务学习中设计loss权重

  着眼于baseline改进方向的第一条,我发现这可能是比较有意思的一部分。这时候要回到赛题介绍,如图:

这就意味着我们要用单模型去完成三个任务,正是赛题要求的泛化能力。由于这三个任务并不相同(直观反映在数据量和label内容的不同),可见需要我们在设计loss权重方面动一动脑筋。而且,通过比赛成绩反映出ocemotion数据集的结果一般。待更新~

更换预训练模型

  在尝试cleanlab无果后,我选择了一个比较容易实现的方向。将原来的bert-base-chinese更换为chinese-roberta-wwm-ext(下载地址)。下载config.json,vocab.txt,pytorch_model.bin,把这三个文件放进tianchi-multi-task-nlp/bert_pretrain_model文件夹下。

  而后,为了体验一下batchSize=32的感觉,我租了两块3090(知乎搜索适合自己方案吧,也可以在了解清楚情况后,用colab或aistudio)试一试水,瞬间提速。老黄刀法名不虚传!

之后,为了测试一下两块3090的实力,我将batchSize调到了64,没想到居然爆了(一定是我操作失误~~)。写博客前最后一次在租用的环境中测试,参数调整如下:batchSize=48epoch=8,提交结果如图:

并没有明显的变化。。。质量优秀的数据才是关键啊!

总结

  调整batchSize以及epochs用于适配显存(贯穿调优全程),一开始尝试使用cleanlab清洗训练集;在不得方法精髓后,选择替换预训练模型,将bert-base-chinese替换为chinese-roberta-wwm-ext;在写博客的时候,我秃然想起了方法5(请原谅一只小白的愚钝~),与李宏毅老师(ML20课程主页)在讲解模型训练的Basic Concept章节中所提到的(N-fold)cross validation方法类似,该方法可能会平衡variance和bias以减小total error。感觉还可以再抢救一下模型,写完之后继续愉快地学习吧!

参考

  • 夕小瑶:别让数据坑了你(置信学习)
  • cleanlab代码讲解参考
  • cleanlab——github
  • baseline
  • 全球人工智能技术创新大赛【热身赛二】
  • chinese-roberta-wwm-ext
  • 李宏毅ML20课程主页
  • 踩坑记录——记一次训练提交baseline全过程
  • Deep Learning with Noisy Label - 资瓷向量机的文章 - 知乎
  • SCEloss复现
  • 神经网络中,设计loss function有哪些技巧? - 刘诗昆的回答 - 知乎

记一次小白调参baseline——NLP中文预训练模型泛化能力比赛相关推荐

  1. 组队学习-NLP实践-中文预训练模型泛化能力挑战赛(文本分类,bert)

    组队学习-NLP实践-中文预训练模型泛化能力挑战赛 Docker 安装与使用 阿里云镜像仓库 baseline 本机运行并提交 Docker 安装与使用 参考:https://mp.weixin.qq ...

  2. 天池NLP中文预训练模型赛来了!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale赛事 主办单位:阿里云,CLUE,乐言科技 自从2017年具有划时代意义的Tr ...

  3. 借鉴人类,跨越模态 | NLP和预训练模型未来的发展之路

    [专栏:研究思路]近来,超大规模预训练模型快速发展,在自然语言处理领域引起热议.基于深度学习的自然语言 处理技术正沿着"极大数据.极大模型.极大算力"的轨道,"无所不用其 ...

  4. 【小白学PyTorch】5.torchvision预训练模型与数据集全览

    [机器学习炼丹术]的学习笔记分享 <<小白学PyTorch>> 小白学PyTorch | 4 构建模型三要素与权重初始化 小白学PyTorch | 3 浅谈Dataset和Da ...

  5. 【NLP】预训练模型综述

    预训练模型综述 摘要:近年来,预训练模型的出现将自然语言处理带入了一个新的时代.本文概述了面向自然语言处理领域的预训练模型技术.我们首先概述了预训练模型及其发展历史.并详细介绍自然语言处理领域的经典预 ...

  6. GhostNet 解读及代码实验(附代码、超参、日志和预训练模型)

    文章首发于 极市平台 文章目录 一.前言 二.论文阅读 摘要 问题1: 何为特征图冗余? 问题2: Ghost feature maps 和 Intrinsic feature maps 是什么? 问 ...

  7. T5 模型:NLP Text-to-Text 预训练模型+数据清洗

    简单总结T5模型:         T5模型:是一个端到端,text-to-text 预训练模型         T5模型也是训练七十个模型中一个较通用的一个框架.         T5模型:可以做文 ...

  8. 手把手系列—风控模型的调参方法和实际应用

    序言: 大数据时代的风控体系必有模型部分的参与,用策略贯穿整个风控体系,以数据为驱动,模型一定是标配内容.于是在模型的建设上,如何精细化地输出一套有效的模型,就是在精细化管理上非常重要的一个差异点.不 ...

  9. 【机器学习】决策树原理、调参、可视化 + 银行信用卡欺诈检测案例(含数据集)

    目录 决策分类树 2.1 ID3算法(信息增益) 2.2 C4.5 算法(信息增益率) 2.3 CART算法(Gini系数) CART构造决策树实例 决策树的剪枝 sklearn实现决策树 决策树的调 ...

最新文章

  1. ceph——rgw服务启不起来
  2. 记录下两个孩子在MineCraft里面还原公寓的经历
  3. php写接口的注意事项,接口的调用注意事项
  4. opengl加载显示3D模型AMF类型文件
  5. linux socket bind 内核详解,Socket与系统调用深度分析(示例代码)
  6. Android addr2line和 c++filt使用
  7. 项目:聊天室思路(linux下实现,语言:C/C++)
  8. java所有代码都需要编译吗_为什么要编译此Java代码?
  9. 史上最强三千六百道脑筋急转弯(6)
  10. 2021年北京市促进服务外包发展专项资金申报时间及材料,补贴500万
  11. 非合作关系设定下的多智能体强化学习
  12. 【008】基于vue.js的仿网易云web端(含源码答辩PPT、接口文档、运行教程)
  13. android 字体倒影,android实现TextView文字倒影效果
  14. tensorflow6-7
  15. 2015年基金公司排名排行榜,基金公司排名2015一览
  16. ISO SAE 21434-2021 要求、建议、允许(RQ、RC、PM)整理
  17. 解决:idea中tomcat项目改名后,原名项目启动后是新名项目的内容
  18. 基于java+SpringBoot+HTML+Mysql音乐网站
  19. 如何设计安全可靠的开放接口---之Token
  20. 论文阅读:Fast Optical Flow using Dense Inverse Search

热门文章

  1. 行业报告归档 2017.3.21
  2. 织梦php模板在哪个文件夹,织梦主要文件夹目录及模板文件说明
  3. PDF文件压缩和优化的原理是什么?看了这篇C#案例实践就知道了
  4. 【无标题】种草推广如何精准引流 KOL达人与内容要用好
  5. 可编辑表格TableCell
  6. c语言程序 5ms 延时,计算机单片机延时方法电脑c语言.docx
  7. 第二十二章 : 格式化输出
  8. 7-26 输出大写英文字母
  9. python生成二维码_使用python生成二维码
  10. 计算机主板上的命名,电脑主板常见命名规则整理:微星;华硕;技嘉