Школьное образование, к сожалению, не успевает за развитием нашей отрасли, и потому создает в головах большей части людей не очень корректную картину. У них возникает популярное заблуждение, согласно которому компьютеры не способны чему-либо учиться и делают только то, на что запрограммированы — тупо, но быстро и старательно. На самом деле это давно не так. Создавать программы, способные анализировать данные, обобщать их, делать выводы и учиться таким образом чему-то новому для себя, мы умеем уже десятки лет, и с каждым годом всё лучше и лучше. Этому посвящена обширная дисциплина: машинное обучение, и она давно не является каким-то тайным знанием, доступным лишь избранным. Соответствующие методы и теории уже разработаны до такой степени, что им можно обучать, например, талантливых студентов. При Яндексе уже несколько лет работает целое учебное заведение — Школа анализа данных, — большая часть курсов которого посвящена именно таким методам. В начале октября этого года Яндекс провёл конференцию, на которую приехали ведущие исследователи в этой области из многих стран мира.
Не стоит думать, что машинное обучение — что-то экзотическое, используемое только в детекторах Большого адронного коллайдера (хотя, честно говоря, там оно тоже используется). Вовсе нет.
Каждый раз, задавая запрос в Яндексе, вы пользуетесь плодами машинного обучения. Вы, наверное, замечали, что количество найденного почти по любому запросу огромно: сотни тысяч, часто — миллионы результатов. Большая часть из них неинтересные, бесполезные, лишь случайно упоминают слова запроса или вообще являются спамом. Для ответа на ваш запрос нужно мгновенно отобрать из всех найденных результатов десятку лучших. Написать программу, которая делает это с приемлемым качеством, не под силу никакому программисту-человеку. Десять результатов по вашему запросу отобраны при помощи формул, полученных в ходе машинного обучения. С помощью созданной у нас технологии Матрикснет Яндекс обучает на кластере FML сотни таких формул в год.
Каждый раз, когда входящее письмо с предложением увеличить грудь, взять дешёвый кредит или посмотреть новый вирус попадает в папку «Спам», вы пользуетесь машиннообученным классификатором. Вы пользуетесь результатами машинного обучения каждый раз, когда диктуете голосовые команды своему телефону или навигатору, когда смотрите прогноз пробок на следующий час, когда загружаете картинку, чтобы поискать похожие в системе «Сибирь» и во многих других ситуациях. В день пользователь Яндекса, сам о том не подозревая, сталкивается с машинным обучением десятки раз.
О том, как устроено машинное обучение, рассказать в одной записи в блоге невозможно. В конце концов, не зря на эту тему пишут тома и собирают международные научные конференции. Но об отдельных интересных фактах рассказать всё же стоит.
Методы машинного обучения, исторически изобретённые первыми, были попытками скопировать природу: так называемые «нейронные сети» имитировали работу нейронов коры головного мозга (сейчас мы знаем, что имитировали неверно, но это не мешало им добиваться определенных успехов), появившиеся чуть позже «генетические алгоритмы» — эволюцию по Дарвину и менделевскую генетику. Эти попытки были чем-то похожи на самолёт с чертежей Леонардо да Винчи, машущий перепончатыми крыльями. Как современные самолёты не похожи на летучих мышей, так и методы машинного обучения, применяемые в XXI веке, чаще не являются бионическими.
Математическая основа современного машинного обучения, заложенная, в том числе, нашими соотечественниками Владимиром Вапником и Алексеем Червоненкисом, довольно сложна, но можно попытаться описать «на пальцах» то, как работают алгоритмы, использующие эту математику. Например, мы хотим научить компьютер определять, изображён ли на фотографии человек. Для этого мы берём очень много фотографий и вручную раскладываем на две стопки: в одну фотографии людей, в другую всё остальное — пейзажи, натюрморты, автомобили, животные, абстракции. Компьютер, получивший эти две стопки, сравнивает фотографии и выявляет характерные признаки изображения человека.
На первом шаге алгоритм берёт самый простой признак, выдающий результат, хоть как-то похожий на нужный. В данном случае он начинает считать, что человек — это всё, что похоже на вертикальный тёмный прямоугольник пропорцией примерно 4:1. Этот «метод», при всём его шокирующем идиотизме, неплохо отличает людей от кошек, автомобилей, домов и деревьев, еды в инстаграме и многих других объектов. На втором шаге алгоритм смотрит на ошибки первого шага: например, Джа-Джа Бинкс и платяной шкаф моей бабушки ошибочно сочтены людьми, а Обеликс и Саша Грей ошибочно сочтены объектами, непохожими на людей. Снова выбирается самый простой признак, но на этот раз такой, который обращает повышенное внимание на ошибки первого и, по возможности, исправляет их. У совокупности двух признаков ошибок будет уже меньше, и Обеликса он распознает правильно. Но ошибки всё ещё будут. Можно приступать к третьему шагу. Чем больше проходит шагов, тем больше признаков можно учесть, и через несколько сотен шагов полученный «определитель человека», обращающий внимание только на яркость прямоугольных областей, уже хорошо справляется с работой.
Такой процесс является основой известного алгоритма AdaBoost, широко используемого в компьютерном зрении. В таком изложении этот алгоритм выглядит просто, но дьявол, как всегда, в деталях. Что лучше выбирать: чуть более простой, но хуже работающий признак, или наоборот? Как именно записать условие «обращай повышенное внимание на ошибки предыдущих шагов»? На каком шаге остановиться? Как правильно комбинировать найденные признаки?
Интересно, что, хотя ответ на эти вопросы найден опытным путем, никто и по сей день не может в точности объяснить, почему именно те решения, которые используются в AdaBoost, работают лучше прочих вариантов. На прошедшей конференции Школы анализа данных Яндекса сам автор алгоритма, Роберт Шапире, рассказывал о различных подходах к этой проблеме, но даже ему исчерпывающее объяснение неизвестно. А было бы здорово его найти: строгое математическое объяснение, скорее всего, позволит усовершенствовать и этот метод, и многие другие.
Другой докладчик конференции, Ян Лекан, рассказывал о технике, известной под названием «свёрточные нейронные сети» (convolutional neural networks). Технику эту он изобрел давным-давно, примерно четверть века назад, и неуклонно совершенствует с тех пор; учёные вообще живут в вечности, и им в ней хорошо. Свёрточные нейронные сети интересны своей близостью к природе (даже если зрительная кора млекопитающих устроена по-другому, она вполне могла бы быть и такой), огромной скоростью распознавания образов, но главное в них, конечно, те замечательные результаты, которых можно добиться с их помощью. Ян Лекан прямо с кафедры показывал мгновенное распознавание компьютером разных предметов: наводил на них по очереди камеру ноутбука, и тот уверенно опознавал пульт управления, микрофон, дисплей, докладчика и прочие предметы. Потом прямо на лету, за пару секунд и пару кадров, обучил его отличать себя от случайного человека из зала. Если продолжать сравнение бионических методов с летательными аппаратами да Винчи, получается, что орнитоптеры отлично летают и успешно конкурируют с самолётами.
Демонстрировался на конференции и короткий документальный фильм о том, как мобильный робот, похожий на Валли из одноименного мультфильма, но конструируемый по заказу американских военных, при помощи одной картинки с камеры (без участия человека) уверенно чувствует себя в настоящем лесу, объезжая на скорости деревья и прочие препятствия, а также
В общем, конференция получилась замечательная, и надеюсь, что не последняя. Машинное обучение активно работает над слегка запоздавшим светлым будущим. Если развитие человеческой (и компьютерной) мысли и дальше пойдет теми же темпами, то на нашем веку мы наконец дождемся настоящих роботов, именно таких, которых нам обещали когда-то давным-давно.
Андрей Плахов, руководитель службы функциональности поиска