Нейронная сеть яндекса


Как научить свою нейросеть генерировать стихи / Хабрахабр

Умоляю перестань мне снитьсяЯ люблю тебя моя невестаБелый иней на твоих ресницахПоцелуй на теле бессловесном

Когда-то в школе мне казалось, что писать стихи просто: нужно всего лишь расставлять слова в нужном порядке и подбирать подходящую рифму. Следы этих галлюцинаций (или иллюзий, я их не различаю) встретили вас в эпиграфе. Только это стихотворение, конечно, не результат моего тогдашнего творчества, а продукт обученной по такому же принципу нейронной сети.

Вернее, нейронная сеть нужна лишь для первого этапа — расстановки слов в правильном порядке. С рифмовкой справляются правила, применяемые поверх предсказаний нейронной сети. Хотите узнать подробнее, как мы это реализовывали? Тогда добро пожаловать под кат.

Языковые модели

Определение
Начнем с языковой модели. На Хабре я встречал не слишком-то много статей про них — не лишним будет напомнить, что это за зверь.

Языковые модели определяют вероятность появления последовательности слов в данном языке: . Перейдём от этой страшной вероятности к произведению условных вероятностей слова от уже прочитанного контекста:

.

В жизни эти условные вероятности показывают, какое слово мы ожидаем увидеть дальше. Посмотрим, например, на всем известные слова из Пушкина:

Языковая модель, которая сидит у нас (во всяком случае, у меня) в голове, подсказывает: после честных навряд ли снова пойдёт мой. А вот и, или, конечно, правил — очень даже.

N-граммные языковые модели
Кажется, самым простым способом построить такую модель является использование N-граммной статистики. В этом случае мы делаем аппроксимацию вероятности — отбрасывая слишком далекие слова, как не влияющие на вероятность появления данного.

Такая модель легко реализуется с помощью Counter’ов на Python — и оказывается весьма тяжелой и при этом не слишком вариативной. Одна из самых заметных её проблем — недостаточность статистики: большая часть 5-грамм слов, в том числе и допустимых языком, просто не встретится в сколько-то ни было большом корпусе.

Для решения такой проблемы используют обычно сглаживание Kneser–Ney или Katz’s backing-off. За более подробной информацией про методы сглаживания N-грамм стоит обратиться к известной книге Кристофера Маннинга “Foundations of Statistical Natural Language Processing”.

Хочу заметить, что 5-граммы слов я назвал не просто так: именно их (со сглаживанием, конечно) Google демонстрирует в статье “One Billion Word Benchmark for Measuring Progress in Statistical Language Modeling” — и показывает результаты, весьма сопоставимые с результатами у рекуррентных нейронных сетей — о которых, собственно, и пойдет далее речь. Нейросетевые языковые модели

Преимущество рекуррентных нейронных сетей — в возможности использовать неограниченно длинный контекст. Вместе с каждым словом, поступающим на вход рекуррентной ячейки, в неё приходит вектор, представляющий всю предыдущую историю — все обработанные к данному моменту слова (красная стрелка на картинке).

Возможность использования контекста неограниченной длины, конечно, только условная. На практике классические RNN страдают от затухания градиента — по сути, отсутствия возможности помнить контекст дальше, чем на несколько слов. Для борьбы с этим придуманы специальные ячейки с памятью. Самыми популярными являются LSTM и GRU. В дальнейшем, говоря о рекуррентном слое, я всегда буду подразумевать LSTM.

Рыжей стрелкой на картинке показано отображение слова в его эмбеддинг (embedding). Выходной слой (в простейшем случае) — полносвязный слой с размером, соответствующим размеру словаря, имеющий softmax активацию — для получения распределения вероятностей для слов словаря. Из этого распределения можно сэмплировать следующее слово (или просто брать максимально вероятное).

Уже по картинке виден минус такого слоя: его размер. При словаре в несколько сотен тысяч слов его он легко может перестать влезать на видеокарту, а для его обучения требуются огромные корпуса текстов. Это очень наглядно демонстрирует картинка из блога torch:

Для борьбы с этим было придумано весьма большое количество различных приемов. Наиболее популярными можно назвать иерархический softmax и noise contrastive estimation. Подробно про эти и другие методы стоит почитать в отличной статье Sebastian Ruder.

Оценивание языковой модели
Более-менее стандартной функцией потерь, оптимизируемой при многоклассовой классификации, является кросс-энтропийная (cross entropy) функция потерь. Вообще, кросс-энтропия между вектором и предсказанным вектором записывается как . Она показывает близость распределений, задаваемый и . При вычислении кросс-энтропии для многоклассовой классификации — это вероятность -ого класса, а — вектор, полученный с one-hot-encoding (т.е. битовый вектор, в котором единственная единица стоит в позиции, соответствующей номеру класса). Тогда при некотором .

Кросс-энтропийные потери целого предложения получаются усреднением значений по всем словам. Их можно записать так: . Видно, что это выражение соответствует тому, чего мы и хотим достичь: вероятность реального предложения из языка должна быть как можно выше.

Кроме этого, уже специфичной для языкового моделирования метрикой является перплексия (perplexity):

.

Чтобы понять её смысл, посмотрим на модель, предсказывающую слова из словаря равновероятно вне зависимости от контекста. Для неё , где N — размер словаря, а перплексия будет равна размеру словаря — N. Конечно, это совершенно глупая модель, но оглядываясь на неё, можно трактовать перплексию реальных моделей как уровень неоднозначности генерации слова.

Скажем, в модели с перплексией 100 выбор следующего слова также неоднозначен, как выбор из равномерного распределения среди 100 слов. И если такой перплексии удалось достичь на словаре в 100 000, получается, что удалось сократить эту неоднозначность на три порядка по сравнению с “глупой” моделью.

Реализация языковой модели для генерации стихов

