Compartilhar via


Interpretando epoch_size, minibatch_size_in_samples e MinibatchSource.next_minibatch em CNTK

Neste artigo, esclareceremos a interpretação e o uso dos seguintes parâmetros e funções no Python:

epoch_size

O número de exemplos de rótulo (tensores ao longo de um eixo dinâmico) em cada época. O epoch_size CNTK é o número de exemplos de rótulo após os quais ações adicionais específicas são executadas, incluindo

  • salvar um modelo de ponto de verificação (o treinamento pode ser reiniciado a partir daqui)
  • validação cruzada
  • controle de taxa de aprendizagem
  • minibatch-scaling

Observe que a definição do número de exemplos de rótulo é semelhante ao número de amostras usadas para minibatch_size_in_samples. A definição de epoch_size difere da definição de minibatch_size_in_samples , no sentido de que epoch_size são exemplos de rótulo , não de exemplos de entrada.

Portanto, importante, para dados sequenciais, um exemplo é um item individual de uma sequência. Portanto, CNTK não epoch_sizese refere a várias sequências, mas ao número de itens de sequência nos rótulos de sequência que constituem a minibatch.

Igualmente importante, epoch_size refere-se a exemplos de rótulo , não a exemplos 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 um rótulo por sequência e para cada sequência ter muitos exemplos (nesse caso epoch_size , atua como número de sequências), e é possível ter um rótulo por exemplo em uma sequência, nesse caso epoch_size , atua exatamente como minibatch_size_in_samples em que cada exemplo (não sequência) é contado.

Para tamanhos menores do conjunto de dados, epoch_size geralmente é definido como o tamanho do conjunto de dados. No Python, você pode especificar cntk.io.INFINITELY_REPEAT para isso. Somente no Python, você também pode defini-lo como cntk.io.FULL_DATA_SWEEP, em que o processamento será interrompido após uma passagem do tamanho de dados inteiro.

Para conjuntos de dados grandes, convém orientar sua escolha pelo epoch_size ponto de verificação. Por exemplo, se você quiser perder no máximo 30 minutos de computação no caso de uma falha de energia ou de rede, você gostaria que um ponto de verificação fosse criado a cada 30 minutos (a partir do qual o treinamento pode ser retomado). Escolha epoch_size ser o número de exemplos que leva cerca de 30 minutos para ser computada.

minibatch_size_in_samples

Observação: para usuários do BrainScript, o parâmetro para tamanho de minibatch é minibatchSize; para usuários do Python, é minibatch_size_in_samples.

CNTK tem uma definição muito específica do minibatch_size_in_samples parâmetro: ele denota o número de exemplos entre atualizações de modelo. Um exemplo aqui é definido como um vetor ou tensor que flui pelo sistema. Por exemplo, em uma tarefa de reconhecimento de imagem, uma imagem é um exemplo.

O tamanho da minibatch para cada época é dado em exemplos (tensores ao longo de um eixo dinâmico). O valor padrão é 256. Você pode usar valores diferentes para diferentes épocas; por exemplo, 128*2 + 1024 (em Python) significa usar um tamanho de minibatch de 128 para as duas primeiras épocas e, em seguida, 1024 para o restante. Observe que "tamanho da minibatch" em CNTK significa o número de amostras processadas entre atualizações de modelo. Essa definição também se mantém ao paralelizar entre os trabalhadores (por exemplo, para K os trabalhadores, o número de exemplos que cada trabalhador processaria é minibatch_size_in_samples/K). No caso de entradas de comprimento variável, minibatch_size_in_samples refere-se ao número de itens nessas sequências, não ao número de sequências. O SGD tentará ajustar o máximo possível de sequências na minibatch que não exceder o minibatch_size_in_samples total de amostras. Se várias entradas forem fornecidas, tensores serão adicionados à minibatch atual até que uma das entradas exceda o minibatch_size_in_samples.

