Tạo mô hình RNN có attention
Tại PyBooks, nhóm đang khám phá nhiều kiến trúc deep learning khác nhau. Sau khi nghiên cứu, bạn quyết định triển khai một RNN với cơ chế Attention để dự đoán từ tiếp theo trong câu. Bạn được cung cấp một bộ dữ liệu gồm các câu và một vocabulary được tạo từ đó.
Các gói sau đã được import sẵn: torch, nn.
Các biến sau đã được nạp sẵn:
vocabvàvocab_size: tập từ vựng và kích thước của nóword_to_ixvàix_to_word: từ điển ánh xạ từ → chỉ số và chỉ số → từinput_datavàtarget_data: dữ liệu đã chuyển đổi thành các cặp đầu vào–đầu raembedding_dimvàhidden_dim: kích thước cho embedding và trạng thái ẩn của RNN
Bạn có thể kiểm tra biến data trong bảng điều khiển để xem các câu ví dụ.
Bài tập này là một phần của khóa học
Deep Learning cho Văn bản với PyTorch
Hướng dẫn bài tập
- Tạo một tầng embedding cho vocabulary với
embedding_dimđã cho. - Áp dụng phép biến đổi tuyến tính lên đầu ra chuỗi của RNN để lấy attention score.
- Lấy attention weight từ các score này.
- Tính context vector như tổng có trọng số của các đầu ra RNN và các attention weight.
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
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")