Funções de ativação com BrainScript
Sigmoid(), Tanh(), ReLU(), Softmax(), LogSoftmax(), Hardmax()
Funções de ativação não lineares 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
Valor Retornado
Resultado da aplicação da não linearidade. A forma tensor da saída é a mesma da entrada.
Descrição
Essas são as funções de ativação populares de redes neurais.
Todos eles, exceto a Softmax()
família, e Hardmax()
são aplicados de forma elemental.
Observe que, para eficiência, ao usar o critério de treinamento entre entropias, muitas vezes é desejável não aplicar uma operação Softmax no final, mas, em vez disso, passar a entrada do Softmax para CrossEntropyWithSoftmax()
A Hardmax()
operação determina o elemento com o valor mais alto e representa sua localização como um vetor/tensor único.
Isso é usado para executar a classificação.
Expressando outras não linearidades no BrainScript
Se a não linearidade necessária não for uma das acima, ela poderá ser redigida como uma expressão BrainScript. Por exemplo, uma ReLU com vazamento com uma inclinação de 0,1 para a parte negativa pode ser apenas gravada como
LeakyReLU (x) = 0.1 * x + 0.9 * ReLU (x)
Softmax ao longo de eixos
A família Softmax é especial, pois envolve a computação de um denominador. Esse 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, em que 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.
Portanto, a operação Softmax deve calcular 20 denominadores separados.
Essa operação não tem suporte nas funções internas (Log)Softmax()
, mas pode ser realizada no BrainScript usando uma operação de redução elementwise da seguinte maneira:
ColumnwiseLogSoftmax (z) = z - ReduceLogSum (axis=1)
Aqui, ReduceLogSum()
calcula o (log de) denominador, resultando em um tensor com dimensão 1 para o eixo reduzido; [1 x 20]
no exemplo acima. Subtrair isso do [10000 x 20]
vetor de entrada dimensional é uma operação válida, como de costume, a 1
"transmissão" automaticamente, ou seja, duplicada para corresponder à dimensão de entrada.
Exemplo
Um MLP simples que executa uma classificação de 10 vias de vetores de recursos 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)