Друга нейромережа — 5 кроків у напрямку розумності

На початку травня я запустив свою першу нейромережу в житті та описав свої переживання у цій статті. Потім мені довелося відволіктись на розробку гри “Хабаросафарі”, акселерацію нашого стартапу “Memelex” і написання дисертації. Нарешті випав час доробити другу нейромережу, посилену “нейронами сумніву”, “нейронами заборони”, “алгоритмом інтерпретації” та іншими штуками. Пропоную вам оцінити, чи стала вона кращою. Ця стаття є продовженням попередньої, це ще глибше занурення у світ нейромереж.

Andrey Kostenko
Dead Lawyers Society
8 min readJul 24, 2018

--

Передусім дуже дякую всім, хто тестив першу нейромережу і годував її різними підступними реченнями. :) Ці тести показали, що вона вийшла незграбною і затурканою. Це вийшло з ряду причин. Наприклад, вона не була здатна проявляти базову когнітивну здатність людини — здатність сумніватися. Також у ній були інші принципові недоліки, які зараз більш-менш вдалося усунути. Оглянемо 5 нововведень, які зробили цю нейромережу ефективнішою.

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

  1. веб-інтерфейс, з якого тестувальниками відправляється чергове підступне речення і на яке повертаються результати його оцінки (далі — “Веб-інтерфейс”);
  2. підготовча частина, де за допомогою контекстних словників та різноманітних досягнень мов програмування досліджується це речення, в результаті чого формуються сигнали для вхідного шару нейромережі (далі — “Підготовчий алгоритм”);
  3. власне нейронна мережа, яка завдяки послідовності математичних операцій формує сигнали на своєму вихідному шарі (далі — “Нейромережа”);
  4. алгоритм інтерпретації, який оброблює фінальні сигнали Нейромережі та видає на їх базі вердикт автору підступного речення (далі — Алгоритм інтерпретації).
У біології нейромережі теж не самі по собі: у них є свої постачальники даних.

Нововведення 1 — вміння розбірливої далекоглядності

Після запуску першої версії швидко стало зрозуміло, що “відстань” у 5 контекстних слів від багатозначного слова для української мови явно замала. Ось чудовий приклад від одного з тестувальників:

“… однак документи, які б підтверджували раціональність нашої ідеї, не пройшли легалізацію.”.

В цьому випадку єдине корисне для наших цілей слово “документи” стоїть на позиції -9 (тобто дев’яте слово зліва). Тому я вирішив збільшити цю відстань до 10. Звісно, інколи потрібні контекстні слова зустрічаються і на більшій відстані, але я вже вирішив, що “наше дослідження має суто дослідницький характер” і тому не потребує такої точності. Також вирішив перевірку на контекстні слова проводити з 2-ї позиції, а не з 1-ї, щоб ця група з трьох нейронів відповідала лише за своє поле видимості, і не залазила на чужі поля, які знаходяться на “відстані 1”. Тому цю групу нейронів я умовно назвав “Both2to10”, а самі ці нейрони далі буду називати Both2to10-нейрони.

Однак це ще не все. Раніше знайдені слова з кожного з трьох контекстних списків просто рахувалися і на відповідні вхідні нейроні подавалася їх арифметична сума. Але тут мене охопив сумнів, адже взагалі на практиці виходить так, що чим ближче контекстне слово до багатозначного слова, тим більшу статистичну вагу воно має в процесі визначення його сенсу. Тому число в сигналі кожного Both2to10-нейрона має відображати не просто арифметичну суму знайдених слів, а ще й віддаленість кожного з них. Через це я вирішив зробити алгоритм більш природнім: щоб вага контекстного слова залежала ще й від його конкретної фактичної відстані, а не лише від факту входження в умовний діапазон “відстань 2-10”. Що менша ця відстань, тим більший вплив. Сума впливів знайдених слів по кожній контекстній групі множиться на спеціальний коефіцієнт, і це стає сигналом для відповідних Both2to10-нейронів.

Думаю, що квадрат величини збільшення контекстної відстані прямо пропорційний кількості знайденого на цій відстані сенсу.

Нововведення 2 — вміння визначати пріоритети

Раніше найбільший пріоритет для Нейромережі мали слова, які просто знаходилися на “відстані 1” навколо багатозначного слова. Однак це дуже грубий підхід для нашої мови. З позицій синтаксису і семантики для визначення сенсу багатозначного іменника “легалізація” найбільшу вагу має іменник, який йде після цього слова в родовому відмінку і не відокремлений від нього розділовими знаками. Тобто ці два слова знаходяться у відношенні підрядності: слово “легалізація” не має сенсу саме по собі, щось/хтось має підлягати цій легалізації. Це безумовний показник. Як би ви не будували речення, насичаючи його протилежними сенсами, якщо це відношення підрядності присутнє, то воно буде мати пріоритет у будь-якому хаосі. Наприклад:

