Почему обновление оптимизатора дает плохой результат? - PullRequest
2 голосов
/ 19 января 2020

Я попытался изменить свой оптимизатор, но прежде всего я хочу проверить, дают ли следующие два кода одинаковые результаты:

optimizer = optim.Adam(params, lr)
for epoch in range(500):
    ....
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
for epoch in range(500):
    ....
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

Если я вставлю один и тот же оптимизатор между «для циклов»,

optimizer = optim.Adam(params, lr)
for epoch in range(500):
    ....
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

optimizer = optim.Adam(params, lr)
for epoch in range(500):
    ....
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

Результат стал плохим. Почему это происходит? Разве оптимизатор не получает только градиенты от потерь и не выполняет шаги градиентного спуска?

1 Ответ

2 голосов
/ 19 января 2020

Разные оптимизаторы могут иметь некоторую «память».
Например, Adam правило обновлений отслеживает первый и второй моменты градиентов каждого параметра и использует их для вычисления размера шага для каждый параметр.
Поэтому, если вы инициализируете свой оптимизатор, вы стираете эту информацию и, следовательно, делаете оптимизатор "менее информированным", что приводит к неоптимальным выборам для размеров шага.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...