返回列表

2nd Place Solution (LSTM-Encoded SAKT-like TransformerEncoder)

416. Riiid Answer Correctness Prediction | riiid-test-answer-prediction

开始: 2020-10-05 结束: 2021-01-07 学习效果预测 数据算法赛
第二名方案 (LSTM编码的类SAKT TransformerEncoder)

第二名方案 (LSTM编码的类SAKT TransformerEncoder)

作者: mamas
比赛: Riiid! Answer Correctness Prediction
排名: 2nd Place

感谢所有与我竞争的团队、所有参与本次比赛的人,以及主办方设计了如此精彩的API并举办了这么棒的比赛!
祝贺 @keetar,他击败了我并成为了本次比赛的冠军。

我很开心,因为这是我第一次获得单人奖项!

这是我参加的第4次Kaggle比赛,很高兴能与我的前队友(@nyanpn, @pocketsuteado)以及我在过去比赛中竞争过的人(例如 @aerdem4, @its7171)同台竞技。
在这里,我将解释我的模型摘要和特征。

我上传了2个Kaggle笔记本进行说明。由于集成在我的解决方案中不是很重要,我将只解释我的单模型。

  1. 6个相似模型的加权平均 : Public 0.817 / Private 0.818
  2. 单模型 : Public 0.814 / Private 0.816

模型

Model Architecture

概述

我的模型类似于SAKT,序列长度为400,维度为512,头数为4。
我没有将讲座信息用作Transformer模型的输入,我想这就是我在本次比赛中失利的原因。对于类SAKT模型的查询和键/值,我使用了LSTM编码的特征,其输入如下。

  • “查询”特征
    content_id (内容ID)
    part (部分)
    tags (标签)
    normalized timedelta (归一化时间差)
    normalized log timestamp (归一化对数时间戳)
    correct answer (正确答案)
    task_container_id delta (任务容器ID差值)
    content_type_id delta (内容类型ID差值)
    normalized absolute position (归一化绝对位置)

  • “记忆”特征
    explanation (解释)
    correctness (正确性)
    normalized elapsed time (归一化用时)
    user_answer (用户答案)

训练/推理过程的详细解释

我尝试了一种非常精确的索引/掩码技术来避免训练过程中的数据泄露,我想这也是我获得第二名的部分原因。好吧,假设一个序列长度=5的非常简单的模型,某个特定用户的 task_container_id 历史(不含讲座)是这样的。
[0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 8, 7, 7, 6]
由于该用户有15次测量记录,我制作了 15/5 = 3 个训练样本和损失掩码。

(1) 输入 task_container_id: [pad, pad, pad, pad, pad, 0, 0, 0, 1, 1]
(1) loss_mask: [False, False, False, False, False, True, True, True, True, True]
(2) 输入 task_container_id: [0, 0, 0, 1, 1, 2, 2, 3, 3, 4]
(2) loss_mask: [False, False, False, False, False, True, True, True, True, True]

同比赛其他方案