Normalização do lote
BatchNormalization(input, scale, bias, runMean, runVariance, spatial,
normalizationTimeConstant = 0,
blendTimeConstant = 0, epsilon = 0.00001, useCntkEngine = true)
Parâmetros
input
é a entrada do nó de normalização do lotescale
é um ParameterTensor{} que contém os fatores de dimensionamento de componentes aprendidos (gamma
termo na equação abaixo).bias
é um ParameterTensor{} que contém o viés aprendido (beta
termo).scale
ebias
deve ter as mesmas dimensões que devem ser iguais àsinput
dimensões no caso ouspatial = false
número de mapas de recursos de convolução de saída no caso despatial = true
.runMean
é a média de execução que é usada durante a fase de avaliação e pode ser usada durante o treinamento também. Você deve passar um ParameterTensor{} com as mesmas dimensões quescale
ebias
, valor inicial 0, elearningRateMultiplier=0
definir.runVariance
é a variação em execução. Ele é representado da mesma maneira querunMean
.spatial
é um sinalizador que especifica se a média/var deve ser computada para cada recurso em um minibatch de forma independente ou, no caso de camadas convolucionais, por mapa de recursos.normalizationTimeConstant
(padrão 0): constante de tempo para calcular a média de execução de média e variação como uma versão filtrada de passagem baixa das estatísticas do lote. Observação: o padrão normalmente não é o que você deseja.blendTimeConstant
(padrão 0): permite suavizar estimativas em lote com as estatísticas em execuçãoepsilon
é uma constante de condicionador adicionada à variação ao calcular o desvio padrão inverso.useCntkEngine
(padrão: true): defina isso parafalse
selecionar a implementação cuDNN somente de GPU
Valor retornado
O lote normalizado input
.
Descrição
BatchNormalization
implementa a técnica descrita no papel Normalização do Lote: acelerando o treinamento de rede profunda reduzindo o deslocamento de covariado interno (Sergey Ioffe, Christian Szegedy).
Em suma, ele normaliza as saídas de camada para cada minibatch para cada saída (recurso) de forma independente e aplica a transformação affine para preservar a representação da camada. Ou seja, para camada input
:
m = mean (input)
var = variance (input)
inputNorm = (input - mean)/sqrt (epsilon + var)
output = gamma * inputNorm + beta
onde gamma
e beta
são parâmetros treináveis.
mean
e variance
são estimados a partir de dados de treinamento. No caso mais simples, eles são a média e a variação da minibatch atual durante o treinamento. Em inferência, uma estimativa de longo prazo é usada em vez disso.
As estimativas de longo prazo são uma versão filtrada com baixo passe das estatísticas de minibatch, com a constante de tempo (em exemplos) fornecida pelo normalizationTimeConstant
parâmetro.
Um valor de meios de 0
que não haverá suavização exponencial e a média/variação de execução sempre será igual à da última minibatch vista.
Isso geralmente é indesejável.
Em vez disso, é recomendável usar um valor de alguns milhares aqui.
O BatchNormalizationLayer{}
wrapper tem um padrão de 5000.
Para obter mais informações sobre constantes de tempo e suavização exponencial: https://en.wikipedia.org/wiki/Exponential_smoothing#Time_Constant
Como as estatísticas de minibatch podem ser barulhentas, CNTK também permite usar uma estimativa MAP (máximo a posteriori) durante o treinamento, em que a estimativa de longo prazo em execução é tomada como a anterior.
O peso do anterior é controlado pelo blendTimeConstant
parâmetro.
No entanto, isso não foi encontrado útil até agora em nossos experimentos.
Observe que, durante a inferência, CNTK definirá as duas constantes de tempo automaticamente, de modo que use apenas a média de execução existente e que ela não seja atualizada. Não há nenhuma ação explícita necessária pelo usuário.
Implementação cuDNN
Por padrão, essa função usa uma implementação CNTK que funciona com GPUs e CPUs. Você pode optar por usar a implementação cuDNN, que é mais performante. No entanto, observe que a implementação cuDNN não dá suporte a todas as opções e o treinamento requer uma GPU (CNTK, no entanto, fornece uma emulação de CPU para inferência mesmo se você selecionar a implementação cuDNN).