Основываясь на коде Андрея Карпати https://github.com/karpathy/char-rnn и бумага Сами Бенгио http://arxiv.org/abs/1506.03099
Сделать код может обрабатывать как английские, так и китайские иероглифы. Это мое первое прикосновение Lua, поэтому процесс струны кажется глупым, но он работает хорошо.
Я также добавляю опцию под названием «min_freq», потому что размер слока на китайском языке очень большой, что заставляет параметр увеличиваться. Так что удалить какой -то редкий персонаж может помочь.
Запланированная выборка Сами Бенгио для прогнозирования последовательности с рецидивирующими нейронными сетями в NIPS15 предлагает простой, но способный метод мощности для въезда RNN.
В своем эксперименте я считаю, что это очень помогает избежать переживания, и заставило потери теста глубже. Я использую только линейный распад.
Используйте -use_ss , чтобы включить или выключить запланированную выборку, по умолчанию включено. -start_ss -это начало реальных данных, я предлагаю использовать 1, потому что наша модель должна изучать данные без шума в самом начале. -min_ss также очень важен, так как слишком много шума повредит производительности. Наконец, -decay_ss является линейной скоростью распада.
Я добавляю скрипт для преобразования модельного файла, обученного GPU в модель процессора. Вы можете попробовать это следующим образом:
$ th convert.lua gpu_model cpu_modelДобавляется веб -демо, чтобы другие могли легко тестировать модель, основываясь на Sub/Pub of Redis. Я использую Redis, потому что я не нашел хорошую RPC или WebServer, хорошо интегрированную с факелом. Вы должны заметить, что демонстрация асинхронна Ajax. Чтобы настроить демонстрацию на Ubuntu: установить Redis и начать ее
$ wget http://download.redis.io/releases/redis-3.0.3.tar.gz
$ tar xzf redis-3.0.3.tar.gz
$ cd redis-3.0.3
$ make
$ sudo make install
$ redis-server &Затем установите колбу и плагин Redis:
$ sudo pip install flask
$ sudo pip install redis
$ luarocks install redis-luaПоместите свой модельный файл в Online_model, переименовать его как «model.t7», сценарий запуска бэкэнд и подрыва:
$ nohup th web_backend.lua &
$ nohup python web_server.py & Пожалуйста, следуйте этому, чтобы настроить ваш эксперимент.
Этот код реализует многослойную рецидивирующую нейронную сеть (RNN, LSTM и GRU) для обучения/выборки из языковых моделей уровня персонажа. Модель учится прогнозировать вероятность следующего символа в последовательности. Другими словами, ввод - это единый текстовый файл, и модель учится генерировать текст, подобный он.
Контекст этой кодовой базы подробно описан в моем блоге. Страница проекта, на которой есть несколько указателей на некоторые наборы данных.
Этот код был первоначально основан на классе машинного обучения Оксфордского университета Practice 6, который, в свою очередь, основан на обучении для выполнения кода из Wojciech Zaremba. Куски его также были разработаны в сотрудничестве с моим товарищем по лабсу Джастину Джонсону.
Этот код написан в LUA и требует факела. Кроме того, вам необходимо установить nngraph и optim Packages, используя Luarocks, которые вы сможете сделать после установки Torch:
$ luarocks install nngraph
$ luarocks install optim Если вы хотите использовать вычисления GPU CUDA, вам сначала нужно установить инструментарий CUDA, то пакеты cutorch и cunn :
$ luarocks install cutorch
$ luarocks install cunn Если вы хотите использовать OpenCl GPU -вычисления, вам сначала нужно установить пакеты cltorch и clnn , а затем использовать опцию -opencl 1 во время обучения:
$ luarocks install cltorch
$ luarocks install clnn Все входные данные хранятся внутри data/ каталога. Вы заметите, что в репо (в папках data/tinyshakespeare ) есть пример набора данных, который состоит из подмножества работ Шекспира. Я предоставляю еще несколько наборов данных на странице проекта.
Ваши собственные данные : если вы хотите использовать свои собственные данные, создайте единый файл input.txt и поместить его в папку в data/ . Например, data/some_folder/input.txt . В первый раз, когда вы запустите учебный скрипт, он напишет еще два файла удобства в data/some_folder .
Обратите внимание, что если ваши данные слишком малы (1 МБ уже считается очень маленьким), RNN не будет учиться очень эффективно. Помните, что он должен полностью изучить все с нуля.
И наоборот, если ваши данные велики (более чем около 2 МБ), чувствуйте себя уверенно, что увеличивает rnn_size и обучает большую модель (см. Подробности обучения ниже). Это будет работать значительно лучше . Например, с 6 МБ вы можете легко подняться до rnn_size 300 или даже больше. Самым большим, который подходит для моего GPU и что я обучил этот код, является rnn_size 700 с num_layers 3 (2 - по умолчанию).
Начните обучать модель с помощью train.lua , например:
$ th train.lua -data_dir data/some_folder -gpuid -1
Флаг -data_dir наиболее важен, поскольку он определяет набор данных для использования. Обратите внимание, что в этом примере мы также устанавливаем gpuid на -1, который сообщает коду для обучения с использованием ЦП, в противном случае он по умолчанию в GPU 0. Есть много других флагов для различных вариантов. Проконсультируйтесь $ th train.lua -help для комплексных настроек. Вот еще один пример:
$ th train.lua -data_dir data/some_folder -rnn_size 512 -num_layers 2 -dropout 0.5
В то время как модель обучается, она периодически записывает файлы контрольных точек в папку cv . Частота, с которой записаны эти контрольные точки, управляется с номером итераций, как указано с опцией eval_val_every (например, если это 1, то контрольная точка записывается каждую итерацию). Имя файла этих контрольно -пропускных пунктов содержит очень импоратантный номер: потеря . Например, контрольная точка с именем файла lm_lstm_epoch0.95_2.0681.t7 указывает, что в этот момент модель была на эпохе 0,95 (то есть она почти сделала один полный проход по учебным данным), а потеря данных проверки составила 2.0681. Это число очень важно, потому что чем ниже он, тем лучше работает контрольная точка. После того, как вы начнете генерировать данные (обсуждаются ниже), вы захотите использовать контрольную точку модели, которая имеет самую низкую потерю проверки. Обратите внимание, что это не обязательно может быть последней контрольной точкой в конце обучения (из -за возможного переживания).
Другими важными количествами, о которых следует знать, являются batch_size (Call It B), seq_length (CALL IT S) и настройки train_frac и val_frac . Размер партии указывает, сколько потоков данных обрабатывается параллельно за один раз. Длина последовательности указывает длину каждого куска, что также является пределом, при котором градиенты обрезаются. Например, если seq_length составляет 20, то сигнал градиента никогда не будет отступать более 20 временных шагов, а модель может не найти зависимости дольше, чем эта длина в количестве символов. Во время выполнения ваш входной текстовый файл имеет n символов, они сначала разделены на куски размера BXS. Эти куски затем выделяются на три раскола: поезда/Val/тест в соответствии с настройками frac . Если ваши данные невелики, возможно, что с настройками по умолчанию у вас будет всего лишь очень мало кусков (например, 100). Это плохо: в этих случаях вы можете уменьшить размер партии или длину последовательности.
Вы также можете инициировать параметры с ранее сохраненной контрольной точки с использованием init_from .
Мы можем использовать эти контрольно -пропускные пункты для генерации текста (обсуждается далее).
Учитывая файл контрольной точки (например, написанный в cv ), мы можем генерировать новый текст. Например:
$ th sample.lua cv/some_checkpoint.t7 -gpuid -1
Убедитесь, что если ваша контрольная точка была обучена графическим процессорам, он также отобран с графическим процессором или наоборот. В противном случае код будет (в настоящее время). Как и в случае сценария поезда, см. $ th sample.lua -help для полных вариантов. Одним из важных является (например) -length 10000 , который генерирует 10 000 символов (по умолчанию = 2000).
Температура Важным параметром, который вы можете захотеть сыграть с большим количеством, является -temperature , который занимает число в диапазоне [0, 1] (обратите внимание 0 не включено), по умолчанию = 1. Температура делит прогнозируемые вероятности логарифмического и консервативные прогнозы. Более высокие температуры заставляют модель больше шансов и увеличивают разнообразие результатов, но по цене большего количества ошибок.
Заполнение . Также возможно заполнить модель с помощью некоторого начального текста с помощью -primetext . Это запускает RNN с некоторых жестких символов, чтобы согреть его с некоторым контекстом, прежде чем он начнет генерировать текст.
Счастливой выборки!
Если вы немного новичок в машинном обучении или нейронных сетях, это может потребоваться немного опыта, чтобы получить хорошие модели. Наиболее важным количеством для отслеживания является разница между вашей потерей обучения (напечатано во время обучения) и потерей проверки (напечатано время от времени, когда RNN запускается на данных проверки (по умолчанию каждые 1000 итераций)). В частности:
Двумя наиболее важными параметрами, которые управляют моделью, являются rnn_size и num_layers . Я бы посоветовал, чтобы вы всегда использовали num_layers из 2/3. rnn_size может быть скорректирован на основе того, сколько у вас данных. Два важных количества, чтобы отслеживать здесь:
Эти два должны быть примерно одинаковыми порядком. Это немного сложно сказать. Вот несколько примеров:
rnn_size больше.Стратегия победы по получению очень хороших моделей (если у вас есть время вычислительной работы) состоит в том, чтобы всегда ошибаться в увеличении сети (так же большей, как вы готовы ждать ее, чтобы вычислить), а затем попробуйте разные значения отсева (от 0,1). Какую бы модель была лучшая производительность валидации (потеря, написанная в имени файла контрольной точки, низкая) - это то, что вы должны использовать в конце.
В глубоком обучении очень распространено запуск множества различных моделей со многими различными настройками гиперпараметра, и, в конце концов, предпринимайте любую контрольную точку, которая дала наилучшую проверку.
Кстати, размер вашей тренировки и валидации также являются параметрами. Убедитесь, что у вас есть приличное количество данных в вашем наборе проверки или иначе производительность проверки будет шумной и не очень информативной.
Грань