Parâmetros e constantes
ParameterTensor{}
Cria um escalar, vetor, matriz ou tensor de parâmetros aprendíveis.
ParameterTensor {shape,
init='uniform'/*|heNormal|...*/, initOutputRank=1, initValueScale=1.0,
randomSeed=-1,
initValue=0.0, initFromFilePath='',
learningRateMultiplier=1.0}
Parâmetros
-
shape
: forma (dimensões) do parâmetro como uma matriz. Por exemplo,(13:42)
criar uma matriz com 13 linhas e 42 colunas. Para algumas operações, as dimensões dadas como 0 são automaticamente inferidas (veja aqui) -
init
(padrão 'uniforme'): especifica a inicialização aleatória, por exemplo,init='heNormal'
(veja aqui) -
initOutputRank
(padrão 1): Especifica o número de eixos de distribuição à esquerda. Se negativo, -number de eixos de fan-out à direita (veja aqui) -
initValueScale
(padrão 1): fator de escala adicional aplicado a valores de inicialização aleatórios -
randomSeed
(-1padrão): se positivo, use esta semente aleatória para inicialização aleatória. Se negativo, use um contador que seja aumentado para cadaParameterTensor{}
-
initValue
: especifica a inicialização com um valor constante, por exemplo,initValue=0
-
initFromFilePath
: Especifica a inicialização carregando valores iniciais de um arquivo. Por exemplo,initFromFilePath="my_init_vals.txt"
-
learningRateMultiplier
: A taxa de aprendizagem do sistema será dimensionada por este (0 para desativar a aprendizagem) (veja aqui)
Valor de retorno
Um tensor de parâmetros aprendíveis.
Descrição
Esta função de fábrica cria um escalar, vetor, matriz ou tensor de parâmetros aprendíveis, ou seja, um tensor que é reconhecido pela ação "train"
como contendo parâmetros que devem ser atualizados durante o treinamento.
Os valores serão inicializados, dependendo do parâmetro opcional fornecido, para
- números aleatórios, se
init
for dado; - uma constante se
initValue
for dado; quer - um tensor lido de um arquivo de entrada externo, se
initFromFilePath
for dado. O padrão éinit="uniform"
.
Para criar um escalar, vetor, matriz ou tensor com classificação>2, passe o seguinte como o parâmetro shape
:
-
(1)
para um escalar; -
(M)
para um vetor de coluna comM
elementos; -
(1:N)
para um vetor de linha com elementosN
. Os vetores de linha são matrizes de uma linha; -
(M:N)
para uma matriz comN
linhas eI
colunas; -
(I:J:K...)
para um tensor de classificação arbitrária>2 (nota: a classificação máxima permitida é 12); e ainda -
(W:H:C)
para um tensor que corresponde às dimensões de uma imagem[W x H]
comC
canais.
Inferência automática de dimensões
Quando um ParameterTensor
é usado para pesos como entrada imediata de operações específicas, é permitido especificar algumas dimensões como Inferred
. Por exemplo, o produto da matriz ParameterTensor{42:Inferred} * x)
irá automaticamente inferir a segunda dimensão como sendo igual à dimensão de x
.
Isso é extremamente útil para entradas de camadas, pois libera o código BrainScript do usuário da carga de passar as dimensões de entrada. Além disso, em algumas situações, é muito complicado determinar as dimensões precisas de entrada de uma camada, por exemplo, para a primeira camada totalmente conectada no topo de uma pirâmide de combinações de convolução/agrupamento sem preenchimento, onde cada operação de convolução e agrupamento pode soltar linhas ou colunas de pixels de limite e escala as dimensões.
Este recurso é o que permite que as camadas predefinidas da CNTK sejam especificadas apenas por sua dimensão de saída (por exemplo, DenseLayer
{1024}
).
Inicialização aleatória
A inicialização aleatória é selecionada pelo parâmetro init
, que escolhe entre distribuição uniforme e normal, onde o intervalo/desvio padrão é calculado em função de fan-in e fan-out:
valor da init |
Distribuição | intervalo/desvio padrão |
---|---|---|
'HeNormal' | normal | sqrt (2 / fanIn) |
'HeUniform' | uniforme | sqrt (6 / fanIn) |
'glorotNormal' | normal | sqrt (2 / (fanIn+fanOut)) |
'glorotUniform' | uniforme | sqrt (6 / (fanIn+fanOut)) |
'Xavier' | uniforme | sqrt (3 / fanIn) |
'uniforme' | uniforme | 1/20 |
'Gaussiano' | normal | sqrt (0.04 / fanIn) |
'zero' | n/a | 0 |
(Onde zero
é uma alternativa às vezes conveniente para especificar initValue=0
.) Para uma distribuição uniforme, os parâmetros serão inicializados uniformemente em [-range, range]; para a distribuição normal, a média é sempre zero.
Observe que o padrão para init
é uniform
ao usar ParameterTensor{}
diretamente.
No entanto, o padrão é glorotUniform
para camadas que contêm parâmetros dentro, como DenseLayer{}
e ConvolutionalLayer{}
.
Fan-in e fan-out para inicialização aleatória
A inicialização aleatória pressupõe que os parâmetros fazem parte de alguma forma de operação matricial-produto que tem um fan-in e fan-out bem definidos, que são usados para determinar o dimensionamento dos valores aleatórios por tabela acima. Por padrão, o primeiro eixo é considerado fan-out, e os eixos/eixos restantes são fan-in, combinando semântica do produto de matriz regular.
O parâmetro opcional initOutputRank
pode ser usado para especificar o número de eixos principais que devem ser considerados fan-out. Por exemplo, para um produto matricial em de interpretação tensor estendida da CNTK que mapeia uma x
vetorial [K]
-dimensional para um objeto rank-2 -dimensional [I x J]
pode ser escrito como Times
(W, x, outputRank=2)
, onde W
tem a forma [I x J x K]
.
Aqui, initOutputRank=2
especifica que, ao dimensionar os valores de inicialização aleatórios, a distribuição é I*J
e o fan-in K
.
Valores negativos para initOutputRank
indicam que os eixos de fan-out são eixos à direita. Por exemplo, o kernel de filtro do ConvolutionalLayer{}
e a operação de Convolution()
subjacente para uma configuração típica de processamento de imagem tem uma forma [W x H x C x K]
, onde K
é o fan-out, enquanto o fan-in é W*H*C
.
Isso é especificado por initOutputRank=-1
.
Leitura de valores iniciais de arquivos
Os valores iniciais podem ser lidos a partir de um arquivo de texto. Para fazer isso, passe um nome de caminho para o parâmetro opcional initFromFilePath
.
Espera-se que o arquivo de texto consista em uma linha por linhas de matriz, que consistem em números separados por espaço, um por coluna.
As dimensões de linha e coluna no arquivo devem corresponder a shape
.
Taxa de aprendizagem específica do parâmetro
As taxas de aprendizagem específicas de parâmetros podem ser realizadas com o parâmetro learningRateMultiplier
opcional.
Este fator é multiplicado com a taxa de aprendizagem real ao realizar atualizações de parâmetros.
Por exemplo, se especificado como 0, o parâmetro não será atualizado, é constante.
Exemplos
Uma matriz de parâmetros regular que será inicializada como heUniform
(o padrão seria heNormal
):
W = ParameterTensor {(outDim:inDim), init=`heUniform`}
Um parâmetro de viés regular que será inicializado como zero:
b = ParameterTensor {outDim, initValue=0}
Uma matriz de incorporação que deve ser lida de um arquivo e mantida constante:
E = ParameterTensor {(embedDim:vocabSize),
initFromFilePath='./EmbeddingMatrix.txt',
learningRateMultiplier=0} # prevents learning
Um parâmetro de viés do tamanho total de uma imagem de tamanho [width x height]
com numChannels
planos de cores:
bFull = ParameterTensor {(width:height:numChannels)}
{} constante
Crie um tensor constante.
Constant {scalarValue, rows=1, cols=1}
Parâmetros
-
scalarValue
: valor desta constante -
rows
(padrão: 1): número de linhas, se constante não for escalar -
cols
(padrão: 1): número de cols, se constante não for escalar
Valor de retorno
Uma constante, um objeto escalar ou rank-1 ou rank-2 de dimensão [rows x cols]
, onde todos os elementos são preenchidos com scalarValue
.
Descrição
Um valor constante. Pode ser escalar ou um objeto rank-1 (vetor) ou rank-2 (matriz) inicializado com um único valor (como 0). Observe que, como para constantes vetoriais e matriciais todos os valores são idênticos, as constantes usadas em conjunto com operações baseadas em elementos muitas vezes podem ser especificadas como escalares, aproveitando de transmissão.
Nota de execução:
Um Constant()
é um ParameterTensor{}
com learningRateMultiplier=0
.
Exemplos
Interpolação entre dois valores com peso de interpolação alpha
no intervalo 0..1 ("multiplexador suave"):
SoftMUX (x, y, alpha) = Constant (1-alpha) .* x + Constant (alpha) .* y
Perda de Hamming (cf. aqui):
HammingLoss (y, p) = ReduceSum (BS.Boolean.Xor (y, Greater (p, Constant(0.5))))
hl = HammingLoss (multiLabels, probabilities)