第19名方案
第19名方案
作者:guchio3
比赛排名:第19名
首先,感谢 Google 和 Kaggle 团队举办这场精彩的比赛。我认为这场比赛的激动人心之处在于,它完美平衡了对最新 NLP 知识的需求以及针对特定任务的创意应用!虽然我没能获得金牌,但我非常享受这个过程并学到了很多。
我想分享我从 150 多次实验中获得的见解。我的代码和Kernel现已公开。
预处理
- 添加特殊 token 来分隔标题和问题。
- 例如:[CLS] title [NEW_SEP] question [SEP] answer [SEP]
- 在标题的开头添加类别信息。
- 例如:[CLS] CAT-TECHNOLOGY title [NEW_SEP] question [SEP] answer [SEP]
- 这种方法应该比仅仅将类别连接到最后一层分类层更好,因为 Hugging-Face 模型可以在提取文本特征时利用类别信息。
- 像这样修剪文本的头部和尾部。
- 例如:I have a dream that one day on the red hills of Georgia, the sons of former slaves and the sons of former slave owners will be able to sit down together at the table of brotherhood.
-> I have a dream that + at the table of brotherhood.
建模 (使用 PyTorch Hugging-Face 库)
- 使用问题正文进行 GKF(Group K-Fold)。
- 对最后一层序列输出进行平均池化,并将其用作一个线性层的输入。
- 针对问题类型标签和答案类型标签使用 2 个独立的模型。
- (title-max-len, question-max-len, answer-max-len) 分别为:(30, 239*2, 0) 和 (30, 0, 239*2)(如果某部分小于最大长度,其余部分将使用剩余的长度)。
- 四个模型的集成 (权重比例为 1 : 0.5 : 0.5 : 1)
- bert-base-uncased (最佳快照)
- robert-base (最佳快照, 次佳快照)
- xlnet-base-cased (最佳快照)
- Batch size 为 8,训练 6 个 epochs(冻结层很关键)
- 第一个 epoch 仅冻结 Hugging-Face 模型,其余 5 个 epoch 解冻它。
- 损失函数:BCEWithLogitsLoss
- 优化器:Adam 配合余弦调度器 (3e-5 -> 1e-5)
- 1 轮伪标签
- 连接软目标、硬目标和半硬目标。半硬目标是指仅当应用阈值能提高 OOF 分数时,才对该列应用阈值后的目标。
后处理
- 搜索并应用阈值
- 使用 scipy.optimize.minimize 为 OOF 获取优化阈值。初始值根据 OOF 的百分位点计算得出。(参考)
- 仅当使用阈值能提高 OOF 分数时,才将其应用于该列。
- 仅当测试集的公共/私有部分中某列的基数大于 1 时,才将阈值应用于该列。
- 根据主机设置 question-type-spelling 为 0 或 0.5(基于 Kernel)。
对我无效的方法
- 更大的 Batch size
- 更长的序列长度
- 超过 512 的更长位置嵌入矩阵
- 循环位置 ID(标题 0-29,问题 0-511,答案 0-511)
- 更短的序列长度
- 使用除类别以外的元特征
- 使用 Hugging-Face 模型的最后 N 个隐藏输出
-