Funções de ativação com BrainScript
Sigmoid(), Tanh(), ReLU(), Softmax(), LogSoftmax(), Hardmax()
Funções de ativação não linear para redes neurais.
Sigmoid (x)
Tanh (x)
ReLU (x)
Softmax (x)
LogSoftmax (x)
Hardmax (x)
Parâmetros
x
: argumento para aplicar a não-linearidade a
Devolver Valor
Resultado da aplicação da não-linearidade. A forma de tensor da saída é a mesma da entrada.
Description
Estas são as funções populares de ativação das redes neurais.
Todos estes, exceto a Softmax()
família, são Hardmax()
aplicados elementarmente.
Note que, para a eficiência, ao utilizar o critério de treino de cross-entropia, é muitas vezes desejável não aplicar uma operação Softmax no final, mas sim passar a entrada do Softmax para CrossEntropyWithSoftmax()
A Hardmax()
operação determina o elemento com o valor mais elevado e representa a sua localização como vetor/tensor de um só calor.
Isto é usado para executar a classificação.
Expressando Outras Não Linearidades no BrainScript
Se a sua não-linearidade necessária não for uma das anteriores, pode ser compostável como uma expressão BrainScript. Por exemplo, um ReLU vazado com uma inclinação de 0.1 para a parte negativa poderia ser apenas escrito como
LeakyReLU (x) = 0.1 * x + 0.9 * ReLU (x)
Softmax Ao Longo de Eixos
A família Softmax é especial na medida em que envolve a computação de um denominador. Este denominador é calculado sobre todos os valores do vetor de entrada.
Em alguns cenários, no entanto, a entrada é um tensor com a classificação>1, onde os eixos devem ser tratados separadamente.
Considere, por exemplo, um tensor de entrada de forma [10000 x 20]
que armazena 20 distribuições diferentes, cada coluna representa a distribuição de probabilidade de um item de entrada distinto.
Assim, a operação Softmax deve calcular 20 denominadores separados.
Esta operação não é suportada pelas funções incorporadas (Log)Softmax()
, mas pode ser realizada no BrainScript usando uma operação de redução de elementos da seguinte forma:
ColumnwiseLogSoftmax (z) = z - ReduceLogSum (axis=1)
Aqui, ReduceLogSum()
calcula o (log de) o denominador, resultando num tensor com dimensão 1 para o eixo reduzido; [1 x 20]
no exemplo acima. Subtraindo isto do [10000 x 20]
vetor de entrada -dimensional é uma operação válida -- como de costume, a 1
"transmissão" automaticamente, isto é, duplicada para corresponder à dimensão de entrada.
Exemplo
Um MLP simples que executa uma classificação de 10 vias de vetores de características de 40 dimensões:
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)