比赛总结:GAIIC 2023 全球人工智能技术创新大赛—算法挑战赛

本文介绍了参加GAIIC2023全球人工智能技术创新大赛算法挑战的过程。选手使用复旦的fnlp/bart-base-chinese模型,通过动态加噪预训练(DAE)适应数据,进行了模型词表缩减和预训练,采用包括EMA、FGM、RDrop等技巧进行微调和融合,最终在比赛中取得了良好排名。
摘要由CSDN通过智能技术生成

比赛总结:GAIIC 2023 全球人工智能技术创新大赛—算法挑战赛

作者:没有算力哭唧唧

赛题解析

详见:https://www.heywhale.com/org/gaiic2023/competition/area/63fef766b4422ee27402289d/content/2

数据解析

数据为脱敏数据,由三部分组成:影像描述description、诊断报告diagnosis、临床信息clinical(复赛加入)。
description的最大长度为150,diagnosis的最大长度为80,clinical最大长度为30。

词表大小没有具体统计,预估在2000以内。

有选手试图将脱敏数据转化为明文数据,效果不佳。所以直接使用脱敏数据最好。

初赛 Training 集规模为 20000 例样本;

复赛 Training 集规模为 80000 例样本。

初赛 Test 集分为 A/B 榜,规模均为 3000;

复赛 Test 集分为 A/B 榜,规模均为 7500。

经过观察,每个句子后面都带有10这个ID,猜测为句号。

数据为脱敏数据且无法恢复成明文数据,预训练模型的原始权重不能用,需要重新进行预训练,让模型学习新token的嵌入表示。

正常来说,需要重新构建词表,并做词表映射(分词),由于本次比赛数据本身就是数字ID,因此可以选择直接将token当成token id,基于空格进行分词,不用tokenizer。不过需要注意,special token id 需要和预训练模型的 special token id 对应,可能需要对token id做一个平移操作,例如+100。

模型选择

(尝试过uniml,bart,T5)

最终选择复旦的预训练模型 fnlp/bart-base-chinese 作为基础模型。链接为:https://huggingface.co/fnlp/bart-base-chinese

由于模型本身的词表的非常大,为了加快模型训练/推理的速度,选择缩减模型词表。

from transformers import BartForConditionalGeneration
model = BartForConditionalGeneration.from_pretrained('fnlp/bart-base-chinese')
model.resize_token_embeddings(2000)  # 修改embedding大小
model.save_pretrained('pretrain_model/fnlp_bart_base')  # 保存修改后的model
print(model)

算法

整体思路介绍

基于复旦的fnlp/bart-base-chinese模型,因比赛数据的特殊性,先在比赛数据集上构造DAE预训练任务,使模型适应比赛数据。之后进行任务训练、验证、调参、测试。

DAE 预训练任务

动态加噪预训练:DAE语料在每次读取DataLoader的时候进行生成,每个epoch不会遍历相同的噪声数据。
动态Padding:根据每个batch的最大长度进行填充。

DAE语料构造方法:

  1. 1-gram mask
  2. 2-gram mask
  3. 3-gram mask
  4. 针对每条数据,将句子基于句号(10)进行分割,并打乱顺序。

随机从上面4种方式中,选择1种进行加噪
mask 比例分别为 0.15、0.75、0.05,保证总体mask掉15%的token。可以选择是否使用mask token,此处没有使用mask token,而是直接将需要mask的词直接换成词表中的随机词。

模型需要将 DAE 语料进行还原,source为加噪后的句子,target为原始句子。

模型训练

预训练

bz:32
优化器:Adaw
学习率:1e-4
学习率衰减策略: 余弦退火(num_cycles=0.5)
一共预训练100轮

微调

bz:16
优化器:Adaw
学习率:8e-5
学习率衰减策略: 多项式函数衰减
微调20轮,基本上会在6轮之后指标最高

Tricks

使用了EMA、fgm、rdrop,最后进行投票融合。尝试过5折交叉验证swa权重平均,训练时间长且效果不佳。

ema:decay取0.999

fgm:对token_embedding进行攻击,epsilon=0.3

rdrop:loss = ce_loss + 0.005 * kl_loss,ce_lossh和kl_loss需要保持1:1或者2:1,这里放缩比例取0.005,如果太大训练会崩。计算KL loss的时候可以选择sum和mean,不管选择sum还是mean,最后ce和kl量级要差不多,这里用的sum。

