Як ми робили систему виділення інформації з тексту на природній мові для банку АТ «Банк ЦентрКредит» (Казахстан)

Деякий час тому до нас звернувся представник банку АТ «Банк ЦентрКредит» (Казахстан) з цікавим завданням. Необхідно було інтегрувати в конвеєр обробки даних, що представляють з себе текст природною мовою, додатковий інструмент обробки. Всіх деталей проекту ми розкривати не можемо, так як він знаходиться у сфері безпеки банку і розробляється його службою безпеки. У висвітленні технологічних аспектів завдання та способів їх реалізації замовник не був проти, що власне ми і хочемо зробити в рамках даної статті.

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

Вхідні дані
Розмічених і доступних корпусів іменованих сутностей російською на той момент не було взагалі. А якщо б і були, то там виявилися не зовсім ті сутності. Або зовсім не ті сутності. Аналогічні рішення були, але вони виявилися або поганими (знаходили, наприклад, такі організації як «Задня Кришка» в реченні «після року роботи Задня кришка зламалася») або навіть дуже хорошими, але виділяють не те, що треба (малися вимоги, що стосуються того, які саме сутності потрібно виділяти і щодо меж цих сутностей).

Початок роботи
Дані довелося розмічати самостійно. З наданих специфічних текстів була створена навчальна вибірка. Протягом тижня зусиллями півтора землекопів вдалося розбити вибірку об'ємом 112 000 слів, містить близько 9 000 згадок потрібних сутностей. Після навчання кількох класифікаторів на валідаційної вибірці ми отримали наступне:
Метод F1
CRF (базовий набір ознак) 67.5
Двонаправлена багатошарова мережа Елмана
68.5
Двонаправлена LSTM
74.5
Для простих за змістом сутностей це не дуже добре, порівнянних завдання спеціалізовані системи часто видають F1 районі 90-94 (за опублікованих робіт). Але то на вибірках з мільйона з гаком словоформ та за умови ретельного підбору ознак.

У попередніх результатах найкраще себе показала модель LSTM, з великим відривом. Але використовувати її не дуже хотілося, бо вона відносно повільна, обробляти їй великі масиви тексту в реальному часі накладно. До моменту отримання розміченій вибірки, і попередніх результатів до строку залишалася тиждень.

День #1. Регуляризация
Основна проблема нейронних мереж на малих вибірках – перенавчання. Класично з цим можна боротися підбором правильного розміру мережі, або використанням спеціальних методів регуляризації.

Ми спробували підбір розмірів, max-norm регуляризацию на різних шарах, з підбором значень констант і dropout. Отримали червоні очі, головний біль і пару відсотків виграшу.
Метод F1
Зменшення розміру мережі до оптимального
69.3
Max-norm
71.1
Dropout
69.0
Dropout нам ніяк практично не допоміг, навчається мережа повільніше, і результат не особливо хороший. Найкраще показав себе Max-norm і зміна розміру мережі. Але приріст невеликий, до потрібних значень як до місяця, а все що можна начебто зроблено.

День #2. Rectified Linear Pain Unit
Статті рекомендують використовувати RelU функцію активації. Написано, що покращує результати. RelU це проста функція if $ x>0 then x else 0.

Нічого не покращився. Оптимізація з ними взагалі не сходиться або результат жахливих. Провозилися день, намагаючись зрозуміти чому. Не зрозуміли.

День #3. LSTM-подібні монстри
Чи можна зробити так, щоб було як LSTM, але на звичайних шарах? Після деяких роздумів уява підказала конструкцію (рис.1). Перед рекуррентным шаром доданий один feed-forward шар (він типу повинен контролювати яка інформація надходить у мережу), і зверху ще конструкція для управління висновком:


малюнок 1. Архітектура спеціальної нейронної мережі для виділення термінів з тексту

Як не дивно, при правильному підборі параметрів ця конструкція дала приріст F1 до 72.2, що дуже не погано для повністю вигаданою архітектури.

