Цель состоит в том, чтобы минимизировать угол между фактическим и предсказанным векторами в настройках нейронной сети. Может ли кто-нибудь проверить правильность следующего выполнения?
criterion = nn.CosineSimilarity()
loss = torch.mean(torch.abs(criterion(actual_vectors,predicted_vectors)))
#back-propagation on the above *loss* will try cos(angle) = 0. But I want angle between the vectors to be 0 or cos(angle) = 1.
loss = 1 - loss
#To me, the above does not seem right. Isn't back-propagation on the above 'loss' similar to minimizing the negative of 'loss' from line 2?
#Does '1' have no role to play here when back-propagation is applied?
loss.backward()
Теоретически это имеет смысл. Цель обратного распространения — минимизировать потери. Если потеря равна 1 - cos(A)
(где A — разница углов между двумя), то это эквивалентно утверждению, что цель состоит в том, чтобы максимизировать cos(A)
, что, в свою очередь, эквивалентно минимизации угла между двумя векторами.
Простым примером может быть цель минимизации X^2 + 4
. Ответ на эту задачу оптимизации такой же, как и ответ на цель максимизации -(X^2 + 4)
. Приклеивание минуса ко всему уравнению и замена min на max сделают утверждения эквивалентными. Итак, если у вас есть функция, которую вы хотите МАКСИМИЗИРОВАТЬ, а ваша модель оптимизации может только МИНИМИЗИРОВАТЬ, тогда просто поставьте знак минус на свою функцию и на этом закончите.
Еще один вопрос, который вы можете задать: «Что важного в 1? Могли бы мы просто сказать loss = -loss
», и ответ … это зависит. Теоретически да, это эквивалентно, и единица не играет роли в обратном распространении (поскольку она исчезает с производной). Однако, как только мы начнем говорить о реальной оптимизации с числовыми ошибками и сложными оптимизаторами/правилами обновления, константа 1 может сыграть свою роль.
Еще одна причина иметь 1 заключается в том, что ваш убыток четко определен между 0 и 1, что является хорошим свойством.
Так что да, минимизация потерь 1 - cos(A)
из-за обратного распространения эквивалентна минимизации угла между векторами.
Привет @AjayA, если этот или любой другой ответ решил ваш вопрос, рассмотрите возможность его принятия, нажав на галочку. Это показывает более широкому сообществу, что вы нашли решение, и повышает репутацию как отвечающего, так и вас самих. Нет никаких обязательств делать это.
Привет @A Карим, конечно. Подождет один или два дня, чтобы услышать, если таковые имеются, от других, и обязательно приму ответ.
Это полезно! Кроме того, «еще один вопрос, который вы могли бы задать, — «что важно в 1?» — это еще один вопрос, который я действительно имел в виду. Спасибо за ваше мнение по этому поводу.