Построение архитектуры сети
Вспомним теперь, что для нашей задачи языковая модель нужна для выбора наиболее подходящего следующего слова по уже сгенерированной последовательности. А из этого следует, что при предсказании никогда не встретится незнакомых слов (ну откуда им взяться). Поэтому число слов в словаре остается целиком в нашей власти, что позволяет регулировать размер получающейся модели. Таким образом, пришлось забыть о таких достижениях человечества, как символьные эмбеддинги для представления слов (почитать про них можно, например, здесь).

Исходя из этих предпосылок, мы начали с относительно простой модели, в общих чертах повторяющей ту, что изображена на картинке выше. В роли желтого прямоугольника с неё выступали два слоя LSTM и следующий за ними полносвязный слой.

Решение ограничить размер выходного слоя кажется вполне рабочим. Естественно, словарь надо ограничивать по частотности — скажем, взятием пятидесяти тысяч самых частотных слов. Но тут возникает ещё вопрос: какую архитектуру рекуррентной сети лучше выбрать.

Очевидных варианта тут два: использовать many-to-many вариант (для каждого слова пытаться предсказать следующее) или же many-to-one (предсказывать слово по последовательности предшествующих слов).

Чтобы лучше понимать суть проблемы, посмотрим на картинку:

Здесь изображен many-to-many вариант со словарем, в котором не нашлось места слову “чернил”. Логичным шагом является подстановка вместо него специального токена <unk> — незнакомое слово. Проблема в том, что модель радостно выучивает, что вслед за любым словом может идти незнакомое слово. В итоге, выдаваемое ею распределение оказывается смещено в сторону именно этого незнакомого слова. Конечно, это легко решается: нужно всего лишь сэмплировать из распределение без этого токена, но всё равно остается ощущение, что полученная модель несколько кривовата.

Альтернативным вариантом является использование many-to-one архитектуры:

При этом приходится нарезать всевозможные цепочки слов из обучающей выборки — что приведет к заметному её разбуханию. Зато все цепочки, для которых следующее слов — неизвестное, мы сможем просто пропускать, полностью решая проблему с частым предсказанием <unk> токена.

Такая модель имела у нас следующие параметры (в терминах библиотеки keras):

Как видно, в неё включено 60000 + 1 слово: плюс первый токен это тот самый <unk>.

Проще всего повторить её можно небольшой модификацией примера. Основное её отличие в том, что пример демонстрирует посимвольную генерацию текста, а вышеописанный вариант строится на пословной генерации.

Полученная модель действительно что-то генерирует, но даже грамматическая согласованность получающихся предложений зачастую не впечатляет (про смысловую нагрузку и говорить нечего). Логичным следующим шагом является использование предобученных эмбеддингов для слов. Их добавление упрощает обучение модели, да и связи между словами, выученные на большом корпусе, могут придать осмысленность генерируемому тексту.

Основная проблема: для русского (в отличие от, например, английского) сложно найти хорошие словоформенные эмбеддинги. С имеющимися результат стал даже хуже.

Попробуем пошаманить немного с моделью. Недостаток сети, судя по всему — в слишком большом количестве параметров. Сеть просто-напросто не дообучается. Чтобы исправить это, следует поработать с входным и выходным слоями — самыми тяжелыми элементами модели.

Доработка входного слоя
Очевидно, имеет смысл сократить размерность входного слоя. Этого можно добиться, просто уменьшив размерность словоформенных эмебедингов — но интереснее пойти другим путём.

Вместо того, чтобы представлять слово одним индексом в высокоразмерном пространстве, добавим морфологическую разметку:

Каждое слово будем описывать парой: его лемма и грамматическое значение. Использование лемм вместо словоформ позволяет очень сильно сократить размер эмбеддингов: первым тридцати тысячам лемм соответствует несколько сотен тысяч различных слов. Таким образом, серьёзно уменьшив входной слой, мы ещё и увеличили словарный запас нашей модели.

Как видно из рисунка, лемма имеет приписанную к ней часть речи. Это сделано для того, чтобы можно было использовать уже предобученные эмбеддинги для лемм (например, от RusVectores). С другой стороны, эмбеддинги для тридцати тысяч лемм вполне можно обучить и с нуля, инициализируя их случайно.

Грамматическое значение мы представляли в формате Universal Dependencies, благо у меня как раз была под рукой модель, обученная для Диалога-2017.

При подаче грамматического значения на вход модели оно переводится в битовую маску: для каждой грамматической категории выделяются позиции по числу граммем в этой категории — плюс одна позиция для отсутствия данной категории в грамматическом значении (Undefined). Битовые вектора для всех категорий склеиваются в один большой вектор.

Вообще говоря, грамматическое значение можно было бы, так же как лемму, представлять индексом и обучать для него эмбеддинг. Но битовой маской сеть показала более высокое качество.

Этот битовый вектор можно, конечно, подавать в LSTM непосредственно, но лучше пропускать его предварительно через один или два полносвязных слоя для сокращения размерности и, одновременно — обнаружения связей между комбинациями граммем.

Доработка выходного слоя
Вместо индекса слова можно предсказывать всё те же лемму и грамматическое значение по отдельности. После этого можно сэмплировать лемму из полученного распределения и ставить её в форму с наиболее вероятным грамматическим значением. Небольшой минус такого подхода в том, что невозможно гарантировать наличие такого грамматического значения у данной леммы.

Эта проблема легко исправляется двумя способами. Честный путь — сэмплировать именно слово из действительно реализуемых пар лемма + грамматическое значение (вероятностью этого слова, конечно, будет произведение вероятностей леммы и грамматического значения). Более быстрый альтернативный способ — это выбирать наиболее вероятное грамматическое значение среди возможных для сэмплированной леммы.

Кроме того, softmax-слой можно было заменить иерархическим softmax’ом или вообще утащить реализацию noise contrastive estimation из tensorflow. Но нам, с нашим размером словаря, оказалось достаточно и обыкновенного softmax. По крайней мере, вышеперечисленные ухищрения не принесли значительного прироста качества модели.

Итоговая модель
В итоге у нас получилась следующая модель:
Обучающие данные
До сих пор мы никак не обсудили важный вопрос — на чём учимся. Для обучения мы взяли большой кусок stihi.ru и добавили к нему морфологическую разметку. После этого отобрали длинные строки (не меньше пяти слов) и обучались на них.

