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) демонструють чудові результати.

Примітка. Ми повідомляємо про найкращу незрозумілість після пошуку в сітці, використовуючи такі параметри: learning_rate =, noise_samples = (лише для nce), bptt =, diagonal_initialization =, L2 = .

На наступному малюнку показано залежність між кількістю зразків шуму та кінцевою сум'яттяю для різних типів одиниць. Штрихові лінії вказують на незрозумілість моделей з ієрархічним Softmax. Неважко помітити, що використовувані зразки тим нижчі, чим нижче остаточне сум'яття. Однак навіть 5 зразків достатньо, щоб NCE працював краще, ніж HS. За винятком relu-trunc, вони не можуть бути навчені NCE для будь-якої кількості зразків шуму.

Примітка. Ми повідомляємо про найкраще збентеження після пошуку сітки. Розмір прихованого шару - 200.

Тест на один мільярд слів

Для тесту One Billion Word Benchmark ми використовуємо налаштування, як це було описано в [8], використовуючи офіційні сценарії. Близько 0,8 мільярда слів у навчальному корпусі; 793471 слів у словниковому запасі (включаючи та слова). Для перевірки ми використовуємо holdout-00000, а для тестування holdout-00001.

Ієрархічний програмний макс проти оцінки контрастності шуму. У двох словах, для більших словників недоліки ГС стають все більш значущими. В результаті навчання ПЗЕ призводить до набагато менших значень спантеличеності. Неважко помітити, що продуктивність усіченого ReLU на цьому наборі даних узгоджується з експериментами на PTB. А саме, RNN із усіченими модулями ReLU може ефективніше тренуватися з CE, якщо розмір шару невеликий. Однак відносна продуктивність інших типів агрегатів змінилася. На відміну від експериментів PTB, у корпусі «Один мільярд слів» найпростіший блок досягає найкращої якості.

Примітка. Ми повідомляємо про найкраще незрозуміле ставлення до holdout-00001 після пошуку в сітці за learning_rate, bptt та diagonal_initialization. Для навчання ПЗЕ ми використовуємо 50 зразків шуму.

Наступний графік демонструє залежність між кількістю зразків шуму та остаточним сумбуром. Як і у випадку з PTB, для NCE достатньо 5 зразків, щоб значно перевершити NCE.

Однією з важливих властивостей моделей RNNLM є те, що вони доповнюють стандартні N-грамові LM. Одним із способів досягти цього є тренування моделі maxent як частини режиму нейронної мережі. Цього можна досягти за допомогою опцій --direct та --direct-order. Іншим способом досягнення того самого ефекту є використання зовнішньої мовної моделі. Ми використовуємо 5-грамову модель Interpolated KN, яка постачається разом із еталоном.

Модель Maxent значно зменшує незрозумілість для всіх типів та розмірів прихованих шарів. Більше того, це зменшує вплив розміру шару. Як і очікувалося, поєднання RNNLM-ME та KN працює краще, ніж будь-який з них (збентеження моделі KN становить 73).

Примітка. Ми взяли найефективніші моделі з попереднього та додали максимальний шар розміром 1000 та замовлення 3.

Параметри командного рядка

Ми вирішили використовувати параметри командного рядка, сумісні з rnnlm Міколова. В результаті можна просто замінити двійковий файл для перемикання між реалізаціями.

Програма має три режими, тобто навчання, оцінювання та вибірки.

Для всіх режимів потрібна назва моделі:

Створюватиме та .nnet-файли (для зберігання vocab/count у текстовій формі та самій мережі у двійковій формі). Якщо і .nnet вже існують, інструмент спробує завантажити їх замість того, щоб розпочати нове навчання. Якщо існує, а .nnet - ні, інструмент буде використовувати існуючий словник та нові ваги.

Щоб запустити програму в тестовому режимі, потрібно надати файл тесту. Якщо ви використовуєте NCE і хочете обчислити ентропію, ви повинні використовувати прапор --nce_accurate_test. Усі інші параметри ігноруються в режимі застосування

Щоб запустити програму в режимі дискретизації, потрібно вибрати позитивну кількість речень для вибірки.

Щоб навчати програму, ви повинні надати файли поїзда та перевірки

Варіанти структури моделі

Вивчення зворотної моделі, тобто моделі, яка передбачає слова від останнього до першого, може бути корисним для суміші.

Продуктивність не масштабується лінійно за кількістю потоків (вона є лінійною через пропуски кешу, помилкові припущення HogWild тощо). Тестування, перевірка та вибірка завжди виконуються одним потоком, незалежно від цього налаштування. Також замовте розділ "Примітки про ефективність"

За замовчуванням повторювані ваги ініціалізуються за допомогою рівномірного розподілу. В [1] запропоновано інший метод ініціалізації ваг, тобто матрицю ідентичності, помножену на деяку додатну константу. Параметр нижче відповідає цій константі.

