Статья Автор: Деникина Н.В., Деникин А.В.

Минимум перебором

Парабола, которую мы получили, — результат искусственной постановки. Мы заморозили три параметра на верных значениях, и формула MSE(w) = 7.5 · (w − 3)² вывелась ровно потому, что верный ответ был известен заранее.

На настоящих данных так не выйдет. Формулы функции потерь у нас не будет: мы не знаем, где её минимум, и даже не знаем, парабола это или что-то куда более кривое. У сети из нескольких слоёв — заведомо не парабола.

Зато одно действие доступно всегда: взять любой набор весов и посчитать по нему MSE на таблице. Это те самые три шага из первого раздела — прогноз, промах, свёртка. Больше в нашем распоряжении нет ничего.

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

Hot and cold, «горячо — холодно», устроен так. Выбираем величину шага и встаём в какую-нибудь точку. Дальше на каждом шаге считаем ошибку в трёх местах: в самой точке, на шаг левее и на шаг правее. Назовём эти три числа «здесь», «слева» и «справа».

Правило простое. Если «здесь» меньше обоих соседей — мы на дне, останавливаемся. Иначе шагаем в ту сторону, где ошибка меньше.

Посмотрим первый шаг на числах. Шаг возьмём 1.0, начнём с w = 0. Значения MSE у нас уже посчитаны в таблице первого раздела: «здесь» равно 67.5, «справа» (это w = 1) равно 30, «слева» (это w = −1) равно 120. Меньше всего справа — шагаем туда, в w = 1. И так дальше:

0 → 1 → 2 → 3 → стоп

Метод нашёл минимум на сетке с шагом 1. Но проверять он умеет только заранее выбранные точки: если минимум лежит между ними, точного ответа метод не даст.

Например, при шаге 0.25 из нуля до тройки понадобится 12 шагов вместо 3. Чем меньше шаг, тем точнее поиск и тем больше вычислений.

Все три числа считаем всегда

Правило. На каждом шаге считаем все три значения — «здесь», «слева» и «справа» — и только потом решаем, куда двигаться. Сравнить одни стороны друг с другом недостаточно: без «здесь» не видно, что мы уже на дне.

Почему это так, видно в точке w = 3. Там «здесь» равно 0, «слева» (w = 2) равно 7.5, «справа» (w = 4) тоже 7.5.

Стороны одинаковы. Если смотреть только на них, выбрать не из чего, а главное — признак «мы на дне» вообще не появится. Он виден лишь при сравнении с «здесь»: именно то, что ноль меньше обеих семь-с-половиной, и означает минимум.

А без этого сравнения из точки w = 3 придётся уходить: стороны равны, но идти-то куда-то надо. Пусть влево, в w = 2. Оттуда справа лучше — возвращаемся в w = 3. Оттуда снова влево. Движение не кончится никогда:

0 → 1 → 2 → 3 → 2 → 3 → 2 → 3 → ...

Минимум при этом был пройден на третьем шаге — и не замечен.


Программа с шагом 1.0 из точки w = 0 напечатала последовательность весов 0, 1, 2, 3, 2, 3, 2, 3. Ошибки в коде нет. Что происходит с четвёртого шага?

Почему перебор не масштабируется

Пока вес один, на каждом шаге надо посчитать ошибку в двух соседних точках. Но если весов n и для каждого независимо пробовать два направления — увеличить или уменьшить, — комбинаций получается 2ⁿ. Уже при 100 весах это огромное число, а при сотнях тысяч — совершенно непрактичное.

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

Загрузка...
Чтобы оставить комментарий, необходимо авторизоваться
💬
Пока нет комментариев. Будьте первым!
Печать