如何获得 torch.nn.Transformer 的稳定输出

How to get stable output for torch.nn.Transformer

看起来 pytorch 的 Transformer 层提供了不可重现的输出。 cpu 和 gpu 都会发生这种情况。我知道它有时会发生,因为在 gpu 上进行并行计算。

emb = nn.Embedding(10, 12).to(device)
inp1 = torch.LongTensor([1, 2, 3, 4]).to(device)
inp1 = emb(inp1).reshape(inp1.shape[0], 1, 12) #S N E

encoder_layer = nn.TransformerEncoderLayer(d_model=12, nhead=4)
transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers=4)

out1 = transformer_encoder(inp1)
out2 = transformer_encoder(inp1)

out1 和out2 不同。它可以在 cpu 上进行多处理,但结果看起来太不稳定了。如何解决这个问题?

nn.TransformerEncoderLayer 的默认丢弃率为 0.1。当模型处于训练模式时,要删除的索引将在每次迭代中随机化。

如果你想用dropout训练模型,只需要在训练中忽略这个行为,在测试中调用model.eval()

如果您想在训练中禁用这种随机行为,请像这样设置dropout=0

nn.TransformerEncoderLayer(d_model=12, nhead=4, dropout=0)

完整测试脚本:

import torch
import torch.nn as nn

device = 'cpu'

emb = nn.Embedding(10, 12).to(device)
inp1 = torch.LongTensor([1, 2, 3, 4]).to(device)
inp1 = emb(inp1).reshape(inp1.shape[0], 1, 12) #S N E

encoder_layer = nn.TransformerEncoderLayer(d_model=12, nhead=4, dropout=0).to(device)
transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers=4).to(device)

out1 = transformer_encoder(inp1)
out2 = transformer_encoder(inp1)

print((out1-out2).norm())