Програма підтримує зрізане зворотне поширення у часі. Градієнти від прихованого до введення повертаються назад на кожному кроці часу. Однак градієнти від прихованого до попереднього прихованого поширюються для кроків bptt у кожному блоці періоду bppt-періоду. Цей трюк може пришвидшити тренування та боротися з вибухом градієнта. Детальніше див. У [7]. Щоб вимкнути будь-яке скорочення, встановіть bptt на нуль.

Параметри ранньої зупинки (див. [0]). Нехай `ratio '- це відношення ентропії перевірки попередньої епохи до нової.

Використовується оцінка контрастності шуму, якщо кількість зразків шуму (опція --nce) перевищує нуль. В іншому випадку використовується HS. Розумне значення для nce - 20.

Для прискорення матричних операцій ми використовуємо Eigen (бібліотека шаблонів C ++ для лінійної алгебри). Крім того, ми використовуємо паралельність даних із пакетним реченням HogWild [5]. Найкращої продуктивності можна досягти, якщо всі потоки прив'язані до одного і того ж процесора (один потік на ядро). Це можна зробити за допомогою інструменту набору завдань (доступний за замовчуванням у більшості дистрибутивів Linux). Наприклад якщо у вас 2 процесори і кожен процесор має 8 реальних ядер + 8 ядер гіперпотоків, вам слід скористатися наступною командою:

У режимі NCE CUDA використовується для прискорення обчислення ентропії перевірки. Звичайно, якщо у вас немає графічного процесора, ви можете використовувати CPU для обчислення ентропії, але це займе багато часу.

  • Вам не потрібно повторювати структурні параметри (прихований, прихований тип, зворотний, прямий, прямий порядок) при використанні існуючої моделі. Вони будуть проігноровані. Словник, збережений у моделі, буде використаний повторно.
  • Словарний запас будується на основі навчального файлу під час першого запуску інструменту для певної моделі. Програма буде ігнорувати речення з OOV під час навчання (або повідомляти про них під час перевірки).
  • Розмір словника відіграє дуже незначну роль у виконанні (він є логарифмічним за розміром словникового запасу через розкладання дерева Хаффмана). Прихований розмір шару та обсяг навчальних даних є головними факторами.
  • Зазвичай NCE працює краще, ніж HS, як з точки зору PPL, так і WER.
  • Прямі підключення можуть значно покращити якість моделі. Особливо у випадку ГС. Розумними значеннями, з яких слід починати, є -direct 1000 -direct-order 4 .
  • Модель буде записана у файл після навчальної епохи лише тоді, коли її ентропія перевірки покращилася порівняно з попередньою епохою.
  • Хорошою ідеєю є перемішування речень у наборі перед тим, як розділити їх на навчальні та перевірочні набори (GNU shuf & split - один із можливих варіантів для цього). Для величезних наборів даних використовуйте параметр --epoch-per-file.

[0] Міколов Т. (2012). Статистичні мовні моделі на основі нейронних мереж. Презентація в Google, Mountain View, 2 квітня.

[1] Le, Q. V., Jaitly, N., & Hinton, G. E. (2015). Простий спосіб ініціалізації повторюваних мереж випрямлених лінійних блоків. препринт arXiv arXiv: 1504.00941.

[2] Chung, J., Gulcehre, C., Cho, K., & Bengio, Y. (2014). Емпірична оцінка керованих рекурентних нейронних мереж при моделюванні послідовностей. препринт arXiv arXiv: 1412.3555.

[3] Chen, X., Liu, X., Gales, M. J. F., & Woodland, P. C. (2015). Повторне навчання мовної моделі нейронної мережі з оцінкою контрастності шуму для розпізнавання мови.

[4] Т. Тілеман та Г. Хінтон, “Лекція 6.5-rmsprop: Розділіть градієнт на середнє значення його останньої величини”, КУРСЕРА: Нейронні мережі для машинного навчання, вип. 4, 2012

[5] Recht, B., Re, C., Wright, S., & Niu, F. (2011). Хогвільд: Безблоковий підхід до паралелізації стохастичного градієнтного спуску. У досягненні нейронних систем обробки інформації (стор. 693-701). Чикаго

[6] Міколов Т., Чен К., Коррадо Г. та Дін Дж. (2013). Ефективна оцінка подань слів у векторному просторі. препринт arXiv arXiv: 1301.3781.

[7] Суцкевер, І. (2013). Навчання рекурентним нейронним мережам (докторська дисертація, Університет Торонто).

[8] Челба, К., Міколов, Т., Шустер, М., Ге, К., Брантс, Т., Кен, П., і Робінсон, Т. (2013). Орієнтир на один мільярд слів для вимірювання прогресу в статистичному моделюванні мов. препринт arXiv arXiv: 1312.3005. GitHub

[9] Міколов Т., Жулен А., Чопра С., Матьє М., Ранзато М.А. (2014). Вивчення довшої пам’яті в періодичних нейронних мережах. препринт arXiv arXiv: 1412,7753.

Про

Швидший повторюваний набір інструментів моделювання нейронних мереж з контрастною оцінкою шуму та ієрархічним Softmax