# cделать шаг градиента
def step(v,direction, step_size):
"""Двигаться с шаговым размером step_size в направлении от v"""
return [v_i + step_size*direction_i for v_i, direction_i in zip(v, direction)]
Как это работает?direction в нашем случае градиент.Зачем из v_i вычитать произведение частной производной и размера шага?
Вопрос 2: Зачем в стохастическом спуске растасовывают данные?
1 - нарисуйте картинку для одномерного случая. Градиент превратится в обычную производную. Производная - это угол наклона касательной к нашей cost функции. Получается на этом шаге мы смотрим возрастает функция или нет (производная больше или меньше) и в зависимости от этого смещаемся в сторону, где функция меньше на размер шага(отсюда и название - градиентный спуск, мы спускаемся к минимуму функции используя градиент как направление). Для многомерного случая все так же, мы по сути делаем это для каждой переменной.
2 - чтобы не попасть на локальный минимум
2 - в части исходных данных может быть какая-то дополнительная структура, которая и правда приведет нас к локальному минимуму. Например, если какие-то N примеров подряд имеют примерно одинаковые входные или выходные данные, то тогда модель обучится, что данные только такого характера и есть в принципе, и ей сложнее будет "расстаться" с этим знанием при обучении на следующих примерах.