Compartilhar via


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 à esquerda
  • y: 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 Minusdifusã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))