目录

赛题介绍

赛题背景

   影像科医生在工作时会观察医学影像(如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
2
3
4
5
6
7
8
9
10
11
12
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 
1|,|48 328 538 382 809 623 434 355 382 382 363 145 424 389 693 808 266 751 335 832 47 693 583 328 305 206 461 204 48 328 740 204 411 204 549 728 832 122 |,|
2|,|623 656 293 851 636 842 698 493 338 266 369 691 693 380 136 363 399 556 698 66 432 449 177 830 381 332 290 380 26 343 28 177 415 832 14 |,|15
3|,|48 328 380 259 439 107 380 265 172 470 290 693 556 698 54 623 34 138 351 761 693 657 305 342 809 618 282 300 654 556 698 432 449 693 380 834 809 343 809 832 47 693 514 569 428 614 34 846 138 693 358 380 136 363 399 556 698 313 66 432 449 177 415 145 693 380 172 809 380 654 439 380 834 832 47 750 256 514 837 231 113 256 |,|
4|,|623 328 399 698 493 338 266 14 177 415 511 647 693 852 60 328 380 172 54 788 591 487 |,|16
5|,|80 328 328 54 172 439 741 380 172 842 698 177 777 415 832 14 381 693 623 328 697 382 38 582 382 363 177 257 415 145 755 404 386 106 566 521 |,|15
6|,|48 322 795 856 374 439 48 328 443 380 597 172 320 842 698 494 149 266 218 415 106 521 79 693 380 361 200 737 813 306 693 556 698 554 232 823 34 138 351 761 693 305 654 809 282 300 654 678 195 698 432 449 693 66 834 809 343 809 654 556 104 698 832 47 617 256 514 129 231 614 34 138 693 91 382 569 231 134 698 313 66 432 623 |,|4 11 15
7|,|623 328 659 486 582 162 711 289 606 405 809 78 477 693 697 777 582 162 716 854 832 122 693 697 582 38 582 2 498 165 397 455 693 724 328 697 698 494 504 382 672 514 381 |,|
8|,|852 328 471 585 117 458 399 607 693 380 522 623 304 160 380 303 789 439 852 328 419 571 769 256 661 809 621 499 300 832 582 698 493 338 266 521 177 415 381 |,|6 12 14 15
9|,|229 172 200 737 437 547 651 693 623 328 355 653 382 579 488 776 591 487 693 91 400 478 698 477 300 797 415 381 |,|1 3
10|,|852 328 305 461 71 413 728 479 122 693 697 382 809 461 486 382 809 357 471 809 777 382 494 504 584 265 363 818 776 389 522 426 693 427 363 170 607 590 618 |,|
...

复赛训练数据格式如下

列名 说明 示例
report_ID 数据标号,整型 1
description 脱敏后的影像描述,以字为单位使用空格分割 101 47 12 66 74 90 0 411 234 79 175
label string,由两部分组成。第一部分为若干异常区域ID,用空格分割。第二部分为若干异常类型ID,用空格分割。两部分用逗号“,”分割。若定义中所有区域均无异常,则两部分均为空,此项为“,”。 3 4,0 2
1
2
3
4
5
6
7
8
9
10
11
12
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 |,|,
1|,|623 328 328 380 172 54 823 487 391 693 256 433 569 231 171 852 770 693 48 328 305 461 406 333 399 698 177 415 14 381 |,|,
2|,|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
3|,|48 697 91 399 28 400 478 809 623 697 538 265 478 284 498 289 399 698 335 266 477 300 381 693 38 582 623 697 382 382 363 397 455 |,|0 7 ,9
4|,|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
5|,|852 261 669 105 259 160 362 341 639 693 747 750 399 842 837 161 372 14 177 415 693 623 328 411 204 399 842 698 160 338 177 415 832 14 381 |,|,
6|,|852 328 355 382 610 538 382 382 327 543 381 |,|,
7|,|8 266 627 93 333 832 47 693 380 598 200 737 470 290 693 380 834 809 342 809 257 654 832 47 693 852 328 566 357 659 439 697 582 162 498 289 169 405 |,|,
8|,|443 380 172 56 180 345 693 380 809 343 218 654 832 47 402 690 693 256 696 569 233 306 256 |,|,
9|,|623 328 554 232 461 204 399 842 698 177 832 14 381 |,|,
10|,|328 697 538 678 355 661 698 335 338 408 521 86 415 693 240 221 104 328 328 380 172 12 187 394 174 506 37 788 313 66 832 429 |,|0 1 2 ,2
...

测试集数据

列名 说明 示例
report_ID 数据标号,整型 1
description 脱敏后的影像描述,以字为单位使用空格分割 101 47 12 66 74 90 0 411 234 79 175
1
2
3
4
5
6
7
8
9
10
11
12
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 
1|,|380 358 343 654 171 832 47 832 690 693 48 563 380 609 532 50 470 651 693 380 434 343 832 47 693 256 514 569 231 113 256
2|,|751 335 834 582 717 583 585 693 623 328 107 380 698 808 549 14 455 415 381
3|,|623 328 649 582 488 12 578 623 538 382 382 265 363 832 424 389 693 91 785 414 78 571 693 374 698 338 266 521 5 415 381 439 173 257 642 493 149 13 177 722 265 14 381 693 48 328 380 834 380 654 532 50 386 832 47 693 256 514 10 231 113 256
4|,|83 293 398 797 382 363 145 424 693 698 800 691 693 731 700 243 165 317 846 693 852 328 355 382 488 12 591 487 693 506 330 91 400 321 695 698 646 750 669 730 381
5|,|623 328 305 461 204 842 750 160 107 837 14 177 415 414 693 740 328 697 661 149 338 266 14 177 415 381
6|,|380 741 200 737 439 73 834 809 809 654 556 698 448 290 693 256 514 569 231 118 3 693 48 54 419 571 769 256 524 439 328 514 380 172 320 257 363 399 842 698 493 566 266 177 415 106 521 381 693 700 384 261 7
7|,|597 714 328 697 382 698 422 259 693 158 56 79 328 697 68 539 582 617 233 306 162 498 289 554 232 405
8|,|48 305 461 312 439 740 204 698 177 415 832 14 381 693 623 328 520 66 557 86 675 657 380 498 104 289 442 415 617 823
9|,|380 129 514 569 231 113 256 693 91 382 556 134 227 382 327 622 351 761 777 204 779 374 556 698 313 66 38
10|,|48 328 328 380 172 809 192 497 380 172 716 854 618 380 172 399 552 698 494 504 14 165 415 45 693 623 328 765 172 268 693 256 514 437 463 852 615 138
...

提交要求

所需提交文件格式为

列名 说明 示例
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

评估标准

评估指标较为严格,以测试集数据上对提交结果计算的mlogloss\text{mlogloss}指标为基础,记样本个数为NN,每个样本对应MM个预测值,那么首先计算M×NM \times N个预测值的均值如下
$$
\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}
$$

