single
Challenge: Syötteen Eteenpäin Suuntautuvien Verkkojen Toteuttaminen
Pyyhkäise näyttääksesi valikon
Tutkiessasi Transformer-arkkitehtuuria luonnollisen kielen käsittelyssä kohtaat tärkeän osan jokaisessa Transformer-lohkossa: paikkakohtaisen syötteen eteenpäin syötetyn verkon (FFN). Kun itsehuomiomekanismi on käsitellyt syötteen esitykset, FFN muuntaa näitä esityksiä edelleen jokaisessa sekvenssin kohdassa, riippumatta muista kohdista. Tämä tarkoittaa, että jokaiseen lauseen tokeniin sovelletaan samaa pientä neuroverkkoa, mikä mahdollistaa mallin lisätä epälineaarisuutta ja oppia monimutkaisempia rakenteita tekstistä. FFN on olennainen itsehuomion koodaaman tiedon suhteiden havaitsemisessa ja tarkentamisessa, erityisesti käsiteltäessä ihmiskielen hienovaraisuuksia ja monitulkintaisuutta.
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)
Yllä olevassa koodissa näet yksinkertaisen paikkakohtaisen syötteen eteenpäin syötetyn verkon toteutuksen käyttäen numpy-kirjastoa. Verkko koostuu kahdesta lineaarisesta muunnoksesta (matriisikertolaskusta), joiden välissä on ReLU-aktivointifunktio.
ReLU-aktivointifunktio: ReLU (Rectified Linear Unit) -aktivointi määritellään seuraavasti: relu(x) = max(0, x). Se asettaa kaikki negatiiviset arvot nollaksi ja säilyttää positiiviset arvot muuttumattomina. ReLU:ta käytetään syötteen eteenpäin suuntautuvassa verkossa tuomaan epälineaarisuutta, mikä mahdollistaa monimutkaisempien mallien oppimisen datasta.
Ensimmäinen lineaarinen kerros projisoi syötteen d_model-ulottuvuudesta (kunkin tokenin upotuksen koko) korkeamman ulottuvuuden tilaan d_ff, mikä mahdollistaa monimutkaisempien piirteiden havaitsemisen. Toinen lineaarinen kerros projisoi tuloksen takaisin alkuperäiseen d_model-kokoon. Huomaa, että tämä verkko sovelletaan itsenäisesti jokaiseen sekvenssin positioon, mikä tarkoittaa, että yhden tokenin muunnos ei vaikuta suoraan muihin. Tämä itsenäisyys auttaa mallia käsittelemään jokaisen tokenin esityksen rinnakkain, mikä tekee Transformereista erittäin tehokkaita tekstidatan käsittelyssä.
Pyyhkäise aloittaaksesi koodauksen
Toteuta positionaalinen syötteestä riippumaton syväsyöttöverkko-funktio käyttäen numpy-kirjastoa.
Määrittele funktio position_wise_ffn(x, W1, b1, W2, b2), joka ottaa seuraavat parametrit:
x:numpy-taulukko muodossa(batch_size, seq_len, d_model);W1:numpy-taulukko muodossa(d_model, d_ff);b1:numpy-taulukko muodossa(1, d_ff);W2:numpy-taulukko muodossa(d_ff, d_model);b2:numpy-taulukko muodossa(1, d_model).
Jokaiselle sekvenssin positiolle suoritetaan:
- Lineaarinen muunnos:
out1 = x @ W1 + b1; - ReLU-aktivointi:
out1 = relu(out1); - Toinen lineaarinen muunnos:
out2 = out1 @ W2 + b2.
Palauta tulostaulukko out2, jonka muoto on (batch_size, seq_len, d_model).
Ratkaisu
Kiitos palautteestasi!
single
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme