Adăugarea atenției încrucișate în stratul decoderului
Pentru a integra stivele de encoder și decoder definite anterior într-un transformer de tip encoder-decoder, trebuie să creezi un mecanism de atenție încrucișată care să funcționeze ca punte între cele două.
Clasa MultiHeadAttention definită anterior este în continuare disponibilă.
Acest exercițiu face parte din cursul
Modele Transformer cu PyTorch
Instrucțiuni pentru exercițiu
- Definește un mecanism de atenție încrucișată (folosind
MultiHeadAttention) și o a treia normalizare a stratului (folosindnn.LayerNorm) în metoda__init__. - Completează pasul înainte (forward pass) pentru a adăuga atenția încrucișată în stratul decoderului.
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
class DecoderLayer(nn.Module):
def __init__(self, d_model, num_heads, d_ff, dropout):
super().__init__()
self.self_attn = MultiHeadAttention(d_model, num_heads)
# Define cross-attention and a third layer normalization
self.cross_attn = ____
self.ff_sublayer = FeedForwardSubLayer(d_model, d_ff)
self.norm1 = nn.LayerNorm(d_model)
self.norm2 = nn.LayerNorm(d_model)
self.norm3 = ____
self.dropout = nn.Dropout(dropout)
def forward(self, x, y, tgt_mask, cross_mask):
self_attn_output = self.self_attn(x, x, x, tgt_mask)
x = self.norm1(x + self.dropout(self_attn_output))
# Complete the forward pass
cross_attn_output = self.____(____)
x = self.norm2(x + self.dropout(____))
ff_output = self.ff_sublayer(x)
x = self.norm3(x + self.dropout(ff_output))
return x