single
Challenge: Het Implementeren van Feed-Forward Netwerken
Veeg om het menu te tonen
Tijdens het verkennen van de Transformer-architectuur voor natuurlijke taalverwerking kom je een cruciaal onderdeel tegen binnen elk Transformer-blok: het positiegewijze feed-forward netwerk (FFN). Nadat het self-attention-mechanisme de inputrepresentaties heeft verwerkt, transformeert het FFN deze representaties verder op elke positie in de sequentie, onafhankelijk van andere posities. Dit betekent dat voor elk token in een zin hetzelfde kleine neurale netwerk wordt toegepast, waardoor het model extra niet-lineariteit kan introduceren en complexere patronen uit de tekst kan leren. Het FFN is essentieel voor het vastleggen van relaties en het verfijnen van de informatie die door self-attention is gecodeerd, vooral bij het omgaan met de subtiliteiten en ambiguïteiten van menselijke taal.
123456789101112131415161718192021222324252627282930313233import numpy as np def relu(x): return np.maximum(0, x) class PositionWiseFeedForward: def __init__(self, d_model, d_ff): # Initialize weights and biases for two linear layers self.W1 = np.random.randn(d_model, d_ff) * 0.01 self.b1 = np.zeros((1, d_ff)) self.W2 = np.random.randn(d_ff, d_model) * 0.01 self.b2 = np.zeros((1, d_model)) def __call__(self, x): # x shape: (batch_size, seq_len, d_model) # Apply first linear layer and ReLU activation out1 = relu(np.matmul(x, self.W1) + self.b1) # Apply second linear layer out2 = np.matmul(out1, self.W2) + self.b2 return out2 # Example usage: batch_size = 2 seq_len = 4 d_model = 8 d_ff = 16 # Example input: random tensor simulating text representations x = np.random.randn(batch_size, seq_len, d_model) ffn = PositionWiseFeedForward(d_model, d_ff) output = ffn(x) print("Output shape:", output.shape)
In de bovenstaande code zie je een eenvoudige implementatie van een positiegewijs feed-forward netwerk met behulp van numpy. Het netwerk bestaat uit twee lineaire transformaties (matrixvermenigvuldigingen), gescheiden door een ReLU-activeringsfunctie.
ReLU-activeringsfunctie: De ReLU (Rectified Linear Unit) activering wordt gedefinieerd als relu(x) = max(0, x). Hierbij worden alle negatieve waarden op nul gezet en blijven positieve waarden onveranderd. ReLU wordt in het feed-forward netwerk gebruikt om niet-lineariteit toe te voegen, waardoor het netwerk complexere patronen uit de data kan leren.
De eerste lineaire laag projecteert de invoer van d_model dimensies (de grootte van de embedding van elk token) naar een hoger-dimensionale ruimte d_ff, waardoor het model meer complexe kenmerken kan vastleggen. De tweede lineaire laag projecteert het resultaat terug naar de oorspronkelijke d_model grootte. Merk op dat dit netwerk onafhankelijk op elke positie in de reeks wordt toegepast, wat betekent dat de transformatie voor één token anderen niet direct beïnvloedt. Deze onafhankelijkheid helpt het model om de representatie van elk token parallel te verwerken, waardoor Transformers zeer efficiënt zijn voor tekstdata.
Veeg om te beginnen met coderen
Implementeer een positioneel feed-forward netwerkfunctie met behulp van numpy.
Definieer een functie position_wise_ffn(x, W1, b1, W2, b2) die het volgende ontvangt:
x: eennumpyarray met vorm(batch_size, seq_len, d_model);W1: eennumpyarray met vorm(d_model, d_ff);b1: eennumpyarray met vorm(1, d_ff);W2: eennumpyarray met vorm(d_ff, d_model);b2: eennumpyarray met vorm(1, d_model).
Voor elke positie in de sequentie wordt het volgende toegepast:
- Een lineaire transformatie:
out1 = x @ W1 + b1; - Een ReLU-activatie:
out1 = relu(out1); - Een tweede lineaire transformatie:
out2 = out1 @ W2 + b2.
Geef de uitvoerarray out2 terug met vorm (batch_size, seq_len, d_model).
Oplossing
Bedankt voor je feedback!
single
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.