www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Рекуррентные нейронные сети на примере в Python

Дата публикации Nov 5, 2018

В первый раз, когда я пытался изучать рекуррентные нейронные сети, я совершил ошибку, пытаясь сначала изучить теорию, лежащую в основе таких вещей, как LSTM и GRU. После нескольких разочаровывающих дней, глядя на линейные уравнения алгебры, я попал в следующий отрывок вГлубокое обучение с Python:

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

Это был автор библиотеки Керас (Франсуа Шоле), эксперт по глубокому обучению, который сказал мне, что мне не нужно понимать все на базовом уровне! Я понял, что моя ошибка начиналась с теории, вместо того, чтобы просто пытаться построить рекуррентную нейронную сеть.

Вскоре после этого я сменил тактику и решил попробовать наиболее эффективный способ изучения техники науки о данных: найти проблему и решить ее!

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

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

Полный код доступен в виде серииНоутбуки Jupyter на GitHub, Я также предоставил всепредварительно обученные моделитак что вам не нужно тренировать их в течение нескольких часов самостоятельно! Чтобы начать как можно быстрее и исследовать модели, см.Быстрый старт для текущих нейронных сетейи для подробных объяснений, обратитесь кГлубокое погружение в рекуррентные нейронные сети,


Рекуррентная нейронная сеть

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

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

Обзор РНН (Источник)

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

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

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


В основе RNN лежит слой из ячеек памяти. Самая популярная ячейка на данный момент - этоДолгосрочная кратковременная память(LSTM), который поддерживает состояние ячейки, а также перенос для гарантии того, что сигнал (информация вформа градиента) не теряется при обработке последовательности. На каждом временном шаге LSTM рассматривает текущее слово, перенос и состояние ячейки.

Ячейка LSTM (долговременная кратковременная память) (Источник)

У LSTM есть 3 разных гейта и вектора весов: есть ворота «забыть» для отбрасывания неактуальной информации; «входной» вентиль для обработки текущего ввода и «выходной» вентиль для создания прогнозов на каждом временном шаге. Однако, как указывает Чоллет, бесполезно пытаться присвоить конкретные значения каждому из элементов в клетке.

Функция каждого элемента ячейки в конечном итоге определяется параметрами (весами), которые изучаются во время тренировки Не стесняйтесь маркировать каждую часть клетки, но это не обязательно для эффективного использования! Напомним, преимущество Recurrent Neural Network дляпоследовательность обученияон сохраняет в памяти всю последовательность, предотвращая потерю предыдущей информации.


Постановка проблемы

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

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

Этапы подхода изложены ниже:

  1. Преобразование тезисов из списка строк в список списков целых чисел (последовательностей)
  2. Создать элемент и метки из последовательностей
  3. Создайте модель LSTM с использованием слоев Embedded, LSTM и Dense
  4. Загрузка в предварительно обученные вложения
  5. Модель поезда, чтобы предсказать следующую работу в последовательности
  6. Делайте прогнозы, передавая в стартовой последовательности

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


Подготовка данных

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

Патент реферат данных

Мы начнем с аннотации патента в виде списка строк. Основные этапы подготовки данных для нашей модели:

  1. Удалить пунктуацию и разбить строки на списки отдельных слов
  2. Преобразовать отдельные слова в целые числа

Эти два шага могут быть выполнены с использованиемKerasTokenizerучебный класс. По умолчанию это удаляет все знаки препинания, слова в нижнем регистре, а затем преобразует слова вsequencesцелых чисел.Tokenizerпервыйfitв списке строк, а затем преобразует этот список в список списковцелые, Это продемонстрировано ниже:

Выход первой ячейки показывает исходный реферат, а выход второй - токенизированную последовательность. Каждый реферат теперь представлен как целые числа.

Мы можем использоватьidx_wordАтрибут обученного токенизатора, чтобы выяснить, что означает каждое из этих целых чисел:

Если вы внимательно посмотрите, вы заметите, чтоTokenizerубрал все знаки препинания и вычеркнул все слова. Если мы используем эти настройки, то нейронная сеть не будет учить правильный английский! Мы можем настроить это, изменив фильтры наTokenizerне удалять пунктуацию.

# Don't remove punctuation or uppercase
tokenizer = Tokenizer(num_words=None,
filters='#$%&()*+-<=>@[\\]^_`{|}~\t\n',
lower = False, split = ' ')

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


Особенности и ярлыки

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

Дайте сети последовательность слов и обучите ее предсказывать следующее слово.

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

Создание объектов и меток является относительно простым, и для каждого резюме (представленного в виде целых чисел) мы создаем несколько наборов объектов и меток. Мы используем первые 50 слов в качестве признаков, а 51-е - в качестве метки, затем используем слова 2–51 в качестве признаков и прогнозируем 52-е и т. Д. Это дает нам значительно больше данных об обучении, что полезно, потому чтопроизводительность сети пропорциональна объему данныхчто он видит во время тренировки.

Реализация создания функций и меток ниже:

Особенности в конечном итоге с формой(296866, 50)это означает, что у нас есть почти 300 000 последовательностей, каждая с 50 токенами. На языке рекуррентных нейронных сетей каждая последовательность имеет 50временные шагикаждый с 1 функцией.

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

Чтобы найти слово, соответствующее строке вlabel_array, мы используем:

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


Построение рекуррентной нейронной сети

