2017-01-27 4 views
1

Я пытаюсь внедрить языковую модель языка символов RNN из блога Andrej Karpathy http://karpathy.github.io/2015/05/21/rnn-effectiveness/ с использованием TensorFlow RNN. Для начала я взял ptb_word_lm.py из учебника LSTM в TensorFlow и изменил функцию чтения, так что теперь вместо исходного набора данных PTB с 10000 различными словами он обучается потоку из 36 отдельных символов. (Форма вложения была уменьшена соответственно: до 36x36 вместо 10000x200). Набор обучения/валидации был текстом «Война и мир» (3,5 миллиона символов в нижнем регистре).Как использовать учебник TensorFlow LSTM для моделирования языка символов?

Я ожидал простого переноса. Вместо 20 прогонов RNN застревает в состоянии с чрезмерно представленными Т в начале и конце слов. Образец отсчета начинает выглядеть так, как это происходит через 5 или около того: OF TrTSONAL TY TO TEE soS OF TOERE AHME И TOmSEDtik TEpoUNCENG soSECTIOaELING О sNTIFiNDENTE OF TNE S SWN srrSONAL TY ТТУ TN Tf Т IauGR АЭХ SEW sisWoeID Tt WS Thue, что й wONNOT Seel ТНА sorEMENT ИЗ sMRTH АВТ^Т VITTENG Tt sNPENelITY OiRhREAVEDTN Т Оорд

(здесь заглавные буквы означают более высокую вероятность). Дальнейший прогресс не достигнут в течение следующих 100 + эпох. Превосходства быстро заморожены вокруг 4 для набора поездов и 3,75 для набора проверки.

Верно, что среди всех пар символов в типичном тексте «космос-Т» и «Т-пространство» являются наиболее частыми, но RNN должен решить такие проблемы, не так ли? Я пробовал разные параметры (ADAM для градиента, более длинный шаг, забвение = 1.0 и т. Д.) - ничего не меняется. Я нахожусь в конце своей веревки. Что здесь может быть не так?

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

+0

попробовать обучение в течение более длительного времени с крошечной скоростью обучения, как 1e-4 и Адамом –

+0

Я использую Адам, который устанавливает свою собственную скорость обучения. Превосходство снижается как поездам, так и по валидации, но все более крошечным. Ран на 100 эпох до сих пор, последние 80 из них без заметного значительного изменения производства. Я буду упорствовать в течение другого дня. (На моем ПК 10 эпох с RNN на 2 слоя x 200 скрытых варсов занимают более часа, поэтому у меня есть еще пара дней вперед –

ответ

0

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

например. tf.truncated_normal([size_in, size_out], stddev=0.1)

для смещения, малая константа также работает tf.constant(0.1, shape=[size_out])