Создавайте истории, используя RNN | чистая математика с кодом |:

Привет, читатель!

На заметку читателю:

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

Некоторая информация об этой статье:

В этой статье мы обсудим и реализуем RNN с нуля. Затем мы будем использовать их для создания текста (например, стихов, кода на C ++). Я вдохновился на написание этой статьи после прочтения блога Андрея Карпати Неоправданная эффективность рекуррентных нейронных сетей. Текст, сгенерированный этим кодом, не идеален, но он дает интуитивное представление о том, как на самом деле работает генерация текста. Наш вход будет простым текстовым файлом, содержащим некоторый текст (например, стихотворение Шекспира), и наша программа будет генерировать вывод, аналогичный входному (стихотворение), который может иметь или не иметь смысла.

Давайте погрузимся в математический мир RNN.

Итак, какова основная структура RNN?

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

На Рис. 1:

h (t): скрытое состояние RNN в момент времени t = t

fw: функция нелинейности (в основном tanh)

Whh: случайно инициализированная матрица весов. Он используется, когда мы переходим из h в h (скрытое состояние в другое скрытое состояние).

Wxh: случайно инициализированная весовая матрица. Он используется, когда мы переходим от « к « (входы в скрытые состояния).

Почему: случайно инициализированная матрица весов при переходе от « к « представляет скрытое состояние для вывода.

bh (нет на фото): случайно инициализированная матрица столбцов как матрица смещения, которая будет добавлена ​​при вычислении h (t).

by (нет на фото): случайно инициализированная матрица столбцов как матрица смещения, которая будет добавлена ​​при вычислении y (t).

КОД:

Начнем с импорта данных:

скачать данные отсюда.

char_to_ix: it's a dictionary to assign a unique number to each unique character
ix_to_char:it's a dictionary to assign a unique character to each number.
We deal with assigned number of each character and predict number of next character and then use this predicted number to find the next character.

скрытый размер: количество скрытых нейронов.

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

lr: обозначает скорость обучения.

Инициализируйте параметры:

Инициализируйте параметры, которые мы обсуждали выше (Whh …… by).

Вперед:

xs, ys, hs, ps - словари.

xs [t]: в момент времени (символ) t = t мы используем горячую кодировку для представления символов, которые все элементы горячего вектора нули, кроме одного элемента, и мы находим местоположение этого элемента (символа), используя словарь char_to_ix. Пример: предположим, что у нас есть данные как «abcdef». Мы представляем "a", используя горячую кодировку, как

this is what we are doing in 25th,26th line in the code above.
a=[[1], 
   [0],
   [0],
   [0],
   [0],
   [0]]

ys [t]: в момент времени (символ) t = t мы сохраняем окончательный вывод этой ячейки RNN.

hs [t]: в момент времени (символ) t = t мы сохраняем скрытое состояние текущей ячейки RNN.

ps [t]: в момент времени (символ) t = t мы сохраняем вероятность появления каждого символа.

Как вы видите в приведенном выше коде, мы реализовали простые вычисления, как показано на рис. 1, для xs [t], ys [t], hs [t], ps [t].

И, наконец, мы рассчитываем потери softmax.

Обратный проход

dWxh: производная по матрице Wxh. Мы будем использовать это, чтобы исправить нашу матрицу Wxh. И аналогично dWhh, dWhy, dbh, dby, dhnext.

Для обратного перехода в y: мы вычитаем 1 из вероятности появления правильного следующего символа, потому что:

Now:
To calculate:
dy: ps[t]-1
dWhy += : dy•hs[t].T
dh += Why.T•dy + dhnext
dby += dy (As matrix multiplication term becomes zero in   derivative )
#backprop in hs[t] now:
dhraw adds derivative w.r.t tanh(derivative of tanh is 1-tanh^2)
dhraw= (1-hs[t]^2)*dh
dbh += dhraw (because derivative matrix multiplication terms is zero w.r.t dbh)
dWhx += (dhraw•xs[t].T)
dWhh += (dhraw•hs[t-1])
finally:
dhnext += (Whh.T•dhraw)

Все настроено:

Пора запускать программу: DeepLearning Studio

RNN очень дороги в вычислительном отношении. Для обучения нашей программы я использовал Deep Learning Studio компании Deep Cognition. Он предоставляет предустановленные платформы DeepLearning, такие как Tensorflow-gpu / cpu, keras-gpu / cpu, pytorch… и многие другие. Проверьте это здесь.



mbh, mby - переменные памяти оптимизатора Adagrad.

Наконец, потери рассчитываются из нашей функции потерь для различных параметров (Почему… h (t)) и вычитаются из соответствующих параметров.

line number 5-6 is the way we Adagrad works.
Like in normal gradient descent we do:
theta= theta-lr*grad
1e-8 is used to prevent DivisionByZero exception.

Результаты обучения:

At epoch zero:Generated text
loss=106.56699692603289
iteration:0
QZBipoe.M
prb’gxc]QXECCY“f);wqEnJAVV-Dn-
Fl-tXTFTNI[ ?Jpzi”BPM’TxJlhNyFamgIj)wvxJDwBgGbF!D“F‘bU;[)KXrT km*;xwYZIx-
AX
dDl_zk(QlW(KolSenbudmX.yq
H-(uPUl-B:mj]o’E-ZTjzH)USf:!
sCiTkTMcmgUY)rCj
ZaL*rhWVpS----
---------------------------------------------------
l was  beginning begiginning to Alice walicegininn to geteginninato giteginniito geteginninn to geteginninatg gegeginninasto get beginninnninnigw to gicleaaaa  was ginniicg benning to get a wen----
loss=11.115271278781561
iteration:66200

Он начинает запоминать такие слова, как «начало, Алиса, было, чтобы, получить…». Это совсем не идеально. Но это дает интуицию, что мы можем сгенерировать правильный текст, используя некоторые образцы данных. LSTM работают намного лучше, чем RNN. LSTM являются расширением RNN с 3–4 шлюзами. Проверьте мою статью о LSTM



Доступ к полному коду с наборами данных на репозитории github.

Поздравляем читателя, теперь вы знакомы с глубокой математикой RNN (простая линейная алгебра).

Спасибо, что уделили драгоценное время на чтение моей статьи. Если вам действительно понравилось, поделитесь и аплодируйте 👏.

Следуйте за мной на medium и LinkedIn.

Удачного глубокого обучения.