Рекуррентные нейронные сети

Введение и план этого курса

Здравствуйте и добро пожаловать на занятия по теме «Рекуррентные нейронные сети на языке Python: глубокое обучение, часть 5».

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

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

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

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

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

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

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

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

Обзор важнейших понятий глубокого обучения

Если вы проходили 1-ю, 2-ю, 3-ю и 4-ю части цикла по глубокому обучению, а также изучали скрытые марковские модели, то у вас должно быть более чем достаточно опыта для прохождения этого курса.

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

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

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

W\leftarrow W - \eta \bigtriangledown J.

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

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

В конце концов мы достигаем локального минимума, наклон касательной будет нулевым, так что значения весовых коэффициентов больше меняться не будут.

В курсе «Глубокое обучение, часть 4» вы узнали, как можно использовать нейронные сети для обучения без учителя. Обучение без учителя интересно тем, что позволяет нам находить закономерности в данных при отсутствии меток. Это именно то, что мы делаем при языковом моделировании: у нас есть некоторый объём текста, но, как правило, текст не имеет меток, это лишь строка слов, образующих в некотором роде закономерность. А одно из представлений об обучении без учителя состоит в том, что мы изучаем своего рода распределение вероятностей, которому следуют данные.

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

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

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

Где взять код и данные

Весь код для данного курса размещён на github. Вы можете получить его, перейдя по адресу https://github.com/lazyprogrammer/machine_learning_examples и открыв папку rnn_class. Git – это система контроля версий, позволяющая загружать обновления и сохранять историю всех изменений. Постоянно запускайте команду git pull, чтобы удостовериться, что у вас самая свежая версия кода. Будучи программистом высокого уровня, я ожидаю, что вы уже знакомы с этой системой. Тем более, что в будущем вероятно появление дополнений к этому курсу, в которых будут реализовываться дополнительные проекты, и они могут содержаться в своих собственных папках. В начале этих проектов я дам знать, где их искать.

Хочу подчеркнуть, что лекции, посвящённые написанию кода, преимущественно предназначены для самостоятельного и независимого написания кода. Не надо, чтобы вы только смотрели и никогда не пробовали сами. Это подобно попыткам научиться боксу, просматривая видео на Youtube, – согласитесь, не очень здравая идея. Вы должны натренировать «мышечную память» и задавать вопросы по каждому из этапов.

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

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

Поэтому для полноценного усвоения материала вам следует сочетать просмотр лекций, самостоятельное написание кода и проверки на наличие свежих версий этого кода.

Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: