BrainScript minibatchSize em CNTK
Observação: para usuários do BrainScript, o parâmetro para tamanho de minibatch é minibatchSize
, para usuários do Python, é minibatch_size_in_samples
. Para usuários do Python, consulte aqui.
CNTK tem uma definição muito específica de minibatchSize
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 BrainScript) ou 128*2 + 1024
(em Python) significa usar o tamanho da 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 é minibatchSize/K
).
No caso de entradas de comprimento variável, minibatchSize
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 excede o minibatchSize
total de amostras.
Se várias entradas forem fornecidas, tensores serão adicionados à minibatch atual até que uma das entradas exceda o minibatchSize.
É importante ressaltar que, para dados sequenciais, um exemplo é um item individual de uma sequência.
Portanto, CNTK nãominibatchSize
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ários Input{}
s são usados, é 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 definesMbSize=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 definesMbSize
sido definida como True
.)
Apesar de nossa clara definição de minibatchSize
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 epochSize
, mas epochSize
tem algumas diferenças, confira aqui.