如何获得 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())
看起来 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())