始める無料で始める

アテンション付き RNN モデルの作成

PyBooks では、チームがさまざまなディープラーニングのアーキテクチャを検討しています。調査の結果、文章中の次の単語を予測するために、アテンション機構付きの RNN を実装することにしました。文章のデータセットと、そこから作成された語彙が与えられています。

次のパッケージはインポート済みです:torchnn

次の変数はあらかじめ用意されています:

  • vocabvocab_size:語彙集合とそのサイズ
  • word_to_ixix_to_word:単語からインデックス、インデックスから単語への対応辞書
  • input_datatarget_data:入力と出力のペアに変換したデータセット
  • embedding_dimhidden_dim:埋め込みと RNN の隠れ状態の次元

コンソールで data 変数を確認すると、例文を参照できます。

この演習はコースの一部です

PyTorch で学ぶテキストの Deep Learning

コースを見る

演習の手順

  • 指定された embedding_dim を用いて、語彙向けの埋め込み層を作成します。
  • RNN の系列出力に線形変換を適用して、アテンションスコアを得ます。
  • スコアからアテンション重みを取得します。
  • RNN の出力とアテンション重みの加重和としてコンテキストベクトルを計算します。

実践的なインタラクティブ演習

このサンプルコードを完成させて、この演習に挑戦してみましょう。

class RNNWithAttentionModel(nn.Module):
    def __init__(self):
        super(RNNWithAttentionModel, self).__init__()
        # Create an embedding layer for the vocabulary
        self.embeddings = nn.____(vocab_size, embedding_dim)
        self.rnn = nn.RNN(embedding_dim, hidden_dim, batch_first=True)
        # Apply a linear transformation to get the attention scores
        self.attention = nn.____(____, 1)
        self.fc = nn.____(hidden_dim, vocab_size)
    def forward(self, x):
        x = self.embeddings(x)
        out, _ = self.rnn(x)
        #  Get the attention weights
        attn_weights = torch.nn.functional.____(self.____(out).____(2), dim=1)
        # Compute the context vector 
        context = torch.sum(____.____(2) * out, dim=1)
        out = self.fc(context)
        return out
      
attention_model = RNNWithAttentionModel()
optimizer = torch.optim.Adam(attention_model.parameters(), lr=0.01)
criterion = nn.CrossEntropyLoss()
print("Model Instantiated")
コードを編集して実行