4

「unk」トークンの埋め込みをトレーニングするための十分なトレーニング例を取得できるように、ネットワークに単語ドロップアウトを追加したいと考えています。私の知る限り、これは標準的な方法です。unk トークンのインデックスが 0 で、パディングのインデックスが 1 であると仮定しましょう (より便利であれば、それらを切り替えることができます)。

これは単純な CNN ネットワークで、単語のドロップアウトを私が期待したとおりに実装しています。

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 トークンから分離したいと考えています。それがこの質問の存在理由だからです。

私の入力はスケーリングする必要のないロングテンソルですが、ドロップアウトは適切にスケーリングできるようにフロートテンソルを必要とするため、これは機能しません。

pytorchでこれを行う簡単な方法はありますか? 基本的には、LongTensor に適したドロップアウトを使用したいと考えています (おまけ: ゼロ パディングを使用できるように、0 以外のドロップアウト定数を指定できるようにするとよいでしょう)。

4

1 に答える 1