第37名解决方案 (Transformer部分)
第37名解决方案 (Transformer部分)
作者: Dean (m10515009) | 比赛排名: 第37名
首先,我要感谢主办方和Kaggle举办这次比赛。此外,感谢 @vk00st 邀请我们合并组队,以及其他队友 @unkoff、@arvissu、@syxuming,我们有着很棒的团队合作。
我还要感谢 @manikanthr5、@wangsg、@leadbest 提供的优秀 SAKT starter notebook。如果没有这些资源,我无法独自实现 Transformer 模型。
我将我们类似 SAINT+ 的模型细节总结如下。
输入特征
- content_id (内容ID)
- response (回答是否正确)
- part (部分)
- prior_question_elapsed_time (上一题耗时)
- prior_question_had_explanation (上一题是否有解释)
- lag_time1 - 将滞后时间转换为秒。如果 lag_time1 >= 300,则设为 300。
- lag_time2 - 将滞后时间转换为分钟。如果 lag_time2 >= 1440,则设为 300 (一天)。
- lag_time3 - 将滞后时间转换为天。如果 lag_time3 >= 365,则设为 365 (一年)。
将滞后时间拆分为不同的时间格式,分数提升了约 0.003。
区分零填充
- 为了区分零填充和 content_id 的零值,我给 content_id、prior_question_had_explanation 和 response 都加了一。这有助于模型区分零填充和实际特征。分数提升了约 0.003。
q_ = q_+1
pri_exp_ = pri_exp_+1
res_ = qa_+1
Transformer
编码器输入
- 题目嵌入
- 部分嵌入
- 位置嵌入
- 上一题是否有解释嵌入
解码器输入
- 位置嵌入
- 回答嵌入
- 上一题耗时嵌入
- lag_time1 类别嵌入
- lag_time2 类别嵌入
- lag_time3 类别嵌入
- 注意:我在上一题耗时和滞后时间上尝试了类别嵌入和连续嵌入。类别嵌入的性能优于连续嵌入。
Transformer 参数
- 最大序列长度: 100
- 模型维度 (d model): 256
- 编码器层数: 2
- 解码器层数: 2
- 批大小: 256
- Dropout: 0.1
- 学习率: 5e-4 (使用 AdamW 优化器)
模型融合
- LGBM + Catboost + 三个 Transformer
- LGBM + 两个 Transformer
结果
- 最终,我们团队的 LGBM 公开榜单分数为 0.794,Transformer 公开榜单分数为 0.799。
- 通过融合,公开榜单分数达到了 0.804。