Вопросы на подумать
У каждого из них есть ответ, и учебник до него дойдёт. Попробуй додумать сам раньше, чем дочитаешь до ответа.
Как считать градиент, когда слоёв несколько? Формулу 2 · (прогноз − факт) · признак мы вывели для одного линейного слоя. У сети с двумя слоями вес первого влияет на ответ через второй, и такую цепочку надо разбирать отдельно. Это следующая глава: цепное правило и обратное распространение.
Почему для классификации мы меняем не сам градиентный спуск, а функцию выхода и функцию потерь? Что именно в спуске не зависит от того, число мы предсказываем или класс?
Почему для огромной выборки выгодно считать градиент по mini-batch, а не по всей базе? Чем при этом приходится заплатить?
Почему у настоящих сетей ландшафт не парабола? У нас минимум был один и находился точно. У многослойной сети поверхность потерь сложнее, единственного минимума нет, и одного lr на всё обучение не хватает.
Как то же самое делает библиотека? Мы писали градиент и шаг руками — это правильный порядок: понимать раньше, чем пользоваться. PyTorch разбирается отдельным модулем.
Что мы теперь умеем
- измерять качество набора весов одним числом и объяснять, почему в MSE стоит квадрат;
- находить наклон функции потерь двумя независимыми способами и сверять их друг с другом;
- делать шаг против градиента, подбирать его длину и по выводу программы отличать расходимость от слишком медленной сходимости;
- спускаться сразу по всем параметрам одной матричной записью;
- приводить признаки к одной шкале и возвращать найденные веса в исходные единицы;
- выбирать функцию потерь под задачу: MSE для числа, binary cross-entropy для двух классов;
- считать градиент по mini-batch, когда выборка велика.
Этого хватает, чтобы обучить один линейный слой — и ровно на этом наши возможности заканчиваются.
Следующая проблема: слоёв несколько
Формулу 2 · (прогноз − факт) · признак мы вывели для одного слоя. Именно это условие и держит всю главу.
У сети из двух слоёв вес первого влияет на ответ не напрямую, а через второй. Промах на выходе мы знаем. А вот какая доля этого промаха приходится на конкретный вес первого слоя — уже нет: между ними стоит цепочка вычислений.
Оба наших способа тут не годятся. Формула написана про один слой. Численная разность формально сработает, но требует пересчитать всю сеть заново на каждый вес — при сотнях тысяч весов это неприемлемо дорого.
Значит, нужен способ проносить промах назад через слои, от выхода к входу. Он называется обратным распространением и опирается на цепное правило. Это следующая глава.