É importante ressaltar que, para dados sequenciais, um exemplo é um item individual de uma sequência. Portanto, CNTK nãominibatch_size_in_samples se refere ao número de sequências na minibatch, mas ao número agregado de itens/tokens de sequência nas 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 variados na mesma minibatch, sem a necessidade de soluções alternativas, como bucketing. Juntamente com a noção de CNTK de especificar a taxa de aprendizagem por exemplo (em vez de uma média de minibatch), cada item de sequências de qualquer comprimento contribui para o gradiente, levando a convergência consistente. (Muitos outros kits de ferramentas definem o tamanho da minibatch para dados sequenciais como o número de sequências na minibatch. Isso é problemático, especialmente se os gradientes também forem definidos como médias de minibatch em vez das somas de minibatch do CNTK, porque a contribuição para o gradiente de cada token ou etapa em uma sequência seria inversamente proporcional ao comprimento da sequência. A abordagem de CNTK evita isso.)

Quando várias entradas são usadas, é 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 token. Nesse caso, a entrada com o maior número de exemplos controla o tamanho da minibatch. (Você pode alterar esse comportamento especificando defines_mb_size=True para alguma entrada e, em seguida, o tamanho da minibatch será contado com base nas sequências dessa entrada específica. Quando várias entradas são especificadas, apenas uma única pode ter defines_mb_size sido definida como True.)

Apesar de nossa clara definição de minibatch_size_in_samples ser o número de exemplos entre atualizações de modelo, há duas ocasiões em que devemos relaxar a definição:

  • Dados sequenciais: as sequências de comprimento variável geralmente não somam exatamente o tamanho de minibatch solicitado. Nesse caso, o maior número possível de sequências é empacotado em uma minibatch sem exceder o tamanho de minibatch solicitado (com uma exceção: se a próxima sequência no corpus randomizado exceder o comprimento do tamanho da minibatch, o tamanho da minibatch consistirá nessa sequência).
  • paralelismo de dados: aqui, o tamanho da minibatch é aproximado, pois nosso algoritmo de randomização baseado em partes não pode garantir que cada trabalhador receba precisamente o mesmo número de amostras.

Todas as considerações acima também se aplicam a epoch_size, mas epoch_size tem algumas diferenças, confira acima.

MinibatchSource.next_minibatch

O método MinibatchSource.next_minibatch() lê uma minibatch que contém dados para todos os fluxos de entrada. Quando chamado durante o treinamento, MinibatchSource.next_minibatch(minibatch_size_in_samples, input_map) escolherá um subconjunto aleatório de k amostras do conjunto de dados de treinamento, em que k=minibatch_size_in_samples.

A implementação garante que, quando next_minibatch chamado N de horários (em que N = number_of_training_samples/minibatch_size_in_samples), todo o conjunto de dados de treinamento seja coberto no final das N chamadas de next_minibatch. Isso também significa que, quando next_minibatch é chamado 2*N de horário, todo o conjunto de dados é coberto duas vezes.

Informações adicionais:

  • Cada ciclo pelos dados terá uma ordem aleatória diferente.
  • Se você dobrar o tamanho da minibatch, uma minibatch conterá exatamente os exemplos que, antes, os dois minibatches consecutivos correspondentes teriam contido (isso pode ser aproximado se você tiver sequências de comprimento variável). Ou seja, duas execuções que só diferem no tamanho da minibatch processam os dados na mesma ordem.
  • Se você interromper e reiniciar do ponto de verificação, receberá a mesma ordem aleatória como se não tivesse interrompido o treinamento. Isso é implementado baseando o processo de leitura/randomização em um eixo de tempo nominal, com este algoritmo simples:
    • O treinamento prossegue em um eixo de tempo infinito nominal. Se você buscar uma minibatch do tamanho 256, o tempo nominal avançará em 256.
    • O corpus de treinamento é replicado um número infinito de vezes nesse eixo de tempo. Se você tiver M exemplos, a primeira réplica abrange o tempo 0..M-1nominal; o segundo M..2M-1, etc.
    • Cada réplica é embaralhada aleatoriamente dentro, mas não em limites de réplica. Ou seja, depois de processar exemplos precisamente M , você viu cada exemplo exatamente uma vez.
    • A chamada next_minibatch(K) fornece os próximos K exemplos nesta linha do tempo infinita reembaralhada. É o mesmo que chamar next_minibatch(1) por K horas.
    • Isso tudo é feito preguiçosamente.
    • Reiniciar do ponto de verificação é tão simples quanto redefinir o tempo nominal para a hora nominal em que o ponto de verificação foi criado.