Каждая строка рассматривалась как самостоятельная — таким образом мы боролись с тем, что соседние строки зачастую слабо связаны по смыслу (особенно на stihi.ru). Конечно, можно обучаться сразу на полном стихотворении, и это могло дать улучшение качества модели. Но мы решили, что перед нами стоит задача построить сеть, которая умеет писать грамматически связный текст, а для такой цели обучаться лишь на строках вполне достаточно.

При обучении ко всем строкам добавлялся завершающий символ , а порядок слов в строках инвертировался. Разворачивать предложения нужно для упрощения рифмовки слов при генерации. Завершающий же символ нужен, чтобы именно с него начинать генерацию предложения.

Кроме всего прочего, для простоты мы выбрасывали все знаки препинания из текстов. Это было сделано потому, что сеть заметно переобучалась под запятые и прочие многоточия: в выборке они ставились буквально после каждого слова. Конечно, это сильное упущение нашей модели и есть надежда исправить это в следующей версии.

Схематично предобработка текстов может быть изображена так:

Стрелки означают направление, в котором модель читает предложение.

Реализация генератора

Правила-фильтры
Перейдём, наконец-то, к генератору поэзии. Мы начали с того, что языковая модель нужна только для построения гипотез о следующем слове. Для генератора необходимы правила, по которым из последовательности слов будут строиться стихотворения. Такие правила работают как фильтры языковой модели: из всех возможных вариантов следующего слова остаются только те, которые подходят — в нашем случае по метру и рифмовке.

Метрические правила определяют последовательность ударных и безударных слогов в строке. Записываются они обычно в виде шаблона из плюсов и минусов: плюс означает ударный слог, а минусу соответствует безударный. Например, рассмотрим метрический шаблон + — + — + — + — (в котором можно заподозрить четырёхстопный хорей):

Генерация, как уже упоминалось, идёт справа налево — в направлении стрелок на картинке. Таким образом, после мглою фильтры запретят генерацию таких слов как метель (не там ударение) или ненастье (лишний слог). Если же в слове больше 2 слогов, оно проходит фильтр только тогда, когда ударный слог не попадает на “минус” в метрическом шаблоне.

Второй же тип правил — ограничения по рифме. Именно ради них мы генерируем стихотворения задом наперед. Фильтр применяется при генерации самого первого слова в строке (которое окажется последним после разворота). Если уже была сгенерирована строка, с которой должна рифмоваться данная, этот фильтр сразу отсечёт все нерифмующиеся слова.

Также применялось дополнительное правило, запрещающее считать рифмами словоформы с одинаковой леммой.

У вас мог возникнуть вопрос: а откуда мы взяли ударения слов, и как мы определили какие слова рифмуются с какими? Для работы с ударениями мы взяли большой словарь и обучили на этом словаре классификатор, чтобы предсказывать ударения незнакомых слов (история, заслуживающая отдельной статьи). Рифмовка же определяется несложной эвристикой на основе расположения ударного слога и его буквенного состава.

Лучевой поиск
В результате работы фильтров вполне могло не остаться ни одного слова. Для решения этой проблемы мы делаем лучевой поиск (beam search), выбирая на каждом шаге вместо одного сразу N путей с наивысшими вероятностями.

Итого, входные параметры генератора — языковая модель, метрический шаблон, шаблон рифмы, N в лучевом поиске, параметры эвристики рифмовки. На выходе же имеем готовое стихотворение. В качестве языковой модели в этом же генераторе можно использовать и N-граммную модель. Система фильтров легко кастомизируется и дополняется.

Примеры стихов

Так толку мне теперь груститьЧто будет это прожитоНе суждено кружить в путиПочувствовав боль бомжика

Затерялся где то на аллееГде же ты мое воспоминаньеЯ люблю тебя мои родныеСколько лжи предательства и лестиНичего другого и не надоЗа грехи свои голосовые

Скучаю за твоим окномИ нежными эфирамиЛюблю тебя своим тепломТебя стенографируя

Ссылки

Пост был написан совместно с Гусевым Ильёй. В проекте также принимали участие Ивашковская Елена, Карацапова Надежда и Матавина Полина.

Работа над генератором была проделана в рамках курса “Интеллектуальные системы” кафедры Компьютерной лингвистики ФИВТ МФТИ. Хотелось бы поблагодарить автора курса, Константина Анисимовича, за советы, которые он давал в процессе.

Большое спасибо atwice за помощь в вычитке статьи.

habrahabr.ru

Алиса. Как Яндекс учит искусственный интеллект разговаривать с людьми

В будущем, как нам кажется, люди будут взаимодействовать с устройствами с помощью голоса. Уже сейчас приложения распознают точные голосовые команды, заложенные в них разработчиками, но с развитием технологий искусственного интеллекта они научатся понимать смысл произвольных фраз и даже поддерживать разговор на любые темы. Сегодня мы расскажем читателям Хабра о том, как мы приближаем это будущее на примере Алисы – первого голосового помощника, который не ограничивается набором заранее заданных ответов и использует для общения нейронные сети.

Несмотря на кажущуюся простоту, голосовой помощник – один из самых масштабных технологических проектов Яндекса. Из этого поста вы узнаете, с какими сложностями сталкиваются разработчики голосовых интерфейсов, кто на самом деле пишет ответы для виртуальных помощников, и что общего у Алисы с искусственным интеллектом из фильма «Она».

На заре своего существования компьютеры в основном применялись на крупных научных или оборонных предприятиях. Про голосовое управление тогда размышляли лишь фантасты, а в реальности операторы загружали программы и данные с помощью куска картона. Не самый удобный способ: одна ошибка, и все нужно начинать сначала.

С годами компьютеры становятся доступнее и начинают применяться в компаниях поменьше. Специалисты управляют ими с помощью текстовых команд, вводимых в терминале. Хороший, надежный способ – он применяется в профессиональной среде и по сей день, но требует подготовки. Поэтому когда компьютеры стали появляться в домах обычных пользователей, инженеры принялись искать более простые способы взаимодействия машины и человека.

