Come la normalizzazione dei livelli stabilizza i transformer
Scorri per mostrare il menu
I modelli di deep learning moderni si basano su tecniche di normalizzazione per garantire un addestramento efficiente e accurato. Nel processamento del linguaggio naturale (NLP), dove le sequenze di input possono variare in lunghezza e struttura, la normalizzazione è particolarmente importante per stabilizzare il processo di apprendimento. Due metodi di normalizzazione comuni sono batch normalization e layer normalization, ma rispondono a esigenze diverse e sono adatti a differenti tipi di dati.
La batch normalization calcola la media e la varianza di ciascuna caratteristica su tutto il batch di input. Questo approccio funziona bene nei compiti di computer vision, dove ogni immagine in un batch ha tipicamente la stessa dimensione e struttura. Tuttavia, nei compiti NLP, specialmente con sequenze di lunghezza variabile, la batch normalization può introdurre dipendenze indesiderate tra i campioni di un batch e potrebbe non gestire in modo ottimale le diverse lunghezze delle sequenze.
La layer normalization, invece, normalizza le caratteristiche di input all'interno di ciascun dato (come ogni embedding di token in una frase) indipendentemente dagli altri dati nel batch. Questo la rende molto più adatta all'NLP e alla modellazione di sequenze. Standardizzando la somma degli input a un neurone all'interno di uno strato, la layer normalization assicura che la rappresentazione di ciascun token sia su una scala simile, indipendentemente dalla posizione o dalla composizione del batch. Questo aiuta i Transformer ad addestrarsi in modo stabile e a rappresentare il testo in modo più efficace, soprattutto quando si lavora con frasi lunghe o complesse.
123456789101112131415161718192021import numpy as np def layer_norm(x, epsilon=1e-5): """ Applies layer normalization to a 2D numpy array x. Each row is normalized independently. """ mean = np.mean(x, axis=1, keepdims=True) variance = np.var(x, axis=1, keepdims=True) normalized = (x - mean) / np.sqrt(variance + epsilon) # Optional: learnable scale and bias (gamma and beta) gamma = np.ones_like(mean) beta = np.zeros_like(mean) return gamma * normalized + beta # Example: normalize a batch of 3 token embeddings (rows) embeddings = np.array([[2.0, 4.0, 6.0], [1.0, 3.0, 5.0], [0.0, 0.0, 0.0]]) normalized_embeddings = layer_norm(embeddings) print(normalized_embeddings)
Immagina ogni riga del tuo input come un embedding di token unico - come un personaggio in una storia, ognuno con le proprie particolarità. La funzione layer_norm offre a ogni token le stesse opportunità regolando i suoi valori affinché siano centrati attorno allo zero e condividano la stessa scala. Calcola la media e la varianza per ogni riga, quindi trasforma i valori in modo che nessun token risalti troppo o passi inosservato. Questa normalizzazione indipendente significa che, indipendentemente dalla lunghezza della sequenza o dalla composizione del batch, le caratteristiche di ogni token sono bilanciate e pronte per essere interpretate dal modello. Questo approccio mantiene l'addestramento del modello stabile ed efficiente, soprattutto quando si lavora con lunghezze e strutture imprevedibili tipiche dei dati NLP reali.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione