Рекуррентные нейронные сети в настоящее время являются одной из самых мощных моделей машинного обучения. Они лежат в основе многих достижений в области распознавания речи, машинного перевода и обработки естественного языка.
Отличительной чертой рекуррентных нейронных сетей является то, что они могут не только обнаруживать объекты, но и использовать их для генерировать последовательности. (Например, посмотрите мой API прогнозирования кода Python или этот хороший пост в блоге Андрея Карпати).

Рекуррентная нейронная сеть учится предсказывать следующие слова или символы при некотором вводе. На высоком уровне это работает как на следующей картинке:

В этом примере наиболее вероятным является первое слово The. Тогда, учитывая ** The **, наиболее вероятно слово Кошка. Тогда, учитывая Кот, вероятнее всего, Кот и т. Д.

Однако при обучении выходом RNN является распределение вероятностей вместо одного слова.
При генерации текста мы сами выбираем одно из слов с учетом вероятностей и передаем их обратно в сеть. Это называется выборкой.

Жадный поиск

Самая простая форма выборки - жадный поиск. В каждой точке он выбирает наиболее вероятное следующее слово. Например, TheThe CatThe Cat IsThe Cat Is Home. Вы увидите это на следующем рисунке:

Однако у этого метода есть несколько недостатков. Сначала будет сгенерирован только один образец, если вы хотите иметь больше образцов на выбор: облом! Кроме того, он не может смотреть вперед: он мог бы, например, создать Кот Кот вместо Кот дома, потому что после Кошки имел самую высокую вероятность. Но он не мог видеть, что The Cat Is Home лучше всего, что было создано облаком после The Cat The. Например, в реальном примере вы можете получить что-то вроде этого на выходе:

и чувственное, и некоторые, чувства, и некоторые, и чувства, и чувство, такое и такое там, как больное, и все, некоторые, и там, и и и, и чувства такого, чувство некоторых и и некоторые, и такие, и смысл, и некоторые, и те, и некоторые, и грехи, с сокрентием, и некоторые, и концерты, и некоторые, и как

Не очень оригинально, правда? Обратите внимание на повторение, например, слова и и большого количества некоторых, таких и значений.

Поиск луча

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

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

Случайная выборка

Теперь перейдем к случайной выборке. Случайный поиск работает путем выбора следующего слова с вероятностями каждого слова, взятыми из выходных данных модели (распределение вероятностей). Например: слово The имеет вероятность 0,8, поэтому 8 раз из 10 следующим словом будет The, 2 раза из 10 он будет генерировать другое слово. Взгляните, например, на эту картинку:

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

Заключение

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