我想在我的网络中添加单词丢失,以便我可以有足够的训练示例来训练“unk”令牌的嵌入。据我所知,这是标准做法。假设 unk 标记的索引为 0,填充的索引为 1(如果更方便,我们可以切换它们)。
这是一个简单的 CNN 网络,它以我期望的方式实现 word dropout:
class Classifier(nn.Module):
def __init__(self, params):
super(Classifier, self).__init__()
self.params = params
self.word_dropout = nn.Dropout(params["word_dropout"])
self.pad = torch.nn.ConstantPad1d(max(params["window_sizes"])-1, 1)
self.embedding = nn.Embedding(params["vocab_size"], params["word_dim"], padding_idx=1)
self.convs = nn.ModuleList([nn.Conv1d(1, params["feature_num"], params["word_dim"] * window_size, stride=params["word_dim"], bias=False) for window_size in params["window_sizes"]])
self.dropout = nn.Dropout(params["dropout"])
self.fc = nn.Linear(params["feature_num"] * len(params["window_sizes"]), params["num_classes"])
def forward(self, x, l):
x = self.word_dropout(x)
x = self.pad(x)
embedded_x = self.embedding(x)
embedded_x = embedded_x.view(-1, 1, x.size()[1] * self.params["word_dim"]) # [batch_size, 1, seq_len * word_dim]
features = [F.relu(conv(embedded_x)) for conv in self.convs]
pooled = [F.max_pool1d(feat, feat.size()[2]).view(-1, params["feature_num"]) for feat in features]
pooled = torch.cat(pooled, 1)
pooled = self.dropout(pooled)
logit = self.fc(pooled)
return logit
不要介意填充 - pytorch 没有在 CNN 中使用非零填充的简单方法,更不用说可训练的非零填充,所以我手动进行。辍学也不允许我使用非零辍学,我想将填充令牌与 unk 令牌分开。我将它保留在我的示例中,因为它是这个问题存在的原因。
这不起作用,因为 dropout 需要浮点张量以便它可以正确缩放它们,而我的输入是不需要缩放的长张量。
在 pytorch 中是否有一种简单的方法可以做到这一点?我本质上想使用对 LongTensor 友好的 dropout(奖励:如果它能让我指定一个不为 0 的 dropout 常数更好,这样我就可以使用零填充)。