Seq2seq (від англ. sequence to sequence — послідовність в послідовність) — це сімейство підходів машинного навчання, що використовуються для обробки природної мови. Спочатку розроблений в'єтнамським інформатиком та піонером машинного навчання в Google Brain Ле В'єт Куоком, цей фреймворк став фундаментальним для багатьох сучасних систем штучного інтелекту. Застосування включають переклад мов, підписування зображень, діалогові моделі, розпізнавання мовлення, та стиснення тексту.
Seq2seq використовує перетворення послідовностей: він перетворює одну послідовність в іншу.
Історія
seq2seq — це підхід до машинного перекладу (або, більш загально, трансдукції послідовностей), що має коріння в теорії інформації, де зв'язок розуміється як процес кодування-передачі-декодування, а машинний переклад може розглядатися як спеціальний випадок зв'язку. Ця точка зору була розроблена, наприклад, у моделі шумного каналу машинного перекладу.
На практиці seq2seq відображає вхідну послідовність у дійсночисловий вектор за допомогою нейронної мережі (енкодера), а потім відображає її назад у вихідну послідовність за допомогою іншої нейронної мережі (декодера).
Ідея трансдукції послідовностей типу енкодер-декодер була розроблена на початку 2010-х років. Статтями, які найчастіше цитують як такі, що започаткували seq2seq, є дві роботи 2014 року.
У запропонованому ними seq2seq і енкодер, і декодер були мережами LSTM. Це мало проблему «вузького місця» (bottleneck), оскільки вектор кодування має фіксований розмір, тому для довгих вхідних послідовностей інформація схильна втрачатися, оскільки її важко вмістити у вектор кодування фіксованої довжини. Механізм уваги, запропонований у 2014 році, вирішив цю проблему. Вони назвали свою модель RNNsearch, оскільки вона «емулює пошук по вихідному реченню під час декодування перекладу».
Проблемою моделей seq2seq на цьому етапі було те, що рекурентні нейронні мережі важко паралелізувати. Публікація Трансформерів у 2017 році вирішила проблему, замінивши кодуючу РНМ на блоки Трансформера з самоувагою («блоки енкодера»), а декодуючу РНМ — на блоки Трансформера з перехресною увагою та причинно-наслідковою маскою («блоки декодера»).
Спір про пріоритет Однією зі статей, що цитується як першоджерело seq2seq, є (Sutskever et al. 2014), опублікована в Google Brain під час роботи над проектом машинного перекладу Google. Це дослідження дозволило Google оновити Google Translate до Google Neural Machine Translation у 2016 році. Томаш Миколов стверджує, що розвинув ідею (до joining Google Brain) використання «нейронної мовної моделі на парах речень... а потім [генерації] перекладу після побачення першого речення» — що він прирівнює до машинного перекладу seq2seq, і що він згадав цю ідею Іллі Суцкеверу та Куоку Ле (під час роботи в Google Brain), які не визнали його у своїй статті. Миколов працював над RNNLM (використання РНМ для мовного моделювання) у своїй докторській дисертації,Mikolov, Tomáš. "Statistical language models based on neural networks." (2012). і більш відомий розробкою word2vec.
Архітектура Основним джерелом для цього розділу є.
Енкодер
Енкодер відповідає за обробку вхідної послідовності та захоплення її суттєвої інформації, яка зберігається як прихований стан мережі і, у моделі з механізмом уваги, як вектор контексту. Вектор контексту є зваженою сумою вхідних прихованих станів і генерується для кожного моменту часу у вихідних послідовностях.
Декодер
Декодер бере вектор контексту та приховані стани від енкодера і генерує кінцеву вихідну послідовність. Декодер працює в авторегресивному режимі, продукуючи один елемент вихідної послідовності за раз. На кожному кроці він враховує раніше згенеровані елементи, вектор контексту та інформацію про вхідну послідовність, щоб робити прогнози для наступного елемента у вихідній послідовності. Зокрема, в моделі з механізмом уваги вектор контексту та прихований стан конкатенуються разом, утворюючи прихований вектор уваги, який використовується як вхід для декодера.
Метод seq2seq, розроблений на початку 2010-х, використовує дві нейронні мережі: мережа енкодера перетворює вхідне речення на числові вектори, а мережа декодера перетворює ці вектори на речення цільовою мовою. Механізм уваги був інтегрований у цю структуру у 2014 році і показаний нижче. Пізніше він був вдосконалений до архітектури Трансформер енкодер-декодер 2017 року.
Навчання проти прогнозування
Існує тонка різниця між навчанням та прогнозуванням. Під час навчання відомі як вхідна, так і вихідна послідовності. Під час прогнозування відома лише вхідна послідовність, а вихідна послідовність має бути декодована самою мережею.
Зокрема, розглянемо вхідну послідовність та вихідну послідовність . Енкодер оброблятиме вхід крок за кроком. Після цього декодер братиме вихід від енкодера, а також <bos> як вхід і вироблятиме прогноз . Тепер постає питання: що має бути на вході декодера на наступному кроці?
Стандартним методом навчання є «teacher forcing» (примусове навчання з учителем). При teacher forcing, незалежно від того, що видає декодер, наступним входом для декодера завжди є еталонне значення. Тобто, навіть якщо , наступним входом для декодера все одно є , і так далі.
Під час прогнозування «учитель» буде недоступний. Тому на вході декодера має бути , потім , і так далі.
Виявляється, що якщо модель навчалася виключно за допомогою teacher forcing, її продуктивність під час прогнозування погіршується, оскільки генерація на основі власного виходу моделі відрізняється від генерації на основі виходу вчителя. Це називається похибкою експозиції (exposure bias) або зсувом розподілу train/test. У статті 2015 року рекомендується під час навчання випадковим чином перемикатися між teacher forcing та відсутністю teacher forcing.
Механізм уваги для seq2seq Механізм уваги — це вдосконалення, запроваджене Бахданау та ін. у 2014 році для подолання обмежень базової архітектури Seq2Seq, де довша вхідна послідовність призводить до того, що прихований стан виходу енкодера стає нерелевантним для декодера. Він дозволяє моделі вибірково фокусуватися на різних частинах вхідної послідовності під час процесу декодування. На кожному кроці декодера модель вирівнювання обчислює оцінку уваги, використовуючи поточний стан декодера та всі приховані вектори уваги як вхід. Модель вирівнювання — це ще одна модель нейронної мережі, яка навчається спільно з моделлю seq2seq і використовується для обчислення того, наскільки добре вхід, представлений прихованим станом, збігається з попереднім виходом, представленим прихованим станом уваги. Потім до оцінки уваги застосовується функція softmax, щоб отримати вагу уваги.
У деяких моделях стани енкодера безпосередньо подаються на функцію активації, усуваючи потребу в моделі вирівнювання. Функція активації отримує один стан декодера та один стан енкодера і повертає скалярне значення їхньої релевантності.
Розглянемо мовне завдання перекладу з англійської на французьку для seq2seq. Для конкретності розглянемо переклад "the zone of international control <end>", який має бути переведений як "la zone de contrôle international <end>". Тут ми використовуємо спеціальний токен <end> як керівний символ для позначення кінця входу як для енкодера, так і для декодера.
Вхідна послідовність тексту обробляється нейронною мережею (яка може бути LSTM, енкодером Трансформера або якоюсь іншою мережею) у послідовність дійснозначних векторів , де позначає «прихований вектор».
Після завершення обробки енкодером декодер починає працювати з прихованими векторами, щоб створити вихідну послідовність , авторегресивно. Тобто він завжди бере як вхід як приховані вектори, згенеровані енкодером, так і те, що сам декодер згенерував раніше, щоб створити наступне вихідне слово:
(, "<start>") → "la" (, "<start> la") → "la zone" (, "<start> la zone") → "la zone de" ... (, "<start> la zone de contrôle international") → "la zone de contrôle international <end>"
Тут ми використовуємо спеціальний токен <start> як керівний символ для позначення початку входу для декодера. Декодування припиняється, щойно у вихідних даних декодера з'являється "<end>".
Ваги уваги
Оскільки ручне створення ваг суперечить меті машинного навчання, модель повинна обчислювати ваги уваги самостійно. Провівши аналогію з мовою запитів до баз даних, ми змушуємо модель конструювати трійку векторів: ключ (key), запит (query) та значення (value). Груба ідея полягає в тому, що ми маємо «базу даних» у вигляді списку пар ключ-значення. Декодер надсилає запит і отримує відповідь у вигляді зваженої суми значень, де вага пропорційна тому, наскільки сильно запит схожий на кожен ключ.
Декодер спочатку частково обробляє вхід "<start>", щоб отримати проміжний вектор , 0-й прихований вектор декодера. Потім проміжний вектор перетворюється лінійним відображенням у вектор запиту . Тим часом приховані вектори, видані енкодером, перетворюються іншим лінійним відображенням у вектори ключів . Лінійні відображення корисні для того, щоб надати моделі достатньо свободи для пошуку найкращого способу представлення даних.
Тепер запит і ключі порівнюються шляхом обчислення скалярних добутків: . Ідеально, модель повинна була навчитися обчислювати ключі та значення таким чином, щоб був великим, — малим, а решта — дуже малими. Це можна інтерпретувати так, що вага уваги має переважно застосовуватися до 0-го прихованого вектора енкодера, трохи до 1-го і практично жодної до решти.
Щоб створити правильно зважену суму, нам потрібно перетворити цей список скалярних добутків на розподіл ймовірностей за індексами . Це можна зробити за допомогою функції softmax, що дає нам ваги уваги:Це потім використовується для обчислення вектора контексту:
де — це вектори значень, лінійно перетворені іншою матрицею, щоб надати моделі свободу в пошуку найкращого способу представлення значень. Без матриць модель була б змушена використовувати один і той самий прихований вектор і для ключа, і для значення, що може бути недоречним, оскільки ці два завдання не є однаковими.
Це механізм точкової уваги (dot-attention). Конкретна версія, описана в цьому розділі, — це «перехресна увага декодера», оскільки вихідний вектор контексту використовується декодером, вхідні ключі та значення надходять від енкодера, але запит надходить від декодера, звідси — «перехресна увага».
Більш стисло ми можемо записати це якде матриця — це матриця, рядки якої є . Зверніть увагу, що вектор запиту не обов'язково збігається з вектором ключа-значення . Фактично, теоретично можливо, щоб вектори запиту, ключа та значення були всі різними, хоча на практиці це трапляється рідко.
Інші застосування У 2019 році Facebook оголосив про його використання для символьного інтегрування та розв'язання диференціальних рівнянь. Компанія стверджувала, що він може вирішувати складні рівняння швидше та точніше, ніж комерційні рішення, такі як Mathematica, MATLAB та Maple. Спочатку рівняння розбирається в деревоподібну структуру, щоб уникнути нотаційних особливостей. Потім нейронна мережа LSTM застосовує свої стандартні засоби розпізнавання образів для обробки дерева.
У 2020 році Google випустила Meena, чат-бот на основі seq2seq із 2,6 мільярдами параметрів, навчаний на наборі даних обсягом 341 ГБ. Google стверджував, що місткість моделі чат-бота в 1,7 рази перевищує місткість моделі GPT-2 від OpenAI.