581. Google - Fast or Slow? Predict AI Model Runtime | predict-ai-model-runtime
所有模型基本遵循以下结构:
Tile数据集结果采用单模型设计,包含3个GraphSAGE层和3个线性层,使用ListMLE损失训练。Layout数据集结果采用模型集成,所有模型使用GeLu激活函数,但在其他方面有所不同。输出损失使用ListMLE和Pairwise Hinge。
我们保持竞赛数据集中提供的相同训练/验证集划分。
每个布局图被转换为两种不同的图:

首先需要强调的是,归一化在这个问题上绝对至关重要。如果不归一化数据,就无法获得好的分数。
为输出、输入和内核部分计算了额外的配置特征。每个特征都为这些部分重复:
此外,我们计算了以下相似性指标:
操作码仅进行独热编码。
引入is_default标志是因为随机分布与默认分布似乎有足够差异,具有预测价值,因为测试集中也包含此信息。它似乎为验证分数提供了小而可靠的提升。
对于布局问题,我们定义了以下GraphBlock,使用GAT(输出通道/2)处理3跳图的节点特征,使用GAT或GraphSAGE(输出通道/2)处理配置定位图的特征。

然后我们通过残差连接分层GraphBlock,并添加一些密集前馈层(同样带有残差),将全局特征连接到这些层。最终结果是一个略有不同版本的模型集成(变化隐藏维度、线性层等)。

以下是布局集中使用的多边缘块的代码(Tile集模型基本相同,但结构更简单。您可以在此处查看。其余代码可在此处获取):
class MultiEdgeGATBlock(nn.Module):
def __init__(
self,
*,
input_dim: int,
output_dim: int,
heads: int = 4,
with_residual: bool = True,
dropout: float = 0.5,
main_block: Literal["gat", "sage"] = "gat",
alt_block: Literal["gat", "sage"] = "sage",
):
"""应用两种不同边缘卷积到图并连接结果的块。使用边缘掩码确定将主块应用于哪些边,将交替块应用于哪些边。"""
super().__init__()
output_dim_per_block = output_dim // 2
if main_block == "gat":
self.main_edge_block = GATBlock(...)
else:
self.main_edge_block = SAGEBlock(...)
if alt_block == "gat":
self.alternate_edge_block = GATBlock(...)
else:
self.alternate_edge_block = SAGEBlock(...)
self.with_residual = with_residual
self.output_dim = output_dim
def forward(self, data: Data):
# 前向传播实现...
return data.update(new_data)
Tile数据集的模型基本相同,只是使用了3个图层、3个线性层,并且没有图归约(因为没有可配置节点)。
NLP和XLA分别训练。我很想尝试统一模型,但时间和计算资源有限,而分开训练效果良好。
所有模型使用:
| 参数 | XLA-1 | XLA-2 | NLP-1 | NLP-2 |
|---|---|---|---|---|
| 损失函数 | listMLE | listMLE | listMLE | Rank Margin Loss |
| 学习率 | 0.00028 | 0.00028 | 0.00028 | 0.0001 |
| 权重衰减 | 0.004 | 0.004 | 0.004 | 0.007 |
| 图层层数 | 4 | 4 | 4 | 4 |
| 图通道数 | 128 | 128 | 128 | 128 |
| FF层数 | 1 | 2 | 1 | 3 |
| FF通道数 | 128 | 128 | 128 | 64 |
| 3跳图卷积 | GAT(heads=8) | GAT(heads=8) | GAT(heads=8) | GAT(heads=1) |
| 配置图卷积 | GAT | GAT | GAT | GraphSAGE |
| Dropout | 0.15 | 0.15 | 0 | 0 |
输出从XLA-1在3个epoch后收集,以及XLA-2在训练中的2个快照(epoch 2和3结束时)基于其验证分数收集。
NLP模型甚至从未完成一个epoch,损失似乎达到平台期,而我的计算资源有限。这表明我可能可以更好地调整学习率或正则化。
对于给定的文件ID(例如"xla:default:abc..."),每个模型输出有N(1000或1001)个预测。我们对预测进行最小-最大归一化,使其全部在0到1范围内,然后将每个模型输出的分数逐元素相加。我们使用求和后的配置分数来推导排序。
归一化在这里很重要,因为如果在使用排序损失,模型输出的数值不一定在同一尺度上。
我还尝试了简单排序平均和Borda计数,两者都有效,但不如最小-最大平均效果好。这很可能是因为这些方法无法考虑"第2名比第3名好多少"这类信息,而最小-最大归一化集成可以。