Lstm нейронная сеть zhitsoboy.ru

Lstm нейронная сеть

Разнообразие нейронных сетей. Часть вторая. Продвинутые конфигурации

    Переводы, 12 октября 2016 в 22:08

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

Глубинные свёрточные обратные графические сети (deep convolutional inverse graphics networks, DCIGN) названы слегка некорректно, поскольку они по сути являются вариационными автокодировщиками, кодирующая и декодирующая части которых представлены свёрточной и развёртывающей НС соответственно. Сети такого типа моделируют свойства в виде вероятностей, поэтому их можно научить создавать картинку с собакой и кошкой, даже если сеть видела только картинки, на которых было только одно из животных. Возможно и удаление одного из двух объектов. Также были созданы сети, которые могли менять источник освещения и вращать объект. Сети такого типа обычно обучают методом обратного распространения ошибки.

Генеративные состязательные сети (generative adversarial networks, GAN) — это сети другого вида, они похожи на близнецов. Такие сети состоят из любых двух (обычно из FF и CNN), одна из которых контент генерирует, а другая — оценивает. Сеть-дискриминатор получает обучающие или созданные генератором данные. Степень угадывания дискриминатором источника данных в дальнейшем участвует в формировании ошибки. Таким образом, возникает состязание между генератором и дискриминатором, где первый учится обманывать первого, а второй — раскрывать обман (похоже на ситуацию “банкир-фальшивомонетчик”). Обучать такие сети весьма тяжело, поскольку нужно не только обучить каждую из них, но и настроить баланс.

Рекуррентные нейронные сети (recurrent neural networks, RNN) — это сети типа FFNN, но с особенностью: нейроны получают информацию не только от предыдущего слоя, но и от самих себя предыдущего прохода. Это означает, что порядок, в котором вы подаёте данные и обучаете сеть, становится важным. Большой сложностью сетей RNN является проблема исчезающего (или взрывного) градиента, которая заключается в быстрой потере информации с течением времени. Конечно, это влияет лишь на веса, а не состояния нейронов, но ведь именно в них накапливается информация. Обычно сети такого типа используются для автоматического дополнения информации.

Сети с долгой краткосрочной памятью (long short term memory, LSTM) стараются решить вышеупомянутую проблему потери информации, используя фильтры и явно заданную клетку памяти. У каждого нейрона есть клетка памяти и три фильтра: входной, выходной и забывающий. Целью этих фильтров является защита информации. Входной фильтр определяет, сколько информации из предыдущего слоя будет храниться в клетке. Выходной фильтр определяет, сколько информации получат следующие слои. Ну а забывающий фильтр, каким бы странным не казался, также выполняет полезную функцию: например, если сеть изучает книгу и переходит на новую главу, какие-то символы из старой можно забыть. Такие сети способны научиться создавать сложные структуры, например, писать как Шекспир или сочинять простую музыку, но и ресурсов они потребляют немало.

Управляемые рекуррентные нейроны (gated recurrent units, GRU) — это небольшая вариация предыдущей сети. У них на один фильтр меньше, и связи реализованы иначе. Фильтр обновления определяет, сколько информации останется от прошлого состояния и сколько будет взято из предыдущего слоя. Фильтр сброса работает примерно как забывающий фильтр.

Нейронные машины Тьюринга (neural Turing machines, NTM) можно рассматривать как абстрактную модель LSTM и попытку показать, что на самом деле происходит внутри нейронной сети. Ячейка памяти не помещена в нейрон, а размещена отдельно с целью объединить эффективность обычного хранилища данных и мощь нейронной сети. Собственно, поэтому такие сети и называются машинами Тьюринга — в силу способности читать и записывать данные и менять состояние в зависимости от прочитанного они являются тьюринг-полными.

Двунаправленные RNN, LSTM и GRU (bidirectional recurrent neural networks, bidirectional long / short term memory networks и bidirectional gated recurrent units, BiRNN, BiLSTM и BiGRU) не показаны в таблице, поскольку они ничем не отличаются от своих однонаправленных вариантов. Разница заключается в том, что эти сети используют не только данные из “прошлого”, но и из “будущего”. Например, обычную сеть типа LSTM обучают угадывать слово “рыба”, подавая буквы по одной, а двунаправленную — подавая ещё и следующую букву из последовательности. Такие сети способны, например, не только расширять изображение по краям, но и заполнять дыры внутри.