В лаборатории компании Xerox зарождается концепция графического интерфейса WIMP (Windows, Icons, Menus, Point-n-Click) – массовое применение она нашла в продуктах уже других компаний. Заучивать текстовые команды для управления домашним компьютером больше не требовалось — им на смену пришли жесты и клики мышью. Для своего времени это было настоящей революцией. И теперь мир приближается к следующей.

Теперь почти у каждого в кармане лежит смартфон, вычислительных мощностей которого достаточно, чтобы посадить корабль на Луну. Мышь и клавиатуру заменили пальцы, но ими мы совершаем все те же жесты и клики. Это удобно делать, сидя на диване, но не в дороге или на ходу. В прошлом для взаимодействия с компьютерными интерфейсами человеку приходилось осваивать язык машин. Мы верим, что сейчас пришло время научить устройства и приложения общаться на языке людей. Именно эта идея легла в основу голосового помощника Алиса.

У Алисы можно спросить [Где поблизости выпить кофе?], а не диктовать что-то вроде [кофейня улица космонавтов]. Алиса заглянет в Яндекс и предложит подходящее место, а на вопрос [Отлично, а как туда пройти?] — даст ссылку на уже построенный маршрут в Яндекс.Картах. Она умеет отличать точные фактовые вопросы от желания увидеть классическую поисковую выдачу, хамство – от вежливой просьбы, команду открыть сайт – от желания просто поболтать.

Может даже показаться, что где-то в облаке работает нейронная чудо-сеть, которая в одиночку решает любые задачи. Но в реальности за любым ответом Алисы скрывается целая цепочка технологических задач, решать которые мы учимся уже 5 лет. И начнем мы свой экскурс с самого первого звена – со способности слушать.

Привет, Алиса

Искусственный интеллект из научной фантастики умеет слушать – людям не приходится нажимать на специальные кнопки, чтобы включить «режим записи». А для этого нужна голосовая активация – приложение должно понимать, что человек к нему обращается. Сделать это не так легко, как может показаться.

Если вы просто начнете записывать и обрабатывать на сервере весь входящий звуковой поток, то очень быстро разрядите батарейку устройства и потратите весь мобильный трафик. В нашем случае это решается с помощью специальной нейронной сети, которая обучена исключительно на распознавание ключевых фраз («Привет, Алиса», «Слушай, Яндекс» и некоторых других). Поддержка ограниченного числа таких фраз позволяет выполнять эту работу локально и без обращения к серверу.

Если сеть обучается понимать лишь несколько фраз, вы могли бы подумать, что сделать это достаточно просто и быстро. Но нет. Люди произносят фразы далеко не в идеальных условиях, а в окружении совершенно непредсказуемого шума. Да и голоса у всех разные. Поэтому для понимания лишь одной фразы необходимы тысячи обучающих записей.

Даже небольшая локальная нейронная сеть потребляет ресурсы: нельзя просто взять и начать обрабатывать весь поток с микрофона. Поэтому на передовой применяется менее тяжеловесный алгоритм, который дешево и быстро распознает событие «началась речь». Именно он включает нейросетевой движок распознавания ключевых фраз, который в свою очередь запускает самую тяжелую часть – распознавание речи.

Если для обучения лишь одной фразе необходимы тысячи примеров, то вы можете себе представить, насколько трудоемко обучить нейросеть распознаванию любых слов и фраз. По этой же причине распознавание выполняется в облаке, куда передается звуковой поток, и откуда возвращаются уже готовые ответы. Точность ответов напрямую зависит от качества распознавания. Именно поэтому главный вызов – научиться распознавать речь настолько же качественно, насколько это делает человек. Кстати, люди тоже совершают ошибки. Считается, что человек распознает 96-98% речи (метрика WER). Нам удалось добиться точности в 89-95%, что уже не только сопоставимо с уровнем живого собеседника, но и уникально для русского языка.

Но даже идеально преобразованная в текст речь ничего не будет значить, если мы не сможем понять смысл сказанного.

Какая погода завтра в Питере?

Если вы хотите, чтобы ваше приложение выводило прогноз погоды в ответ на голосовой запрос [погода], то здесь все просто – сравниваете распознанный текст со словом «погода» и если получаете совпадение, выводите ответ. И это очень примитивный способ взаимодействия, потому что в реальной жизни люди задают вопросы иначе. Человек может спросить у помощника [Какая погода завтра в Питере?], и тот не должен растеряться.

Первое, что делает Алиса при получении вопроса, это распознает сценарий. Отправить запрос в поиск и показать классическую выдачу с 10 результатами? Поискать один точный ответ и сразу выдать его пользователю? Совершить действие, например открыть сайт? А, может, просто поговорить? Невероятно сложно научить машину безошибочно распознавать сценарии поведения. И любая ошибка здесь малоприятна. К счастью, у нас есть вся мощь поисковой машины Яндекса, которая каждый день сталкивается с миллионами запросов, ищет миллионы ответов и учится понимать, какие из них хорошие, а какие – нет. Это огромная база знаний, на основе которых можно обучить еще одну нейронную сеть – такую, которая бы с высокой вероятностью «понимала», чего именно хочет человек. Ошибки, конечно же, неизбежны, но их совершают и люди.

С помощью машинного обучения Алиса «понимает», что фраза [Какая погода завтра в Питере?] – это запрос погоды (кстати, это заведомо простой пример для наглядности). Но о каком городе идет речь? На какую дату? Здесь начинается этап извлечения из пользовательских реплик именованных объектов (Named Entity Recognition). В нашем случае важную информацию несут два таких объекта: «Питер» и «завтра». И Алиса, у которой за плечами стоят поисковые технологии, «понимает», что «Питер» – синоним «Санкт-Петербурга», а «завтра» – «текущая дата + 1».

