Рекуррентные
нейронные сети
В
последний год приобретают популярность другие модели нейронных сетей: не
сверточные, которые мы применяем к изображениям, а так называемые рекуррентные
модели нейронных сетей. Что это такое?
Обычно такая сеть – сеть прямого
распространения – не имеет в себе никакой памяти. То есть, допустим, мы подали
изображение на эту сеть, она что-то распознала, мы подали следующее
изображение, и она ничего про предыдущее изображение уже не помнит. То есть она
никак не связывает последовательность изображений между собой. Во множестве
задач такой подход не очень применим, потому что если мы, например, возьмем
какой-нибудь текст, допустим, текст на естественном языке, какая-нибудь глава
книжки, то этот текст состоит из слов, и эти слова образуют некоторую
последовательность. И нам бы хотелось, чтобы мы, например, подавали это слово
на сеть, потом подавали на следующее слово, но чтобы она не забыла про
предыдущее слово, чтобы она помнила про него, помнила, что оно было, и
анализировала каждое следующее слово с учетом предыдущей истории. И для этого
существуют рекуррентные нейронные сети. Как здесь видно, кроме того, что у нас
есть путь от входных признаков к некоторому выходу нейронной сети, мы также
учитываем сигналы из этих внутренних слоев с предыдущих временных шагов, то
есть мы как бы запоминаем информацию, подаём её на вход опять самим себе. И
такую рекуррентную нейронную сеть можно развернуть.
Справа – это просто развертка по
времени. x0, x1, x2 и так далее. И сеть
еще помнит свое предыдущее состояние. И то, как она анализирует каждый входной
объект, зависит не только от этого объекта, но и от предыдущей истории.
Для чего это применяется? Одно из
интересных применений – например, мы хотим генерировать тексты просто по букве.
Допустим, мы сначала инициализируем эту сеть некоторой последовательностью,
например, словом, и дальше хотим, чтобы на каждом следующем временном шаге она
нам выплевывала просто букву, то есть какую следующую букву она хочет написать.
Это статья в LaTeX, которая позволяет одновременно писать, то есть это такой
язык программирования для написания статей по большому счету. Если
натренировать сеть таким образом и позволить ей генерировать текст, то
получаются осмысленные, по крайней мере, слова. То есть слова она не путает.
Кажется, что даже синтаксис предложений тоже получается осмысленным. То есть у
нас есть глагол, есть подлежащее, сказуемое в английском языке, но семантика
этих предложений, то есть их смысл, не всегда присутствует. Вроде с точки
зрения построения все выглядит хорошо, а смысла там бывает иногда немного. Но
это очень простая модель, она генерирует по одному символу за проход. И,
например, она еще даже пытается рисовать какие-то диаграммы здесь справа
наверху. Так как язык разметки LaTeX позволяет не только писать, но и рисовать,
то она пытается еще что-то рисовать.
Или,
например, мы можем непосредственно генерировать исходный код программ. Эта сеть
была обучена на исходном коде ядра операционной системы Linux, и мы можем
видеть, что, кажется, она генерирует, по крайней мере, похожий на осмысленный
код. То есть у нас есть, например, функции, есть разные условные выражения,
циклы и так далее. Кажется, что это выглядит осмысленно. Скоро сети будут сами
писать за нас программы, кажется, но, я думаю, что до этого еще далеко, и
программисты будут нам еще нужны, не только сети.
Оказывается, что тренировать
такие рекуррентные сети, если мы будем просто представлять их так слоями
нейронов, достаточно сложно. Сложно потому, что они очень быстро забывают
информацию о предыдущих объектах, которые мы им подавали до текущего. А иногда
нам нужно, чтобы они помнили взаимосвязи между объектами, которые очень
отдалены на расстоянии. Допустим, если мы себе представим «Войну и мир»,
чудесное произведение Льва Толстого, то там некоторые предложения занимают по
несколько строчек. И я помню, что когда я их читал, то к концу предложения я
уже забывал о том, что там было вначале. И такая же проблема наблюдается у
рекуррентных сетей, они тоже забывают, что было в начале последовательности, а
не хотелось бы. И для этого придумали более сложную архитектуру. Здесь важно
то, что у нас в центре есть один нейрон, который подает свой выход себе же на
вход. Мы видим такую рекуррентную связь. Кроме всего прочего у нас есть еще
отдельные нейроны, которые контролируют, они являются вентилями, то есть
определяют, нужно ли нам воспринимать текущую входящую информацию. Есть вентиль
на входе, то есть у нас есть некоторый вход, и мы определяем, нужно его
пропустить дальше или не нужно. Или нам нужно его игнорировать и просто
сохранить свои воспоминания. Точно также здесь есть вентиль на воспоминания:
стоит ли нам сохранять наши воспоминания в текущий момент времени о предыдущих,
или нам стоит их обнулить и сказать, что мы стираем нашу память.
— Откуда берется число нейронов,
и что они из себя представляют?
— Нейрон – это просто такой
сумматор, у которого есть какие-то входы и есть веса, с которыми он их
взвешенно суммирует. Это очень простой элемент.
А количество – это хороший
вопрос, вопрос экспериментального подхода. В разных задачах нам может быть
необходимо разное число слоев этих нейронов и разное количество нейронов в
слоях. Это очень сильно зависит от задачи. Каждый раз, когда вы сталкиваетесь с
какой-то задачей, которую вы хотите решить с помощью нейронных сетей, нужно
провести какое-то количество экспериментов, чтобы понять, что, если у вас 100
нейронов – этого недостаточно. Она плохо обучается, высокая ошибка на обучающем
множестве, надо больше нейронов. Например, 100 тыс нейронов – слишком много, у
нас нет таких вычислительных ресурсов, чтобы все обсчитать, ее обучить. Она
переобучается на множестве. Поэтому правда где-то посредине. Давайте возьмем 50
тыс., например, и получим оптимальное качество распознавания.
Подобные
сети, которые могут контролировать вентилями, нужно ли воспринимать текущий
вход и нужно ли забывать некоторую память, которая у нас на текущий момент
есть, они сейчас и применяются. И типичная архитектура такой сети выглядит
следующим образом.
У нас на вход этой сети подается
входная последовательность, например, некоторые предложения, и на выходе мы
тоже можем с помощью такой же рекуррентной сети генерировать слова. То есть мы
сворачиваем входящую последовательность и генерируем выходящую последовательность.
Для чего
это нужно? Применений очень много, поэтому я про все из них не буду
рассказывать. Одно из применений, которые активно исследуются, – это, например,
перевод. То есть на входе у нас предложение из одного языка, например, из
русского, а на выходе мы пытаемся сгенерировать перевод этого предложения на
другой язык, например, на английский. Другое приложение немножко фантастическое
– это когда у нас есть некоторая статья, которую нам написал какой-то
журналист, а мы хотим некую краткую выжимку из этой статьи, abstract. И мы
подаем на вход этой сети всю эту статью, а дальше она нам некоторое краткое
содержание этой статьи выплевывает на выводе.
Или,
например, мы можем обучить некоторую систему, которая будет вести диалог и
разговаривать с ней. Например, мы можем взять большие логи общения людей с
командой техподдержки, то есть людей, которые решают некоторые проблемы
пользователя, связанные с IT, натренировать такую сеть и попробовать пообщаться
с ней. Например, здесь у пользователя возникла проблема, что он не может
подключиться по сети к удаленному терминалу, и пользователь спрашивает, что ему
делать, и машина пытается решить его проблему. Она сначала пытается понять
некоторые входные данные, то есть какая операционная система у пользователя,
что он видит на экране, пытается проводить разные диагностические тесты и
предлагает какие-то решения. И все это сделано с помощью этой простой сети,
которая состоит просто из взвешивания различных входов, которые ей подаются на
вход. Здесь нет никаких тайных знаний, или люди не сидели долго-долго и не
думали, что «Давайте попробуем как-нибудь, если у нас есть одно слово в начале
предложения, другое слово в конце, как бы нам их связать, проанализировать?».
Нет, все это подали на нейронную сеть, она обучилась и генерирует такие
замечательные диалоги с человеком.
В конце концов, нейронная сеть
решает проблему человека. Она ему говорит, что нужно получить другой
сертификат, еще что-то, ввести пароль, и человек остается доволен.
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.