目录
赛题介绍
赛题背景
影像科医生在工作时会观察医学影像(如CT、核磁共振影像),并对其作出描述,这些描述中包含了大量医学信息,对医疗AI具有重要意义。本任务需要参赛队伍根据医生对CT的影像描述文本数据,判断身体若干目标区域是否有异常以及异常的类型。初赛阶段仅需判断各区域是否有异常,复赛阶段除了判断有异常的区域外,还需判断异常的类型。判断的结果按照指定评价指标进行评测和排名,得分最优者获胜。
赛题链接:Link
赛题描述
赛题数据
大赛分为初赛A/B榜、复赛A/B榜以及决赛答辩,各时间点公布的数据文件及时间如下
数据文件 | 发布时间 | 备注 |
---|---|---|
track1_round1_train_20210222.csv | 2021.03.02(初赛A榜) | 仅包含区域标注 |
track1_round1_testA_20210222.csv | 2021.03.02(初赛A榜) | 测试集数据,无标注 |
track1_round1_testB.csv | 2021.04.08(初赛B榜) | 测试集数据,无标注 |
train.csv | 2021.04.15(复赛A榜) | 包含区域与类型标注 |
testA.csv | 2021.04.15(复赛A榜) | 测试集数据,无标注,不开放下载 |
testB.csv | 2021.05.08(复赛B榜) | 测试集数据,无标注,不开放下载 |
初赛训练数据格式如下
列名 | 说明 | 示例 |
---|---|---|
report_ID | 数据标号,整型 | 1 |
description | 脱敏后的影像描述,以字为单位使用空格分割 | 101 47 12 66 74 90 0 411 234 79 175 |
label | 由多个异常区域ID组成,以空格分隔。若此描述中无异常区域,则为空 | 3 4 |
1 | 0|,|623 328 538 382 399 400 478 842 698 137 492 266 521 177 415 381 693 700 132 706 317 534 830 290 512 729 327 548 520 445 51 240 711 818 445 358 240 711 693 623 328 380 172 54 175 563 470 609 |,|2 |
复赛训练数据格式如下
列名 | 说明 | 示例 |
---|---|---|
report_ID | 数据标号,整型 | 1 |
description | 脱敏后的影像描述,以字为单位使用空格分割 | 101 47 12 66 74 90 0 411 234 79 175 |
label | string,由两部分组成。第一部分为若干异常区域ID,用空格分割。第二部分为若干异常类型ID,用空格分割。两部分用逗号“,”分割。若定义中所有区域均无异常,则两部分均为空,此项为“,”。 | 3 4,0 2 |
1 | 0|,|623 355 582 617 265 162 498 289 169 137 405 693 399 842 698 335 266 14 177 415 381 693 48 328 461 478 439 473 851 636 739 374 698 494 504 656 575 754 421 421 791 200 103 718 569 |,|, |
测试集数据
列名 | 说明 | 示例 |
---|---|---|
report_ID | 数据标号,整型 | 1 |
description | 脱敏后的影像描述,以字为单位使用空格分割 | 101 47 12 66 74 90 0 411 234 79 175 |
1 | 0|,|852 328 697 538 142 355 582 800 728 4 647 169 750 703 488 82 487 693 852 328 697 582 809 538 729 327 194 79 728 478 333 832 47 |
提交要求
所需提交文件格式为
列名 | 说明 | 示例 |
---|---|---|
report_ID | 数据标号,整型 | 1 |
Prediction | 预测输出向量(初赛为17维,复赛为29维),以空格分割,值在0到1之间,表示区域/类型包含异常类型的概率 | 0.68 0.82 0.92 0.59 0.71 0.23 0.45 0.36 0.46 0.64 0.92 0.66 0.3 0.5 0.94 0.7 0.38 0.05 0.97 0.71 0.5 0.64 0.0 0.54 0.5 0.49 0.41 0.06 0.07 |
评估标准
评估指标较为严格,以测试集数据上对提交结果计算的指标为基础,记样本个数为,每个样本对应个预测值,那么首先计算个预测值的均值如下
$$
\text{mlogloss}(y, \tilde{y}) = -
\frac{1}{M} \sum_{m=1}^M
\frac{1}{N} \sum_{m=1}^N
\left [
y_{nm} \log \tilde{y}{nm} + (1 - y{nm}) \log (1 - \tilde{y}_{nm})
\right] \tag{1}
$$
两阶段计算有所区别:
-
初赛阶段:。
-
复赛阶段:为了让分数区间更合理,复赛阶段调整为。另外,复赛阶段分数由两部分组成:
- 第一部分(区域)得分计算方式与初赛一致,对个预测值计算指标;
- 第二部分(类型)得分对所有实际存在异常区域的测试样本计算指标,例如个样本中包含个存在区域异常的样本,那么对个预测值计算指标。
最终复赛得分为。
赛题思路
- 文本数据脱敏是该题一方面的限制,因为不能利用公开的预训练模型对应的词表,也就不能直接在公开模型基础上微调,需要重新生成词表并预训练;
- 该任务是一个典型的多标签分类任务,需要对每个标签进行异常判别,在微调阶段采用二分类交叉熵(BCE)损失,与评测指标一致。
数据处理
探索分析
各文件给定文本长度统计:
各文件给定文本词频统计:
初赛/复赛样本标签频数统计:
- 数据总数:初赛训练集共10000条,A/B榜测试集分别有3000条;复赛训练集共20000条,A/B榜测试集分别有5000条。
- 文本长度:长度最小为2,最大长度都短于128。
- 词表统计:词表大小为852,词频分布较为一致。
- 标签统计:初赛和复赛在标签上的分布存在不一致。
数据划分
数据划分的目的是:
- 从训练集总体中划分一部分作为验证集(dev),用作early-stopping;
- 模型使用不同划分的数据训练,能增大模型差异,为后续模型集成作准备。
尝试使用多种数据划分方式,如
- 多次随机划分(
sklearn.model_selection.ShuffleSplit
); - 普通K折划分(
sklearn.model_selection.KFold
); - 多标签分层K折采样(
iterstrat.ml_stratifiers.MultilabelStratifiedKFold
); - 对抗验证(adversarial validation)。
adversarial validation 详情参考:Link
实验发现多标签分层K折采样训练得到的模型,在集成中收益最大,可能原因如下
- K折划分获得的多折训练集两两间都存在差异,可以增大模型差异,提升集成效果;
- 划分过程中,需尽量使训练集的数据分布尽可能与原始数据分布保持一致,分层(stratified)能使标签分布保持一致。
考虑到以下几点,取:
- K取值越大时,每折训练集中样本个数越多,模型训练次数也越多,导致训练时间过长;
- 会导致折间差异变小,影响模型融合效果。
样本重加权
本地验证集上能达到的分数,但实际LB的分数最高也只有左右,因此线上线下存在较大的不一致。为了减少不一致,对训练集样本进行重加权,权值由TFIDF与余弦相似度评估,具体计算方法是:用给定文本语料训练TFIDF参数,然后计算训练集与测试集样本两两间的句级相似度,取均值得到各训练集样本权重,如下图所示。
数据增强
受目前视觉领域Mixup、Cutout与CutMix数据增强方式[1]启发,本方案设计了与其类似的数据增强方式,具体方法为:从训练样本集中随机选择两个原始样本,随机打乱顺序后拼接得到扩增样本,并将两个原始样本的标签进行合并,具体如下,注意此时要调整模型的最大输入长度。
样本 | tokens | label |
---|---|---|
原始样本1 | 708 328 328 380 172 470 455 693 256 514 569 231 113 256 693 852 328 328 380 172 300 320 842 698 149 338 266 521 415 381 693 700 830 273 332 | 15, 2 |
原始样本2 | 411 657 399 698 17 36 575 548 435 142 51 519 421 569 183 693 380 136 363 556 698 432 449 177 415 381 693 477 767 809 712 477 767 37 11 693 430 698 251 391 | 15, 11 |
扩增样本 | 708 328 328 380 172 470 455 693 256 514 569 231 113 256 693 852 328 328 380 172 300 320 842 698 149 338 266 521 415 381 693 700 830 273 332 411 657 399 698 17 36 575 548 435 142 51 519 421 569 183 693 380 136 363 556 698 432 449 177 415 381 693 477 767 809 712 477 767 37 11 693 430 698 251 391 | 2, 11, 15 |
另外,尝试使用了EDA数据增强[2],但效果欠佳
- 同义词替换(Synonyms Replace, SR):不考虑stopwords,在句子中随机抽取n个词,然后从同义词词典中随机抽取同义词,并进行替换。
- 随机插入(Randomly Insert, RI):不考虑stopwords,随机抽取一个词,然后在该词的同义词集合中随机选择一个,插入原句子中的随机位置。该过程可以重复n次。
- 随机交换(Randomly Swap, RS):句子中,随机选择两个词,位置交换。该过程可以重复n次。
- 随机删除(Randomly Delete, RD):句子中的每个词,以概率p随机删除。
模型训练
模型结构
目前,NLP领域的SOTA都是预训练加微调的方案,其中预训练模型(Pre-training Language Models, PLMs)是在大量语料上进行无监督训练得到的,网络结构采用Transformer模型(Encoder或Decoder),常见的有:BERT[3]、RoBERTa[4]、XLNet[5]、GPT[6]、UniLM[7,8,9]等,国内相关技术如百度的ERNIE[10]、华为的NEZHA[11]等。本方案使用了两种预训练模型,分别是华为提出的NEZHA、苏剑林(苏神)提出的RoFormer[12,16]。选择这两种预训练模型的原因是:
- 两种模型都对位置编码(Position Embedding, PE)做了优化,其中NEZHA采用相对位置编码,RoFormer采用了旋转式位置编码,原文实验结果都表明了其有效性;
- 自注意力计算复杂度较高(),在预训练阶段为减少训练时间,设置的最大文本长度为128,而微调阶段使用数据增强时设置的最大文本长度为256。此时若采用可学习PE会导致128~256位置的参数学习不充分,而NEZHA和RoFormer的PE参数是固定无需学习的,不存此问题。
另外,本文在句级表征获取方面进行了设计。用BERT类模型获取句级表征一般是通过特殊token[CLS]
获取,也有部分方法通过对各输入token对应的编码特征进行池化操作得到句级表征,如均值池化、最大值池化、LSTM池化等。初赛阶段方案采用[CLS]
对应编码输出作为句级表征,但后续实验发现为每个标签设置单独的表征能极大提升分类的性能,两者方案对比如下:
反直觉:微调过程中尝试多种方法建模标签间依赖都失效,如Self-Attention、GCN等,而将两个任务分开训练能得到更好的实验结果,也就是说区域预测与类型预测间没有较大的关联性,更有部分选手采用小型深度模型(如RNN)对各个标签单独建模。
同时,各标签间解耦也能提升模型的性能,通过修改attention_mask
为以下形式实现,多头注意力每个头的注意力掩码一致
预训练
谷歌BERT模型预训练以自监督方式进行,进行的两个任务分别为token级的Masked Laguage Model(MLM)和句级的Next Sequence Prediction(NSP)[3]。此后大量研究对这方面进行了改进,即对预训练任务进行了调整,旨在提高模型的语义表达能力。在token级任务上,SpanBERT[13]期望模型能得到连续范围的预测输出,科大讯飞为中文文本处理提出了Whole Word Mask Language Model(wwm-MLM)任务[14],取得了较为不错的实验结果,wwm-MLM与MLM的对比如下图所示。在句级分类任务上,RoBERTa[4]移除了NSP任务,仅保留MLM;ALBERT在BERT基础上,将NLP任务修改为Sentence Order Prediction(SOP);苏剑林等人提出SimBERT[20],将文本匹配的有监督信息用于预训练任务中。
本方案预训练模型结构如下,在token级任务上采用了wwm-MLM任务,在句级任务上进行了创新。具体地,在同批次数据内对每个待预测标签进行匹配,如果两个样本具有相同标签,那么求取两者对应标签的句级编码的内积进行相似度匹配,利用二分类交叉熵计算匹配损失,如果样本属于测试集,无标签信息,那么不进行匹配。这样做的目的是希望将模型通过相似度匹配任务学习到的语义表达能力推广应用到分类任务中。
具体例子如下,若读取的某批次(bs=8)数据的标签为
1 | | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
那么标签19的匹配标签矩阵,如下,其中0
表示不匹配,1
表示匹配,-1
表示忽略(不计算损失)。
1 | | 0 1 2 3 4 5 6 7 |
存在的问题以及相应的解决方案:
- wwm-MLM需要使用分词信息得到词语的划分,而本赛题文本已脱敏化,解决方案是:
- 为了能使用目前的分词工具,如jieba,首先将脱敏token映射为中文字符;
- 采用了新词发现算法寻找可能存在的由2~4个字组成的词语,仅保留了200个以减少噪声干扰。经统计发现词频最低的token组合是
830 290 724 486
,在语料中共出现18次,其余提取的词语出现次数都远大于该词,一定程度上验证了新词发现的有效性。
- 这种预训练方案导致微调时验证集标签泄露,容易过拟合:重新初始化
[CLS 0]~[CLS n]
对应的嵌入向量; - 当无标签数据过多时,单个批次内匹配的标签对比较稀疏,导致模型学习不充分:训练时减少无标签数据。
模型参数量与BERT(base)一致(L12_A12_H768
),部分关键训练参数如下表。最终损失在0.1~0.3之间,该范围内的预训练模型对后续模型微调效果差距不大。
初赛 | 复赛 | |
---|---|---|
数据文件 | track1_round1_train_20210222.csv track1_round1_testA_20210222.csv track1_round1_testB.csv |
track1_round1_train_20210222.csv train.csv testA/B.csv |
batch matching | w/o | w/ |
mlm probability | 0.3 | 0.2 |
learning rate | 0.000176 | 0.000176 |
max sequence length | 45(误) | 128 |
batch size | 256 | 64 |
warmup steps | 500 | 5000 |
total steps | 16000 | 90090 |
optimizer | AdamW | AdamW |
scheduler | linear | linear |
… | … | … |
微调
微调阶段模型比较简单,是在预训练模型基础上添加线性变换层进行二分类训练,即每个分类标签对应编码向量作Logistic回归,预测异常概率,如下图所示
损失函数对不同样本重加权后取均值,见样本重加权。计算方法与指标计算保持一致。初赛阶段计算每个预测值的,复赛阶段损失由两部分组成:
- 第一部分(区域)损失计算方式与初赛一致,对个预测值计算损失;
- 第二部分(类型)损失对所有实际存在异常区域的测试样本计算指标,例如个样本中包含个存在区域异常的样本,那么对个预测值计算指标。
最终复赛阶段损失为。一些部分关键训练参数范围如下
参数 | 范围 |
---|---|
adv_epsilon | 1.5 ~ 3.0 |
batch size | 32 |
warmup ratio | 0.1 |
learning_rate(bert) | 2e-5, 3e-5, 5e-5 |
learning_rate(other) | 1e-4 ~ 1e-3 |
epochs | 3 ~ 4 |
optimizer | AdamW |
scheduler | linear |
… | … |
模型集成
这题模型集成带来的收益是极大的,如单个NEZHA模型在5折下LB为0.928+,加入RoFormer模型LB能达到0.934+,集成过程示意图如下。将训练数据折划分,确定超参数范围后从中选择一组参数训练个模型,每个模型在测试集上的结果取均值作为该组参数下的结果,反复多组参数训练并以Blending组合多组参数的输出结果。但实际过程中发现,Blending求取的参数非常稀疏,许多参数都是0,因此最终采用均值集成。
复赛提交时,对数据进行5折划分,一共2个不同的模型,共设定6组训练参数,两个任务分别训练,对单个任务来说共个模型集成。
方案优化
优化方向 | 方法 | 说明 | 是否有效 | 原因分析 |
---|---|---|---|---|
数据 | 数据增强——CutMix | 从训练样本集中随机选择两个原始样本,随机打乱顺序后拼接得到扩增样本,并将两个原始样本的标签进行合并 | 是 | 扩增样本集 |
数据 | 数据增强——EDA | 随机替换、删除、交换、插入其他token | 否 | 因数据集而异 |
数据 | 样本重加权 | 用训练集样本和测试集样本相似度计算权重,减少样本分布不一致 | 是 | 一定程度上对齐训练集与测试集 |
数据 | 多标签分层K折划分 | 使每折中各类标签分布一致,避免改变样本集分布 | 是 | 减少样本分布不一致问题的影响 |
模型 | 设置分类标签嵌入 | 为每个标签设置嵌入向量,并优化注意力掩码矩阵 | 是 | 使多标签间解耦 |
模型 | 复用公开预训练模型权重 | 考虑BERT模型的编码器可能包含较强的语义编码能力,因此尝试在模型预训练阶段复用公开预训练模型权重。具体地,载入预训练模型的编码器部分权重、重新初始化嵌入层参数,在此基础上进行Mask Language Model训练 | 否 | 可能是BERT编码器与嵌入层参数间存在较大的耦合性 |
模型 | 更多特征 | 加入其他句级特征,如Word2Vec、TFIDF特征 | 否 | 低阶特征对性能影响不大 |
模型 | 句级特征正态分布约束 | BERT模型获取的编码特征存在各向异性,添加句级特征正态分布约束来改进,思路来源BERT-flow | 否 | 太多的限制对模型参数优化不佳 |
损失 | 损失计算改进 | 复赛阶段损失分为两部分计算 | 是 | 损失计算和指标计算一致 |
损失 | Label Smoothing | 对标签进行一定程度的平滑 | 否 | 评估指标较为严格,若以准确率为指标可能会有提升 |
损失 | Focal Loss | 调整α参数进行困难样本挖掘,调整γ参数增大正样本权重 | 否 | 评估指标较为严格,若以准确率为指标可能会有提升 |
损失 | Asymmetric Loss | 基于Focal Loss提出的用于多标签分类的非对称损失 | 否 | 参数调整不佳 |
损失 | 负样本采样 | 各标签正负样本存在严重的类别不平衡问题,希望通过负样本采样来平衡 | 否 | 验证集上正样本分数提升但负样本分数下降,由于负样本更多导致总体分数下降 |
学习策略 | 对抗训练 | 微调训练过程中使用了FGM对抗学习[17,18],即对词向量添加一定的扰动生成对抗样本,也可以视作数据增强 | 是 | 扩增样本集、增强模型鲁棒性 |
学习策略 | 学习率衰减策略 | 如余弦衰减、线性衰减 | 线性衰减有效 | 因数据集而异 |
学习策略 | 半监督学习 | 利用无标签数据训练,详情见半监督学习 | 初赛阶段提升结果较大,但复赛阶段无效 | 未知 |
学习策略 | 伪标签 | 半监督的一种,用训练好的模型在测试上获取标签,标签预测概率较高的样本用作测试集 | 否 | 受模型性能影响,噪声较大 |
其他 | 略 | 略 | 略 | 略 |
大赛结果
Top方案
TODO:
不足与展望
- 在模型方面,BERT模型的多头注意力机制关注的是全局特征,ConvBERT[15]也提出其中部分头是冗余的,考虑是否能通过修改
attention_mask
使模型获取到局部的语义信息,这种方式比ConvBERT更简单; - 微调的分类损失函数采用交叉熵,没有尝试其他原理上较为不同的损失函数,如Soft-F1[19];
- 数据增强方面,受Mixup启发,可以将两句输入的词向量和标签加权累加获得扩增样本,有效性待确定;
- 大赛要求复赛LB能复现,导致复赛A榜调试时过度关注全流程问题,影响有效调参次数(每日限制提交3次,但实际最多提交2次),需做好时间安排;
- 在实验调参过程中,必须做好消融实验,保存各种日志,另外妥善修改代码确保各版本稳定可复现;
参考文献
[1] Yun S , Han D , Oh S J , et al. CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features[J]. 2019.
[2] Wei J , Zou K . EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks[J]. 2019.
[3] Devlin J , Chang M W , Lee K , et al. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding[J]. 2018.
[4] Liu Y , Ott M , Goyal N , et al. RoBERTa: A Robustly Optimized BERT Pretraining Approach[J]. 2019.
[5] Yang Z , Dai Z , Yang Y , et al. XLNet: Generalized Autoregressive Pretraining for Language Understanding[J]. 2019.
[6] Brown T B , Mann B , Ryder N , et al. Language Models are Few-Shot Learners[J]. 2020.
[7] Wang W , Wei F , Dong L , et al. MiniLM: Deep Self-Attention Distillation for Task-Agnostic Compression of Pre-Trained Transformers[J]. 2020.
[8] Dong L , Yang N , Wang W , et al. Unified Language Model Pre-training for Natural Language Understanding and Generation[J]. 2019.
[9] Bao H , Dong L , Wei F , et al. UniLMv2: Pseudo-Masked Language Models for Unified Language Model Pre-Training[J]. 2020.
[10] Zhang Z , Han X , Liu Z , et al. ERNIE: Enhanced Language Representation with Informative Entities[C]// Proceedings of the 57th Annual Meeting of the Association for Computational Linguistics. 2019.
[11] Wei J , Ren X , Li X , et al. NEZHA: Neural Contextualized Representation for Chinese Language Understanding[J]. 2019.
[12] Su J , Lu Y , Pan S , et al. RoFormer: Enhanced Transformer with Rotary Position Embedding. 2021.
[13] Joshi M , Chen D , Liu Y , et al. SpanBERT: Improving Pre-training by Representing and Predicting Spans[J]. Transactions of the Association for Computational Linguistics, 2020, 8:64-77.
[14] Cui Y , Che W , Liu T , et al. Pre-Training with Whole Word Masking for Chinese BERT[J]. 2019.
[15] Jiang Z , Yu W , Zhou D , et al. ConvBERT: Improving BERT with Span-based Dynamic Convolution[J]. 2020.
[16] Transformer升级之路:2、博采众长的旋转式位置编码 - 科学空间
[17] 一文搞懂NLP中的对抗训练FGSM/FGM/PGD/FreeAT/YOPO/FreeLB/SMART - 知乎
[18] 对抗学习在NLP中的应用 - 夕小瑶/CSDN
[19] The Unknown Benefits of using a Soft-F1 Loss in Classification Systems - towardsdatascience.com/
[20] 鱼与熊掌兼得:融合检索和生成的SimBERT模型
附录
半监督学习
考虑到伪标签半监督方法存在以下两个问题:1) 严重依赖输出测试集预测的模型的性能;2) 以两阶段的形式进行,同时训练时间较长。本文设计了一种端到端的半监督学习方法。具体地,在训练时训练集数据(有标签)与测试集数据(无标签)同时读取到某个批次中,模型对该批次前向推断计算每个样本每个标签的概率输出。设定阈值,将无标签数据预测结果中大于的作为正样本,小于的作为负样本,这些被标记的预测输出与有标签数据同时计算损失。另外,为了减少错误预测带来的噪声影响,这些被标记的无标签样本计算损失时,真实值采用模型输出的概率值,而不是0或1的取值。
Blending
设定某组训练参数下,进行折模型训练得到个模型,每个模型对其验证集数据进行推断,得到相应的验证集输出,将合并后得到推断输出,该输出集可以视作该组参数对训练集的推断结果,由组参数分别得到的结果计算加权参数。
假设共个训练集样本,在组参数下训练得到个输出结果,初始化参数,设定优化目标为
其中是评估函数,分数越小表示集成效果越好。