Метод градиентного спуска применим не только к кошкам; вы можете использовать его каждый раз, когда захотите, чтобы машина изучала какую-то стратегию на собственном опыте. Возможно, вам нужна стратегия, которая берет чьи-то рейтинги для сотен фильмов и предсказывает их рейтинги для еще не просмотренных картин; или стратегия, которая берет позицию в шашках или го и выдает ход, ставящий вашего противника в проигрышное положение; или стратегия, которая на основе видеосигнала с камеры автомобиля выдает движение рулевой колонки, упреждающее столкновение с мусорным баком. Все что угодно! Во всех случаях вы можете начать с какой-то предложенной стратегии, оценить, какие незначительные изменения максимально уменьшат неправильность в большинстве примеров, которые вы уже видели, внести эти изменения и повторить.
Я не хочу преуменьшать вычислительные проблемы. «Кошкотрон», скорее всего, придется обучать на миллионах изображений, а не на тысячах. Поэтому вычисление полной неправильности может потребовать сложения миллионов отдельных неправильностей. Даже если у вас очень мощный процессор, это затратно по времени! Вот почему на практике мы часто используем разновидность процесса под названием стохастический градиентный спуск. У этого метода невообразимое количество модификаций, хитростей и усложнений, но базовая идея такова: вместо того чтобы складывать все неправильности, вы берете наугад одну картинку из своего обучающего множества – одного ангорского котенка или аквариум, – а затем делаете шаг, который сильнее всего уменьшит для нее неправильность. На следующем шаге вы снова выбираете случайное изображение и продолжаете. Со временем (поскольку для этого процесса требуется много шагов) вы, вероятно, в итоге учтете все различные изображения.
Что мне нравится в стохастическом градиентном спуске, так это его странность. Представьте, например, что президент Соединенных Штатов принимает решения без какой-либо глобальной стратегии: глава государства окружен толпой кричащих подчиненных, где каждый требует скорректировать политику в соответствии с его собственными интересами. И президент ежедневно случайным образом выбирает одного из этих людей, выслушивает его и соответствующим образом меняет курс страны[297]. Довольно нелепый (и опасный!) способ руководить правительством огромной страны, однако неплохо работающий в машинном обучении!
В нашем описании пока отсутствует кое-что важное: как узнать, когда остановиться? Ну, это как раз просто: вы останавливаетесь, когда ваши мелкие изменения больше не дают никаких улучшений. Однако тут возникает большая проблема: возможно, на самом деле вы вовсе не на вершине!
Если вы – тот самый счастливый альпинист на рисунке, то при любом шаге влево или вправо заметите, что уклона вверх нигде нет. Вот почему вы счастливы! Вы на вершине!
Хотя нет. Настоящая вершина далеко, и градиентный спуск не приведет вас туда. Вы попали в точку, известную как локальный оптимум[298], в которой никакие мелкие изменения не приводят к улучшению, но при этом она далека от фактического наилучшего положения. Мне нравится думать о локальном оптимуме как о математической модели прокрастинации – склонности откладывать дела на потом. Предположим, вам нужно сделать какое-то неприятное дело: например, разобрать огромную шаткую стопку папок, большинство из которых связано с целями, к которым вы стремились годами, и избавление от них означало бы окончательное признание, что вы этими путями уже больше никогда не пойдете. В любой конкретный день метод градиентного спуска рекомендует вам совершить какой-то маленький шаг, который сделает вас в этот день максимально счастливым. Нужно ли для этого разбирать завалы? Нет, как раз наоборот. Начав возиться со злополучной стопкой, вы почувствуете себя ужасно. Таким образом, градиентный спуск требует от вас отложить работу на завтра. Но завтра он вам скажет то же самое. И послезавтра тоже. Поздравляю! Вы попали в точку локального оптимума, на невысокую вершину. Чтобы подняться на более высокую вершину, вам придется спуститься в какую-то низину и, возможно, преодолеть большое расстояние – спуститься, чтобы в итоге покорить вершину. Градиентный спуск – это так называемый жадный алгоритм, потому что в любой момент он требует сделать шаг, ведущий к краткосрочной выгоде. Жадность – одна из главных ветвей на древе грехов, но опять же, согласно капиталистической поговорке, жадность – это хорошо[299]. В машинном обучении правильнее сказать: «Жадность – это довольно хорошо». Метод градиентного спуска может привести к локальному оптимуму, однако на практике это случается не так часто, как можно предположить теоретически.
Существуют способы обойти локальный оптимум: нужно просто ненадолго приструнить свою жадность. У каждого хорошего правила есть исключения! Например, вы можете вместо остановки на какой-то вершине выбрать другое случайное положение и заново запустить градиентный спуск. Оказываясь в одном и том же месте, вы обретете больше уверенности, что эта точка – наилучшая. Однако на картинке, нарисованной выше, выход из случайной начальной точки с большей вероятностью закончится на высоком пике, а не на низком.
В реальной жизни весьма сложно поставить себя в случайно выбранное новое местоположение! Более реалистичный поступок – сделать из своего текущего положения случайный большой шаг вместо маленького жадного шажка; часто этого достаточно, чтобы вы оказались в такой точке, откуда можно добраться до наилучшей доступной вершины. Именно это мы делаем, когда просим совета у незнакомца, находящегося вне нашего обычного круга общения, или вытаскиваем карты из колоды вроде «Обходных стратегий»[300], изречения на которых («Используй неприемлемый цвет», «Самое главное – то, что легче всего забыть», «Бесконечно малые градации»[301], «Отбрось аксиому»[302]) предназначены для того, чтобы выбить нас из локального оптимума, где мы застряли, и сделать шаги, «срабатывающие» не сразу. Само название указывает на путь, отличающийся от того, что мы обычно выбираем.
Существует еще одно препятствие, причем значительное. Мы беспечно решили рассмотреть все небольшие изменения, которые можем сделать, и выяснить, какое из них обеспечивает лучший градиент. Когда вы – альпинист на горе, все четко определено: вы находитесь на двумерной поверхности, и выбор шага – это всего лишь выбор какого-то направления по компасу; ваша цель – найти направление с максимальным градиентом.
Но что насчет пространства всех возможных стратегий для оценивания изображений кошек? Это пространство гораздо больше, фактически оно бесконечномерное. Нет никакого реального способа рассмотреть все ваши возможные варианты. Это очевидно, если расценивать ситуацию с точки зрения человека, а не машины. Предположим, я пишу книгу по саморазвитию с помощью градиентного спуска и говорю: «Улучшить выбор в жизни легко: достаточно взять все возможные способы изменить ее и выбрать тот, который кардинально улучшает ситуацию». Вас бы парализовало! Пространство всех возможных изменений поведения слишком велико для поиска. А если с помощью какого-то сверхчеловеческого подвига самоанализа вы все же смогли бы его вести? Тогда вы столкнулись бы с еще одной проблемой, потому что есть стратегия для вашей жизни, которая абсолютно минимизирует неправильность всего вашего прошлого опыта.
Стратегия: если решение, которое вам предстоит принять, в точности совпадает с тем, что вы уже принимали раньше, примите то, которое вы сейчас, оглядываясь назад, считаете правильным. В противном случае подбросьте монету.
В сценарии «Кошкотрона» аналог этого правила будет таким.
Стратегия: для любого изображения, которое вы при обучении признали кошкой, скажите «кошка». Для любого изображения, которое вы при обучении признали некошкой, скажите «некошка». Для остальных изображений подбросьте монету.
Эта стратегия обладает нулевой неправильностью! Она дает правильный ответ для каждого изображения в группе, на которой вы обучались. Но это настораживает. Если я показываю «Кошкотрону» картинку кошки, которую он не видел, он подбрасывает монету. Если я покажу картинку, которую уже называл кошкой, но поверну на сотую долю градуса, он подбросит монету. Если я покажу картинку с холодильником, он подбросит монету. Все, что он способен сделать, – это воспроизвести точный конечный список кошек и некошек, который я ему когда-то сообщил. Это не обучение, а просто запоминание.
Мы увидели два вида неэффективности стратегий. В каком-то смысле они противоположны.
• Стратегия неверна во множестве ситуаций, с которыми вы уже сталкивались.
• Стратегия настолько точно адаптирована к ситуациям, с которыми вы уже сталкивались, что бесполезна для новых ситуаций.
Первая проблема называется недообучением: при формировании стратегии вы недостаточно использовали свой опыт; вторая – переобучением: мы слишком полагаемся на свой опыт. Как найти золотую середину между этими бесполезными крайностями? Это можно сделать, приблизив задачу к настоящему походу в горы. Альпинист выбирает из весьма ограниченного количества вариантов, и мы тоже можем так поступить, если заранее решим ограничить свои возможности. Давайте вернемся к моей книге по саморазвитию с помощью градиентного спуска. Что, если вместо указания рассортировать все допустимые вмешательства, которые читатели могут предпринять, я предложу им подумать только об одном измерении? Например, спрошу работающих родителей, что для них важнее – работа или дети? Это выбор в одном измерении – одна ручка на приборе вашей жизни, которую можно повернуть. И вы можете спросить себя, оглядываясь назад: хотелось бы мне повернуть эту ручку б