Operazioni binarie
Operatori binari element per elemento.
ElementTimes (x, y)
x .* y
Minus (x, y)
x - y
Plus (x, y)
x + y
LogPlus (x, y)
Less (x, y)
Equal (x, y)
Greater (x, y)
GreaterEqual (x, y)
NotEqual (x, y)
LessEqual (x, y)
BS.Boolean.And (x, y)
BS.Boolean.Or (x, y)
BS.Boolean.Xor (x, y)
Parametri
x
: input sinistroy
: input destro
Le dimensioni di x
e y
devono corrispondere (soggette alle regole di trasmissione, vedere di seguito).
Per le tre Boolean
operazioni, è previsto che entrambi gli input siano 0 o 1. In caso contrario, il comportamento delle funzioni non è specificato e in effetti cambierà nelle versioni future.
I valori di tipo sparse non sono attualmente supportati.
Valore restituito
Queste funzioni restituiscono il risultato delle operazioni corrispondenti. Gli operatori di relazione (Equal()
e così via) e le tre Boolean
operazioni restituiscono valori 0 o 1.
La dimensione di output o la forma del tensore è identica a quella degli input, soggetta alla trasmissione, vedere di seguito.
Descrizioni
Si tratta degli operatori binari comuni.
Vengono applicate in senso elemento.
Si noti che l'operatore di *
BrainScript non è in senso elemento, ma sta per il prodotto matrice. Questo è diverso, ad esempio, dalla libreria di numpy
Python.
Le dimensioni degli input devono essere identiche, ad eccezione della trasmissione.
Semantica di trasmissione
La trasmissione, un concetto che CNTK modelli dopo la libreria di numpy
Python, significa che una dimensione in uno degli input può essere 1 in cui l'altro input non è.
In tal caso, l'input con la dimensione 1 verrà copiato n
, dove n
corrisponde alla dimensione dell'altro input corrispondente.
Se i ranghi del tensore non corrispondono, si presuppone che la forma tensore dell'input con dimensioni inferiori sia 1 e attivi la trasmissione.
Ad esempio, l'aggiunta di un [13 x 1]
tensore a un [1 x 42]
vettore produce un [13 x 42]
vettore che contiene le somme di tutte le combinazioni.
Operazioni di relazione
Gli operatori di relazione (Equal()
e così via) non sono differenziabili, la loro sfumatura viene sempre considerata 0.
Possono essere usati per i flag, ad esempio come argomento di condizione nell'operazione If()
.
LogPlus()
L'operazione LogPlus()
calcola la somma dei valori rappresentati in forma logaritmica.
Ad esempio, calcola:
LogPlus (x, y) = Log (Exp (x) + Exp (y))
dove x
e y
sono logaritmi di valori.
Questa operazione è utile quando si gestiscono le probabilità, che sono spesso così piccole che solo una rappresentazione logaritmica consente l'accuratezza numerica appropriata.
Nota: un altro nome comune per questa operazione è log-add-exp, ad esempio SciPy.
Esempio
Livello Sigmoid Standard
Questo livello usa il file binario +
element per elemento :
z = Sigmoid (W * x + b)
Si noti che *
in precedenza non è in senso elemento, ma sta per il prodotto matrice.
Implementazione alternativa dell'attivazione Softmax
La Softmax()
funzione di attivazione può essere scritta usando la trasmissione Minus
:
MySoftmax (z) = Exp (z - ReduceLogSum (z))
In questo caso, ReduceLogSum()
riduce il vettore z
a un scalare calcolando la somma logaritmica. Tramite la semantica di trasmissione della sottrazione, questo scalare viene quindi sottratto da ogni valore di input.
In questo modo viene implementata la divisione in base alla somma di tutti i valori nella funzione Softmax.
Numero massimo di due input elemento per elemento
Il valore massimo di due input in senso elemento può essere calcolato come combinazione di Greater()
e If()
:
MyElementwiseMax (a, b) = If (Greater (a, b), a, b)
Questo funziona anche con la trasmissione. Ad esempio, il rectifier lineare può essere scritto con questo usando una costante scalare come secondo input:
MyReLU (x) = MyElementwiseMax (x, Constant(0))