Глубинные остаточные сети (deep residual networks, DRN) — это очень глубокие сети типа FFNN с дополнительными связями между отделёнными друг от друга слоями. Такие сети можно обучать на шаблонах глубиной аж до 150 слоёв — гораздо больше, чем можно было бы ожидать. Однако, было показано, что эти сети мало чем отличаются от рекуррентных, и их часто сравнивают с сетями LSTM.

Нейронная эхо-сеть (echo state networks, ESN) — это ещё одна разновидность рекуррентных сетей. Её особенностью является отсутствие сформированных слоёв, т.е. связи между нейронами случайны. Соответственно, метод обратного распространения ошибки не срабатывает. Вместо этого нужно подавать входных данные, передавать их по сети и обновлять нейроны, наблюдая за выходными данными.

Читать еще:  Как настроить оперативную память в Windows 7?

Метод экстремального обучения (extreme learning machines, ELM) — это, по сути, сеть типа FFNN, но со случайными связями. Они очень похожи на сети LSM и ESN, но используются как FFNN. Так происходит не только потому, что они не рекуррентны, но и потому, что их можно обучать просто методом обратного распространения ошибки.

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

Метод опорных векторов (support vector machines, SVM) находит оптимальные решения задачи оптимизации. Классическая версия способна категоризировать линейно разделяемые данные: например, различать изображения с котом Томом и с котом Гарфилдом. В процессе обучения сеть как бы размещает все данные на 2D-графике и пытается разделить данные прямой линией так, чтобы с каждой стороны были данные только одного класса и чтобы расстояние от данные до линии было максимальным. Используя трюк с ядром, можно классифицировать данные размерности n. Что характерно, этот метод не всегда рассматривается как нейронная сеть.

И наконец, нейронные сети Кохонена (Kohonen networks, KN), также известные как самоорганизующиеся карты (self organising (feature) maps, SOM, SOFM), завершают наш список. Эти сети используют соревновательное обучение для классификации данных без учителя. Сети подаются входные данные, после чего сеть определяет, какие из нейронов максимально совпадают с ними. После этого эти нейроны изменяются для ещё большей точности совпадения, в процессе двигая за собой соседей. Иногда карты Кохонена также не считаются нейронными сетями.

Вот и всё! После прочтения наших статей и прилагающихся материалов вы точно будете уверенно разбираться в видах нейронных сетей

Долгая краткосрочная память

Долгая краткосрочная память (англ. Long short-term memory, LSTM) — особая разновидность архитектуры рекуррентных нейронных сетей, способная к обучению долговременным зависимостям, предложенная в 1997 году Сеппом Хохрайтером и Юргеном Шмидхубером [1] .

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

LSTM-модули разработаны специально, чтобы избежать проблемы долговременной зависимости, запоминая значения как на короткие, так и на длинные промежутки времени. Это объясняется тем, что LSTM-модуль не использует функцию активации внутри своих рекуррентных компонентов. Таким образом, хранимое значение не размывается во времени и градиент не исчезает при использовании метода обратного распространения ошибки во времени (англ. Backpropagation Through Time, BPTT) [2] [3] при тренировке сети.

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

По мере того, как происходит обучение, состояние ячейки изменяется, информация добавляется или удаляется из состояния ячейки структурами, называемыми фильтрами. Фильтры контролируют поток информации на входах и на выходах модуля на основании некоторых условий. Они состоят из слоя сигмоидальной [4] нейронной сети и операции поточечного умножения.

Сигмоидальный слой возвращает числа в диапазоне [0; 1], которые обозначают, какую долю каждого блока информации следует пропустить дальше по сети. Умножение на это значение используется для пропуска или запрета потока информации внутрь и наружу памяти. Например, входной фильтр контролирует меру вхождения нового значения в память, а фильтр забывания контролирует меру сохранения значения в памяти. Выходной фильтр контролирует меру того, в какой степени значение, находящееся в памяти, используется при расчёте выходной функции активации.

  • Состояние ячейки
  • Фильтры, контролирующие состояние ячейки
    • Забывания
    • Входной
    • Выходной

