НачатьНачать бесплатно

Создание модели RNN с механизмом внимания

Команда PyBooks исследует различные архитектуры глубокого обучения. После изучения темы вы решаете реализовать RNN с механизмом внимания для предсказания следующего слова в предложении. В вашем распоряжении — набор данных с предложениями и словарём, построенным на их основе.

Следующие пакеты уже импортированы: torch, nn.

Следующие объекты уже загружены:

  • vocab и vocab_size: словарный запас и его размер
  • word_to_ix и ix_to_word: словари для отображения слов в индексы и индексов в слова
  • input_data и target_data: набор данных, преобразованный в пары «вход — выход»
  • embedding_dim и hidden_dim: размерности эмбеддинга и скрытого состояния RNN

Вы можете просмотреть переменную data в консоли, чтобы увидеть примеры предложений.

Это упражнение является частью курса

Глубокое обучение для работы с текстом на PyTorch

Посмотреть курс

Инструкции к упражнению

  • Создайте слой эмбеддингов для словаря с заданным значением 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")
Редактировать и запускать код