Изменения

Перейти к: навигация, поиск

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

5780 байт добавлено, 03:14, 9 апреля 2019
Примеры кода
== Вариации ==
=== Cмотровые глазки ===Одна из популярных вариаций LSTM, предложенная Герсом и Шмидхубером<ref name=LSTM-peephole-connections>[ftp://ftp.idsia.ch/pub/juergen/TimeCount-IJCNN2000.pdf Gers, Schmidhuber. Recurrent Nets that Time and Count (2000).]</ref>, характеризуется добавлением так называемых “смотровых глазков” (“peephole connections”англ. ''peephole connections''). С их помощью слои фильтров могут видеть состояние ячейки.
[[File:Lstm-peephole-connections.png|none|650px]]
 
На схеме выше “глазки” есть у каждого слоя, но во многих работах они добавляются лишь к некоторым слоям.
=== Объединенные фильтры ===Другие модификации включают объединенные фильтры “забывания” и входные фильтры. В этом случае решения, какую информацию следует забыть, а какую запомнить, принимаются не отдельно, а совместно. Информация забывается только тогда, когда необходимо записать что-то на ее её место. Добавление новой информации в состояние ячейки выполняется только тогда, когда забываем старую.
[[File:Lstm-mod-1.png|none|650px]]
=== Управляемые рекуррентные нейроны ===Немного больше отличаются от стандартных LSTM управляемые рекуррентные нейроны (англ. ''Gated recurrent units, GRU''), впервые описанные в работе Кюнгхюна Чо Кунгхун (англ. Kyunghyun Cho Kyunghyun)<ref name=Cho>[https://arxiv.org/pdf/1406.1078v3.pdf Cho. Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation (2014).]</ref>. В ней фильтры У них на один фильтр меньше, и они немного иначе соединены. Фильтры «забывания» и входа объединяют в один фильтр «обновления» (англ. ''update gate''). Этот фильтр определяет сколько информации сохранить от последнего состояния, и сколько информации получить от предыдущего слоя. Кроме того, состояние ячейки объединяется со скрытым состоянием, есть и другие небольшие изменения. Построенная Фильтр сброса состояния (англ. ''reset gate'') работает почти так же, как фильтр забывания, но расположен немного иначе. На следующие слои отправляется полная информация о состоянии, выходного фильтра нет. В большинстве случаем GRU работают так же, как LSTM, самое значимое отличие в том, что GRU немного быстрее и проще в эксплуатации, однако обладает немного меньшими выразительными возможностями. В результате модель модели проще, чем стандартная LSTM, и их популярность ее неуклонно возрастает. Эффективность при решении задач моделирования музыкальных и речевых сигналов сопоставима с использованием долгой краткосрочной памяти.
[[File:Lstm-gru.png|none|650px]]
=== Глубокие управляемые рекуррентные нейроны ===Существует множество других модификаций, как, например, глубокие управляемые рекуррентные нейронные сети (англ. ''Depth Gated RNNs''), представленные в работе Каишенга Яо (англ. Kaisheng Yao)<ref name=Yao>[https://arxiv.org/pdf/1508.03790v2.pdf SeppKaisheng Yao. Depth-Gated Recurrent Neural Networks (2015).]</ref>. Глубокие управляемые рекуррентные нейронные сети привносят фильтр глубины для подключения ячеек памяти соседних слоев. Это вводит линейную зависимость между нижними и верхними рекуррентными единицами. Важно отметить, что линейная зависимость проходит через функцию стробирования, которая называется фильтром забывания. Данная архитектура способна улучшить машинный перевод и языковое моделирование. === Механизм часов ===Есть и другие способы решения проблемы долговременных зависимостей, например, механизм часов (англ. ''Clockwork RNN '', CW-RNN) Яна Кутника<ref name=Jan>[https://arxiv.org/pdf/1402.3511v1.pdf Jan Koutnik. A Clockwork RNN (2014).]</ref>. CW-RNN {{---}} мощная модификация стандартной архитектуры RNN, в которой скрытый слой разделен на отдельные модули, каждый из которых обрабатывает входные данные со своей временной детализацией, производя вычисления только при заданной тактовой частоте. Стандартная модель RNN не ставновится сложнее, CW-RNN уменьшает количество параметров RNN, улучшает точность и скорость обучения сети в задачах генерации звуковых сигналов.
== Примеры кода ==
=== Keras ===
Пример кода с использованием библиотеки Keras.<ref name=KerasRNN>[https://keras.io/layers/recurrent/ Keras RNN with LSTM layer]</ref>
 
<font color="green"># Импорты</font>
'''import''' numpy '''as''' np
'''import''' keras.backend '''as''' K
'''from''' keras.preprocessing '''import''' sequence
'''from''' keras.models '''import''' Sequential
'''from''' keras.layers '''import''' Dense, Activation, Embedding
'''from''' keras.layers '''import''' LSTM
'''from''' keras.datasets '''import''' imdb
'''def''' f1(y_true, y_pred):
'''def''' recall(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
recall = true_positives / (possible_positives + K.epsilon())
return recall
'''def''' precision(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
precision = true_positives / (predicted_positives + K.epsilon())
return precision
precision = precision(y_true, y_pred)
recall = recall(y_true, y_pred)
return 2*((precision*recall)/(precision+recall+K.epsilon()))
<font color="green"># Устанавливаем seed для обеспечения повторяемости результатов</font>
np.random.seed(<font color="blue">42</font>)
<font color="green"># Указываем количество слов из частотного словаря, которое будет использоваться (отсортированы по частоте использования)</font>
max_features = <font color="blue">5000</font>
<font color="green"># Загружаем данные (датасет IMDB содержит 25000 рецензий на фильмы с правильным ответом для обучения и 25000 рецензий на фильмы с правильным ответом для тестирования)</font>
(X_train, y_train), (X_test, y_test) = imdb.load_data(nb_words = max_features)
<font color="green"># Устанавливаем максимальную длину рецензий в словах, чтобы они все были одной длины</font>
maxlen = <font color="blue">80</font>
<font color="green"># Заполняем короткие рецензии пробелами, а длинные обрезаем</font>
X_train = sequence.pad_sequences(X_train, maxlen = maxlen)
X_test = sequence.pad_sequences(X_test, maxlen = maxlen)
<font color="green"># Создаем модель последовательной сети</font>
model = Sequential()
<font color="green"># Добавляем слой для векторного представления слов (5000 слов, каждое представлено вектором из 32 чисел, отключаем входной сигнал с вероятностью 20% для предотвращения переобучения)</font>
model.add(Embedding(max_features, <font color="blue">32</font>, dropout = <font color="blue">0.2</font>))
<font color="green"># Добавляем слой долго-краткосрочной памяти (100 элементов для долговременного хранения информации, отключаем входной сигнал с вероятностью 20%, отключаем рекуррентный сигнал с вероятностью 20%)</font>
model.add(LSTM(<font color="blue">100</font>, dropout_W = <font color="blue">0.2</font>, dropout_U = <font color="blue">0.2</font>))
<font color="green"># Добавляем полносвязный слой из 1 элемента для классификации, в качестве функции активации будем использовать сигмоидальную функцию</font>
model.add(Dense(<font color="blue">1</font>, activation = <font color="red">'sigmoid'</font>))
<font color="green"># Компилируем модель нейронной сети</font>
model.compile(loss = <font color="red">'binary_crossentropy'</font>,
optimizer = <font color="red">'adam'</font>,
metrics = [<font color="red">'accuracy'</font>, <font color="red">'f1'</font>])
<font color="green"># Обучаем нейронную сеть (данные для обучения, ответы к данным для обучения, количество рецензий после анализа которого будут изменены веса, число эпох обучения, тестовые данные, показывать progress bar или нет)</font>
model.fit(X_train, y_train,
batch_size = <font color="blue">64</font>,
nb_epoch = <font color="blue">7</font>,
validation_data = (X_test, y_test),
verbose = <font color="blue">1</font>)
<font color="green"># Проверяем качество обучения на тестовых данных (если есть данные, которые не участвовали в обучении, лучше использовать их, но в нашем случае таковых нет)</font>
scores = model.evaluate(X_test, y_test, batch_size = <font color="blue">64</font>)
print(<font color="red">'Точность на тестовых данных: %.2f%%'</font> % (scores[1] * <font color="blue">100</font>))
print(<font color="red">'F1 на тестовых данных: %.2f%%'</font> % (scores[2] * <font color="blue">100</font>))
 
Результат:
Точность на тренировочных данных: 89.64%
F1 на тренировочных данных: 89.55%
Точность на тестовых данных: 83.01%
F1 на тестовых данных: 82.48%
 
=== TensorFlow ===
Пример кода с библиотекой TensorFlow<ref>[https://www.tensorflow.org/ TensorFlow]</ref>
sess.run(accuracy, feed_dict={X: test_data, Y: test_label}))
=== Keras ===Результат: Точность на тренировочных данных: 91.40% F1 на тренировочных данных: 91.05%Пример кода с использованием библиотеки Keras Точность на тестовых данных: 85.<ref name=KerasRNN>[https15% F1 на тестовых данных://keras84.io/layers/recurrent/ Keras RNN with LSTM layer]</ref>28%
<font color="green"># Импорты</font> '''import''' numpy '''as''' np '''from''' keras.preprocessing '''import''' sequence '''from''' keras.models '''import''' Sequential '''from''' keras.layers '''import''' Dense, Activation, Embedding '''from''' keras.layers '''import''' LSTM '''from''' keras.datasets '''import''' imdb <font color="green"># Устанавливаем seed для обеспечения повторяемости результатов</font> np.random.seed(<font color="blue">42</font>) <font color="green"># Указываем количество слов из частотного словаря, которое будет использоваться (отсортированы по частоте использования)</font> max_features = <font color="blue">5000</font> <font color="green"># Загружаем данные (датасет IMDB содержит 25000 рецензий Пример на фильмы с правильным ответом для обучения и 25000 рецензий на фильмы с правильным ответом для тестирования)</font> (X_train, y_train), (X_test, y_test) языке Java= imdb.load_data(nb_words = max_features) <font color="green"># Устанавливаем максимальную длину рецензий в словах, чтобы они все были одной длины</font> maxlen = <font color="blue">80</font> <font color="green"># Заполняем короткие рецензии пробелами, а длинные обрезаем<[https:/font> X_train = sequence.pad_sequences(X_train, maxlen = maxlen) X_test = sequence.pad_sequences(X_test, maxlen = maxlen) <font color="green"># Создаем модель последовательной сети</font> model = Sequential() <font color="green"># Добавляем слой для векторного представления слов (5000 слов, каждое представлено вектором из 32 чисел, отключаем входной сигнал с вероятностью 20% для предотвращения переобучения)</font> modelgithub.add(Embedding(max_features, <font color="blue">32<com/font>, dropout = <font color="blue">0.2<deeplearning4j/font>)) <font color="green"># Добавляем слой долгоdl4j-краткосрочной памяти (100 элементов для долговременного хранения информации, отключаем входной сигнал с вероятностью 20%, отключаем рекуррентный сигнал с вероятностью 20%)<examples/font> model.add(LSTM(<font color="blue">100<blob/font>, dropout_W = <font color="blue">0.2<master/font>, dropout_U = <font color="blue">0.2<dl4j-examples/font>)) <font color="green"># Добавляем полносвязный слой из 1 элемента для классификации, в качестве функции активации будем использовать сигмоидальную функцию<src/font> model.add(Dense(<font color="blue">1<main/font>, activation = <font color="red">'sigmoid'<java/font>)) <font color="green"># Компилируем модель нейронной сети<org/font> model.compile(loss = <font color="red">'binary_crossentropy'<deeplearning4j/font>, optimizer = <font color="red">'adam'<examples/font>, metrics = [<font color="red">'accuracy'<recurrent/font>]) <font color="green"># Обучаем нейронную сеть (данные для обучения, ответы к данным для обучения, количество рецензий после анализа которого будут изменены веса, число эпох обучения, тестовые данные, показывать progress bar или нет)<character/font> modelLSTMCharModellingExample.fit(X_trainjava Пример] реализации рекуррентной нейронной сети, y_train, batch_size = <font color="blue">64</font>, nb_epoch = <font color="blue">7</font>, validation_data = (X_test, y_test), verbose = <font color="blue">1</font>) <font color="green"># Проверяем качество обучения использующей механизм LSTM и натренированной на тестовых данных (если есть данныетекстах Шекспира, которые не участвовали в обучении, лучше использовать их, но в нашем случае таковых нет)с применением библиотеки </fontcode> scores = model.evaluate(X_test, y_test, batch_size = <font color="blue">64deeplearning4j</font>) print(<font color="red"code>'Точность на тестовых данных: %.2f%%'</font> % (scores[1] * <font color="blue">100</font>))
==См. также==
[[Категория: Нейронные сети]]
[[Категория: Рекуррентные нейронные сети]]
 
== Источники информации ==
* [http://colah.github.io/posts/2015-08-Understanding-LSTMs/ Understanding LSTM Networks]
* [https://towardsdatascience.com/illustrated-guide-to-lstms-and-gru-s-a-step-by-step-explanation-44e9eb85bf21 Illustrated Guide to LSTM’s and GRU’s: A step by step explanation]
* [https://towardsdatascience.com/the-fall-of-rnn-lstm-2d1594c74ce0 The fall of RNN / LSTM]
* [https://en.wikipedia.org/wiki/Long_short-term_memory Long short-term memory] - статья на Википедии
* [https://www.coursera.org/lecture/nlp-sequence-models/long-short-term-memory-lstm-KXoay Long Short Term Memory (LSTM)] - курс Andrew Ng
Анонимный участник

Навигация