gpt4 book ai didi

python - 如果我不想进行自回归,如何使用 PyTorch Transformers 执行 seq2seq 任务?

转载 作者:行者123 更新时间:2023-12-03 17:20:01 24 4
gpt4 key购买 nike

我可能弄错了,但 PyTorch Transformers 似乎是自回归的,这就是 mask 的用途。但是,我见过一些实现,人们只使用编码器并将其直接输出到 Linear。层。
就我而言,我正在尝试将频谱图(行是频率,列是时间步长)转换为另一个相同维度的频谱图。我有一个不可能的时间试图弄清楚如何做到这一点。
对于我的模型,我有:

class TransformerReconstruct(nn.Module):
def __init__(self, feature_size=250, num_layers=1, dropout=0.1, nhead=10, output_dim=1):
super(TransformerReconstruct, self).__init__()
self.model_type = 'Transformer'

self.src_mask = None
self.pos_encoder = PositionalEncoding(feature_size)
self.encoder_layer = nn.TransformerEncoderLayer(d_model=feature_size, nhead=nhead, dropout=dropout)
self.transformer_encoder = nn.TransformerEncoder(self.encoder_layer, num_layers=num_layers)
self.decoder = nn.Linear(feature_size, output_dim)
self.init_weights()

def init_weights(self):
initrange = 0.1
self.decoder.bias.data.zero_()
self.decoder.weight.data.uniform_(-initrange, initrange)

def forward(self, src):
if self.src_mask is None or self.src_mask.size(0) != len(src):
device = src.device
mask = self._generate_square_subsequent_mask(len(src)).to(device)
self.src_mask = mask

src = self.pos_encoder(src)
output = self.transformer_encoder(src, self.src_mask)
output = self.decoder(output)
return output

def _generate_square_subsequent_mask(self, sz):
mask = (torch.triu(torch.ones(sz, sz)) == 1).transpose(0, 1)
mask = mask.float().masked_fill(mask == 0, float('-inf')).masked_fill(mask == 1, float(0.0))
return mask
在训练时,我有:
model = TransformerReconstruct(feature_size=128, nhead=8, output_dim=128, num_layers=6).to(device)
这会返回正确的形状,但似乎没有学习。
我的基本训练循环如下所示:
for i in range(0, len(data_source) - 1, input_window):
data, target = get_batch(data_source, i, 1)
output = recreate_model(data)
我正在使用 MSELoss我正在尝试学习一个非常简单的身份。输入和输出相同的地方,但这不是学习。我可能做错了什么?提前致谢。

最佳答案

Huggingface Transformers 中的大多数模型都是 BERT 的某个版本,因此不是自回归的,唯一的异常(exception)是仅解码器模型(GPT 和类似模型)和序列到序列模型。
有两种概念上不同类型的掩码:一种是特定于输入批处理的输入掩码,其目的是允许在单个批处理中使用不同长度的序列。当序列被填充到相同的长度时,self-attention 应该关注填充位置。这是您调用 self.transformer_encoder 时应该使用的内容。在前向方法中。
此外,自回归 Transformer 解码器使用另一种类型的掩码。正是三角形掩码阻止了 self-attention 关注当前位置右侧的标记(在推理时,当前位置右侧的单词在实际生成之前是未知的)。这就是您在 _generate_square_subsequent_mask 中的内容方法,这就是使模型自回归的原因。它是恒定的,不依赖于输入批处理。
总结一下:要拥有一个双向 Transformer,只需去掉三角形 mask 即可。如果您的输入序列的长度不同,则应使用特定于批处理的掩码,如果不是,则只需传递一个带有 1 的矩阵。

关于python - 如果我不想进行自回归,如何使用 PyTorch Transformers 执行 seq2seq 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64789217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com