我在PyTorch的变形金刚编码器中遇到了一个填充掩码的问题.我正在努力确保填充序列中的值不会影响模型的输出.然而,即使在将输入序列中的填充值设置为零之后,我仍然观察到输出中的差异.

以下是我的代码的简化版本:

import torch as th
from torch import nn

# Data
batch_size = 2
seq_len = 5
input_size = 16
src = th.randn(batch_size, seq_len, input_size)

# Set some values to a high value
src[0, 2, :] = 1000.0
src[1, 4, :] = 1000.0

# Generate a padding mask
padding_mask = th.zeros(batch_size, seq_len, dtype=th.bool)
padding_mask[0, 2] = 1
padding_mask[1, 4] = 1

# Pass the data through the encoder of the model
encoder = nn.TransformerEncoder(
    nn.TransformerEncoderLayer(
        d_model=input_size,
        nhead=1,
        batch_first=True,
    ),
    num_layers=1,
    norm=None,
)
out1000 = encoder(src, src_key_padding_mask=padding_mask)

# Modify the input data so that the masked vector does not affect
src[0, 2, :] = 0.0
src[1, 4, :] = 0.0

# Pass the modified data through the model
out0 = encoder(src, src_key_padding_mask=padding_mask)

# Check if the results are the same
assert th.allclose(
    out1000[padding_mask == 0],
    out0[padding_mask == 0],
    atol=1e-5,
)

尽管在输入序列中将填充的值设置为零,但我仍然观察到Transformer编码器的输出中的差异.有没有人能帮我解释一下为什么会发生这种情况?如何确保填充序列中的值不会影响模型的输出?

推荐答案

这种差异是由编码层中的丢失引起的.您可以通过将dropout=0.0传递到TransformerEncoderLayer来修复此问题

encoder = nn.TransformerEncoder(
    nn.TransformerEncoderLayer(
        d_model=input_size,
        nhead=1,
        batch_first=True,
        dropout=0.0
    ),
    num_layers=1,
    norm=None,
)

Python相关问答推荐

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

如果值不存在,列表理解返回列表

在线条上绘制表面

如何从数据库上传数据到html?

从嵌套的yaml创建一个嵌套字符串,后面跟着点

Python导入某些库时非法指令(核心转储)(beautifulsoup4."" yfinance)

如何保持服务器发送的事件连接活动?

UNIQUE约束失败:customuser. username

名为__main__. py的Python模块在导入时不运行'

与命令行相比,相同的Python代码在Companyter Notebook中运行速度慢20倍

try 检索blob名称列表时出现错误填充错误""

网格基于1.Y轴与2.x轴显示在matplotlib中

matplotlib + python foor loop

GPT python SDK引入了大量开销/错误超时

用fft计算指数复和代替求和来模拟衍射?

如何将泛型类类型与函数返回类型结合使用?

如何从数据框列中提取特定部分并将该值填充到其他列中?

文本溢出了Kivy的视区

时长超过24小时如何从Excel导入时长数据

Stats.ttest_ind:提取df值