Что на самом деле делает a.sub_ (lr * a.grad)? - PullRequest
1 голос
/ 07 октября 2019

Я делаю курс fast-ai, SGD, и я не могу понять .....

Это вычитает коэффициенты на (скорость обучения * градиент) ...

Но зачем нужно вычитать?

вот код:

def update(): 
  y_hat = x@a  
  loss = mse(y_hat, y) 
  if t % 10 == 0: print (loss)
  loss.backward() 
  with torch.no_grad(): 
    a.sub_(lr * a.grad) 

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

enter image description here

Посмотрите на изображение. Показывает функцию потерь J как функцию параметра W. Здесь это упрощенное представление с W, являющимся единственным параметром. Таким образом, для выпуклой функции потерь кривая выглядит так, как показано.

Обратите внимание, что скорость обучения положительна. С левой стороны, градиент (наклон линии, касательной к кривой в этой точке) отрицателен, поэтому произведение скорости обучения и градиента отрицательно. Таким образом, вычитание продукта из W фактически увеличит W (так как 2 негатива дают положительный результат). В этом случае это хорошо, потому что потери уменьшаются.

С другой стороны (с правой стороны) градиент положительный, поэтому произведение скорости обучения и градиента положительное, поэтому произведение обученияСкорость и градиент положительны. Таким образом, вычитание продукта из W уменьшает W. В этом случае также это хорошо, потому что потери уменьшаются.

Мы можем расширить эту же вещь для большего числа параметров (показанный график будет более размерным и его будет непросто визуализировать, поэтомуизначально мы взяли один параметр W и для других функций потерь (даже невыпуклых, хотя они не всегда сходятся к глобальным минимумам, но определенно к ближайшим локальным минимумам).

Примечание. Это объяснение можно найти в курсах глубокого обучения Эндрю Нга, но я не смог найти прямую ссылку, поэтому написал этот ответ.

1 голос
/ 07 октября 2019

Я предполагаю, a представляет параметры вашей модели, основанные на y_hat = x @ a. Это необходимо, поскольку алгоритм стохастического градиентного спуска стремится найти минимумы функции потерь. Поэтому вы берете градиент относительно параметров вашей модели и немного обновляете их в направлении градиента.

Подумайте о аналогии сползания вниз по склону: если пейзаж представляет вашу потерю, градиент - это направление наискорейшего спуска. Чтобы добраться до дна (то есть минимизировать потери), вы делаете небольшие шаги в направлении самого крутого спуска от того места, где вы стоите.

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