两阶段计算有所区别:

  • 初赛阶段S=1mloglossS = 1 - \text{mlogloss}

  • 复赛阶段:为了让分数区间更合理,复赛阶段调整为12×mlogloss1 - 2 \times \text{mlogloss}。另外,复赛阶段分数由两部分组成:

    • 第一部分(区域)得分S1S_1计算方式与初赛一致,对N×M1N \times M_1个预测值计算指标;
    • 第二部分(类型)得分S2S_2对所有实际存在异常区域的测试样本计算mlogloss\text{mlogloss}指标,例如NN个样本中包含KK个存在区域异常的样本,那么对K×M2K \times M_2个预测值计算mlogloss\text{mlogloss}指标。

    最终复赛得分为S=0.6×S1+0.4×S2S = 0.6 \times S_1 + 0.4 \times S_2

赛题思路

  1. 文本数据脱敏是该题一方面的限制,因为不能利用公开的预训练模型对应的词表,也就不能直接在公开模型基础上微调,需要重新生成词表并预训练
  2. 该任务是一个典型的多标签分类任务,需要对每个标签进行异常判别,在微调阶段采用二分类交叉熵(BCE)损失,与评测指标一致。

Fig1_pretrain_finetune

数据处理

探索分析

各文件给定文本长度统计:
Fig2_eda1

各文件给定文本词频统计:
Fig2_eda2

初赛/复赛样本标签频数统计:
Fig2_eda3

  • 数据总数:初赛训练集共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=5K=5

  • K取值越大时,每折训练集中样本个数越多,模型训练次数也越多,导致训练时间过长;
  • 会导致折间差异变小,影响模型融合效果。

样本重加权

   本地验证集上能达到0.96+0.96+的分数,但实际LB的分数最高也只有0.940.94左右,因此线上线下存在较大的不一致。为了减少不一致,对训练集样本进行重加权,权值由TFIDF与余弦相似度评估,具体计算方法是:用给定文本语料训练TFIDF参数,然后计算训练集与测试集样本两两间的句级相似度,取均值得到各训练集样本权重,如下图所示。
Fig3_reweight