Сперва “слой фильтра забывания” (англ. forget gate layer) определяет, какую информацию можно забыть или оставить. Значения предыдущего выхода [math]h_[/math] и текущего входа [math]x_t[/math] пропускаются через сигмоидальный слой. Полученные значения находятся в диапозоне [0; 1]. Значения, которые ближе к 0 будут забыты, а к 1 оставлены.

Далее решается, какая новая информация будет храниться в состоянии ячейки. Этот этап состоит из двух частей. Сначала сигмоидальный слой под названием “слой входного фильтра” (англ. input layer gate) определяет, какие значения следует обновить. Затем tanh-слой [5] строит вектор новых значений-кандидатов [math]tilde_t[/math] , которые можно добавить в состояние ячейки.

Читать еще:  Как сменить экран загрузки Windows 7?

Для замены старого состояния ячейки [math]C_[/math] на новое состояние [math]C_t[/math] . Необходимо умножить старое состояние на [math]f_t[/math] , забывая то, что решили забыть ранее. Затем прибавляем [math]i_t * tilde_t[/math] . Это новые значения-кандидаты, умноженные на [math]t[/math] – на сколько обновить каждое из значений состояния.

На последнем этапе определяется то, какая информация будет получена на выходе. Выходные данные будут основаны на нашем состоянии ячейки, к ним будут применены некоторые фильтры. Сначала значения предыдущего выхода [math]h_[/math] и текущего входа [math]x_t[/math] пропускаются через сигмоидальный слой, который решает, какая информация из состояния ячейки будет выведена. Затем значения состояния ячейки проходят через tanh-слой, чтобы получить на выходе значения из диапазона от -1 до 1, и перемножаются с выходными значениями сигмоидального слоя, что позволяет выводить только требуемую информацию.

Полученные таким образом [math]h_t[/math] и [math]C_t[/math] передаются далее по цепочке.

Cмотровые глазки [ править ]

Одна из популярных вариаций LSTM, предложенная Герсом и Шмидхубером [6] , характеризуется добавлением так называемых “смотровых глазков” (англ. peephole connections). С их помощью слои фильтров могут видеть состояние ячейки.

На схеме выше “глазки” есть у каждого слоя, но во многих работах они добавляются лишь к некоторым слоям.

Объединенные фильтры [ править ]

Другие модификации включают объединенные фильтры “забывания” и входные фильтры. В этом случае решения, какую информацию следует забыть, а какую запомнить, принимаются не отдельно, а совместно. Информация забывается только тогда, когда необходимо записать что-то на её место. Добавление новой информации в состояние ячейки выполняется только тогда, когда забываем старую.

Управляемые рекуррентные нейроны [ править ]

Немного больше отличаются от стандартных LSTM управляемые рекуррентные нейроны (англ. Gated recurrent units, GRU), впервые описанные в работе Кюнгхюна Чо (англ. Kyunghyun Cho) [7] . У них на один фильтр меньше, и они немного иначе соединены. Фильтры «забывания» и входа объединяют в один фильтр «обновления» (англ. update gate). Этот фильтр определяет сколько информации сохранить от последнего состояния, и сколько информации получить от предыдущего слоя. Кроме того, состояние ячейки объединяется со скрытым состоянием, есть и другие небольшие изменения. Фильтр сброса состояния (англ. reset gate) работает почти так же, как фильтр забывания, но расположен немного иначе. На следующие слои отправляется полная информация о состоянии, выходного фильтра нет. В большинстве случаем GRU работают так же, как LSTM, самое значимое отличие в том, что GRU немного быстрее и проще в эксплуатации, однако обладает немного меньшими выразительными возможностями. В результате модели проще, чем LSTM и их популярность неуклонно возрастает. Эффективность при решении задач моделирования музыкальных и речевых сигналов сопоставима с использованием долгой краткосрочной памяти.

Глубокие управляемые рекуррентные нейроны [ править ]