“Поважні консули з документами і апостилями їхали на ішаках, і легалізація доходів від продажу кулеметів та пістолетів, а також героїну і кокаїну, бентежила їх думки…”

Група нейронів, яка відповідає за цей підрядний зв’язок, називається AfterHard. Якщо провести умовну стратифікацію всіх груп вхідних нейронів, то AfterHard-нейрони — еліта вхідного шару нейромережі, їх слово має найбільшу вагу. Причому лише один AfterHard-нейрон з трьох може бути активований одночасно, бо, вочевидь, лише одне слово може стояти першим після багатозначного слова. :) Це багато що спрощує.

Але це ще не все. Інколи це підрядне слово може стояти не після багатозначного слова, а перед ним, при цьому будучи відокремленим комою, тоді як багатозначне слово потрапляє в дієприкметниковий зворот. Ось як це виглядає:

“Розквітає проституція, легалізація якої могла …”

Причому це підрядне слово може бути в будь-якому відмінку:

“Розквітаючу проституцію, легалізація якої могла …”

“Розквітаючої проституції, легалізація якої могла …”

У трьох наведених вище реченнях правильний сенс слова “легалізація” буде “узаконення”. Однак чому цей показник не можна прирівнювати за силою до групи AfterHard? А тому, що можливі такі хитрі прийоми:

“Розквітаючої проституції, легалізація доходів від якої могла …”

“Розквітаючої проституції, легалізація документів в умовах існування якої має потенціал для …”

Як бачимо, в цих випадках правильний сенс слів “легалізація” буде не “узаконення”. Тому алгоритмічно не можна ототожнювати “слово перед” та “слово після”. От і з’являється у нас наступна група нейронів — група BeforeSoft. Чому “Soft”, а не “Hard”? Тому що контекстний словник для цієї групи містить не лише родові відмінки, а й інші, а інколи і взагалі основу слів (тобто шматок слова без закінчення).

Поряд з групами AfterHard і BeforeSoft, є ще група нейронів AfterSoft. Сигнал цих нейронів теж базується на слові, яке йде одразу після слова “легалізація”, однак допускається не лише родовий відмінок, а й інші, а також деякі основи і корені слів.

Таким чином, маємо чотири групи з 3 нейронами в кожній, розташовані за спаданням значимості: AfterHard, BeforeSoft, AfterSoft, Both2to10. У кожній групі кожен нейрон має свій вплив на відповідний йому нейрон прихованого шару мережі. Вже в нас є 12 вхідних нейронів, що у два рази перевищує їх кількість у попередній нейромережі. Але цього все ще замало.

У нейромережі стратифікація може бути в межах одного шару (в моєму випадку — вхідного). Але немає єдиного “правителя”. Рішення колегіальні. Щоправда, баланс сил може бути нерівний.

Нововведення 3 — вміння сумніватися

Сумнів — це наш природний стан. Він виникає, коли щось йде не так, коли нема ясності. Носити краватку чи не носити? Давати хабар чи не давати? Коли алгоритм бачитиме кілька контекстних слів, які належать до різних сенсів, то він має “засумніватися”. Засумніватися у доцільності однозначного приписування слову “легалізація” одного з цих сенсів. Тобто він має вирішити, що краще промовчати, аніж спробувати вгадати і помилитися. Так іноді вчиняємо і ми. Тому вирішив увести на прихований і вихідний шари мережі нейрони сумніву.

Початково схема роботи нейронів сумніву була така:

  1. нейрон сумніву на прихованому шарі має “побачити”, що на вхідному шарі є якась підозріла активність у різних смислових групах (наприклад, з групи BeforeSoftлунає, що має бути сенс “узаконення”, а група AfterSoft кричить, що сенс “відмивання”, і до неї ще долучається група “Both2to10”);
  2. цей нейрон активується, якщо розрахований сигнал на базі сигналів різних нейронів тих груп перевищує пороговий (0,5);
  3. він має пригнічити вихідні нейрони, які відповідають за констатацію наявності сенсів, та активувати на повну вихідний нейрон сумніву.
  4. сигнал вихідного нейрона сумніву передається в Алгоритм інтерпретації, що і визначає долю майбутньої відповіді.

