Подражание развивается с опытом. При обучении танцам разница между движениями ученика и наставника так велика, что затрудняет усвоение. На первых порах повторять не так‐то просто. Некоторые движения получаются… но выглядят неправильно. Стремление к сходству толкает к новым попыткам, ведущим к поражению, пока в конце концов тело не совершает верные движения.
Что бы я делал? Не попадал бы в такую ситуацию.
Генеральный директор Apple Том Кук в ответ на вопрос, что бы он сделал, оказавшись в конфликтной ситуации с Марком Цукербергом [580]
Наступил 2009 год. С момента создания ALVINN прошло 20 лет, но в том же здании Университета Карнеги-Меллона аспирант Стефан Росс снова работал над проблемой управления, играя в Super Mario Kart – точнее, в ее бесплатную версию с открытым кодом SuperTuxKart, где главным героем был талисман Linux – пингвин Тукс.
Пока Росс гонял по трассе, компьютер записывал каждое изображение с экрана и каждое движение джойстика. Эти данные использовались для обучения довольно простой нейросети (лишь немного сложнее той, что управляла ALVINN), чтобы она научилась рулить в точности как Росс [581]. Затем он отпускал управление и позволял нейросети вести Тукса. Но очень быстро пингвин слишком широко входил в поворот и вылетал с трассы. Росс начинал заново, но дело шло плохо.
Проблема была в том, что объем данных не имел значения. Росс записал миллионы кадров – около двух часов езды по кругу, – но результат оставался прежним. Стоило передать управление нейросети, Тукс бодро стартовал, а затем начинал вилять и неизбежно улетал в кювет.
Корень проблемы крылся в самой сути обучения: ученик наблюдает за экспертом, а эксперт почти никогда не ошибается. Но какой бы талантливой ни была нейросеть-ученик, она будет совершать ошибки, явные или скрытые. А поскольку она никогда не видела, чтобы эксперт попадал в беду (и тем более – как он из нее выбирался), она понятия не имела, что делать в критической ситуации. Ошибившись, новичок оказывался в положении, которого никогда не было в обучающих данных. «И это означает, – говорил Сергей Левин, – что ситуация становится непредсказуемой».
В SuperTuxKart Росс играл хорошо, поэтому программа видела только примеры идеальной езды по центру трассы. Но стоило Туксу под управлением нейросети слегка отклониться или поехать криво, система терялась. Картинка на экране отличалось от той, что была у Росса. Требовалась реакция, отличная от стандартного «газ в пол», но нейросеть никогда не видела примеров исправления ошибок. И сколько бы Росс ни наматывал идеальные круги, система не становилась лучше.
Исследователи имитационного обучения называют это «каскадным эффектом», и это одна из фундаментальных проблем метода. Как писал Дин Померло, работая над ALVINN: «Поскольку человек ведет машину по центру дороги, нейросеть никогда не видит ситуаций, где нужно исправлять отклонение от курса» [582]. Обучить этому систему долгое время оставалось сложнейшей задачей.
Если Померло был готов доверить системе свою жизнь на шоссе до озера Эри, ему нужно было дать ей нечто большее, чем просто пассивное наблюдение за идеальной ездой. Иначе система оставалась надежной ровно до первой ошибки. Требовать безошибочной работы от прототипа на протяжении двух часов при скорости 90 км/ч было бы безумием.
«Нейросети нужно показать не только правильное вождение, – писал Померло, – но и то, как возвращаться в центр полосы после ошибки» [583]. Но как это сделать? Одна из идей самого Померло заключалась в том, чтобы во время обучения специально отклоняться от курса, показывая ALVINN, как выравнивать машину. Но для этого нужно было бы удалить из данных момент самого начала отклонения (иначе ALVINN научилась бы вилять специально!). Кроме того, чтобы покрыть все возможные ситуации, пришлось бы вилять по дороге так часто и так хаотично, что это заняло бы уйму времени и было бы просто опасно.
Тогда Померло пришла в голову другая идея: он решил одурачить систему.
Изображения, которые видела ALVINN, были крошечными (30 на 32 пикселя), черно-белыми и зернистыми, охватывая лишь трапециевидный кусок асфальта перед капотом. (Поле зрения было настолько узким, что на перекрестках машина терялась в море асфальта.) Померло взял реальные кадры с камеры и программно сместил их так, будто машина отклонилась влево или вправо. Затем он добавил эти фальшивые кадры в обучающую выборку, приписав к ним правильные команды руля для возвращения в центр. Это потребовало некоторой ювелирной работы (фокус работал только на ровной дороге без ям), но на шоссе I‐79 сработало отлично.
По иронии судьбы, развитие технологий глубокого обучения за последнее десятилетие сделало этот «жульнический» подход почти неприменимым. Современные камеры имеют слишком высокое разрешение, широкий угол обзора и высокую частоту кадров – их так просто не подделаешь. Если сгенерированные изображения будут хоть немного отличаться от того, что машина увидит в реальности при заносе, последствия могут быть фатальными. Доверять свою жизнь навыкам работы в Photoshop – слишком большой риск, а современные нейросети обмануть все труднее.
Спустя 20 лет проблема восстановления после ошибок оставалась нерешенной как на практике, так и в теории. «Когда вы учитесь, наблюдая за кем‐то, – говорил мне Стефан Росс, – вы видите распределение примеров, которые необязательно совпадут с тем, с чем вы столкнетесь сами». Росса видит в этом глубокую проблему: все машинное обучение строится на допущении, что условия обучения и реальной работы одинаковы (тренировочное и тестовое распределения совпадают). Но в имитационном обучении это не так [584].
Росс и его научный руководитель Дрю Багнелл провели теоретический анализ проблемы. В обычном обучении (например, распознавании картинок) ошибки растут линейно: покажите системе в 10 раз больше картинок, и она сделает в 10 раз больше ошибок. Но в имитационном обучении все хуже. Одна ошибка приводит систему в незнакомое состояние, где прогнозы становятся бессмысленными, что ведет к ошибкам. Здесь зависимость квадратичная: работа в 10 раз дольше приведет к 100‐кратному росту ошибок [585]. Теоретический вывод был неутешительным, но он подсказал направление: можно ли найти способ вернуть задачу в безопасную зону линейных ошибок? В какой момент вероятность аварии увеличивается всего в 10 раз, если ехать в 10 раз дольше? «Мы отправились на поиски священного Грааля, не иначе», – говорил исследователь.
Как оказалось, они его нашли. Ключом стало взаимодействие. Ученик должен не только наблюдать, но и иметь возможность обратиться к учителю: «Эй, я попытался сделать как ты, но получается плохо. Что делать в такой ситуации?»
Росс придумал два способа внедрить такое взаимодействие в SuperTuxKart [586]. Первый: пока нейросеть (поначалу ужасно) вела Тукса по трассе, Росс держал джойстик и двигал им так, как надо было бы рулить в этот момент. Система записывала «идеальные» команды для тех «плохих» ситуаций, в которые она сама себя загоняла.
Второй способ: управление случайно переключалось между Россом и нейросетью. «Это как будто ты играешь, а в какой‐то момент руль перехватывает нейросеть. Со временем ты управляешь все реже, но всегда готов вмешаться». Это ощущалось странно, неестественно, но работало. «Машина начинает вилять, ты ее ловишь… – усмехается Росс. – Потом она все реже ошибается, и ты вдруг перестаешь замечать, кто сейчас рулит».
Самым удивительным стало то, что этот метод (Росс назвал его DAgger – Dataset Aggregation) требовал невероятно мало данных. При пассивном наблюдении нейросеть была одинаково беспомощна и после тысячи кадров, и после миллиона. Но с методом DAgger она начинала ехать идеально уже к третьему кругу. «Когда мы этого добились, – рассказывал Росс, – я подумал: „Ух ты, это действительно круто!“ Это работает на порядок лучше стандартного подхода».
Получив докторскую степень, Стефан Росс сменил виртуальные трассы SuperTuxKart на реальные улицы Маунтин-Вью, где теперь возглавляет группу прогнозирования компании Waymo, которая занимается беспилотными автомобилями. Он учит машины предсказывать действия других водителей и пешеходов. «Уровень надежности здесь нужен на порядок выше. Модель должна работать всегда, 99 % времени – это недостаточно хорошо». Задача сложная, но вдохновляющая. «Это один из тех проектов, где успех может реально сделать мир лучше. Одной этой мысли достаточно, чтобы продолжать работать».
Хотя метод DAgger теоретически считается золотым стандартом, на практике не очень удобно бороться с настоящей машиной за руль, чтобы научить ее ездить. Есть и более простые способы, которые хорошо работают в реальности.
В 2015 году группа швейцарских робототехников применила остроумный подход для обучения дрона, который должен был летать по лесным тропам в Альпах, не теряясь. Вместо того чтобы пытаться программировать правила («тропа – это коричневая полоса среди зеленого»), они обучили систему напрямую преобразовывать картинку в команду моторам. На входе – пиксели (деревья и грязь), на выходе – «влево», «вправо» или «прямо». Годы исследований компьютерного зрения и ручного написания фильтров были заменены одной нейросетью.
Чтобы научить дрон исправлять ошибки, они использовали хитрость. На голову туристу надели не одну, а три камеры GoPro: одну прямо, другие – налево и направо. Турист шел по тропе, стараясь не вертеть головой. Данные с центральной камеры учили дрон: «когда видишь такое – лети прямо». Данные с левой камеры (которая смотрела в лес слева от тропы) учили: «когда видишь такое – поворачивай вправо». Данные с правой камеры учили поворачивать влево. Нейросеть обучили на этих данных и запустили дрон в лес. Он прекрасно справился, летая над тропинками. Главный урок: нужно не просто показать идеальный путь, но и дать данные о том, как вернуться на него, если сбился.
В 2016 году исследователи NVIDIA (Холмдел, штат Нью-Джерси) применили тот же трюк с тремя камерами на реальном автомобиле Linkoln MKZ. Получился многочасовой видеоматериал, показывающий, как выглядит окружение, когда машина слегка отклоняется от курса. Команда «скормила» эти данные системе, велев повторять за водителем и оставаться в пределах центральной полосы. После 72 часов обучения на видеозаписях машина уверенно ехала по извилистым дорогам и шоссе, не требуя вмешательства водителя. На видео, выпущенном командой, видно, как машина выезжает на магистраль, и сотрудник восклицает: «Она все еще едет сама?! Выглядит отлично». Он даже добавил, что автопилот ведет себя лучше, чем большинство живых водителей в Нью-Джерси [587].
В этой истории есть два забавных совпадения. Во-первых, то самое здание в Нью-Джерси, откуда выезжала машина NVIDIA, в конце 80‐х принадлежало Bell Labs. Именно там Ян Лекун изобрел сверточные нейросети и алгоритм обратного распространения ошибки – технологии, которые сегодня управляют этими самыми машинами [588]. Во-вторых, я сам учился водить именно на дорогах округа Монмут в Нью-Джерси, регулярно проезжая мимо того здания. И, честно говоря, я бы хотел, чтобы спустя 17 лет за рулем я чувствовал себя так же уверенно и безопасно, как эта нейросеть после 72 часов обучения.