KerasЭто невероятная библиотека: она позволяет нам создавать современные модели в несколько строк понятного кода Python. Хотядругие библиотеки нейронных сетей могут работать быстрее или обеспечивать большую гибкостьничто не может побить Keras за время разработки и простоту использования.

Код для простого LSTM приведен ниже с пояснением ниже:

Мы используем KerasSequentialAPI, который означает, что мы строим сеть по одному уровню за раз. Слои следующие:

  • Embeddingкоторый отображает каждое входное слово в 100-мерный вектор. Встраивание может использовать предварительно обученные веса (больше за секунду), которые мы поставляем вweightsпараметр.trainableможно установитьFalseесли мы не хотим обновлять вложения.
  • Maskingслой для маскировки любых слов, которые не имеют предварительно обученного встраивания, которые будут представлены как все нули. Этот слой не следует использовать при обучении встраиваниям.
  • Сердце сети: слойLSTM клетки сбросить, чтобы предотвратить переоснащение, Поскольку мы используем только один слой LSTM, онневернуть последовательности, для использования двух или более слоев, убедитесь, что возвращают последовательности.
  • Полностью подключенDenseслой сreluактивация. Это добавляет дополнительную репрезентативную емкость в сеть.
  • Dropoutслой для предотвращения наложения на тренировочные данные.
  • Denseполностью подключенный выходной слой. Это дает вероятность для каждого слова в словаре, используяsoftmaxактивация.

Модель составлена ​​сAdamоптимизатор (вариант по Стохастическому градиентному спуску) и обучен с использованиемcategorical_crossentropyпотеря. Во время обучения сеть будет пытаться свести к минимуму потери в журнале путем корректировки обучаемых параметров (весов). Как всегда, градиенты параметров рассчитываются с использованиемобратное распространениеи обновляется с помощью оптимизатора. Так как мы используем Keras, мыне нужно беспокоиться о том, как это происходитнегласно, только о правильной настройке сети.

Схема сети LSTM.

Без обновления вложений в сети гораздо меньше параметров для обучения.Вход вLSTMслой(None, 50, 100)что значитчто для каждого пакета (первого измерения) каждая последовательность имеет 50 временных шагов (слов), каждый из которых имеет 100 признаков после внедрения. Вход в слой LSTM всегда имеет(batch_size, timesteps, features)форма.

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

Предварительно обученные вложения

Как только сеть построена, мы все равно должны предоставить ей предварительно обученные вложения слов. Естьмногочисленные вложения вы можете найти онлайнобучены на разных корпусах (большие текстовые тексты). Те, которые мы будем использовать,доступны из Стэнфордаи придем в 100, 200 или 300 измерениях (мы будем придерживаться 100). Эти вложения изGloVe (глобальные векторы для представления слов)алгоритм и прошли обучение в Википедии.

Несмотря на то, что предварительно обученные вложения содержат 400 000 слов, в нашем словаре есть некоторые слова, которые включены. Когда мы представляем эти слова с вложениями, они будут иметь 100-мерные векторы всех нулей. Эту проблему можно решить, обучив наши собственные вложения или установивEmbeddingслояtrainableпараметр дляTrue(и удаляяMaskingслой).

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

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

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

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

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


Обучение модели

С подготовленными данными обучения и валидации, созданной сетью и загруженными вложениями мы почти готовы к тому, чтобы наша модель научилась писать рефераты на патент. Тем не менее, хорошие шаги, которые необходимо предпринять при обучении нейронных сетей, должны использоватьModelCheckpoint и EarlyStopping в форме обратных вызовов Keras:

  • Контрольная точка модели: сохраняет лучшую модель (измеренную по потерям при проверке) на диске для использования лучшей модели
  • Ранняя остановка: останавливает тренировку, когда потеря проверки больше не уменьшается

С помощьюРанняя остановкаозначает, что мы не будем соответствовать учебным данным и тратить время на обучение для дополнительных эпох, которые не улучшают производительность. Модель Checkpoint означает, что мы можем получить доступ к лучшей модели, и если наше обучение будет прервано на 1000 эпох, мы не потеряем весь прогресс!

Затем модель может быть обучена с помощью следующего кода:

НаAmazon p2.xlarge экземпляр($ 0,90 / час зарезервировано), это заняло чуть более 1 часа, чтобы закончить. После завершения обучения мы можем загрузить обратно лучшую сохраненную модель и оценить окончательное время по данным проверки.

from keras import load_model# Load in model and evaluate on validation data
model = load_model('../models/model.h5')
model.evaluate(X_valid, y_valid)

В целом модель, использующая предварительно обученные вложения слов, достигла точности проверки 23,9%. Это очень хорошо, учитывая, что как человек, мне очень трудно предсказать следующее слово в этих тезисах! Наивное предположение наиболее распространенного слова («the») дает точность около 8%. Метрики для всех моделей в ноутбуке приведены ниже:

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


Патент абстрактного поколения

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

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

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

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

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

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


Человек или Машина?

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

Каково ваше предположение? Ответ в том, чтовторойэто реальный реферат, написанный человеком (ну, это то, что было на самом деле в реферате. Я не уверен, что эти рефераты написаны людьми). Вот еще один:

На этот разв третьихбыл писатель из плоти и крови.

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


Выводы

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

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

Двунаправленная ячейка LSTM (Источник)

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


Как всегда, я приветствую отзывы и конструктивную критику. Со мной можно связаться в твиттере@koehrsen_willили через мой сайт по адресуwillk.online,

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map