Так спершу я собі придумав. Але виявилось, що проста математична модель Нейромережі за такою схемою працює парадоксально: коли в одній смисловій групі буде дуже сильний сигнал, а по інших групах буде нульовий, наприклад у реченні “Збройний уряд веде наркотичну легалізацію наркотиків, кокаїну, пістолетів, проституції, кулеметів і творів Гітлера”, то нейрон сумніву спрацює! Бо сигнал для сенсу “узаконення” буде дуже сильний. Зменшення “чутливості” нейрона сумніву — поганий хід, тому що він перестане “помічати” ті ситуації, коли “сумнів” вже потрібний. До того ж, з математичної точки зору ця проблема все одно залишиться. Тому мені довелося створити нейрон сумніву ще й на вхідному шарі, і його сигнал розраховувати за допомогою окремого шматочку коду, який і увійшов до Підготовчого алгоритму.

Тепер алгоритм буде розумно стверджувати, що сумнівається, досліджуючи речення на кшталт таких:

  1. “Хіба може легалізація одночасно означати узаконення, відмивання та підтвердження?” (до речі, це речення стало моїм фаворитом з усіх речень, люб’язно наданих тестувальниками)
  2. Консульська легалізація трансплантації документів ще заявить про себе.” (в цьому випадку алгоритм ще додасть, що він обрав би сенс “підтвердження”)
Сумнів може утримати від невдалого рішення. Наприклад, від розказування несмішного анекдоту.

Нововведення 4 — вміння відмовлятися

Інколи слово “легалізація” вживають некоректно. Наприклад: “легалізація трудових відносин”, “легалізація заробітної плати”, “легалізація програмного забезпечення”. Під словом “легалізація” в таких випадках розуміється щось на кшталт “переведення чогось в режим законного використання”, “перехід на законні основи використання/здійснення чогось”. Але це, з юридичної точки зору, неправильний вжиток цього слова, тому я вирішив, що алгоритм в таких випадках повинен принципово відмовлятися працювати далі з таким реченням.

Для цього створив “нейрон заборони” на всіх шарах Нейромережі. Той з них, який вхідний, активується Підготовчим алгоритмом при виявленні названих вище та деяких інших конструкцій у зв’язці з нашим багатостраждальним багатозначним словом. Логіка його робота проста, як камінь. Якщо цей нейрон активувався, він безжалісно пригнічує всі інші нейрони і безжалісно активує нейрон заборони на прихованому шарі. Таким чином, вердиктом як Нейромережі, так і всього алгоритму, незалежно від загального балансу сил, буде відмова виявляти сенс у таких умовах.

Із забороною все просто: просто не роби.

Нововведення 5 — вміння додатково інтерпретувати

Приклад минулої Нейромережі змусив мене підозрювати, що, напевно, нема нічого поганого в тому, щоб з вихідних сигналів Нейромережі не напряму робити якісь висновки, а додатково обробляти їх перед винесенням остаточного рішення. Так і з’явився Алгоритм інтерпретації. Це дозволяє, наприклад, не просто констатувати сумнів, але й показати, якому сенсу Нейромережа надала би перевагу, якби не цей сумнів. Але це, щоправда, вже не входить до роботи самої Нейромережі. Це вже робота таких штук, як “if/else” і математичне порівняння, який сигнал більший за інші два. На цьому перелік нововведень слід завершити.

Просте зважування отриманих результатів може бути вельми дієвим.

Підсумки

  1. Попередня схема нейронних зв’язків “6–3–3” змінилася на “14–5–5”, що дало значно більші можливості і більшу схожість роботи цього алгоритму до людського мислення. Однак все ж я ні в якому разі не перебільшую його можливості. Наразі ще є як мінімум дві вразливості цієї Нейромережі, які я хотів би, щоб ви розгадали. :)
  2. У першої нейромережі разом з веб-інтерфейсом було 4 варіації вердикту (“сенс 1”, “сенс 2”, “сенс 3”, “слабкі сигнали”), а в нової їх стало набагато більше: 3 (3 можливі сенси)+ 4 (“слабкі сигнали” + 3 можливі “симпатії”)+ 4 (“сумніви” + 3 можливі “симпатії”)+ 1 (“відмова”) = 12.
  3. Ускладнення часто варте результату, однак у більш складної системи з’являється більше вразливостей (це твердження справедливе і в біології). Тому майже експоненційно зростає кількість коду, який треба писати, щоб обробляти вразливості і баги складнішої системи.

Прошу тестити це чудо ось тут і лишати коментарі під постіком у ФБ.

Текст зайшов як діти в школу? Хочте ще таких? Так ставайте хутчіш нашими патронами:

--

--