Естественный язык – не только внешняя форма наших реплик, но и их связность. В жизни мы не обмениваемся короткими фразами, а ведем диалог – он невозможен, если не помнить контекст. Алиса его помнит – это помогает ей разбираться со сложными лингвистическими явлениями: например, справляться с эллипсисом (восстанавливать пропущенные слова) или разрешать кореференции (определять объект по местоимению). Так, если спросить [Где находится Эльбрус?], а потом уточнить [А какая у него высота?], то помощник в обоих случаях найдет верные ответы. А если после запроса [Какая погода сегодня?] спросить [А завтра?], Алиса поймет, что это продолжение диалога про погоду.

И кое-что еще. Помощник должен не только понимать естественный язык, но и уметь говорить на нем – как человек, а не как робот. Для Алисы мы синтезируем голос, в оригинале принадлежащий актрисе дубляжа Татьяне Шитовой (официальный голос Скарлетт Йоханссон в России). Она озвучивала искусственный интеллект в фильме «Она», хотя вы могли запомнить ее и по озвучке чародейки Йеннифэр в «Ведьмаке». Причем речь идет о достаточно глубоком синтезе с применением нейронных сетей, а не о нарезке готовых фраз – записать все их многообразие заранее невозможно.

Выше мы описали особенности естественного общения (непредсказуемая форма реплик, отсутствующие слова, местоимения, ошибки, шум, голос), с которыми нужно уметь работать. Но у живого общения есть еще одно свойство – мы далеко не всегда требуем от собеседника конкретного ответа или действия, иногда нам просто хочется поговорить. Если приложение будет отправлять такие запросы в поиск, то вся магия разрушится. Именно поэтому популярные голосовые ассистенты используют базу редакторских ответов на популярные фразы и вопросы. Но мы пошли еще дальше.

А поболтать?

Мы научили машину отвечать на наши вопросы, вести диалог в контексте определённых сценариев и решать задачи пользователя. Это хорошо, но можно ли сделать ее менее бездушной и наделить человеческими свойствами: дать ей имя, научить рассказывать о себе, поддерживать разговор на свободные темы?

В индустрии голосовых помощников эта задача решается с помощью редакторских ответов. Специальная команда авторов берет сотни наиболее популярных у пользователей вопросов и пишет по несколько вариантов ответов на каждый. В идеале это нужно делать в едином стиле, чтобы из всех ответов складывалась цельная личность помощника. Для Алисы мы тоже пишем ответы – но у нас есть кое-что еще. Кое-что особенное.

Помимо топа популярных вопросов существует длинный хвост из низкочастотных или даже уникальных фраз, на которые заранее подготовить ответ невозможно. Вы уже догадались, с помощью чего мы решаем эту проблему, не так ли? С помощью еще одной нейросетевой модели. Для ответов на неизвестные ей вопросы и реплики Алиса использует нейросеть, обученную на огромной базе текстов из интернета, книг и фильмов. Знатоков машинного обучения, возможно, заинтересует то, что начинали мы с 3-слойной нейронной сети, а теперь экспериментируем с огромной 120-слойной. Детали прибережем для специализированных постов, а здесь скажем, что уже текущая версия Алисы старается отвечать на произвольные фразы с помощью «нейросетевой болталки» – так мы ее называем внутри.

Алиса учится на огромном количестве самых разных текстов, в которых люди и персонажи далеко не всегда ведут себя вежливо. Нейросеть может научиться совсем не тому, чему мы хотим ее научить.

– Закажи мне сэндвич. – Обойдетесь. Как и любого ребенка, Алису нельзя научить не хамить, ограждая ее от всех проявлений хамства и агрессии – то есть обучая нейросеть на «чистой» базе, где нет грубостей, провокаций и прочих неприятных вещей, часто встречающихся в реальном мире. Если Алиса не будет знать о существовании подобных выражений, она будет отвечать на них бездумно, случайными фразами – для неё они останутся неизвестными словами. Пусть лучше она знает, что это такое – и выработает определённую позицию по этим вопросам. Если ты знаешь, что такое мат, ты можешь либо ругнуться в ответ, либо сказать, что не станешь разговаривать с ругающимся. И мы моделируем поведение Алисы так, чтобы она выбирала второй вариант.

Бывает так, что сама по себе реплика Алисы вполне нейтральна, но вот в контексте, заданном пользователем, ответ перестаёт быть безобидным. Однажды, еще во время закрытого тестирования, мы попросили пользователя найти какие-то заведения – кафе или что-то подобное. Он сказал: «Найди другое такое же». И в этот момент в Алисе случился баг, и она вместо запуска сценария поиска организации дала довольно дерзкий ответ – что-то вроде «на карте поищи». И не стала ничего искать. Пользователь сначала удивился, а потом удивил и нас, похвалив поведение Алисы.

Когда Алиса использует «нейросетевую болталку», в ней может проявиться миллион разных личностей, так как нейросеть вобрала в себя немного от автора каждой реплики из обучающей выборки. В зависимости от контекста Алиса может быть вежливой или грубой, жизнерадостной или депрессивной. Мы же хотим, чтобы персональный помощник представлял собой целостную личность со вполне определенным набором качеств. Здесь на помощь приходят наши редакторские тексты. Их особенность в том, что они изначально написаны от лица той личности, которую мы хотим воссоздать в Алисе. Получается, что можно продолжать обучать Алису на миллионах строк случайных текстов, но отвечать она будет с оглядкой на эталон поведения, заложенный в редакторских ответах. И это то, над чем мы уже работаем.

Алиса стала первым известным нам голосовым помощником, который старается поддерживать общение не только с помощью редакторских ответов, но и используя обученную нейронную сеть. Конечно же, мы еще очень далеки от того, что изображают в современной фантастике. Алиса не всегда точно распознает суть реплики, что влияет на точность ответа. Поэтому работы у нас еще много.

Мы планируем сделать Алису самым человекоподобным помощником в мире. Привить ей эмпатию и любознательность. Сделать её проактивной – научить ставить цели в диалоге, проявлять инициативу и вовлекать собеседника в разговор. Сейчас мы одновременно и в самом начале пути, и на переднем крае наук, изучающих эту область. Чтобы двигаться дальше, придется этот край подвинуть.