融合:logits融合和投票融合

没有写logits融合,太难写了,要手撸beam_search。

投票融合:比如三个模型生成三个文本,以一个为preds 其他两个为target,计算一个指标,然后求个平均作为preds的分数,每个都这么求一遍,最后投票 哪个高选哪个。

融合了三个随机种子:2023,98,6789(线下cider最高)

比赛结果

初赛:rank 67,cider 2.8326

复赛:rank 39,cider+blue加权 2.201

总结

从0开始入门nlp,学到很多,再接再厉。
主要提分点在预训练、trick、融合。如果不限制融合,融才是硬道理!

参考资料

怎么改词表,怎么预训练,各种trick,全都写的挺好的:https://github.com/daniellibin/gaiic2021_track3_querySim

LAMBADA——用GPT-2来做文本数据增强:https://zhuanlan.zhihu.com/p/489246523

【炼丹技巧】指数移动平均(EMA)的原理及PyTorch实现 https://zhuanlan.zhihu.com/p/68748778

NLP炼丹技巧合集
https://www.jianshu.com/p/8cfc900611cb

环境配置

cuda版本:11.4 、python:3.9.16、pytorch:1.12

依赖包及版本如下:

absl-py==1.4.0
aiohttp==3.8.4
aiosignal==1.3.1
asttokens==2.2.1
async-timeout==4.0.2
attrs==22.2.0
autopep8==2.0.2
backcall==0.2.0
backports.functools-lru-cache==1.6.4
blinker==1.5
brotlipy==0.7.0
cachetools==5.3.0
certifi==2022.12.7
cffi==1.15.1
charset-normalizer==2.1.1
click==8.1.3
colorama==0.4.6
comm==0.1.2
cryptography==39.0.2
dataclasses==0.8
debugpy==1.6.6
decorator==5.1.1
executing==1.2.0
filelock==3.10.0
frozenlist==1.3.3
google-auth==2.16.2
google-auth-oauthlib==0.4.6
grpcio==1.52.1
huggingface-hub==0.13.3
idna==3.4
importlib-metadata==6.1.0
ipykernel==6.22.0
ipython==8.11.0
jedi==0.18.2
joblib==1.2.0
jupyter_client==8.1.0
jupyter_core==5.3.0
Markdown==3.4.1
MarkupSafe==2.1.2
matplotlib-inline==0.1.6
mkl-fft==1.3.1
mkl-random==1.2.2
mkl-service==2.4.0
multidict==6.0.4
nest-asyncio==1.5.6
numpy==1.23.5
oauthlib==3.2.2
opencv-python==4.7.0.72
packaging==23.0
pandas==1.5.3
parso==0.8.3
pexpect==4.8.0
pickleshare==0.7.5
Pillow==9.4.0
pip==23.0.1
platformdirs==3.1.1
pooch==1.7.0
prompt-toolkit==3.0.38
protobuf==4.21.12
psutil==5.9.4
ptyprocess==0.7.0
pure-eval==0.2.2
pyasn1==0.4.8
pyasn1-modules==0.2.7
pybind11==2.10.4
pycodestyle==2.10.0
pycparser==2.21
Pygments==2.14.0
PyJWT==2.6.0
pylcs==0.0.8
pyOpenSSL==23.0.0
PySocks==1.7.1
python-dateutil==2.8.2
pytz==2022.7.1
pyu2f==0.1.5
PyYAML==6.0
pyzmq==25.0.2
regex==2022.10.31
requests==2.28.2
requests-oauthlib==1.3.1
rsa==4.9
sacremoses==0.0.43
scikit-learn==1.2.2
scipy==1.10.1
sentencepiece==0.1.97
setuptools==67.6.0
six==1.16.0
stack-data==0.6.2
tensorboard==2.11.0
tensorboard-data-server==0.6.1
tensorboard-plugin-wit==1.8.1
threadpoolctl==3.1.0
tokenizers==0.13.2
tomli==2.0.1
torch==1.12.0
torchaudio==0.12.0
torchvision==0.13.0
tornado==6.2
tqdm==4.65.0
traitlets==5.9.0
transformers==4.27.2
typing_extensions==4.5.0
urllib3==1.26.15
wcwidth==0.2.6
Werkzeug==2.2.3
wheel==0.40.0
yarl==1.8.2
zipp==3.15.0

其他文章

2023全球人工智能技术创新大赛-影像学NLP赛题非官方baseline

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>