Como definir o tamanho do mini lote em SGD em keras

10

Eu sou novo em Keras e preciso de sua ajuda.

Estou treinando uma rede neural em Keras e minha função de perda é a diferença ao quadrado entre a saída e o valor-alvo da rede.

Eu quero otimizar isso usando a Descida de gradiente. Depois de passar por alguns links na rede, soube que existem 3 tipos de descidas gradientes usadas geralmente:

  1. Descida do gradiente de amostra única : aqui, o gradiente é calculado a partir de apenas uma amostra a cada iteração -> o gradiente pode ser barulhento.
  2. Descida do gradiente em lote : aqui, o gradiente é a média dos gradientes calculados em TODAS as amostras no conjunto de dados -> Gradiente é mais geral, mas intratável para grandes conjuntos de dados.
  3. Descida de gradiente de mini-lote : semelhante ao lote GD. Em vez de usar um conjunto de dados inteiro, apenas algumas das amostras (determinadas por batch_size) são usadas para calcular o gradiente em todas as iterações -> Não são muito barulhentas e tratáveis ​​computacionalmente -> O melhor dos dois mundos.

Questões:

  1. Eu gostaria de realizar a descida de gradiente de mini-lote em Keras. Como posso fazer isso? Devo usar o otimizador SGD?
  2. Se o SGD for usado, como defino o batch_size? Não parece haver um parâmetro para a função SGD para definir batch_size.

    optimizer = keras.optimizers.SGD(lr=0.01, decay=0.1, momentum=0.1, nesterov=False)
  3. Há um parâmetro batch_size no model.fit () no Keras.

    history = model.fit(x, y, nb_epoch=num_epochs, batch_size=20, verbose=0, validation_split=0.1)

    É o mesmo que o tamanho do lote na descida de gradiente do minilote? Caso contrário, o que significa exatamente treinar em um lote de insumos? Isso significa que 'batch_size' no. de segmentos executados paralelamente e atualizar os pesos do modelo paralelamente?

Se ajudar, aqui está o trecho de código python que escrevi até agora .

Iceflame007
fonte

Respostas:

8

Sim você está certo. Em Keras batch_sizerefere-se ao tamanho do lote na descida de gradiente de mini-lote. Se você deseja executar uma descida de gradiente em lote, defina batch_sizeo número de amostras de treinamento. Seu código parece perfeito, exceto que eu não entendo por que você armazena a model.fitfunção em um histórico de objeto.

Ernest S Kirubakaran
fonte
3
Ele armazena em um objeto histórico porque, em keras, a função "ajustar" retorna não apenas o modelo treinado, mas um objeto Histórico que armazena o modelo treinado, histórico de treinamento e muitas outras coisas. Existem alguns exemplos em exemplos de keras como esse.
Ygor de Mello Canalli 17/10
1

Levando em consideração as considerações teóricas, dado o conjunto de dados da vida real e o tamanho da rede neural moderna típica, normalmente levaria muito tempo para treinar em lotes de tamanho um, e você não terá RAM e / ou GPU suficientes para treinar em todo o conjunto de dados de uma vez só. Portanto, geralmente não é a pergunta "se" o mini-lote deve ser usado, mas "qual o tamanho" dos lotes que você deve usar. O batch_sizeargumento é o número de observações para treinar em uma única etapa, geralmente tamanhos menores funcionam melhor porque têm efeito regularizador. Além disso, muitas vezes as pessoas usam otimizadores mais complicados (por exemplo, Adam, RMSprop) e outros truques de regularização, o que torna a relação entre desempenho do modelo, tamanho do lote, taxa de aprendizado e tempo de computação mais complicada.

Tim
fonte
Obrigado por esclarecer isso. Mas como eu faria a normalização de dados dessa maneira. Sei que poderia normalizar todos os dados de treinamento e teste, mas isso tornará os mini-lotes alimentados no processo de otimização não mais normalizados.
Mr.Robot
@ Mr.Robot, por que você supõe que cada lote precisa ser normalizado independentemente?
Tim
Eu li anteriormente um post dizendo que os dados de treinamento e teste devem ser tratados separadamente (ou seja, faça a divisão do teste de trem primeiro e depois processe-os individualmente). Eu pensei que isso também se aplicaria ao otimizar usando mini-lotes. Eu estou suspeitando que isso pode ser bom para convergência?
31719
@ Mr.Robot reductio ad absurdum : com mini-lotes de tamanho 1, você passaria como seus dados apenas 0s? Você pode fazer isso como uma pergunta separada, se desejar.
Tim
Obrigado por apontar isto! Agora eu agora os problemas com o meu raciocínio.
Mr.Robot