数据增强

   受目前视觉领域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]。选择这两种预训练模型的原因是:

  1. 两种模型都对位置编码(Position Embedding, PE)做了优化,其中NEZHA采用相对位置编码,RoFormer采用了旋转式位置编码,原文实验结果都表明了其有效性;
  2. 自注意力计算复杂度较高(O(n2)O(n^2)),在预训练阶段为减少训练时间,设置的最大文本长度为128,而微调阶段使用数据增强时设置的最大文本长度为256。此时若采用可学习PE会导致128~256位置的参数学习不充分,而NEZHA和RoFormer的PE参数是固定无需学习的,不存此问题。

   另外,本文在句级表征获取方面进行了设计。用BERT类模型获取句级表征一般是通过特殊token[CLS]获取,也有部分方法通过对各输入token对应的编码特征进行池化操作得到句级表征,如均值池化、最大值池化、LSTM池化等。初赛阶段方案采用[CLS]对应编码输出作为句级表征,但后续实验发现为每个标签设置单独的表征能极大提升分类的性能,两者方案对比如下:

反直觉:微调过程中尝试多种方法建模标签间依赖都失效,如Self-Attention、GCN等,而将两个任务分开训练能得到更好的实验结果,也就是说区域预测与类型预测间没有较大的关联性,更有部分选手采用小型深度模型(如RNN)对各个标签单独建模。

Fig5_model1

同时,各标签间解耦也能提升模型的性能,通过修改attention_mask为以下形式实现,多头注意力每个头的注意力掩码一致

Fig5_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],将文本匹配的有监督信息用于预训练任务中。

Fig4_wwm

   本方案预训练模型结构如下,在token级任务上采用了wwm-MLM任务,在句级任务上进行了创新。具体地,在同批次数据内对每个待预测标签进行匹配,如果两个样本具有相同标签,那么求取两者对应标签的句级编码的内积进行相似度匹配,利用二分类交叉熵计算匹配损失,如果样本属于测试集,无标签信息,那么不进行匹配。这样做的目的是希望将模型通过相似度匹配任务学习到的语义表达能力推广应用到分类任务中。

Fig5_model2

具体例子如下,若读取的某批次(bs=8)数据的标签为

1
2
3
4
5
6
7
8
9
10
  | 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
-----------------------------------------------------------------------------------------
0 | 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
1 | 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
2 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0
3 | 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
4 | 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
5 |-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
6 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 | 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0

那么标签19的匹配标签矩阵,如下,其中0表示不匹配,1表示匹配,-1表示忽略(不计算损失)。

1
2
3
4
5
6
7
8
9
10
  |  0  1  2  3  4  5  6  7
---------------------------
0 | -1 0 0 0 1 -1 1 0
1 | -1 -1 1 1 0 -1 0 1
2 | -1 -1 -1 1 0 -1 0 1
3 | -1 -1 -1 -1 0 -1 0 1
4 | -1 -1 -1 -1 -1 -1 1 0
5 | -1 -1 -1 -1 -1 -1 -1 -1
6 | -1 -1 -1 -1 -1 -1 -1 0
7 | -1 -1 -1 -1 -1 -1 -1 -1

存在的问题以及相应的解决方案:

  1. wwm-MLM需要使用分词信息得到词语的划分,而本赛题文本已脱敏化,解决方案是:
    • 为了能使用目前的分词工具,如jieba,首先将脱敏token映射为中文字符;
    • 采用了新词发现算法寻找可能存在的由2~4个字组成的词语,仅保留了200个以减少噪声干扰。经统计发现词频最低的token组合是830 290 724 486,在语料中共出现18次,其余提取的词语出现次数都远大于该词,一定程度上验证了新词发现的有效性。
  2. 这种预训练方案导致微调时验证集标签泄露,容易过拟合:重新初始化[CLS 0]~[CLS n]对应的嵌入向量;
  3. 当无标签数据过多时,单个批次内匹配的标签对比较稀疏,导致模型学习不充分:训练时减少无标签数据。

   模型参数量与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回归,预测异常概率,如下图所示

Fig5_model3

损失函数对不同样本重加权后取均值,见样本重加权。计算方法与指标计算保持一致。初赛阶段计算每个预测值的mlogloss\text{mlogloss},复赛阶段损失由两部分组成:

  • 第一部分(区域)损失L1L_1计算方式与初赛一致,对N×M1N \times M_1个预测值计算损失;
  • 第二部分(类型)损失L2L_2对所有实际存在异常区域的测试样本计算mlogloss\text{mlogloss}指标,例如NN个样本中包含KK个存在区域异常的样本,那么对K×M2K \times M_2个预测值计算mlogloss\text{mlogloss}指标。

