В каждой нейронной сети есть множество весов и смещений, которые связывают нейроны между разными слоями. При правильных весах и смещениях нейронная сеть может хорошо выполнять свою работу. При обучении нейронной сети мы пытаемся определить наилучшие веса и смещения, чтобы улучшить производительность нейронной сети. Этот процесс называется «обучением».

Сначала мы просто дадим сети набор случайных весов и смещений. Это, конечно, означает, что сеть будет не очень точной. Например, сеть, которая отличает собак от кошек, не очень точна, если она возвращает вероятность 0,7 для собаки и 0,3 вероятности для кошки при наличии изображения кошки. В идеале он должен возвращать 0 вероятностей для собаки и 1 для кошки.

Чтобы сообщить сети, как изменить ее веса и смещения, мы должны сначала определить, насколько неточна сеть. В примере с собаками и кошками вероятность, которую он дал для кошки, составила 0,3, а правильное значение - 1. Мы можем взять разницу между двумя значениями и возвести ее в квадрат, чтобы получить положительное число, представляющее неспособность сети классифицировать изображения кошек, вот так: (0,3–1) 2 = 0,49. Мы можем сделать то же самое с вероятностью изображения собаки: (0,7–0) 2 = 0,49. Затем мы складываем два значения: 0,49 + 0,49 = 0,98. Это потеря нашей нейронной сети для единственной фотографии, которую мы передали.

* Примечание: в этом приведении нейронной сети только с двумя выходами (то есть кошкой или собакой) разница вероятностей одинакова (в данном случае оба 0,49). Но в сетях с несколькими выходами (например, в сети, распознающей буквы алфавита, которая будет иметь 26 выходов), каждое различие вероятностей будет уникальным.

Теперь мы можем повторить этот процесс с несколькими обучающими образами, каждое из которых дает разные потери. После того, как мы проработаем все наши обучающие данные, мы сможем вычислить среднее значение всех потерь. Эта средняя потеря показывает, насколько плохо работает сеть, и определяется значениями весов и смещений.

Следовательно, потери связаны со значениями весов и смещений. Мы можем определить функцию потерь, которая принимает на входе все значения весов и смещений и возвращает средние потери. Чтобы улучшить производительность сети, мы должны как-то изменить веса и смещения, чтобы минимизировать потери.

Несмотря на то, что функция потерь имеет несколько входов, ее легче визуализировать как функцию с одним входом (весами) и одним выходом. На этой диаграмме вертикальная ось L (w) представляет величину потерь в зависимости от весов. Горизонтальная ось w представляет значение весов (несколько весов, но для лучшей визуализации мы можем представить только один вес).

Для начального случайного веса, который мы даем, мы находимся в определенной точке функции потерь. Чтобы минимизировать потери, мы должны сделать шаг к локальному минимуму. Мы можем сделать это, взяв производную (наклон) функции, сделав шаг влево, если он положительный, и шаг вправо, если он отрицательный. В приведенном выше примере мы видим, что производная в этой точке положительна, поэтому мы делаем шаг влево (уменьшаем значение веса). С математической точки зрения, если исходный вес равен xn, новый вес xn + 1 = xn + dy⁄dxn • r. Здесь r - скорость обучения или размер шага, который мы делаем.

После уменьшения веса и просмотра еще одной партии изображений потери стали меньше. Мы снова берем производную и соответственно меняем веса, делая еще один шаг к локальному минимуму.

Повторим те же шаги еще раз.

О, нет! На этот раз мы зашли слишком далеко. Следовательно, мы должны сделать еще один шаг назад, чтобы приблизиться к локальному минимуму.

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

В статье 2015 года Лесли Смит Cyclical Learning Rates for Training Neural Networks представлен способ определения оптимальной скорости обучения для каждой нейронной сети. Используя этот метод, мы сначала сделаем небольшой шаг: немного сместим веса. Затем, во второй раз, когда мы просматриваем пакет изображений, мы сдвигаем веса на немного большую величину (делаем больший шаг). Каждый раз, когда мы бежим, мы увеличиваем скорость обучения, делая большие шаги, пока не пересечем локальный минимум и не закончим с большей потерей. Это показано на схеме ниже:

Вначале шаги небольшие. Затем мы постепенно увеличиваем степень изменения веса, пока не достигнем локального минимума и не выпрыгнем из локальной впадины. Если мы построим график скорости обучения в зависимости от времени, это будет выглядеть примерно так:

поскольку скорость обучения увеличивается с каждым новым прогоном с пакетом изображений.

Если мы построим график потерь в зависимости от скорости обучения, это будет выглядеть примерно так:

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

Смит предложил выбрать ту скорость обучения, при которой убытки уменьшаются быстрее всего. Другими словами, мы выбираем точку на графике скорости обучения с потерей знаний, где потери все еще уменьшаются, но наклон является самым крутым.

Обратите внимание, что мы не выбираем скорость обучения с наименьшими потерями, так как это может быть точка, в которой она просто перешагнула наш локальный минимум.

Конечно, на графиках функции потерь выше я нанес только один вес, чтобы лучше визуализировать функцию. На самом деле существует множество весов и смещений, которые влияют на потерю нейронной сети. Однако метод градиентного спуска и определение скорости обучения остались прежними.