返回列表

4th place solution : Single Transformer Model

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

开始: 2020-10-05 结束: 2021-01-07 学习效果预测 数据算法赛
第4名方案:单Transformer模型

第4名方案:单Transformer模型

作者: Duc-Kinh Le Tran
比赛排名: 第4名

大家好,
很高兴能参加这次精彩的挑战赛。感谢 Kaggle 和比赛主办方提供了这样一个平台。

很高兴在这里分享让我获得第4名的解决方案。这是一个受之前的工作(如本次比赛中经常讨论的 SAINT, SAKT)启发的单 Transformer 模型。

模型架构

Riiid 4th solution model architecture

希望我的图表足够直观。下面我想详细解释一下该模型的关键特性:

输入序列

我尝试包含训练表和元数据表中所有可用的数据。我还添加了时间延迟,即与前一次交互的时间差(同一容器中的问题具有相同的时间戳,因此它们共享相同的时间延迟)。
此外,在问题表中,我添加了2个特征:难度级别(每个问题的正确回答率)和受欢迎程度(出现次数),这些是从整个训练数据中计算得出的。

输入嵌入

所有输入的嵌入大小相同,嵌入向量随后被拼接并通过线性变换,输入到 Transformer 的第一个编码器和解码器中。

连续特征(时间延迟问题已用时间问题难度问题受欢迎程度)的嵌入是使用 ContinuousEmbedding 层计算的。ContinuousEmbedding 的思想是对一定数量的连续嵌入向量(来自嵌入权重矩阵)进行求和(加权求和)。

这样我们就得到了连续变量嵌入的“平滑”版本:两个非常接近的值应该具有相似的嵌入。

Transformer

编码器的输入是所有输入元素的嵌入。解码器的输入不包含用户回答相关的元素。
编码器和解码器层与原始论文(Attention is all you need)几乎相同。
一个关键的区别当然是因果掩码,以防止当前位置看到未来。另一个是我为了提高性能和收敛速度而添加的一个特性:一种时间感知的加权注意力。其思想是将注意力系数衰减一个因子 \\(dt^{-w}\\),其中 \\(dt\\) 是某个位置与其所关注位置的时间戳差值,\\(w\\) 是一个被约束为非负的可训练参数(每个注意力头一个参数)。这很容易实现:在对数尺度上计算时间戳差值矩阵,将其与参数 \\(w\\) 相乘,并从注意力对数(注意力层的缩放点积输出)中减去它。

训练

我使用了 https://www.kaggle.com/its7171/cv-strategy 的交叉验证方法(感谢 @its7171)。该模型使用 Tensorflow 实现,并在 Colab Pro 的 TPU 上进行训练。
序列被随机剪切并填充至相同长度,所有部分都保留用于训练。
我模型的最终版本嵌入大小为 128,模型大小为 512,包含 4 个编码器层和 4 个解码器层。
训练序列长度为 1024,训练约 36000 步(预热 4000 步,然后余弦衰减),批次大小为 64。训练耗时约 4-5 小时。
在提交内核中,由于资源限制,我不得不将序列长度减少到 512。

一些观察

  • 输入嵌入:拼接比求和效果更好。
  • 更长的序列(训练和推理时)能提高性能。
  • 模型大小也很重要:更大的模型尺寸通常能提高性能,但超过 512 和 4 层后改善不大。

为什么不做模型融合

比赛快结束时我没有太多时间。当我的单模型还能改进时,我选择继续优化它,而不是花时间做小模型的融合。我不确定这是否是一个好的选择,但它让我走到了这一步,所以我依然很开心。

同比赛其他方案