Funzioni di attivazione con BrainScript
Sigmoid(), Tanh(), ReLU(), Softmax(), LogSoftmax(), Hardmax()
Funzioni di attivazione non lineare per le reti neurali.
Sigmoid (x)
Tanh (x)
ReLU (x)
Softmax (x)
LogSoftmax (x)
Hardmax (x)
Parametri
x
: argomento a cui applicare la non linearità
Valore restituito
Risultato dell'applicazione della non linearità. La forma del tensore dell'output è uguale a quella dell'input.
Descrizione
Si tratta delle funzioni di attivazione più diffuse delle reti neurali.
Tutti questi tranne la Softmax()
famiglia e Hardmax()
vengono applicati in modo elementario.
Si noti che per l'efficienza, quando si usa il criterio di training tra entropia, spesso è consigliabile non applicare un'operazione Softmax alla fine, ma passare invece l'input di Softmax a CrossEntropyWithSoftmax()
L'operazione Hardmax()
determina l'elemento con il valore più alto e rappresenta la relativa posizione come vettore/tensore uno-hot.
Viene usato per l'esecuzione della classificazione.
Espressione di altre non linearità in BrainScript
Se la non linearità necessaria non è una delle precedenti, può essere componibile come espressione BrainScript. Ad esempio, una ReLU persa con un coefficiente angolare pari a 0,1 per la parte negativa potrebbe essere scritta come
LeakyReLU (x) = 0.1 * x + 0.9 * ReLU (x)
Softmax lungo gli assi
La famiglia Softmax è speciale in quanto implica il calcolo di un denominatore. Questo denominatore viene calcolato su tutti i valori del vettore di input.
In alcuni scenari, tuttavia, l'input è un tensore con rango>1, in cui gli assi devono essere trattati separatamente.
Si consideri, ad esempio, un tensore di input di forma [10000 x 20]
che archivia 20 distribuzioni diverse, ogni colonna rappresenta la distribuzione di probabilità di un elemento di input distinto.
Di conseguenza, l'operazione Softmax deve calcolare 20 denominatori separati.
Questa operazione non è supportata dalle funzioni predefinite (Log)Softmax()
, ma può essere realizzata in BrainScript usando un'operazione di riduzione elementwise come indicato di seguito:
ColumnwiseLogSoftmax (z) = z - ReduceLogSum (axis=1)
In questo caso, ReduceLogSum()
calcola il denominatore (log di), ottenendo un tensore con dimensione 1 per l'asse ridotto, [1 x 20]
nell'esempio precedente. Sottraendo questo valore dal [10000 x 20]
vettore di input -dimensionale è un'operazione valida, come di consueto, l'oggetto 1
"broadcast", ovvero duplicato per trovare la corrispondenza con la dimensione di input.
Esempio
Semplice MLP che esegue una classificazione a 10 vie di vettori di funzionalità 40 dimensionali:
features = Input{40}
h = Sigmoid (ParameterTensor{256:0} * features + ParameterTensor{256})
z = ParameterTensor{10:0} * h * ParameterTensor{10} # input to Softmax
labels = Input{10}
ce = CrossEntropyWithSoftmax (labels, z)