Поговорить с Алисой можно в приложении Яндекс для Android и iOS, в бета-версии для Windows, а скоро и в Яндекс.Браузере. Нам было бы интересно обсудить, каким вы видите будущее голосовых интерфейсов и сценарии его использования.

habrahabr.ru

Нейросети, космос, человек: «Яндекс» представил новый поиск

«Яндекс» запустил принципиально новую версию своего поисковика, основанную на использовании нейронных сетей. Новый поиск базируется на интеллектуальном алгоритме «Королёв». В результате поисковик отвечает на сложные вопросы ещё более точно, причём это касается не только текстовой информации, но и графики, видео, аудио. Кроме того, в «Яндексе» рассказали о значительных изменениях в архитектуре самого индекса.

Презентация новой версии поисковика «Яндекса» прошла в Московском планетарии минувшим вечером. Собственно, площадка планетария должна была настроить аудиторию на нечто возвышенное, высокоинтеллектуальное, космическое и скоростное. Ну, а нехватка мест в зале была объяснима. Всем хотелось узнать, что же такого нового представит крупнейшая ИТ-компания России в области поиска. А представлен был новый алгоритм поиска «Королёв», названный в честь легендарного советского конструктора Сергея Королева.

В начале мероприятия представители «Яндекса» рассказали об истории развития поиска. Первые поисковые системы появились в середине 1990-х годов, когда интернет был совсем небольшим — счёт сайтов шёл на тысячи. Чтобы помочь человеку найти нужное, достаточно было составить список веб-страниц, где есть слова из поискового запроса. О сложном ранжировании (упорядочивании страниц по степени соответствия запросу) тогда речь не шла. Считалось, что чем чаще в документе встречаются слова из запроса, тем лучше он подходит.

Между тем, Интернет быстро рос, и потребовались дополнительные критерии отбора. Поисковики начали учитывать ссылки на документы, научились определять регион, откуда поступил запрос, стали обращать внимание на поведение пользователей.

В какой-то момент факторов ранжирования (признаков, по которым можно определить, насколько хорошо страница отвечает на запрос) набралось так много, что стало ясно: прописать их все в виде инструкций невозможно. Лучше научить машину самостоятельно принимать решения. Осталось понять, какие признаки использовать и как их комбинировать. В «Яндексе» для этих целей создали «Матрикснет» - метод машинного обучения, с помощью которого строится формула ранжирования и пристраиваются внутренние связи.

Перед тем как пустить в ход сложную формулу ранжирования, поисковые машины составляют список «предварительно подходящих» веб-страниц — таких, в которых есть слова из запроса. Нам, людям, понятно, что один и тот же смысл можно выразить разными словами. Веб-страница может не содержать всех слов из запроса, но тем не менее очень хорошо на него отвечать. Однако объяснить это машине довольно сложно.

«Первый шаг к поиску по смыслу «Яндекс» сделал в прошлом году, когда мы представили поисковый алгоритм «Палех». В его основе лежит нейронная сеть. Нейросети показывают отличные результаты в задачах, с которыми люди традиционно справлялись лучше машин: скажем, распознавание речи или объектов на изображениях», - рассказывает Андрей Стыскин, руководитель Яндекс.Поиска. - Запуская «Палех», мы научили нейронную сеть преобразовывать поисковые запросы и заголовки веб-страниц в группы чисел — семантические векторы. Важное свойство таких векторов состоит в том, что их можно сравнивать друг с другом. Чем сильнее будет сходство, тем ближе друг к другу по смыслу запрос и заголовок».

«Королёв» является развитием алгоритма «Палех», он делает ещё один шаг вперёд. Он умеет сравнивать смысл поискового запроса со смыслом страниц, а не только их заголовков. По мнению разработчиков, «Королёв» позволит более точно понимать смысл поисковых запросов пользователей и делать ответы на них более релевантными даже в том случае, если сам запрос очень редкий и непонятный.

Кроме того, алгоритм «Королёв» обещает существенным образом улучшить качество поиска по картинкам. До сих пор он работал только по поиску слов, содержащихся на страницах с картинками. «Королев» же использует нейтросети для того, чтобы понять смысл картинок.

Принцип работы

id="sub0">

Поисковый алгоритм «Королёв» сравнивает семантические векторы поисковых запросов и веб-страниц целиком, а не только их заголовков. Это позволяет выйти на новый уровень понимания смысла. Тексты веб-страниц в семантические векторы преобразует нейросеть. Эта операция требует много вычислительных ресурсов. Поэтому «Королёв» высчитывает векторы страниц не в режиме реального времени, а заранее, на этапе индексирования. Когда человек задаёт запрос, алгоритм сравнивает вектор запроса с уже известными ему векторами страниц.

Умение понимать смысл особенно полезно при обработке редких и необычных запросов. Это происходит, когда люди пытаются описать своими словами свойства того или иного объекта и ожидают, что поиск подскажет его название. Примеры таких запросов: «картина где небо закручивается» или «ленивая кошка из монголии».

Такая схема позволяет начать подбор веб-страниц, соответствующих запросу по смыслу, на ранних стадиях ранжирования. В «Палехе» смысловой анализ — один из завершающих этапов: через него проходят всего 150 документов. В «Королёве» он производится для 200 тысяч документов — то есть в тысячу с лишним раз больше. Кроме того, новый алгоритм не только сравнивает текст веб-страницы с поисковым запросом, но и обращает внимание на другие запросы, по которым люди приходят на эту страницу. Так можно установить дополнительные смысловые связи.

«У нас есть запрос человека и заголовок страницы, которая претендует на попадание в топ выдачи. Нужно понять, насколько они соответствуют друг другу по смыслу. Для этого мы представляем текст запроса и текст заголовка в виде таких векторов, скалярное произведение которых было бы тем больше, чем релевантнее запросу документ с данным заголовком. Иначе говоря, мы с помощью накопленной поисковой статистики обучаем нейронную сеть таким образом, чтобы для близких по смыслу текстов она генерировала похожие вектора, а для семантически несвязанных запросов и заголовков вектора должны различаться», - говорит Александр Сафронов, руководитель службы релевантности Яндекс.Поиска.