Существует множество других модификаций, как, например, глубокие управляемые рекуррентные нейронные сети (англ. Depth Gated RNNs), представленные в работе Каишенга Яо (англ. Kaisheng Yao) [8] . Глубокие управляемые рекуррентные нейронные сети привносят фильтр глубины для подключения ячеек памяти соседних слоев. Это вводит линейную зависимость между нижними и верхними рекуррентными единицами. Важно отметить, что линейная зависимость проходит через функцию стробирования, которая называется фильтром забывания. Данная архитектура способна улучшить машинный перевод и языковое моделирование.

Механизм часов [ править ]

Есть и другие способы решения проблемы долговременных зависимостей, например, механизм часов (англ. Clockwork RNN, CW-RNN) Яна Кутника [9] . CW-RNN — мощная модификация стандартной архитектуры RNN, в которой скрытый слой разделен на отдельные модули, каждый из которых обрабатывает входные данные со своей временной детализацией, производя вычисления только при заданной тактовой частоте. Стандартная модель RNN не ставновится сложнее, CW-RNN уменьшает количество параметров RNN, улучшает точность и скорость обучения сети в задачах генерации звуковых сигналов.

Keras [ править ]

Пример кода с использованием библиотеки Keras. [10]

TensorFlow [ править ]

Пример кода с библиотекой TensorFlow [11]

Пример на языке Java [ править ]

Пример реализации рекуррентной нейронной сети, использующей механизм LSTM и натренированной на текстах Шекспира, с применением библиотеки deeplearning4j .

Что такое повторяющаяся нейронная сеть, что такое длинная короткая память (LSTM), и всегда ли она лучше?

Во-первых, позвольте мне извиниться за то, что набрал три вопроса в этом названии. Я не уверен, что лучший способ там.

Я получу право на это. Я думаю, что я хорошо понимаю нервные сети.

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

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

Читать еще:  Где находится оперативная память в ноутбуке?

Пример, который я видел в рекуррентной нейронной сети, был двоичным.

Рекуррентная нейронная сеть будет принимать самое большее 0 и 1 во-первых, вывести a 1. Затем возьмите 1 следующий, выведите нуль и перенесите 1. Возьмите следующий 0,0 и выведите a 1, потому что это переносил 1 из последнего расчета. Где он хранит это 1? В корневых сетях результат в основном:

Как рассчитывается рекуррентная нейронная сеть? Я, вероятно, ошибаюсь, но из того, что я понял, рекуррентные нейронные сети представляют собой довольно сильную нервную сеть с скрытыми слоями Т, T — количество временных меток. И каждый скрытый слой принимает вход X в timestep T, и его выходы затем добавляются к следующим соответствующим вкладкам скрытого слоя.

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

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

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

Мне кажется, что чем больше timesteps, рекуррентные нейронные сети являются лишь недостатком более надежных сетей из-за исчезновения градиента. Это подводит меня к моему второму вопросу, из того, что я понял, LSTM — это решение проблемы исчезающего градиента. Но я не понимаю, как они работают. Кроме того, они просто лучше, чем рекуррентные нейронные сети, или есть жертвы при использовании LSTM?

Что такое повторяющаяся нейронная сеть?

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

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

Почему бы просто не использовать окно временных входов?

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

Что такое сеть LSTM?

Вы можете думать о LSTM как о специальном типе RNN. Разница заключается в том, что LSTM может активно поддерживать самоподключающиеся контуры без ухудшения их качества. Это достигается посредством некоторой причудливой активации, включающей дополнительный вывод «памяти» для самосинхронного соединения. Затем сеть должна быть обучена, чтобы выбрать, какие данные будут загружены на эту шину. Обучая сеть явным выборам, что нужно помнить, нам не нужно беспокоиться о том, что новые входы уничтожают важную информацию, а исчезающий градиент не влияет на информацию, которую мы решили сохранить.

Есть два основных недостатка:

  • Гораздо дороже рассчитать выход сети и применить обратное распространение. Из-за сложной активации вам просто нужно больше математики. Однако это не так важно, как вторая точка.
  • Явная память добавляет еще несколько весов к каждому node, все из которых необходимо обучить. Это увеличивает размерность проблемы и потенциально затрудняет поиск оптимального решения.

Всегда ли лучше?

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

Ссылка на основную публикацию
Adblock
detector