Конечно, я сильно упрощаю. Пределы градиентного спуска составляют так называемую проблему локальных минимумов (или проблему локальных максимумов, если налицо не спуск, а подъем по градиенту). Когда вы попадаете в горы и вам захотелось вернуться на равнину, постоянно двигаться вниз ошибочно: да, скорее всего, вы спуститесь в долину, но вряд ли перевалите через следующую гору, отделяющую эту долину от вашего дома. Для достижения цели понадобится либо ментальная модель (то есть карта) топологии, чтобы знать, куда подняться для выхода из долины, либо умение переключаться туда и обратно между градиентным спуском и случайными перемещениями, чтобы вы могли покинуть горы.
Так, собственно, и поступает комар, привлеченный моим запахом: он спускается, когда улавливает мой «шлейф», и совершает случайные движения, когда теряет след или натыкается на препятствие.
Такова природа. А что насчет компьютеров? Традиционное программное обеспечение работает иначе, следует детерминированным правилам жесткой логики: «Если так, то делаем вот так». Но программное обеспечение, взаимодействующее с физическим миром, демонстрирует склонность функционировать по законам физического мира. Это подразумевает «шумные» входы (сигналы датчиков или человеческое поведение) и вероятностные, а не детерминированные результаты. А потому, что вполне ожидаемо, перед нами очередной спуск по градиенту.
Программное обеспечение ИИ является здесь наилучшим примером, в особенности у тех разновидностей ИИ, которые используют искусственные модели нейронных сетей (включая сверточные[117]
или «глубинные» нейронные сети многих уровней). Типичный процесс «обучения» в данном случае состоит из демонстрации множества примеров какого-либо предмета или явления (допустим, изображений кошек с подписью «кошка») заодно со случайно выбранными примерами другого рода (изображениями прочих предметов и явлений). Это так называемое «контролируемое обучение», поскольку нейронная сеть обучается на подобранных примерах, и оно подразумевает «состязательное обучение» на основе распознавания данных, которые не релевантны желаемому результату.Такие нейронные сети, как и их биологические прообразы, объединяют в слои тысячи узлов («нейронов» – по аналогии с нашим мозгом), каждый из которых связан со всеми узлами в слоях выше и ниже; изначально все соединения обладают разной, случайной силой. Слой выше образуют данные, а слой ниже – правильные ответы. Любая последовательность соединений, ведущая к правильному ответу, усиливается («вознаграждается» или «поощряется»), а ошибочная последовательность ослабляется («наказывается» или «штрафуется»). Если повторить эту процедуру десятки тысяч раз, мы получим сеть, полностью обученную оперированию конкретными данными.
Можно трактовать все возможные комбинации связей как поверхность планеты, с холмами и долинами. (Здесь несущественно то, что поверхность всего лишь трехмерна, а фактическая топология многомерна.) Оптимизация, которую осуществляет сеть в ходе обучения, есть просто процесс поиска самой глубокой долины на поверхности планеты. Процедура состоит из следующих шагов:
1. Определить «функцию издержек», характеризующую эффективность решения задачи.
2. Запустить процесс и оценить его выполнение при указанных издержках.
3. Изменить значения связей и запустить процесс повторно. Различие между двумя результатами будет направлением, или «наклоном», в котором сеть перемещалась между двумя испытаниями.
4. Если налицо движение «под уклон», изменить соединения необходимым образом. Если налицо движение «в гору», изменить их противоположным образом.
5. Повторять до тех пор, пока не будет зафиксировано улучшение в любом направлении. Оно будет означать, что мы достигли минимума.
Отлично! Но это, вероятно, лишь локальный минимум (так сказать, первый шаг по горам), и нужно двигаться дальше, если мы хотим добиться большего. Продолжать спуск невозможно, нам неизвестно местонахождение самой низкой точки, и придется как-то ее отыскать. Существует множество способов это сделать; вот несколько из них: