4

Я попытался запрограммировать свою собственную нейронную сеть LSTM (длинную короткую память). Я хочу проверить, работает ли базовая функциональность. Я реализовал обратное распространение через алгоритм BPTT времени для обучения сети с одной ячейкой.LSTM network learning

Должно ли одноядерная сеть LSTM иметь возможность изучать простую последовательность или иметь более чем одну ячейку? Кажется, что сеть не может научиться простой последовательности, такой как 1 0 0 0 1 0 0 0 1 0 0 0 1.

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

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

Я делаю что-то неправильно? Я был бы очень признателен за любые советы.

Большое вам спасибо!

ответ

3

Наличие только одной ячейки (одной скрытой единицы) не является хорошей идеей, даже если вы просто проверяете правильность своего кода. Вы должны попробовать 50 даже для такой простой проблемы. Этот документ здесь: http://arxiv.org/pdf/1503.04069.pdf дает вам очень четкие правила градиента для обновления параметров. Сказав это, нет необходимости реализовывать свои собственные, даже если ваш набор данных и/или проблема, над которой вы работаете, - это новый LSTM. Выберите из существующей библиотеки (Theano, mxnet, Torch и т. Д.) И измените оттуда, я думаю, это более простой способ, учитывая, что он менее подвержен ошибкам и поддерживает вычисления gpu, которые необходимы для обучения lstm в течение разумного промежутка времени ,

0

Я не пробовал 1 скрытый блок раньше, но я уверен, что 2 или 3 скрытых устройства будут работать для последовательности 0,1,0,1,0,1. Это не обязательно больше, чем клетки, тем лучше результат. Трудность обучения также увеличивается с количеством ячеек.

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

Существует много возможностей, которые ваш LSTM не работал, даже если вы внедрили его правильно. Массы нелегко обучать простым градиентным спуском.

Вот мое предложение для оптимизации веса.

  1. Использование метода импульсов для градиентного спуска.

  2. Добавьте некоторый гауссовский шум к вашему набору тренировок, чтобы предотвратить переобучение.

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

Возможно, вы можете взглянуть на Нейронную сеть Курсеры, предлагаемую Университетом Торонто, и обсудить с ними людей.

Или вы можете посмотреть другие примеры на GitHub.Например:

https://github.com/JANNLab/JANNLab/tree/master/examples/de/jannlab/examples

0

Лучший способ проверить реализацию LSTM (после градиентной проверки), чтобы попробовать его на проблемы игрушек памяти, описанных в оригинальной самой LSTM бумаге.

Лучшие один, который я часто использую это «Сложение Проблема»:

Приведет последовательность кортежей вида (значение, маска). Значение является вещественным скалярным число между 0 и 1. Маской представляет собой двоичное значение - либо 0, либо 1.

0.23, 0 0.65, 0 ... 0.86, 0 0.13, 1 0.76, 0 ... 0.34, 0 0.43, 0 0.12, 1 0.09, 0 .. 0.83, 0 -> 0.125

Во всей последовательности таких наборов (обычно длина 100), только 2 кортежей должны имеют маску как 1, остальные кортежи должны иметь маску как 0. Цель на последнем шаге - это среднее значение двух значений, для которых была 1. 1. Выходы на всех других временных шагах, кроме последний из них игнорируется. Значения и положения маски выбираются произвольно. Таким образом, эта простая задача показывает, может ли ваша реализация действительно запоминать вещи в течение длительных периодов времени.