Как только человек вводит запрос в Яндексе, сервера «Яндекса» в режиме реального времени преобразуют тексты в вектора и сравнивают их. Результаты этого сравнения используются поисковой машиной в качестве одного из факторов. Представляя текст запроса и текст заголовка страницы в виде семантических векторов, модель позволяет уловить достаточно сложные смысловые связи, которые иначе выявить трудно, что в свою очередь сказывается на качестве поиска.

Оценка качества

id="sub1">

В «Яндексе» подчёркивают, что использование машинного обучения и нейросетей позволит научить поиск оперировать смыслами на уровне человека. Но без помощи людей тут не обойтись. Чтобы машина поняла, как решать ту или иную задачу, необходимо показать ей огромное количество примеров, как положительных, так и отрицательных. Такие примеры дают пользователи «Яндекса».

Нейронная сеть, которую использует алгоритм «Королёв», обучается на обезличенной поисковой статистике. Системы сбора статистики учитывают, на какие страницы пользователи переходят по тем или иным запросам и сколько времени они там проводят. Если человек открыл веб-страницу и «завис» там надолго, вероятно, он нашёл то, что искал. Это говорит о том, что страница хорошо отвечает на его запрос. Это положительный пример. Подобрать отрицательные примеры гораздо легче: достаточно взять запрос и любую случайную веб-страницу.

В помощи людей нуждается и «Матрикснет», который строит формулу ранжирования. Чтобы поиск развивался, люди должны постоянно давать оценку его работе.

«Когда-то выставлением оценок занимались только сотрудники Яндекса - так называемые асессоры. Но чем больше оценок, тем лучше. Поэтому мы решили привлечь к этому всех желающих и запустили сервис «Яндекс.Толока». Сейчас там зарегистрировано более миллиона пользователей: они анализируют качество поиска и участвуют в улучшении других сервисов Яндекса. Задания на «Толок»е оплачиваются — сумма, которую можно заработать, указана рядом с заданием. За два с лишним года существования сервиса толокеры дали около двух миллиардов оценок», - приводит данные Ольга Мегорская, руководитель отдела обработки данных Яндекс.Поиска.

«Королёв» – это не одна конкретно взятая модель, а целый комплект технологий более глубокого применения нейронных сетей в поиске «Яндекса». В перспективах у разработчиков – использование персонализации поиска, соответствующей интересам человека.

Также в беседе с разработчиками стало известно о том, что переход к анализу содержимого страниц из поисковой выдача может радикально сказаться на рынке поисковой оптимизации (SEO). Однако конкретной статистики в самом «Яндексе» по этому поводу не привели.

1 / Мне нравится

Похожие сюжеты / 2

 

yamobi.ru

Искусственный разум "Яндекса" записал альбом в стиле "Нирваны"

10:3527.06.2017

(обновлено: 16:06 27.06.2017)

10102297

МОСКВА, 27 июн — РИА Новости. Программисты из "Яндекса" создали новую систему искусственного интеллекта, которая может сочинять стихи на английском языке, похожие на тексты песен лидера "Нирваны" Курта Кобейна, и опубликовали первый альбом "Нейроны" во всех популярных музыкальных каталогах.

"Яндекс" создал искусственный интеллект, пишущий музыкуКак сообщает пресс-служба компании, год назад два программиста, Иван Ямщиков и Алексей Тихонов, разработали необычную систему ИИ, которая умела писать тексты и стихи в стиле певца Егора Летова, лидера группы "Гражданская оборона". Используя эту систему и помощь профессиональных музыкантов, ученые записали первый альбом нейросети и выложили ее в музыкальных каталогах под названием "Нейронная оборона".

На этом ученые решили не останавливаться, и сейчас Ямщиков, работающий в Институте научной математики Общества Макса Планка в Лейпциге (Германия), подготовил новую версию искусственного разума, который может сочинять стихи и песни не на русском, а на английском языке. 

Как отмечает Ямщиков, для решения этой задачи ему пришлось собрать огромный архив современной и классической зарубежной поэзии, общий объем которой составил около 200 мегабайт.

Первый анализ текстов показал, что научить компьютер говорить по-английски в стиле Чосера или Шекспира гораздо сложнее, чем сделать то же самое для русского языка — проблема заключается в том, что в англоязычной поэзии гораздо меньше четко установленных правил и не всегда работает "нормальная" грамматика.

Ученые создали программу, способную "перекрасить" кино под Ван Гога

Поэтому Ямщикову и его единомышленникам пришлось удалить часть текстов из архива, чтобы нейросеть могла "научиться" писать стихи на их примере. Сеть они использовали для того, чтобы написать стихи в стиле Курта Кобейна, из которых выбрали четыре наиболее удачных и использовали их для создания первых аудиозаписей "Нейроны". 

Для их подготовки ученые воспользовались помощью профессионального американского музыканта Роба Кэррола, одного из поклонников Курта Кобейна и его рок-группы. Итоговый результат они записали, как рассказывает Ямщиков, на старую аудиокассету с альбомом настоящей "Нирваны" и опубликовали клип на одну из песен в YouTube. По словам ученого, алгоритм работы нейросети и детали ее разработки будут в ближайшее время опубликованы в одном из рецензируемых научных журналов.

—  Иван, учитывая сложности, с которыми вы сталкивались при создании "Нейроны", пробовали ли вы сделать нечто похожее для текстов певицы Линды, известной необычным стилем стихов?

—  Год назад мы обучили нейросеть генерировать тексты в стиле Егора Летова. В принципе, ничто не мешает научить ее генерировать тексты и в стиле Линды.

— Если нейросети теперь могут писать даже стихи и музыку, есть ли что-то, что они никогда не смогут сделать в принципе?

