Машинное обучение
Технологии
109357
0

На сегодняшний день настоящим технологическим прорывом является машинное обучение. При использовании этой технологии программист избавлен от необходимости подробно объяснять компьютеру, как именно решать проблему. Вместо этого компьютер учится находить решение самостоятельно, и в целом ряде областей ему это прекрасно удается. Повсеместное распространение искусственного интеллекта уже оказывает влияние на любого человека, независимо от сферы его деятельности. Поэтому ознакомиться с темой будет полезно каждому из нас.
Искусственный интеллект – модная сейчас тема. Интернет пестрит сообщениями такого плана: «Нейронная сеть научилась отвечать на вопросы лучше человека»…, «…обыграла чемпиона мира по го»…, «…написала альбом песен в стиле Егора Летова»… Но, стоит начать разбираться детально, тут же понимаешь, что в части компьютерного моделирования «здравого смысла» специалисты на настоящий момент делают только первые шаги, и в ближайшее время мы вряд ли увидим «живьем» Электроника и робота Вертера из фильмов нашего давно закончившегося детства.
Впрочем, это отнюдь не означает, что нынешний, пока еще несовершенный, искусственный интеллект и более широкая область computer science под названием «машинное обучение» не имеют практического применения в настоящем. Более того, основанные на машинном обучении программные системы прекрасно справляются с некоторыми задачами, чрезвычайно сложными для людей. Вот только задачи эти довольно специфические… Но начнем с основ.
Кто-то может спросить, нужен ли нам искусственный мозг, если он еще не стал умнее мозга человеческого?
Ответ на этот вопрос не так прост, как может показаться. Живой мозг – это действительно очень мощное устройство обработки информации. Однако он не универсален. Решение одних задач зашито эволюцией в наше «ПЗУ», другие мы учимся решать – сознательно или не очень – в течение своей жизни, но есть и задачи, которые мы вообще решать не умеем. Поясню на примерах. Иллюстрацией первого случая может служить такая ситуация: вы идете по тротуару, и вдруг на вас из-за угла дома с большой скоростью вылетает велосипедист. Вы, не задумываясь, мгновенно отпрыгиваете в сторону. На самом деле, это очень непростая вычислительная проблема, справляться с которой компьютеры более или менее научились всего несколько лет назад. Пример задачи из второй категории – взятие производных от математических функций. Все ли вы помните правила дифференцирования? А производные от базовых функций? Вот производную от гиперболического тангенса можете прямо сейчас посчитать? Выгодского¹ посмотреть надо бы, говорите? Вот и мне тоже. И даже с Выгодским задача займет некоторое время, хотя в вычислительном плане она куда проще, чем оценка динамически меняющейся трехмерной сцены и принятие решения о следующем действии. Просто наши предки сотни миллионов лет уворачивались друг от друга и от неподвижных препятствий, а производные мы считаем от силы лет триста. Что же касается «нерешаемой» задачи, я приведу очень простой пример – посчитайте в уме факториал 123.
Эволюция сделала мозг весьма высокопроизводительным конвейером по обработке информации, поступающей от органов чувств – для людей и высших позвоночных животных в основном от глаз. Бинокулярная картинка, дополненная звуком, запахом и тактильными ощущениями, преобразуется в трехмерную сцену, в ней выделяются подвижные и неподвижные объекты, которые, в свою очередь, классифицируются – относятся к известным мозгу категориям.
Точно так же классифицируются звуки, запахи, вкус и т.п. Дальнейшая судьба этой информации зависит от результата обработки. В случае необходимости как можно более быстрой реакции («на меня летит что-то огромное!») эта реакция будет запущена встроенными механизмами мозга еще до детальной классификации объектов – тут время терять опасно. Пример обратной ситуации: представим себе, что мы прочитали иносказательную притчу. Теперь мы можем часами размышлять, о чем же хотел сказать автор, и нет ли там какого-то второго (третьего, четвертого) «смыслового уровня». А вообще, большую часть поступающей информации мы забываем, даже не успев осознать. Она просто отфильтровывается на том или ином уровне обработки как несущественная.
В общем, можно сказать, что живой мозг – это инструмент для обработки информации о динамически меняющейся картине окружающей действительности, основной задачей которого является выживание за счет приспособления к изменяющимся условиям. В течение практически всей эволюции мозг «учился» рефлекторным реакциям. Часть из них, самые важные, удалось «прошить» в виде безусловных рефлексов, для остальных предусмотрена возможность приобретения и закрепления. И лишь последние несколько десятков, максимум сотен тысяч лет мозг учится воспринимать мир как набор абстракций и абстракций над абстракциями. В итоге мы имеем прекрасный видеоанализатор, снабженный весьма посредственным универсальным «виртуальным процессором» на той же аппаратной базе, предназначенным для работы с произвольной информацией, – очень медленным и с ограниченным объемом памяти.
Однако жизнь ставит перед людьми разные задачи, в том числе и такие, в решении которых мозг совсем слаб. И самые умные из людей напрягли все свои способности к абстрактному мышлению и начали изобретать устройства, позволяющие справиться с такими задачами. Проще всего было с задачами типа «надо посчитать что-то, а его много». Первое вычислительное устройство в виде расчерченной доски с камешками – абак – появилось тысячи лет назад. При помощи него можно было достаточно быстро складывать и вычитать большие числа. Уже хорошо. Логарифмическая линейка еще «умнее» — с ее помощью можно умножать и делить. Ну, а если надо выполнить много действий, и некоторые из них – только при соблюдении определенных условий? Для этого были придуманы компьютеры. При помощи компьютера теоретически можно решить любую задачу при условии, что вам известен порядок выполнения вычислений, необходимый для достижения результата, – так называемый алгоритм. Формализованный алгоритм мы «передаем» компьютеру, и вуаля – он теперь умеет решать соответствующую задачу.
Но вот проблема в том, что не всегда этот порядок известен… Представьте себе, что вы работаете в ИТ-службе банка. Руководители бизнес-подразделений заинтересованы в росте клиентской базы и удержании существующих клиентов. Одно из средств достижения этих целей – мероприятия по повышению лояльности клиентов, ведь клиент, довольный своим банком, не только сам никуда не уйдет, но еще и знакомых своих приведет. И вот вам поставлена задача создать систему, которая генерировала бы индивидуальные предложения для каждого клиента банка. Понятно, что клиенту надо постараться предложить то, что ему действительно нужно. Но как это сделать? Мы ведь не можем залезть к нему в голову… Конечно, можно попытаться умозрительно выделить в массе клиентов несколько наиболее распространенных «типажей», вручную проанализировать их поведение и на основе полученных результатов попытаться запрограммировать правила формирования предложений. Но такой подход вызывает много вопросов, например таких: правильно ли мы определили типажи? все ли значимые типажи мы выявили? насколько характерных представителей каждого типажа мы выбрали? насколько верны наши выводы о причинно-следственных связях в наблюдаемом нами поведении этих людей?
Если бы мы могли детально проанализировать поведение большого количества случайно выбранных клиентов – тысяч или даже десятков тысяч, – мы бы, вероятно, с чистой совестью ответили положительно на все такие вопросы-сомнения. Но ведь такой объем работы вручную не проделаешь… И вот тут нам как раз поможет машинное обучение.
Итак, нам надо выделить характерные типажи клиентов. Что самое простое тут можно сделать? Компьютер у нас «любит» цифры. Давайте возьмем и запишем характеристики клиента в виде упорядоченного набора признаков. Например, так: возраст, пол, регион проживания, сколько лет обслуживается в банке, наличие вкладов, наличие карт, наличие кредитов, остаток во вкладах, остаток по картам, задолженность по кредитам. На самом деле, конечно же, таких признаков может быть значительно больше. Часть из них по своей природе числовая, и это для компьютера хорошо. А признаки «пол» и «регион проживания» у нас категориальные, то есть могут быть представлены значением из фиксированного списка. Их можно «разложить» на набор более мелких признаков вроде «клиент живет в Москве», «клиент живет в Новосибирске» и т.д. со значениями «да» или «нет», а затем закодировать «да» числом 1, а «нет» — числом 0. Так мы сведем категориальные признаки к числовым. Теперь мы можем заменить наш исходный набор признаков вектором чисел (х1…xn).
Этот вектор можно рассматривать как точку в многомерном пространстве. Если мы нарисуем всех наших клиентов в этом самом пространстве, то, вероятно, сможем увидеть их «скопления» невооруженным глазом.
Дело за малым – научиться рисовать в многомерном пространстве… Не выходит? Ну ладно, подойдем к задаче с другой стороны. Компьютер ведь может посчитать расстояние между парой точек? Легко. Значит, он сможет и выделить области близко расположенных точек. Теперь возьмем несколько самых «многолюдных» таких областей и вычислим центр масс каждой из них. Это и будут наши типажи – не существующие в природе усредненные «самые типичные»… кто? А вот тут уже придется закатать рукава и «вручную» пометить каждое скопление – «студенты», «пенсионеры», «ипотечники» и т.п.
Такой подход называется кластеризацией (кластер – это, собственно, как раз область «кучкования» точек в пространстве). Поделив с его помощью основную массу клиентов на скопления-кластеры и выявив характеристики типичного представителя каждого кластера, мы можем осознанно разработать продукты, ориентированные на клиентов из конкретного кластера, – привлекательные для них и выгодные для нас.
Итак, у нас есть продукты, ориентированные на наших клиентов. Отлично! Как будем предлагать – каждому клиенту из каждого кластера все продукты для его кластера, которых у него еще нет? Каждые n дней, пока не купит? Так мы рискуем оказаться чересчур надоедливыми… Или, наоборот, предложить клиенту каждый продукт только по одному разу? Это тоже не оптимально – сегодня ему не нужен кредит, а через полгода понадобится... К тому времени он уже давно забудет про наше предложение или подумает, что оно уже не актуально. Вот бы научиться предлагать клиенту именно тот продукт, который ему нужен, и именно в тот момент, когда он понадобился… Это подводит нас к другой распространенной задаче машинного обучения – классификации.
Что такое классификация, в принципе, понятно интуитивно. Но все же приведем пример. Всем известна такая задача как OCR – optical character recognition, то есть распознавание написанных от руки букв и цифр. Предположим, мы занимаемся автоматическим вводом в компьютерную базу данных заявлений, написанных от руки на разграфленных бланках с клеточками для букв и цифр. То есть границы каждого «знакоместа» нам известны, и задача сводится к тому, чтобы выяснить, какой именно символ нарисован в каждой конкретной позиции. Символов (пусть для простоты это будут русские буквы и арабские цифры) у нас ограниченное количество – всего 43 штуки. То есть нам надо взять изображение в каждой из заполненных клеточек и отнести его к одному из 43 классов – по классу на символ. Это и есть классификация. В грубом приближении задачу можно сформулировать так: пусть в природе есть неизвестная нам функция f, отображающая пространство признаков X (в нашем случае вектор чисел, представляющих картинку с символом в растровом виде) на дискретное множество классов Y. Аналитически (в виде формулы или алгоритма) выразить функцию f мы не можем, потому что не знаем, как она устроена. Но зато у нас есть большое количество пар (x, y), про которые нам известно, что y = f(x). В нашем примере – это большой набор изображений рукописных букв и цифр, в котором для каждой картинки указано, какой именно символ на ней изображен. И нам по этому набору надо как-то построить приближение настоящей функции f – некую функцию g: X → Y, такую, чтобы g(x) почти всегда совпадала с f(x). Подходов тут разных много. Один из самых простых называется «k ближайших соседей» (k nearest neighbours, kNN). Суть его такая. Берем нашу выборку и представляем ее как набор точек в многомерном пространстве. Далее берем точку x, соответствующую набору признаков объекта, который мы хотим классифицировать. Находим k ближайших к ней точек обучающей выборки и смотрим, какой класс наиболее распространен среди них (напомню, для каждого объекта в обучающей выборке мы изначально знаем правильный класс). Этот наиболее многочисленный класс мы и «приписываем» нашему объекту.
К сожалению, kNN работает хорошо далеко не на всех задачах. Скажем, рукописные варианты буквы A могут иметь разное начертание, размер, ручка/карандаш могут оказаться «не совсем черными» после перевода картинки «в монохром» и т.п. При этом легко может получиться, что шум в расстояниях между векторами признаков «проявляется ярче», чем осмысленная информация, и модель не будет работать. В данном случае нужна более совершенная модель.
Более совершенные модели часто строятся по следующему принципу. Пусть у нас есть «универсальная функция» F: (X,Θ) → Y. Здесь X и Y, как и раньше, – пространство признаков и множество категорий, а Θ – пространство так называемых параметров модели. Эти параметры для конкретного экземпляра модели тоже можно представить себе как вектор чисел, нередко «очень многомерный» — он может иметь десятки миллионов элементов. За счет изменения параметров модели функция F может быть «подогнана» под интересную нам функцию f. Это можно представить себе так. Пусть f: R → R – обычная «одномерная» непрерывная, ограниченная функция, с параметром-числом и значением-числом и с областью определения [0, 1]. Пусть наша модель – ломаная линия с n сегментами, и абсциссы концов сегментов расположены через равные расстояния внутри интервала [0, 1]. Тогда пространство Θ состоит из n+1-мерных векторов из ординат концов отрезков ломаной. Очевидно, что мы можем подобрать такой вектор Θ из Θ, чтобы ломаная F(x,Θ) как можно лучше приближала f(x), причем, увеличивая n, мы можем сделать приближение сколь угодно точным (рис. 1).
Рис. 1. Пример функции²
Чтобы получить оптимальное значение вектора параметров, используется «подгонка» параметров под обучающую выборку. Делается это примерно так:
- Берем очередные (x, y) из обучающей выборки. Если выборка кончилась, возвращаемся к ее началу
- Вычисляем F(x, Θ)
- Вычисляем значение ошибки L(F(x, Θ), y) – часто это обычный квадрат расстояния между точками
- Сдвигаем немножко каждый элемент Θ так, чтобы уменьшить L
Тут есть много тонкостей, которые по-разному решаются для разных моделей: что должна собой представлять функция F, как «сдвинуть» Θ именно в сторону уменьшения L, как добиться «схождения» модели, то есть роста качества ее работы до достаточного уровня, как избежать переобучения – ситуации, когда модель «зазубрила наизусть» обучающую выборку, а на незнакомых ей значениях выдает непредсказуемые результаты, и т.п.
Одним из самых широко применяемых классов моделей вышеописанного типа являются знаменитые искусственные нейронные сети. О них мы еще поговорим.
Примечание для самых дотошных. Часто природа закономерности, которую мы хотим смоделировать, на самом деле вероятностная. То есть зависимость Y от X формулируется не «объект со свойствами x относится к классу y», а «объект со свойствами x обычно относится к классу y», или даже «объект со свойствами x часто относится к классу y». В этом случае задача выглядит так: у нас есть выборка из совместного неизвестного нам распределения P(XY). Нам же надо построить как можно более точное приближение к условному распределению P(Y|X). В этом случае наша модель определяет не класс объекта по его признаком, а нечто похожее на значения вероятностей принадлежности объекта к каждому из классов. Но на практике, как ни странно, с точки зрения реализации эти случаи малоотличимы.
Вернемся, однако, к нашим индивидуальным предложениям. Вопросы «Нужен ли данный конкретный продукт данному конкретному клиенту?», «Готов ли данный клиент сегодня открыть вклад?» можно рассматривать как задачи классификации с двумя классами — «положительным» и «отрицательным». Имея достаточно обширные исторические данные о реакции клиентов на предложения банка, мы можем обучить компьютерные модели отвечать на вопросы такого рода. Однако здесь есть одна проблема – для того, чтобы накопить данные, придется в течение достаточно длительного периода рассылать предложения «наугад».
А теперь ненадолго отвлечемся и рассмотрим два класса задач машинного обучения, не имеющих отношения к целевым предложениям, – ведь, в конце концов, область применения искусственного интеллекта не ограничивается одной-единственной проблемой
Регрессия похожа на классификацию с одним отличием – функция f, которую мы хотим смоделировать, отображает пространство признаков не в множество классов, а, например, в обычное число (то есть это функция в привычном нам математическом смысле). Например, мы хотим оценить количество денег, которые надо загрузить в банкомат, чтобы их хватило на неделю, основываясь на исторических данных по этому и/или другим похожим банкоматам. Или, скажем, предсказать температуру воздуха на завтра. Регрессионные модели, как уже, наверное, стало понятно, часто используются в прогнозировании. С технической точки зрения классификация и регрессия – родственные задачи. И многие виды моделей (например, те же нейронные сети) можно применять как для задач классификации, так и для задач регрессии.
Embedding (иногда переводится как «включение») – это особый класс моделей, предназначенных для снижения размерности пространства признаков объекта. Часто embedding «ставится перед» другой моделью (например, перед классификатором), и получается своего рода конвейер. Снижение размерности пространства признаков… Звучит загадочно? Попробую привести простой пример. Допустим, наша модель предназначена для семантической классификации текстов на естественном языке. Текст состоит из слов. Значит, нам нужно уметь представлять слова в виде последовательностей чисел. Можно решить задачу «в лоб» и выбрать в качестве представления вектор из Unicode-кодов букв, дополненный нулями до фиксированной размерности. Но это плохой вариант, потому что в таком случае, например, никак не связанные по смыслу глагол ковать и название реки Ловать будут иметь очень близкие представления, а обозначающие одно и то же слова самолет и аэроплан – очень далекие. Можно поступить по-другому. Пусть число измерений нашего пространства признаков соответствует числу слов в русском языке. Тогда мы можем выделить отдельное измерение для каждого конкретного слова. И представить слово вектором, у которого в «его» измерении стоит значение 1, а все остальные компоненты нулевые. Тогда любая пара слов будет «удалена» друг от друга на одно и то же расстояние. Но модель с таким количеством измерений пространства признаков может элементарно не уместиться ни в какой реалистичный объем памяти. К тому же, если мы хотим, чтобы наш классификатор хорошо обучался и стабильно работал, очень желательно, чтобы близкие по смыслу слова имели близкие представления (и наоборот). Для этого как раз и применяется embedding – модель, которая, будучи обученной на большом объеме текста, умеет преобразовывать слова в векторы в многомерном (обычно несколько сотен измерений) пространстве таким образом, чтобы близкие по смыслу слова «оказывались рядом». Самым известным текстовым embedding’ом является, наверное, Word2Vec. Он устроен таким образом, что слова, часто упоминающиеся в одном контексте, получают близкие представления, и, более того, взаимное расположение векторов может отражать семантические связи между словами (например, Embed(‘Россия’) – Embed(‘Москва’) ≈ Embed(‘Франция’) – Embed(‘Париж’)).
Другой пример embedding – идентификация лиц. Если перед нами стоит задача различать ограниченное количество заранее известных людей, мы можем обучить классификатор. Но на деле куда вероятнее другой случай, когда проблема ставится так: «Есть две фотографии. Модель должна определить, изображен ли на них один и тот же человек или два разных». Для этой цели обучается embedding таким образом, чтобы расстояние между векторами двух изображений одного человека было меньше, а расстояние между векторами изображений двух разных людей – больше некого фиксированного порогового значения.
Выше я обещал рассказать про нейронные сети. Выполняю свое обещание. Заодно посмотрим, можно ли их применить к нашей задаче про персональные предложения.
Искусственные нейронные сети – очень популярный и весьма универсальный вид машинно-обучаемых моделей. Авторы концепции нейронных сетей попытались отразить в ней принципы работы живого мозга. Простая многослойная полносвязная ИНС, так называемый перцептрон, устроена следующим образом (рис. 2).
Рис. 2. Искусственная нейронная сеть
Перцептрон состоит из нескольких слоев так называемых нейронов. Каждый из них соединен со всеми нейронами предыдущего слоя и со всеми нейронами следующего слоя, причем с каждой связью ассоциирован свой собственный числовой вес. Исходные данные (вектор признаков) поступают на входной слой, откуда «передаются» нейронам первого внутреннего, или скрытого, слоя; при этом передаваемая величина умножается на вес связи. Нейрон скрытого слоя суммирует поступающие на его вход сигналы и применяет к сумме так называемую функцию активации, обычно нелинейную (рис. 3). Функции активации применяются разные, графики некоторых из них приведены ниже.
Рис. 3. Примеры разных функций активации
Иногда перед применением функции активации к сумме входных сигналов добавляется фиксированное смещение – bias; у каждого слоя значение смещения свое собственное.
Полученное значение передается по связям на нейроны следующего слоя и так далее, пока не будет достигнут выходной слой. Выходной слой «устроен» аналогично скрытым. Значения, вычисленные в нейронах выходного слоя, и являются результатом работы модели.
Параметрами модели являются веса на связях и величины смещений. Обучение модели, соответственно, сводится к «подгонке» весов и смещений. Как правило, для обучения используется метод обратного распространения ошибки (backpropagation), который является частным случаем описанного выше общего метода обучения моделей. Он позволяет последовательно «подвинуть» в направлении уменьшения ошибки веса каждого слоя, начиная с выходного.
Многослойные перцептроны хорошо подходят для задач, в которых вектор признаков имеет не очень большую фиксированную длину, однако это условие соблюдается не всегда. Рассмотрим, например, задачу классификации растровых изображений. Допустим, мы хотим обучить модель, различающую на фотографиях собак и кошек. Входным вектором здесь является собственно картинка, состоящая, как минимум, из десятков тысяч пикселей. Если мы создадим полносвязную сеть со слоями соответствующего размера, ее будет очень тяжело обучить из-за огромного объема необходимых вычислений. Поэтому для анализа изображений чаще используется специальный тип нейронных сетей – сверточные (convolutional neural networks, CNN). У такой сети нейрон скрытого слоя получает информацию не от всех нейронов предыдущего слоя, а только от нескольких, расположенных рядом друг с другом. В CNN применяется двухмерная структура входного и скрытых слоев, соответствующая «по форме» исходному изображению. Область слоя, «поставляющая» данные нейрону нижележащего слоя, обычно представляет собой прямоугольное окно фиксированного размера m × n (иногда одномерную «палочку» m × 1 или 1 × n). Можно представить себе, как будто окно «скользит» по матрице слоя, проецируя одну вычисленную им точку изображения на нижележащий слой. При этом надо отметить, что веса в сверточной сети ассоциированы с самим окном, но не с его текущей позицией. То есть, окно 3 × 3 – это одни и те же 9 весовых коэффициентов вне зависимости от того, куда оно в данный конкретный момент времени «приехало». Такое окно называется фильтром; фильтров в каждом слое сверточной сети обычно много – десятки или даже сотни, но размер каждого из них редко превышает 5 × 5 «пикселей». Помимо слоев с фильтрами (собственно сверточных) в состав CNN могут входить также слои уменьшения масштаба (их принято называть pooling) и полносвязные; последние обычно составляют выходной блок сети. Каждый фильтр обучается распознавать собственный «образец» фрагмента изображения (например, отрезок прямой линии с определенным углом наклона). За счет объединения слоев в «каскад» и перемежения сверточных слоев масштабирующими обеспечивается укрупнение и «обобщение» распознаваемых образцов по мере «погружения» сигнала в глубину слоев модели (рис. 4).
Рис. 4. Структура сверточной сети
Современные сверточные сети могут иметь очень большое количество сложным образом объединенных слоев. Ниже приведена схема классификатора изображений Google Inception v3.
Рис. 5. Схема классификатора изображений Google Inception v3
При этом архитектура CNN позволяет даже для такой внушительной модели иметь не слишком много параметров и, соответственно, относительно быстро и надежно обучаться.
А что делать, если нам надо классифицировать тексты? Например, мы хотим поделить высказывания по их эмоциональной окраске на «позитивные», «негативные» и «нейтральные». Текст «на элементарном уровне» состоит из букв, но отдельные буквы (вернее, звуки) могут нести эмоциональную нагрузку, пожалуй, только в поэзии. Средний обыватель соответствующим приемам не обучен. Поэтому первым делом нам стоит подняться с уровня букв на уровень слов. Для этого существует описанный выше embedding – он позволяет превратить слова разной длины в векторы одинаковой размерности, да еще и «сгруппированные по смыслу» — как раз то, что нам надо! А вот дальше можно применить уже знакомую нам сверточную сеть, только одномерную. Она будет «анализировать» сочетания слов, сочетания сочетаний слов и так далее. Можно надеяться, что после обучения такая сеть сможет в большинстве случаев правильно определять настроение, вложенное в фразу тем, кто ее произнес.
Помимо CNN для анализа текста и других данных, представляющих собой упорядоченную последовательность однородных объектов, предусмотрены специализированные архитектуры нейронных сетей, составляющие семейство под названием RNN (recurrent neural networks, рекуррентные нейронные сети). Основная их идея заключается в следующем: «за один шаг» такая сеть обрабатывает один элемент последовательности, но при этом помимо его данных в вычислениях участвуют также данные, накопленные при обработке предыдущих элементов. То есть рекуррентная сеть в некотором смысле обладает памятью. Существуют разные архитектуры RNN, отличающиеся в основном устройством памяти, например LSTM (long short-term memory) и GRU (gated recurrent unit).
Итак, для решения нашей задачи с классификацией текста мы можем воспользоваться либо CNN, либо RNN. Интересно, что рекуррентную сеть можно использовать не только для анализа, но и для генерации текста. Делается это, например, так. На большом объеме текстов обучается модель, предсказывающая вероятности различных вариантов следующего символа для заданного начала строки (например, для строки «крокоди» такая модель с почти единичной вероятностью должна предсказывать следующую букву «л»). Затем мы можем генерировать «естественный» текст следующим образом:
- предсказать распределение следующего символа для префикса строка
- выбрать случайный следующий символ с в соответствии с вероятностями из полученного распределения
- строка := строка + с
После обучения модели на русской классике она начинает иногда выдавать забавные фразы типа «Я есть печаль» и «Историк ездил на тебе». Впрочем, большая часть сгенерированного текста у моей модели получалась бессвязной. Автором этой идеи является один из ведущих мировых специалистов по нейронным сетям Andrey Karpathy. Подробнее о его эксперименте можно почитать в авторском блоге (http://karpathy.github.io/2015/05/21/rnn-effectiveness/).
И снова вернемся к проблеме генерации индивидуальных предложений. Для каждого клиента мы должны уметь отвечать на два типа вопросов: «Нужен ли клиенту сейчас новый продукт конкретного вида (вклад, кредит, карта)?» и «Какой именно продукт подойдет данному клиенту?» (или, что эквивалентно «Подойдет ли продукт X данному клиенту?» для каждого из продуктов, которые предлагает банк). Можно предположить, что ответ на второй вопрос зависит от «текущих характеристик» клиента (возраста, места проживания, остатков, оборотов) и уже имеющихся у него продуктов. Эти характеристики можно записать в виде вектора фиксированной длины и передать его многослойному перцептрону. С первым же вопросом ситуация иная – понять, насколько подходящим является текущий момент, можно, проанализировав предшествующую историю общения клиента с банком, то есть набор однородных векторов-«записей». Для этого, как мы уже знаем, подойдет рекуррентная или сверточная сеть.
Казалось бы, банковская сфера с ее строгими регламентами не оставляет много места для стохастических моделей. На самом деле, это не так. Многие задачи решаются с использованием технологий искусственного интеллекта. Вот отнюдь не претендующий на полноту список:
Все эти задачи подразумевают либо анализ неструктурированных данных (естественного текста, изображений, звука), либо принятие решений на основе неких «правил», которые на практике невозможно явным образом сформулировать. И машинное обучение здесь подходит как нельзя лучше.
_________________________________________________________________
¹Имеется в виду «Справочник по высшей математике» М.Я. Выгодского.
²Пример функции взят с образовательного математического сайта exponenta.ru: http://old.exponenta.ru/educat/systemat/hanova/interp/images1/Image1008.gif
Впрочем, это отнюдь не означает, что нынешний, пока еще несовершенный, искусственный интеллект и более широкая область computer science под названием «машинное обучение» не имеют практического применения в настоящем. Более того, основанные на машинном обучении программные системы прекрасно справляются с некоторыми задачами, чрезвычайно сложными для людей. Вот только задачи эти довольно специфические… Но начнем с основ.
Оно зачем?
Кто-то может спросить, нужен ли нам искусственный мозг, если он еще не стал умнее мозга человеческого?
Ответ на этот вопрос не так прост, как может показаться. Живой мозг – это действительно очень мощное устройство обработки информации. Однако он не универсален. Решение одних задач зашито эволюцией в наше «ПЗУ», другие мы учимся решать – сознательно или не очень – в течение своей жизни, но есть и задачи, которые мы вообще решать не умеем. Поясню на примерах. Иллюстрацией первого случая может служить такая ситуация: вы идете по тротуару, и вдруг на вас из-за угла дома с большой скоростью вылетает велосипедист. Вы, не задумываясь, мгновенно отпрыгиваете в сторону. На самом деле, это очень непростая вычислительная проблема, справляться с которой компьютеры более или менее научились всего несколько лет назад. Пример задачи из второй категории – взятие производных от математических функций. Все ли вы помните правила дифференцирования? А производные от базовых функций? Вот производную от гиперболического тангенса можете прямо сейчас посчитать? Выгодского¹ посмотреть надо бы, говорите? Вот и мне тоже. И даже с Выгодским задача займет некоторое время, хотя в вычислительном плане она куда проще, чем оценка динамически меняющейся трехмерной сцены и принятие решения о следующем действии. Просто наши предки сотни миллионов лет уворачивались друг от друга и от неподвижных препятствий, а производные мы считаем от силы лет триста. Что же касается «нерешаемой» задачи, я приведу очень простой пример – посчитайте в уме факториал 123.
Эволюция сделала мозг весьма высокопроизводительным конвейером по обработке информации, поступающей от органов чувств – для людей и высших позвоночных животных в основном от глаз. Бинокулярная картинка, дополненная звуком, запахом и тактильными ощущениями, преобразуется в трехмерную сцену, в ней выделяются подвижные и неподвижные объекты, которые, в свою очередь, классифицируются – относятся к известным мозгу категориям.
Точно так же классифицируются звуки, запахи, вкус и т.п. Дальнейшая судьба этой информации зависит от результата обработки. В случае необходимости как можно более быстрой реакции («на меня летит что-то огромное!») эта реакция будет запущена встроенными механизмами мозга еще до детальной классификации объектов – тут время терять опасно. Пример обратной ситуации: представим себе, что мы прочитали иносказательную притчу. Теперь мы можем часами размышлять, о чем же хотел сказать автор, и нет ли там какого-то второго (третьего, четвертого) «смыслового уровня». А вообще, большую часть поступающей информации мы забываем, даже не успев осознать. Она просто отфильтровывается на том или ином уровне обработки как несущественная.
В общем, можно сказать, что живой мозг – это инструмент для обработки информации о динамически меняющейся картине окружающей действительности, основной задачей которого является выживание за счет приспособления к изменяющимся условиям. В течение практически всей эволюции мозг «учился» рефлекторным реакциям. Часть из них, самые важные, удалось «прошить» в виде безусловных рефлексов, для остальных предусмотрена возможность приобретения и закрепления. И лишь последние несколько десятков, максимум сотен тысяч лет мозг учится воспринимать мир как набор абстракций и абстракций над абстракциями. В итоге мы имеем прекрасный видеоанализатор, снабженный весьма посредственным универсальным «виртуальным процессором» на той же аппаратной базе, предназначенным для работы с произвольной информацией, – очень медленным и с ограниченным объемом памяти.
Однако жизнь ставит перед людьми разные задачи, в том числе и такие, в решении которых мозг совсем слаб. И самые умные из людей напрягли все свои способности к абстрактному мышлению и начали изобретать устройства, позволяющие справиться с такими задачами. Проще всего было с задачами типа «надо посчитать что-то, а его много». Первое вычислительное устройство в виде расчерченной доски с камешками – абак – появилось тысячи лет назад. При помощи него можно было достаточно быстро складывать и вычитать большие числа. Уже хорошо. Логарифмическая линейка еще «умнее» — с ее помощью можно умножать и делить. Ну, а если надо выполнить много действий, и некоторые из них – только при соблюдении определенных условий? Для этого были придуманы компьютеры. При помощи компьютера теоретически можно решить любую задачу при условии, что вам известен порядок выполнения вычислений, необходимый для достижения результата, – так называемый алгоритм. Формализованный алгоритм мы «передаем» компьютеру, и вуаля – он теперь умеет решать соответствующую задачу.
Но вот проблема в том, что не всегда этот порядок известен… Представьте себе, что вы работаете в ИТ-службе банка. Руководители бизнес-подразделений заинтересованы в росте клиентской базы и удержании существующих клиентов. Одно из средств достижения этих целей – мероприятия по повышению лояльности клиентов, ведь клиент, довольный своим банком, не только сам никуда не уйдет, но еще и знакомых своих приведет. И вот вам поставлена задача создать систему, которая генерировала бы индивидуальные предложения для каждого клиента банка. Понятно, что клиенту надо постараться предложить то, что ему действительно нужно. Но как это сделать? Мы ведь не можем залезть к нему в голову… Конечно, можно попытаться умозрительно выделить в массе клиентов несколько наиболее распространенных «типажей», вручную проанализировать их поведение и на основе полученных результатов попытаться запрограммировать правила формирования предложений. Но такой подход вызывает много вопросов, например таких: правильно ли мы определили типажи? все ли значимые типажи мы выявили? насколько характерных представителей каждого типажа мы выбрали? насколько верны наши выводы о причинно-следственных связях в наблюдаемом нами поведении этих людей?
Если бы мы могли детально проанализировать поведение большого количества случайно выбранных клиентов – тысяч или даже десятков тысяч, – мы бы, вероятно, с чистой совестью ответили положительно на все такие вопросы-сомнения. Но ведь такой объем работы вручную не проделаешь… И вот тут нам как раз поможет машинное обучение.
Кластеризация
Итак, нам надо выделить характерные типажи клиентов. Что самое простое тут можно сделать? Компьютер у нас «любит» цифры. Давайте возьмем и запишем характеристики клиента в виде упорядоченного набора признаков. Например, так: возраст, пол, регион проживания, сколько лет обслуживается в банке, наличие вкладов, наличие карт, наличие кредитов, остаток во вкладах, остаток по картам, задолженность по кредитам. На самом деле, конечно же, таких признаков может быть значительно больше. Часть из них по своей природе числовая, и это для компьютера хорошо. А признаки «пол» и «регион проживания» у нас категориальные, то есть могут быть представлены значением из фиксированного списка. Их можно «разложить» на набор более мелких признаков вроде «клиент живет в Москве», «клиент живет в Новосибирске» и т.д. со значениями «да» или «нет», а затем закодировать «да» числом 1, а «нет» — числом 0. Так мы сведем категориальные признаки к числовым. Теперь мы можем заменить наш исходный набор признаков вектором чисел (х1…xn).
Этот вектор можно рассматривать как точку в многомерном пространстве. Если мы нарисуем всех наших клиентов в этом самом пространстве, то, вероятно, сможем увидеть их «скопления» невооруженным глазом.
Дело за малым – научиться рисовать в многомерном пространстве… Не выходит? Ну ладно, подойдем к задаче с другой стороны. Компьютер ведь может посчитать расстояние между парой точек? Легко. Значит, он сможет и выделить области близко расположенных точек. Теперь возьмем несколько самых «многолюдных» таких областей и вычислим центр масс каждой из них. Это и будут наши типажи – не существующие в природе усредненные «самые типичные»… кто? А вот тут уже придется закатать рукава и «вручную» пометить каждое скопление – «студенты», «пенсионеры», «ипотечники» и т.п.
Такой подход называется кластеризацией (кластер – это, собственно, как раз область «кучкования» точек в пространстве). Поделив с его помощью основную массу клиентов на скопления-кластеры и выявив характеристики типичного представителя каждого кластера, мы можем осознанно разработать продукты, ориентированные на клиентов из конкретного кластера, – привлекательные для них и выгодные для нас.
Итак, у нас есть продукты, ориентированные на наших клиентов. Отлично! Как будем предлагать – каждому клиенту из каждого кластера все продукты для его кластера, которых у него еще нет? Каждые n дней, пока не купит? Так мы рискуем оказаться чересчур надоедливыми… Или, наоборот, предложить клиенту каждый продукт только по одному разу? Это тоже не оптимально – сегодня ему не нужен кредит, а через полгода понадобится... К тому времени он уже давно забудет про наше предложение или подумает, что оно уже не актуально. Вот бы научиться предлагать клиенту именно тот продукт, который ему нужен, и именно в тот момент, когда он понадобился… Это подводит нас к другой распространенной задаче машинного обучения – классификации.
Классификация
Что такое классификация, в принципе, понятно интуитивно. Но все же приведем пример. Всем известна такая задача как OCR – optical character recognition, то есть распознавание написанных от руки букв и цифр. Предположим, мы занимаемся автоматическим вводом в компьютерную базу данных заявлений, написанных от руки на разграфленных бланках с клеточками для букв и цифр. То есть границы каждого «знакоместа» нам известны, и задача сводится к тому, чтобы выяснить, какой именно символ нарисован в каждой конкретной позиции. Символов (пусть для простоты это будут русские буквы и арабские цифры) у нас ограниченное количество – всего 43 штуки. То есть нам надо взять изображение в каждой из заполненных клеточек и отнести его к одному из 43 классов – по классу на символ. Это и есть классификация. В грубом приближении задачу можно сформулировать так: пусть в природе есть неизвестная нам функция f, отображающая пространство признаков X (в нашем случае вектор чисел, представляющих картинку с символом в растровом виде) на дискретное множество классов Y. Аналитически (в виде формулы или алгоритма) выразить функцию f мы не можем, потому что не знаем, как она устроена. Но зато у нас есть большое количество пар (x, y), про которые нам известно, что y = f(x). В нашем примере – это большой набор изображений рукописных букв и цифр, в котором для каждой картинки указано, какой именно символ на ней изображен. И нам по этому набору надо как-то построить приближение настоящей функции f – некую функцию g: X → Y, такую, чтобы g(x) почти всегда совпадала с f(x). Подходов тут разных много. Один из самых простых называется «k ближайших соседей» (k nearest neighbours, kNN). Суть его такая. Берем нашу выборку и представляем ее как набор точек в многомерном пространстве. Далее берем точку x, соответствующую набору признаков объекта, который мы хотим классифицировать. Находим k ближайших к ней точек обучающей выборки и смотрим, какой класс наиболее распространен среди них (напомню, для каждого объекта в обучающей выборке мы изначально знаем правильный класс). Этот наиболее многочисленный класс мы и «приписываем» нашему объекту.
К сожалению, kNN работает хорошо далеко не на всех задачах. Скажем, рукописные варианты буквы A могут иметь разное начертание, размер, ручка/карандаш могут оказаться «не совсем черными» после перевода картинки «в монохром» и т.п. При этом легко может получиться, что шум в расстояниях между векторами признаков «проявляется ярче», чем осмысленная информация, и модель не будет работать. В данном случае нужна более совершенная модель.
Более совершенные модели часто строятся по следующему принципу. Пусть у нас есть «универсальная функция» F: (X,Θ) → Y. Здесь X и Y, как и раньше, – пространство признаков и множество категорий, а Θ – пространство так называемых параметров модели. Эти параметры для конкретного экземпляра модели тоже можно представить себе как вектор чисел, нередко «очень многомерный» — он может иметь десятки миллионов элементов. За счет изменения параметров модели функция F может быть «подогнана» под интересную нам функцию f. Это можно представить себе так. Пусть f: R → R – обычная «одномерная» непрерывная, ограниченная функция, с параметром-числом и значением-числом и с областью определения [0, 1]. Пусть наша модель – ломаная линия с n сегментами, и абсциссы концов сегментов расположены через равные расстояния внутри интервала [0, 1]. Тогда пространство Θ состоит из n+1-мерных векторов из ординат концов отрезков ломаной. Очевидно, что мы можем подобрать такой вектор Θ из Θ, чтобы ломаная F(x,Θ) как можно лучше приближала f(x), причем, увеличивая n, мы можем сделать приближение сколь угодно точным (рис. 1).

Рис. 1. Пример функции²
Чтобы получить оптимальное значение вектора параметров, используется «подгонка» параметров под обучающую выборку. Делается это примерно так:
- Инициализируем параметры Θ случайными значениями
- Повторяем, пока не достигнута достаточная точность модели
- Берем очередные (x, y) из обучающей выборки. Если выборка кончилась, возвращаемся к ее началу
- Вычисляем F(x, Θ)
- Вычисляем значение ошибки L(F(x, Θ), y) – часто это обычный квадрат расстояния между точками
- Сдвигаем немножко каждый элемент Θ так, чтобы уменьшить L
Тут есть много тонкостей, которые по-разному решаются для разных моделей: что должна собой представлять функция F, как «сдвинуть» Θ именно в сторону уменьшения L, как добиться «схождения» модели, то есть роста качества ее работы до достаточного уровня, как избежать переобучения – ситуации, когда модель «зазубрила наизусть» обучающую выборку, а на незнакомых ей значениях выдает непредсказуемые результаты, и т.п.
Одним из самых широко применяемых классов моделей вышеописанного типа являются знаменитые искусственные нейронные сети. О них мы еще поговорим.
Примечание для самых дотошных. Часто природа закономерности, которую мы хотим смоделировать, на самом деле вероятностная. То есть зависимость Y от X формулируется не «объект со свойствами x относится к классу y», а «объект со свойствами x обычно относится к классу y», или даже «объект со свойствами x часто относится к классу y». В этом случае задача выглядит так: у нас есть выборка из совместного неизвестного нам распределения P(XY). Нам же надо построить как можно более точное приближение к условному распределению P(Y|X). В этом случае наша модель определяет не класс объекта по его признаком, а нечто похожее на значения вероятностей принадлежности объекта к каждому из классов. Но на практике, как ни странно, с точки зрения реализации эти случаи малоотличимы.
Вернемся, однако, к нашим индивидуальным предложениям. Вопросы «Нужен ли данный конкретный продукт данному конкретному клиенту?», «Готов ли данный клиент сегодня открыть вклад?» можно рассматривать как задачи классификации с двумя классами — «положительным» и «отрицательным». Имея достаточно обширные исторические данные о реакции клиентов на предложения банка, мы можем обучить компьютерные модели отвечать на вопросы такого рода. Однако здесь есть одна проблема – для того, чтобы накопить данные, придется в течение достаточно длительного периода рассылать предложения «наугад».
А теперь ненадолго отвлечемся и рассмотрим два класса задач машинного обучения, не имеющих отношения к целевым предложениям, – ведь, в конце концов, область применения искусственного интеллекта не ограничивается одной-единственной проблемой
Регрессия
Регрессия похожа на классификацию с одним отличием – функция f, которую мы хотим смоделировать, отображает пространство признаков не в множество классов, а, например, в обычное число (то есть это функция в привычном нам математическом смысле). Например, мы хотим оценить количество денег, которые надо загрузить в банкомат, чтобы их хватило на неделю, основываясь на исторических данных по этому и/или другим похожим банкоматам. Или, скажем, предсказать температуру воздуха на завтра. Регрессионные модели, как уже, наверное, стало понятно, часто используются в прогнозировании. С технической точки зрения классификация и регрессия – родственные задачи. И многие виды моделей (например, те же нейронные сети) можно применять как для задач классификации, так и для задач регрессии.
Embedding
Embedding (иногда переводится как «включение») – это особый класс моделей, предназначенных для снижения размерности пространства признаков объекта. Часто embedding «ставится перед» другой моделью (например, перед классификатором), и получается своего рода конвейер. Снижение размерности пространства признаков… Звучит загадочно? Попробую привести простой пример. Допустим, наша модель предназначена для семантической классификации текстов на естественном языке. Текст состоит из слов. Значит, нам нужно уметь представлять слова в виде последовательностей чисел. Можно решить задачу «в лоб» и выбрать в качестве представления вектор из Unicode-кодов букв, дополненный нулями до фиксированной размерности. Но это плохой вариант, потому что в таком случае, например, никак не связанные по смыслу глагол ковать и название реки Ловать будут иметь очень близкие представления, а обозначающие одно и то же слова самолет и аэроплан – очень далекие. Можно поступить по-другому. Пусть число измерений нашего пространства признаков соответствует числу слов в русском языке. Тогда мы можем выделить отдельное измерение для каждого конкретного слова. И представить слово вектором, у которого в «его» измерении стоит значение 1, а все остальные компоненты нулевые. Тогда любая пара слов будет «удалена» друг от друга на одно и то же расстояние. Но модель с таким количеством измерений пространства признаков может элементарно не уместиться ни в какой реалистичный объем памяти. К тому же, если мы хотим, чтобы наш классификатор хорошо обучался и стабильно работал, очень желательно, чтобы близкие по смыслу слова имели близкие представления (и наоборот). Для этого как раз и применяется embedding – модель, которая, будучи обученной на большом объеме текста, умеет преобразовывать слова в векторы в многомерном (обычно несколько сотен измерений) пространстве таким образом, чтобы близкие по смыслу слова «оказывались рядом». Самым известным текстовым embedding’ом является, наверное, Word2Vec. Он устроен таким образом, что слова, часто упоминающиеся в одном контексте, получают близкие представления, и, более того, взаимное расположение векторов может отражать семантические связи между словами (например, Embed(‘Россия’) – Embed(‘Москва’) ≈ Embed(‘Франция’) – Embed(‘Париж’)).
Другой пример embedding – идентификация лиц. Если перед нами стоит задача различать ограниченное количество заранее известных людей, мы можем обучить классификатор. Но на деле куда вероятнее другой случай, когда проблема ставится так: «Есть две фотографии. Модель должна определить, изображен ли на них один и тот же человек или два разных». Для этой цели обучается embedding таким образом, чтобы расстояние между векторами двух изображений одного человека было меньше, а расстояние между векторами изображений двух разных людей – больше некого фиксированного порогового значения.
Искусственные нейронные сети
Выше я обещал рассказать про нейронные сети. Выполняю свое обещание. Заодно посмотрим, можно ли их применить к нашей задаче про персональные предложения.
Искусственные нейронные сети – очень популярный и весьма универсальный вид машинно-обучаемых моделей. Авторы концепции нейронных сетей попытались отразить в ней принципы работы живого мозга. Простая многослойная полносвязная ИНС, так называемый перцептрон, устроена следующим образом (рис. 2).

Рис. 2. Искусственная нейронная сеть
Перцептрон состоит из нескольких слоев так называемых нейронов. Каждый из них соединен со всеми нейронами предыдущего слоя и со всеми нейронами следующего слоя, причем с каждой связью ассоциирован свой собственный числовой вес. Исходные данные (вектор признаков) поступают на входной слой, откуда «передаются» нейронам первого внутреннего, или скрытого, слоя; при этом передаваемая величина умножается на вес связи. Нейрон скрытого слоя суммирует поступающие на его вход сигналы и применяет к сумме так называемую функцию активации, обычно нелинейную (рис. 3). Функции активации применяются разные, графики некоторых из них приведены ниже.

Рис. 3. Примеры разных функций активации
Иногда перед применением функции активации к сумме входных сигналов добавляется фиксированное смещение – bias; у каждого слоя значение смещения свое собственное.
Полученное значение передается по связям на нейроны следующего слоя и так далее, пока не будет достигнут выходной слой. Выходной слой «устроен» аналогично скрытым. Значения, вычисленные в нейронах выходного слоя, и являются результатом работы модели.
Параметрами модели являются веса на связях и величины смещений. Обучение модели, соответственно, сводится к «подгонке» весов и смещений. Как правило, для обучения используется метод обратного распространения ошибки (backpropagation), который является частным случаем описанного выше общего метода обучения моделей. Он позволяет последовательно «подвинуть» в направлении уменьшения ошибки веса каждого слоя, начиная с выходного.
Сверточные и рекуррентные сети
Многослойные перцептроны хорошо подходят для задач, в которых вектор признаков имеет не очень большую фиксированную длину, однако это условие соблюдается не всегда. Рассмотрим, например, задачу классификации растровых изображений. Допустим, мы хотим обучить модель, различающую на фотографиях собак и кошек. Входным вектором здесь является собственно картинка, состоящая, как минимум, из десятков тысяч пикселей. Если мы создадим полносвязную сеть со слоями соответствующего размера, ее будет очень тяжело обучить из-за огромного объема необходимых вычислений. Поэтому для анализа изображений чаще используется специальный тип нейронных сетей – сверточные (convolutional neural networks, CNN). У такой сети нейрон скрытого слоя получает информацию не от всех нейронов предыдущего слоя, а только от нескольких, расположенных рядом друг с другом. В CNN применяется двухмерная структура входного и скрытых слоев, соответствующая «по форме» исходному изображению. Область слоя, «поставляющая» данные нейрону нижележащего слоя, обычно представляет собой прямоугольное окно фиксированного размера m × n (иногда одномерную «палочку» m × 1 или 1 × n). Можно представить себе, как будто окно «скользит» по матрице слоя, проецируя одну вычисленную им точку изображения на нижележащий слой. При этом надо отметить, что веса в сверточной сети ассоциированы с самим окном, но не с его текущей позицией. То есть, окно 3 × 3 – это одни и те же 9 весовых коэффициентов вне зависимости от того, куда оно в данный конкретный момент времени «приехало». Такое окно называется фильтром; фильтров в каждом слое сверточной сети обычно много – десятки или даже сотни, но размер каждого из них редко превышает 5 × 5 «пикселей». Помимо слоев с фильтрами (собственно сверточных) в состав CNN могут входить также слои уменьшения масштаба (их принято называть pooling) и полносвязные; последние обычно составляют выходной блок сети. Каждый фильтр обучается распознавать собственный «образец» фрагмента изображения (например, отрезок прямой линии с определенным углом наклона). За счет объединения слоев в «каскад» и перемежения сверточных слоев масштабирующими обеспечивается укрупнение и «обобщение» распознаваемых образцов по мере «погружения» сигнала в глубину слоев модели (рис. 4).

Рис. 4. Структура сверточной сети
Современные сверточные сети могут иметь очень большое количество сложным образом объединенных слоев. Ниже приведена схема классификатора изображений Google Inception v3.

Рис. 5. Схема классификатора изображений Google Inception v3
При этом архитектура CNN позволяет даже для такой внушительной модели иметь не слишком много параметров и, соответственно, относительно быстро и надежно обучаться.
А что делать, если нам надо классифицировать тексты? Например, мы хотим поделить высказывания по их эмоциональной окраске на «позитивные», «негативные» и «нейтральные». Текст «на элементарном уровне» состоит из букв, но отдельные буквы (вернее, звуки) могут нести эмоциональную нагрузку, пожалуй, только в поэзии. Средний обыватель соответствующим приемам не обучен. Поэтому первым делом нам стоит подняться с уровня букв на уровень слов. Для этого существует описанный выше embedding – он позволяет превратить слова разной длины в векторы одинаковой размерности, да еще и «сгруппированные по смыслу» — как раз то, что нам надо! А вот дальше можно применить уже знакомую нам сверточную сеть, только одномерную. Она будет «анализировать» сочетания слов, сочетания сочетаний слов и так далее. Можно надеяться, что после обучения такая сеть сможет в большинстве случаев правильно определять настроение, вложенное в фразу тем, кто ее произнес.
Помимо CNN для анализа текста и других данных, представляющих собой упорядоченную последовательность однородных объектов, предусмотрены специализированные архитектуры нейронных сетей, составляющие семейство под названием RNN (recurrent neural networks, рекуррентные нейронные сети). Основная их идея заключается в следующем: «за один шаг» такая сеть обрабатывает один элемент последовательности, но при этом помимо его данных в вычислениях участвуют также данные, накопленные при обработке предыдущих элементов. То есть рекуррентная сеть в некотором смысле обладает памятью. Существуют разные архитектуры RNN, отличающиеся в основном устройством памяти, например LSTM (long short-term memory) и GRU (gated recurrent unit).
Итак, для решения нашей задачи с классификацией текста мы можем воспользоваться либо CNN, либо RNN. Интересно, что рекуррентную сеть можно использовать не только для анализа, но и для генерации текста. Делается это, например, так. На большом объеме текстов обучается модель, предсказывающая вероятности различных вариантов следующего символа для заданного начала строки (например, для строки «крокоди» такая модель с почти единичной вероятностью должна предсказывать следующую букву «л»). Затем мы можем генерировать «естественный» текст следующим образом:
- строка := “”
- пока не достигнута нужная длина строки
- предсказать распределение следующего символа для префикса строка
- выбрать случайный следующий символ с в соответствии с вероятностями из полученного распределения
- строка := строка + с
После обучения модели на русской классике она начинает иногда выдавать забавные фразы типа «Я есть печаль» и «Историк ездил на тебе». Впрочем, большая часть сгенерированного текста у моей модели получалась бессвязной. Автором этой идеи является один из ведущих мировых специалистов по нейронным сетям Andrey Karpathy. Подробнее о его эксперименте можно почитать в авторском блоге (http://karpathy.github.io/2015/05/21/rnn-effectiveness/).
И снова вернемся к проблеме генерации индивидуальных предложений. Для каждого клиента мы должны уметь отвечать на два типа вопросов: «Нужен ли клиенту сейчас новый продукт конкретного вида (вклад, кредит, карта)?» и «Какой именно продукт подойдет данному клиенту?» (или, что эквивалентно «Подойдет ли продукт X данному клиенту?» для каждого из продуктов, которые предлагает банк). Можно предположить, что ответ на второй вопрос зависит от «текущих характеристик» клиента (возраста, места проживания, остатков, оборотов) и уже имеющихся у него продуктов. Эти характеристики можно записать в виде вектора фиксированной длины и передать его многослойному перцептрону. С первым же вопросом ситуация иная – понять, насколько подходящим является текущий момент, можно, проанализировав предшествующую историю общения клиента с банком, то есть набор однородных векторов-«записей». Для этого, как мы уже знаем, подойдет рекуррентная или сверточная сеть.
А какие еще есть применения?
Казалось бы, банковская сфера с ее строгими регламентами не оставляет много места для стохастических моделей. На самом деле, это не так. Многие задачи решаются с использованием технологий искусственного интеллекта. Вот отнюдь не претендующий на полноту список:
- Fraud detection – выявление фактов мошенничества
- Выделение смысловой информации из оснований платежных поручений
- Биометрическая идентификация клиента по фото и голосу
- Прогнозирование периодичности и объема подкрепления банкоматов и отделений наличностью
- Кредитный скоринг
Все эти задачи подразумевают либо анализ неструктурированных данных (естественного текста, изображений, звука), либо принятие решений на основе неких «правил», которые на практике невозможно явным образом сформулировать. И машинное обучение здесь подходит как нельзя лучше.
_________________________________________________________________
¹Имеется в виду «Справочник по высшей математике» М.Я. Выгодского.
²Пример функции взят с образовательного математического сайта exponenta.ru: http://old.exponenta.ru/educat/systemat/hanova/interp/images1/Image1008.gif
Читайте также

Siri, Алиса и финансовый чат-бот. Как робот-собеседник определит эмоциональное состояние вашего клиента?

Передел базы клиентов: основные тренды в сфере банковских технологий на 2018 год

В поисках идеального чат-бота

Что думают о чат-ботах в крупнейших российских банках?
Комментарии
Добавить комментарий
Подписка на рассылку
Сортировать
Выберите интересующий Вас продукт компании
Любой продукт
RS-Dealing
Учётное ядро RS-Bank v. 5.5
RSDH: Отчётность ЦБ
Asseco AML: система для противодействия легализации доходов
Учётное ядро RS-Core V.6
InterBank Corporate: ДБО юридических лиц
RSDH: Управленческая отчётность
InterBank Start: ДБО юридических лиц (для развивающихся банков)
Обслуживание физических лиц RS-Retail v. 5.5
RSDH: Финансовое планирование и контроль исполнения бюджета
Asseco InAct : система для предотвращения мошенничества
Обслуживание физических лиц RS-Retail V.6
InterBank Retail: ДБО физических лиц
RSDH: Управление клиентскими данными
InterBank FrontOffice: Автоматизация фронт-офисной деятельности
InterBank Mobile Retail
Автоматизация кредитного бизнеса RS-Loans v. 5.5
InterBank Mobile: Мобильный банк
Расчётная деятельность банка RS-Banking V.6
InterBank Factoring: Автоматизация факторинговых сделок
RSDH: Отчётность МСФО
Платформа InterBank RS
Автоматизация внутрихозяйственной деятельности банка RS-Incounting v. 5.5
RSDH: Портфельная отчётность
Работа с ценными бумагами и производными финансовыми инструментами RS-Securities V.6
RSDH: Система оценки финансового состояния
Платформа RS-DataHouse
Выпуск отчётности RS-Reporting V.6
Межбанковское кредитование RS-Dealing V.6
Кредитование и депозиты RS-Loans V.6
Модуль «RS-Connect. Получение выписки из ПФР»
Сведения об активах и пассивах клиента
Цифровой профиль
Модуль «RS-Connect. Получение справки 2-НДФЛ»
шдрщшр
Модуль «RS-Connect. Проверка действительности паспортов»
Модуль обмена с ЕСИА
RS-Bot: Виртуальный консультант
Модуль «RS-Connect. Работа с реестром банкротов»
Модуль обмена с ЕБС
RS-Digital: Push Server – универсальный push-сервер
Модуль «RS-Connect. Работа с реестром МСП»
Модуль обмена с ФССП
RS-Digital Front Office
Модуль «RS-Connect. Упрощенная идентификация»
Модуль обмена с ЦИК
RS-Payments
Модуль «RS-Connect. Цифровой профиль»
Модуль обмена с ПФР
Отчетность в формате XBRL
Модуль обмена с ЭББГ
RS-Insurance Front Office
Получение ИНН
Модуль обмена с ФТС
Модуль получения результатов госуслуг
RS-Insurance: XBRL
Модуль обмена с ГИС ЖКХ
Модуль обмена с Росреестром
Работа со справочником ПДЛ
Asseco Live: CRM платформа с интегрированным контакт-центром
Модуль обмена с ФНС
Обмен с ПФР информацией по материнскому (семейному) капиталу
Business Universe RS
Работа с реестром МСП
RSDH: Система контроля качества данных
Проект импортозамещения в ИТ
Модуль получения выписок из ЕГРЮЛ/ЕГРИП
Модуль обмена с ФСФМ
Подключение к СПФС
Работа с реестром банкротов
Система RS-FinMarkets
Модуль обмена с ГИС ГМП
Оперативная организация обмена данными с СПФС Банка России
Модуль упрощенной идентификации
Модуль «RS-Connect. Валидация СНИЛС»
Модуль обмена с ФинЦЕРТ
Модуль получения информации из ФНС о блокировках на счетах клиентов
Модуль «RS-Connect. Получение выписок из ЕГРЮЛ/ЕГРИП»»
Модуль обмена с СБП
Проверка паспорта на действительность
Модуль валидации СНИЛС
Модуль упрощенной идентификации
Обмен с платформой ЗСК
Модуль обмена с ФНП
Обмен с платформой ЗСК
