Partilhar via


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_samplesetiquetas 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_sizese 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_SWEEPo 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/Kde). 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 tempo 0..M-1nominal; a segunda M..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óximas K amostras desta linha temporal infinita remodelada. É o mesmo que chamar next_minibatch(1) por K 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.