GitHub - yandexfaster-rnnlm Швидший рекуррентний інструментарій мовного моделювання нейронних мереж із шумом

Швидший набір інструментів RNNLM (HS/NCE)

У двох словах, мета цього проекту - створити реалізацію rnnlm, яку можна навчити на величезних наборах даних (кілька мільярдів слів) та дуже великих словниках (кілька сотень тисяч) і використовувати в реальних задачах ASR та MT. Крім того, для досягнення кращих результатів ця реалізація підтримує такі похвальні установки, як ReLU + DiagonalInitialization [1], GRU [2], NCE [3] та RMSProp [4].

Як швидко це? Ну, на тестуванні одного мільярда слів [8] та процесорі на 3,3 ГГц програма зі стандартними параметрами (прихований сигмовидний шар розміром 256 та ієрархічний softmax) обробляє більше 250 тис. Слів у секунду у 8 потоках, тобто 15 млн. Слів на хвилину. В результаті епоха займає менше однієї години. Перегляньте розділ Експерименти, щоб дізнатися більше про цифри та цифри.

Дистрибутив включає скрипт ./run_benchmark.sh для порівняння швидкості навчання на вашому комп'ютері серед декількох реалізацій. Сценарії завантажують корпус Penn Tree Bank і навчають чотири моделі: rnnlm Міколова з програмним максам на основі класів, rnnlm Едренкіна з HS від проекту Kaldi, більш швидкий rnnlm з ієрархічним softmax та швидший rnnlm з оцінкою контрастності шуму. Зауважте, що хоча моделі з програмним макс на основі класів можуть досягти трохи нижчої ентропії, ніж моделі з ієрархічним програмним макс, їх навчання неможливе для великих словникових запасів. З іншого боку, швидкість NCE не залежить від розміру словникового запасу. Більше того, моделі, навчені за допомогою NCE, порівнянні з моделями на основі класу з точки зору ентропії.

Запустіть ./build.sh, щоб завантажити власну бібліотеку та побудувати швидше-rnnlm.

Щоб навчити просту модель із прихованим блоком GRU та оцінкою контрастності шуму, використовуйте таку команду:

./ rnnlm -rnnlm model_name -train train.txt -дійсне підтвердження.txt -hidden 128 -hidden-type gru -nce 20 -alpha 0,01

Файли train.txt і test.txt повинні містити одне речення на рядок. Всі різні слова, що містяться у навчальному файлі, будуть використовуватися для nca vocab, їх кількість визначатиме структуру дерева Хаффмана і залишатиметься фіксованою для цього nnet. Якщо ви віддаєте перевагу використанню обмеженого словникового запасу (скажімо, 1 мільйон слів), вам слід зіставити всі інші слова або інший маркер на ваш вибір. Обмежений словниковий запас, як правило, є гарною ідеєю, якщо це допомагає вам мати достатньо прикладів навчання для кожного слова.

Щоб застосувати модель, використовуйте наступну команду:

./ rnnlm -rnnlm model_name -test train.txt

Протоколи журналу (log10) кожного речення друкуються на stdout. Ентропія корпусу в бітах друкується на stderr.

Нейронна мережа має вбудований рівень вбудовування, кілька прихованих шарів, вихідний рівень та необов'язкові прямі вхідно-вихідні з'єднання.

На даний момент підтримуються такі приховані шари: сигмовидний, танх, релу, гру, гру-упередження, гру-інсин, гру-фул. Перші три типи цілком стандартні. Останні чотири типи означають різну модифікацію керованого рекурентного блоку. А саме, гру-інсин випливає з формул [2]; gru-full додає умови упередження для скидання та оновлення воріт; gru використовує матриці ідентичності для вхідного перетворення без упередженості; gru-bias - це гру з упередженими термінами. Найшвидший шар - relu, найповільніший - груний.

Стандартним вихідним рівнем для задач класифікації є softmax. Однак, оскільки вихідні дані softmax повинні бути нормалізовані, тобто сума по всіх класах повинна бути одна, її обчислення неможливо для дуже великого словникового запасу. Щоб подолати цю проблему, можна використовувати або розкладення на Softmax, або неявну нормалізацію. За замовчуванням ми наближаємо softmax за допомогою Ієрархічного Softmax над Деревом Хаффмана [6]. Це дозволяє обчислити softmax за логарифмічний лінійний час, але знижує якість моделі. Неявна нормалізація означає, що обчислюється ймовірність наступного слова, як у повному випадку softmax, але без явної нормалізації для всіх слів. Звичайно, не гарантується, що такі ймовірності будуть складатися. Але на практиці сума є досить близькою до одиниці через спеціальну функцію втрат. Оформити замовлення [3] для отримання додаткової інформації.

Максимальна модель ентропії

Як зазначалося в [0], одночасне навчання нейронної мережі разом із моделлю максимальної ентропії може призвести до значного вдосконалення. У двох словах, модель maxent намагається наблизити ймовірність цілі як лінійну комбінацію її особливостей історії. Наприклад для того, щоб оцінити ймовірність, якщо слово "d" у реченні "abcd", модель підсумує такі ознаки: f ("d") + f ("cd") + f ("bcd") + f ("abcd "). Ви можете використовувати maxent як з вихідними шарами HS, так і з NCE.

Ми надаємо результати оцінки моделей на двох популярних наборах даних: PTB та One Billion Word Benchmark. Перевірка doc/RESULTS.md на розумні параметри.

Бенчмарк Penn Treebank

Найпопулярнішим корпусом для тестів LM є англійська Penn Treebank. Його частина поїзда містить трохи менше 1 тис. Слів, а розмір словникового запасу - 10 тис. Слів. Іншими словами, це схоже на набір даних квітів Ірису. Розмір словникового запасу дозволяє використовувати менш ефективне наближення softmax. Ми порівнюємо quick-rnnlm з останньою версією набору інструментів rnnlm звідси. Як і слід було очікувати, клас на основі працює трохи краще, ніж ієрархічний softmax, але він набагато повільніший. З іншого боку, незрозумілість для NCE та програмного макс. Класу порівнянна, тоді як час навчання значно відрізняється. Більше того, швидкість навчання для класу softmax зменшиться зі збільшенням розміру словникового запасу, тоді як NCE не турбується з цього приводу. (Принаймні, теоретично; на практиці більший словниковий запас, ймовірно, збільшить частоту пропусків кешу.) Для справедливого порівняння швидкості ми використовуємо лише один потік для більш швидкого-rnnlm.

Примітка. Ми використовуємо наступне налаштування: швидкість_навчання = 0,1, вибірки_шуму = 30 (для nce), bptt = 32 + 8, потоки = 1 (для більш швидкого-rnnlm).

github

Було показано, що моделі RNN з функціями активації сигмоподібної форми, навчені за критерієм NCE, перевершують моделі, освічені за критерієм CE, за наближеним програмним макс. Ми спробували відтворити ці вдосконалення, використовуючи інші популярні архітектури, а саме усічений ReLU, структурно обмежену рекурентну мережу [9] з 40 контекстними одиницями та керований рекуррентний блок [2]. Дивно, але не всі типи прихованих одиниць отримують вигоду від NCE. Зрізаний ReLU досягає найнижчого незрозумілості серед усіх інших підрозділів під час навчання CE, а найвищий - під час навчання NCE. Ми використовували усічений ReLU, оскільки стандартний ReLU працює ще гірше. "Розумні" блоки (SCRN та GRU) демонструють чудові результати.