Operações binárias
Operadores binários elementwise.
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)
Parâmetros
x
: entrada à esquerday
: entrada à direita
As dimensões de x
e y
devem corresponder (sujeitas a regras de difusão, confira abaixo).
Para as três Boolean
operações, espera-se que ambas as entradas sejam 0 ou 1, caso contrário, o comportamento das funções não é especificado e, de fato, será alterado em versões futuras.
No momento, não há suporte para valores esparsos.
Valor retornado
Essas funções retornam o resultado das operações correspondentes. Os operadores de relação (Equal()
etc.) e as três Boolean
operações retornam valores que são 0 ou 1.
A dimensão de saída ou a forma tensor é idêntica à das entradas, sujeitas à difusão, confira abaixo.
Descrições
Esses são os operadores binários comuns.
Elas são aplicadas de forma elemental.
(Observe que o operador do *
BrainScript não é elementwise, mas significa o produto de matriz. Isso é diferente, por exemplo, da biblioteca do numpy
Python.)
As dimensões das entradas devem ser idênticas, com exceção da difusão.
Semântica de difusão
Difusão, um conceito que CNTK modelos após a biblioteca do numpy
Python, significa que uma dimensão em uma das entradas pode ser 1 em que a outra entrada não é.
Nesse caso, a entrada com a dimensão 1 será copiada n
vezes, onde n
está a dimensão correspondente de outra entrada.
Se as classificações tensores não corresponderem, a forma tensor da entrada com menos dimensões será considerada 1 e disparará a difusão.
Por exemplo, adicionar um [13 x 1]
tensor a um [1 x 42]
vetor produziria um [13 x 42]
vetor que contém as somas de todas as combinações.
Operações de relação
Os operadores de relação (Equal()
etc.) não são diferenciais, seu gradiente é sempre considerado 0.
Eles podem ser usados para sinalizadores, por exemplo, como um argumento de condição na If()
operação.
LogPlus()
A LogPlus()
operação calcula a soma dos valores representados no formato logarítmico.
Ou seja, ele calcula:
LogPlus (x, y) = Log (Exp (x) + Exp (y))
onde x
e y
são logaritmos de valores.
Essa operação é útil ao lidar com probabilidades, que geralmente são tão pequenas que apenas uma representação logarítmica permite a precisão numérica apropriada.
Observação: outro nome comum para essa operação é log-add-exp, por exemplo , SciPy.
Exemplos
Camada Sigmóide Padrão
Essa camada usa o binário +
elementwise:
z = Sigmoid (W * x + b)
Observe que *
acima não é elementwise, mas significa o produto de matriz.
Implementação alternativa da ativação do Softmax
A Softmax()
função de ativação pode ser gravada usando a Minus
difusão:
MySoftmax (z) = Exp (z - ReduceLogSum (z))
Aqui, ReduceLogSum()
reduz o vetor z
a um escalar computando sua soma logarítmica. Por meio da semântica de difusão de subtração, esse escalar é subtraído de cada valor de entrada.
Isso implementa a divisão pela soma sobre todos os valores na função Softmax.
Máximo elementwise de duas entradas
O máximo elemental de duas entradas pode ser calculado como uma combinação de Greater()
e If()
:
MyElementwiseMax (a, b) = If (Greater (a, b), a, b)
Isso também funciona com a difusão. Por exemplo, o retificador linear pode ser gravado com isso usando uma constante escalar como a segunda entrada:
MyReLU (x) = MyElementwiseMax (x, Constant(0))