День #4. RelU Повертається
З упертості спробували RelU на «монстра». Виявилося, що якщо RelU встановити тільки на рекурентний шар, то оптимізація не просто сходиться, а виходить F1 73.8! Звідки таке чудо?

Давайте розберемося. Чому працює добре LSTM? Зазвичай пояснюють це тим, що він може запам'ятовувати інформацію на більш тривалий час, і таким чином «бачити» більше контексту. В принципі, звичайну RNN теж можна навчити пам'ятати довгий контекст, якщо використовувати відповідний алгоритм навчання. Але, стосовно до нашої проблеми розмітки послідовності з векторами слів на вході, звичайна RNN спочатку шукає залежності в поточному часовому проміжку і в найближчому контексті, і встигає переобучится на них до того, як навчання дійде до можливості осмисленого аналізу даного контексту. У звичайній RNN Елмана ми не можемо наростити «обсяг пам'яті» без того, щоб значно не збільшити здатність мережі до перенавчання.

Якщо ми подивимося на картинку нової архітектури, то побачимо, що тут ми рознесли модуль, який зберігає інформацію і «вирішальний» модуль. При цьому модуль пам'яті сам позбавлений можливості будувати складні гіпотези, тому його можна наростити без того боязні того, що він буде вносити істотний внесок в перенавчання. Цим ми отримали можливість управляти ступенем відносної важливості пам'яті та інформації в поточному вікні для конкретної задачі.

День #5. Діагональні елементи
Дотримуючись ідеї, описаної в [1], ми виключили з рекурентного шару все рекурентні з'єднання крім від інших нейронів, залишивши на вхід кожного нейрона тільки його власне попередній стан. Крім того, ми додали зробили верхній шар теж рекуррентным (рис. 2). Це дало нам F1 74.8, що, на даної задачі було кращим результатом, ніж вдалося спочатку отримати з допомогою LSTM.

День #6. Обсяг вибірки
Оскільки весь тиждень ми продовжували розмічати дані, то в цей день ми перейшли до використання нової вибірки подвоєного розміру, що дозволило (після нового витка підбору гиперпараметров) отримати F1 83.7. Немає нічого краще вибірки більшого розміру, коли її легко отримати. Правда подвоїти обсяг розмічених даних зазвичай буває зовсім не просто. Ось що маємо в результаті:
Метод F1
CRF (базовий набір ознак) 76.1
Двонаправлена багатошарова мережа Елмана
77.8
Двонаправлена LSTM
83.2
Наша архітектура
83.7
Висновки і порівняння з аналогами
Адекватно порівняти нашу систему розпізнання з аналогічними реалізаціями у згаданих вище web-API не можна, оскільки розрізняються визначення самих сутностей і кордонів. Ми зробили якийсь дуже приблизний аналіз, на невеликий тестовій вибірці, спробувавши поставити всі системи в рівні умови. Нам довелося вручну проаналізувати результат за спеціальним правилам, використавши метрику binary overlap (зараховується визначення сутності, якщо система виділила хоча б її частина, що знімає питання розбіжність кордонів) і виключивши з аналізу випадки, коли сутності не треба було виділяти з-за незбіжних визначень. Ось що вийшло:
Метод F1
Наша система 76.1
Аналог #1
77.8
Аналог #2
83.2
Аналог #2 має лише невелику перевагу по цій метриці, а Аналог #1 показав себе ще гірше. Обидва рішення будуть видавати менш якісні результати, якщо тестувати їх на нашій задачі з поставленими замовником уточненнями.

З усього вищевикладеного ми зробили два висновки:
1. Навіть добре визначені і вирішені завдання добування іменованих сутностей мають підваріанти, які можуть зробити застосування готових систем неможливим.
2. Застосування нейронних мереж дозволяє швидко створювати спеціалізовані рішення, які знаходяться приблизно в тому ж діапазоні якості, що і більш складні розробки.

Література
1. T. Mikolov, A. Joulin, S. Chopra, M. Mathieu, and M. Ranzato. Learning longer memory in
recurrent neural networks
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.