為 MultiHeadAttention 類別加入方法
在這個練習中,你將從零開始完成 MultiHeadAttention 類別的其餘部分,定義以下四個方法:
.split_heads():在多個注意力頭之間分割並轉換輸入的嵌入向量(embedding).compute_attention():計算縮放點積(scaled dot-product)注意力權重,並與 values 矩陣相乘.combine_heads():將注意力權重轉回與輸入嵌入向量x相同的形狀.forward():呼叫其他方法,讓輸入嵌入向量依序通過各步驟
torch.nn 已匯入為 nn,torch.nn.functional 可用作 F,torch 也已可用。
本練習屬於課程
Transformer Models with PyTorch
動手互動練習
試著完成這個範例程式碼,體驗一下這個練習。
class MultiHeadAttention(nn.Module):
def __init__(self, d_model, num_heads):
super().__init__()
self.num_heads = num_heads
self.d_model = d_model
self.head_dim = d_model // num_heads
self.query_linear = nn.Linear(d_model, d_model, bias=False)
self.key_linear = nn.Linear(d_model, d_model, bias=False)
self.value_linear = nn.Linear(d_model, d_model, bias=False)
self.output_linear = nn.Linear(d_model, d_model)
def split_heads(self, x, batch_size):
seq_length = x.size(1)
# Split the input embeddings and permute
x = x.____
return x.permute(0, 2, 1, 3)