— Это интересный вопрос, на который точного ответа нет. Главное помнить, что нейросеть — это не персонаж. Это просто тип алгоритма, инструмент, созданный для решения той или иной задачи. Как именно формулировать проблему, условия, ограничения, где брать данные для обучения? Со всеми этими вопросами, к примеру, сейчас работает человек.

— Что именно заставило записать вас "Нейрону" на старую кассету с альбомами "Нирваны"?

— Мы поступили так же с записями "Нейронной обороны". Это своего рода традиция. Есть что-то очень родное в звучании кассетного плеера. Не зря же по сети постоянно ходит картинка с карандашом, старой кассетой и подписью "если ты знаешь, как эти предметы связаны друг с другом, ты жил в 90-е".

 — Учитывая появление нейросетей, способных имитировать творчество известных людей, не появится ли в будущем соблазн ввести право собственности и копирайт не только на конкретные аудиозаписи, но и на стиль художника, музыканта или композитора?

Российские ученые научили компьютер угадывать возраст людей по тесту крови— Это, скорее, вопрос к специалистам из области права. В искусстве в целом пока есть элемент эксклюзивности. То, что нейросети умеют теперь имитировать стиль Ван Гога, не девальвирует его творчество. Есть элемент опосредованного общения между человеком, создавшим то или иное произведение, и человеком, который его увидел, услышал, прочитал.

Это, мне кажется, должно снимать вопросы копирайта. Куда интереснее то, что машинный интеллект может становиться соавтором, очередным инструментом, который просто доступен художнику и позволяет делать более интересные вещи.

ria.ru

Как нейронная сеть по имени Зинаида Фолс написала для РБК стихи о будущем :: Бизнес :: Журнал РБК

Португальские ученые научились замерять уровень сарказма в соцсетях, специалисты Google выработали подобие интуиции у механических систем, Microsoft превращает голос в письменную речь. А сотрудники «Яндекса» создали робота Зинаиду, который пишет стихи. Нейросеть зовут Зинаида Фолс, и по просьбе журнала РБК она написала несколько стихов по мотивам известных поэтов

Фото: Depositphotos

Сложно представить будущее без искусственного интеллекта, технологий глубокого машинного обучения и «умных» нейросетей, и с каждым годом они становятся все совершеннее. С 2016 года компания «Яндекс» использует нейронные сети для улучшения качества ранжирования результатов поиска. А международное подразделение Yandex Data Factory, анализируя массивы данных с помощью технологий распознавания образов и речи, обработки естественного языка и глубоких нейросетей, решает бизнес-задачи — от сокращения издержек до увеличения объемов продаж.

В прошлом году ведущий аналитик «Яндекса» Алексей Тихонов научил нейросеть писать стихи. Так появился робот, которого назвали Зинаида Фолс. В июне к Тихонову присоединился другой аналитик компании, Иван Ямщиков, и вместе они выпустили альбом «Нейронная оборона» — он состоит из десяти песен на стихотворения, написанные Фолс в стиле основателя группы «Гражданская оборона» Егора Летова. Также нейропоэт написала стихи для первого номера журнала Политехнического музея.

Специально для номера журнала РБК, посвященного индустриям будущего, мы попросили Зинаиду Фолс написать текст о нейросетях, то есть о самой себе. В «Яндексе» пояснили, что на выполнение такой задачи уйдет несколько лет: столько потребуется на обучение алгоритма с привлечением экспертизы лингвистов. Нейросеть пока умеет работать с образами, но не с сюжетами. «Поэтический образ можно воспроизвести прямым копированием, плюс можно понадеяться на разум читателя, который достроит его сам. А создание некой строгой систематизированной классификации сюжетов для обучения машины — это уже следующее направление, выходящее за пределы компьютерной науки и больше связанное с филологией и нарратологией», — объясняет Ямщиков. Иногда нейропоэт может сочетать слова, которые живой человек никогда бы не использовал, ошибаться с синтаксисом или даже со спряжением, но это вопрос времени, утверждают разработчики.

Задачу для Зинаиды немного упростили: нейросети нужно было написать текст со словами «будущее», «будет» и «время», но не в прозе, а в стихах. Роботу показали всю поэзию на русском языке, которая известна «Яндексу», или примерно 130 Мб текста (полное собрание сочинений Уильяма Шекспира — примерно 5 Мб). Каждое из стихотворений Фолс «прочитала» примерно десять раз. В результате мы получили пять стихотворений-подражаний Владимиру Маяковскому, Анне Ахматовой, Велимиру Хлебникову, Борису Пастернаку и Самуилу Маршаку. Стихотворения робот писал несколько часов. Мы сохранили авторские названия стихотворений, орфографию и пунктуацию.

Это

это всего навсего что-то в будущем и мощь у того человека есть на свете все или нет это кровьа вокруг по рукам жиреет слава у земли с треском в клюве,>

Так будет завтра длиться

так будет завтра длиться в темном сумраке сада там где пляшет колесница от радости бога награда

мы поняли что время от руки не осилить не выйду не встану не любя ни разу ни строки кто кого из нас не выйдет замуж

кто же вы те дни и те ночи да слабые мысли и вздохи о них мой город прекрасен и скучен покуда был первый жених

День над городом

день над городом в небе летит в белой сирени в роще в заре он видит лунные пятна черные очи в каменных клетках

Так скоро будет быть так скоро будет быть и поздно про ваши голоса во сне в тихом домике в зале над бездной ты только вспомни обо мне

ты и я знаем лишь о чуде о том что время с перепою и каждому столетью будет луна над вечерней невою

и я скажу, а завтра все сначала что опять его станут умней был день как семь лет без скандала и минут до скончания дней спит человек как цветок

Я искал свой интерес

я искал свой интерес повезут их в ресторан и храпит последний кран на работу или в лес

эта ночь была в бутылкеа на скамейке у крыльца как у самого конца я люблю твои прогулки,>

что же ты меня привеза глядишь на косогоре о своей судьбе о горе словно выстрелы из слез,>

я не умею говорить сколько в будущем там над желтым кладбищем может быть

www.rbc.ru


Смотрите также