Interpretação epoch_size, minibatch_size_in_samples e MinibatchSource.next_minibatch em CNTK
Neste artigo, clarificaremos a interpretação e utilização dos seguintes parâmetros e funções em Python:
epoch_size
O número de amostras de etiqueta (tensores ao longo de um eixo dinâmico) em cada época. Em epoch_size
CNTK é o número de amostras de rótulo após a qual são tomadas ações adicionais específicas, incluindo
- salvar um modelo de ponto de verificação (a formação pode ser reiniciada a partir daqui)
- validação cruzada
- controlo das taxas de aprendizagem
- minibatch-escala
Note-se que a definição do número de amostras de etiquetas é semelhante ao número de amostras utilizadas para minibatch_size_in_samples. A definição difere epoch_size
da definição de, no sentido em que epoch_size
se trata, são amostras de minibatch_size_in_samples
etiquetas e não de amostras de entrada.
Então, o mais importante, para os dados sequenciais, uma amostra é um item individual de uma sequência.
Portanto, CNTK não epoch_size
se refere a uma série de sequências, mas o número de itens de sequência através das etiquetas de sequência que constituem a minibatch.
Igualmente importante, epoch_size
refere-se a amostras de etiquetagem , não a amostras de entrada, e o número de rótulos por sequência não é necessariamente o número de amostras de entrada. É possível, por exemplo, ter uma etiqueta por sequência e cada sequência ter muitas amostras (nesse caso epoch_size
age como número de sequências), e é possível ter uma etiqueta por amostra numa sequência, caso em que epoch_size
age exatamente como minibatch_size_in_samples
em que cada amostra (não sequência) é contada.
Para tamanhos de conjunto de dados mais pequenos, epoch_size
é frequentemente definido igual ao tamanho do conjunto de dados. Em Python pode especificar cntk.io.INFINITELY_REPEAT
para isso. Apenas Python, pode defini-lo para , onde cntk.io.FULL_DATA_SWEEP
o processamento irá parar após uma passagem de todo o tamanho dos dados.
Para grandes conjuntos de dados, pode querer orientar a sua escolha epoch_size
através do checkpoint. Por exemplo, se quiser perder no máximo 30 minutos de cálculo em caso de falha de energia ou falha de rede, pretende que seja criado um ponto de verificação a cada 30 minutos (a partir do qual o treino pode ser retomado). Opte por epoch_size
ser o número de amostras que demora cerca de 30 minutos a calcular.
minibatch_size_in_samples
Nota: Para os utilizadores do BrainScript, o parâmetro para o tamanho do minibatch é minibatchSize
; para Python utilizadores, é minibatch_size_in_samples
.
CNTK tem uma definição muito específica do minibatch_size_in_samples
parâmetro: Denota o número de amostras entre modelo atualizações.
Uma amostra aqui é definida como um vetor ou tensor fluindo através do sistema.
Por exemplo, numa tarefa de reconhecimento de imagem, uma imagem é uma amostra.
O tamanho da minibatch para cada época é dado em amostras (tensores ao longo de um eixo dinâmico). O valor predefinido é 256
. Pode utilizar valores diferentes para diferentes épocas; por exemplo, 128*2 + 1024
(em Python) significa utilizar um tamanho de minibatch de 128 para as duas primeiras épocas e, em seguida, 1024 para o resto.
Note que o "tamanho da minibatch" na CNTK significa o número de amostras processadas entre atualizações modelo. Esta definição também se mantém quando paraleliza entre trabalhadores (por exemplo, para K
os trabalhadores, o número de amostras que cada trabalhador processaria é minibatch_size_in_samples/K
de).
Em caso de entradas de comprimento variável, minibatch_size_in_samples
refere-se ao número de itens nestas sequências, não ao número de sequências.
A SGD tentará encaixar o maior número possível de sequências na minibatch que não exceda o minibatch_size_in_samples
total de amostras.
Se forem dadas várias entradas, os tensores são adicionados à minibatch atual até que uma das entradas exceda a minibatch_size_in_samples
.
Importante, para dados sequenciais, uma amostra é um item individual de uma sequência.
Assim, CNTK nãominibatch_size_in_samples
se refere ao número de sequências na minibatch, mas sim ao número agregado de itens de sequência/fichas através das sequências que constituem a minibatch.
CNTK tem suporte nativo para sequências de comprimento variável, ou seja, pode acomodar sequências de comprimentos altamente variáveis dentro da mesma minibatch, sem necessidade de soluções alternativas como o balde.
Juntamente com a noção de CNTK de especificar a taxa de aprendizagem por amostra (em vez de uma média de minibatch), cada item de sequências de qualquer comprimento contribui igual para o gradiente, conduzindo a uma convergência consistente.
(Muitos outros conjuntos de ferramentas definem o tamanho da minibatch para dados sequenciais como o número de sequências na minibatch. Isto é problemático, especialmente se os gradientes também forem definidos como médias de minibatch em vez de CNTK somas de minibatch, porque a contribuição para o gradiente de cada token ou passo em uma sequência seria inversamente proporcional ao comprimento da sequência. A abordagem de CNTK evita isto.)
Quando são utilizadas várias entradas, é possível que nem todas as entradas tenham o mesmo comprimento de sequência.
Por exemplo, na classificação de sequência, o rótulo de cada sequência é um único símbolo.
Neste caso, a entrada com o maior número de amostras controla o tamanho da minibatch. (Pode alterar este comportamento especificando defines_mb_size=True
para alguma entrada, em seguida, o tamanho da minibatch será contado com base nas sequências desta entrada particular. Quando várias entradas são especificadas, apenas uma pode ter defines_mb_size
definido para True
.)
Apesar da nossa clara definição de minibatch_size_in_samples
ser o número de amostras entre modelo atualizações, há duas ocasiões em que devemos relaxar a definição:
- dados sequenciais: As sequências de comprimento variável geralmente não resumem exatamente o tamanho da minibatch solicitada. Neste caso, o maior número possível de sequências são embaladas numa minibatch sem exceder o tamanho da minibatch solicitada (com uma exceção: Se a sequência seguinte no corpus aleatório exceder o comprimento do tamanho da minibatch, o tamanho da minibatch será constituído por esta sequência).
- paralelismo de dados: Aqui, o tamanho da minibatch é aproximado, uma vez que o nosso algoritmo de aleatoriedade baseado em pedaços não pode garantir que cada trabalhador recebe precisamente o mesmo número de amostras.
Todas as considerações acima referidas também se aplicam a epoch_size
, mas epoch_size
tem algumas diferenças, ver acima.
MinibatchSource.next_minibatch
O método MinibatchSource.next_minibatch() lê uma minibatch que contém dados para todos os fluxos de entrada. Quando for chamado durante o treino, MinibatchSource.next_minibatch(minibatch_size_in_samples, input_map)
irá recolher um subconjunto aleatório de amostras do conjunto de k
dados de treino, onde k=minibatch_size_in_samples
.
A implementação garante que quando next_minibatch
são chamados N
tempos (onde N = number_of_training_samples/minibatch_size_in_samples
), todo o conjunto de dados de formação é coberto no final das N
chamadas de next_minibatch
.
Isto também significa que quando next_minibatch
é chamado 2*N
tempo, todo o conjunto de dados é coberto duas vezes.
Informações adicionais:
- Cada ciclo através dos dados terá uma ordem aleatória diferente.
- Se duplicar o tamanho da minibatch, uma minibatch irá agora conter exatamente as amostras que, antes, os dois minibatches consecutivos correspondentes teriam contido (isto pode ser aproximado se tiver sequências de comprimento variável). Ou seja, duas corridas que apenas diferem no tamanho de minibatch processam os dados na mesma ordem.
- Se interromper e reiniciar do posto de controlo, receberá a mesma ordem aleatória como se não tivesse interrompido o treino. Isto é implementado através da ligação à terra do processo de leitura/aleatoriedade num eixo de tempo nominal, com este algoritmo simples:
- O treino prossegue num eixo de tempo infinito nominal. Se for buscar uma minibatch de tamanho 256, o tempo nominal progride em 256.
- O corpo de treino é replicado um número infinito de vezes neste eixo de tempo. Se tiver
M
amostras, a primeira réplica estende-se pelo tempo0..M-1
nominal; a segundaM..2M-1
, etc. - Cada réplica é misturada aleatoriamente por dentro, mas não através dos limites de réplica. Ou seja, uma vez processadas precisamente
M
amostras, viu cada amostra exatamente uma vez. - A chamada
next_minibatch(K)
dá-lhe as próximasK
amostras desta linha temporal infinita remodelada. É o mesmo que chamarnext_minibatch(1)
porK
tempos. - Isto é tudo feito preguiçosamente.
- Reiniciar do ponto de verificação é tão simples como repor o tempo nominal até ao tempo nominal quando o ponto de verificação foi criado.