最终复赛阶段损失为L=0.6×L1+0.4×L2L = 0.6 \times L_1 + 0.4 \times L_2。一些部分关键训练参数范围如下

参数 范围
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+,集成过程示意图如下。将训练数据KK折划分,确定超参数范围后从中选择一组参数训练KK个模型,每个模型在测试集上的结果取均值作为该组参数下的结果,反复多组参数训练并以Blending组合多组参数的输出结果。但实际过程中发现,Blending求取的参数非常稀疏,许多参数都是0,因此最终采用均值集成。
   复赛提交时,对数据进行5折划分,一共2个不同的模型,共设定6组训练参数,两个任务分别训练,对单个任务来说共2×5×6=602 \times 5 \times 6 = 60个模型集成。

Fig7_ensemble1

方案优化

优化方向 方法 说明 是否有效 原因分析
数据 数据增强——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],即对词向量添加一定的扰动生成对抗样本,也可以视作数据增强 扩增样本集、增强模型鲁棒性
学习策略 学习率衰减策略 如余弦衰减、线性衰减 线性衰减有效 因数据集而异
学习策略 半监督学习 利用无标签数据训练,详情见半监督学习 初赛阶段提升结果较大,但复赛阶段无效 未知
学习策略 伪标签 半监督的一种,用训练好的模型在测试上获取标签,标签预测概率较高的样本用作测试集 受模型性能影响,噪声较大
其他

大赛结果

Fig6_res1
Fig6_res2

Top方案

   
TODO:

不足与展望

  1. 在模型方面,BERT模型的多头注意力机制关注的是全局特征,ConvBERT[15]也提出其中部分头是冗余的,考虑是否能通过修改attention_mask使模型获取到局部的语义信息,这种方式比ConvBERT更简单;
  2. 微调的分类损失函数采用交叉熵,没有尝试其他原理上较为不同的损失函数,如Soft-F1[19]
  3. 数据增强方面,受Mixup启发,可以将两句输入的词向量和标签加权累加获得扩增样本,有效性待确定;
  4. 大赛要求复赛LB能复现,导致复赛A榜调试时过度关注全流程问题,影响有效调参次数(每日限制提交3次,但实际最多提交2次),需做好时间安排;
  5. 在实验调参过程中,必须做好消融实验,保存各种日志,另外妥善修改代码确保各版本稳定可复现;

参考文献

[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) 以两阶段的形式进行,同时训练时间较长。本文设计了一种端到端的半监督学习方法。具体地,在训练时训练集数据(有标签)与测试集数据(无标签)同时读取到某个批次中,模型对该批次前向推断计算每个样本每个标签的概率输出。设定阈值t,0t1t, 0 \leq t \leq 1,将无标签数据预测结果中大于tt的作为正样本,小于(1t)(1 - t)的作为负样本,这些被标记的预测输出与有标签数据同时计算损失。另外,为了减少错误预测带来的噪声影响,这些被标记的无标签样本计算损失时,真实值采用模型输出的概率值,而不是0或1的取值。

Blending

   设定某组训练参数pp下,进行KK折模型训练得到KK个模型,每个模型对其验证集数据进行推断,得到相应的验证集输出y~kp\tilde{y}_{k}^{p},将{y~1p,y~2p,y~3p,y~4p,y~5p}\{\tilde{y}_{1}^{p}, \tilde{y}_{2}^{p}, \tilde{y}_{3}^{p}, \tilde{y}_{4}^{p}, \tilde{y}_{5}^{p}\}合并后得到推断输出y~p\tilde{y}^{p},该输出集可以视作该组参数对训练集的推断结果,由MM组参数{p1,p2,,pM}\{p_1, p_2, \cdots, p_M\}分别得到的结果计算加权参数。

   假设共NN个训练集样本,在MM组参数下训练得到MM个输出结果,初始化参数w1,w2,,wMw_1, w_2, \cdots, w_M,设定优化目标为

J(w)=minw1,w2,,wM1Ni=1Nscore(yi,1Mj=1Mwjy~ipj)s.t.j=1Mwj=10wj1,j=1,,M\begin{aligned} J(w) \quad & = \min_{w_1, w_2, \cdots, w_M} \frac{1}{N} \sum_{i=1}^N \text{score}( y_i, \frac{1}{M} \sum_{j=1}^M w_j \tilde{y}_i^{p_j} ) \\ s.t. \quad & \sum_{j=1}^M w_j = 1 \\ & 0 \leq w_j \leq 1, j = 1, \cdots, M \end{aligned}

其中score()\text{score}(\cdot)是评估函数,分数越小表示集成效果越好。