ML: Буквений і семантичний ембединг


Вступ

У машинному навчанні мовна модель передбачає ймовірності слів у тексті. Передбачуване слово може бути черговим: $P(w_{t+1}| ...,w_{t-1},w_t)$ або замаскованим: $P(w_{t}| ...w_{t-1},?,w_{t+1},...)$. Класичний підхід побудови мовних моделей полягає у використанні n-грам з їхнім подальшим згладжуванням (марковські моделі). Слабким місцем такого підходу є рідкісні n-грами, з якими достатньо успішно борються нейронні мережі за допомогою механізму ембедингу. Так, якщо деяке поєднання слів у корпусі не зустрілося, але їхні вектори співнапрямлені до більш частотних слів, то можна отримати цілком релевантну ймовірність n-грами.

У стандартного ембедингу, у свою чергу, є два успадковані від n-грам недоліки:

Наприклад, слова "молоток" і "молотком" при складанні словника вважаються не пов’язаними один з одним. Це знову створює проблеми для рідкісних слів, які при навчанні повинні зустрітися в схожому контексті у всіх своїх словоформах (щоб вийшли близькі вектори ембедингу).

З морфологічною мінливістю можна боротися за допомогою класичного морфологічного аналізу, використовуючи лематизацію (приведення слова до базової форми за допомогою словника) або стемінг (виділення основи слова шляхом обрізання його закінчення за простими правилами). Перший метод вимагає великих морфологічних словників і не завжди однозначний ("стекло" = стекло - імен. або стекати - дієсл.). Другий метод може справлятися з незнайомими словами, але іноді помиляється в досить частотних словах (наприклад PorterStemmer для "healthy" дає "healthi"). Ще один підхід - це додавання до вектора словоформи векторів ембедингу його n-грам букв (fastText). Нарешті, можна одразу з рівня слів "опуститися" на рівень символів (2015). Саме цей підхід детальніше розглядається нижче.

Семантична неоднозначність призводить до того, що слово може мати абсолютно різні значення, однак з ним пов’язується один і той самий вектор ембедингу (наприклад "table" - стіл, таблиця). Один зі способів зменшення цієї проблеми робиться у контекстно залежній векторизації ELMo, яка також розглядається у цьому документі.


Морфологічний аналіз

Розглянемо спочатку інструменти, що використовуються в класичному морфологічному аналізі. Стандартом стемінгу в англійській мові є Стемер Портера. Його реалізація є в бібліотеці nltk:
import nltk

ps = nltk.stem.PorterStemmer()

for w in ["looked", "decided",  "got",  "are", "parents", "feet",  "unhealthy"]:
    print(ps.stem(w), end=", ")
         # look, decid, got, are, parent, feet, unhealthi

У цій самій бібліотеці є лематизатор на основі словника WordNet. Для коректної роботи йому необхідно передавати передбачувану частину мови (за замовчуванням - це іменник 'n'):

nltk.download('wordnet')
wn = nltk.WordNetLemmatizer()

for p in ['n', 'v']:
    for w in ["looked", "decided",  "got",  "are", "parents", "feet",  "unhealthy"]:
        print(wn.lemmatize(w, pos=p), end=", ")        
    print()
             # looked, decided, got, are, parent, foot, unhealthy 
             # look,   decide,  get, be,  parent, feet, unhealthy 

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


Буквений ембединг

У статті Kim Y., et al. (2015) було запропоновано отримувати ембединг слів з ембедингу їхніх букв. Для цього використовуються згорткові шари (CNN) і шар макс-пулінгу (подробиці на рисунку праворуч і далі в тексті).

Нехай число символів у мові дорівнює C і кожному з них ставиться у відповідність E-вимірний вектор ембедингу. Тоді слово з L букв $c_1,...,c_L$ характеризується матрицею $\mathbf{C}$ форми (E,L) (вектори слів розташовані по колонках). До цієї матриці застосовується CNN-фільтр $\mathbf{H}$: (E,W), шириною W, після якого додається зміщення $b$ і результат пропускається через функцію активації: $$ \mathbf{f}[i]= \tanh\bigr( \{\mathbf{C}[:,\,i:i+W]\odot\mathbf{H}\}.\text{sum}() + b \bigr), $$ де $\odot$ - операція поэлементного множення матриць (без згортки). У результаті виходить (L-W+1)-вимірний вектор ознак $\mathbf{f}$. До цього вектора застосовується max-pooling, тобто вибирається його максимальна компонента. Ці числа по всіх фільтрах об’єднуються у вектор ембедингу слова. Його розмірність дорівнює числу фільтрів і не залежить від їхніх ширин (кожен фільтр породжує одну ознаку). Передбачається, що різні ширини фільтрів відповідають різним n-грамам букв.

Праворуч на рисунку до слова "absurdity" (L=9, E=4) застосовується 12 фільтрів: 4 жовтих (W=3), 3 синіх (W=2) і 5 червоних (W=4). Вектори результатів згортки розташовані построчно.

Для використання пакетного навчання автори зробили однаковими довжини всіх слів, забиваючи нулями відсутність букв (zero-padding). Крім цього, кожне слово було оточене спеціальними стартовим і фінальним символами (щоб полегшити фільтру виділяти префікс і суфікс слова). У великій моделі (LSTM-Char-Large) використовувався такий набір ширин фільтрів: W = [1, 2, 3, 4, 5, 6, 7] з числом фільтрів для кожної ширини F = [50, 100, 150, 200, 200, 200, 200] (усього 1100 фільтрів = розмірність ембедингу слова). Маленька модель (LSTM-Char-Small) містила 525 фільтрів.

Отриманий вектор $\mathbf{x}$ слова далі пропускають через повнозв’язну швидкісну мережу (див. нижче). Вектори ембедингу на її виході використовувалися авторами для побудови мовної моделі. Для цього за допомогою стопки односпрямованих LSTM рекурентних шарів передбачалося чергове слово послідовності. Якщо на вході моделі могли бути будь-які слова (буквений ембединг), то на виході рекурентного слова стояв повнозв’язний шар з числом нейронів рівних числу слів деякого фіксованого словника. Далі, як звичайно, функція softmax видавала ймовірності слів.

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


☝ Повнозв’язна швидкісна мережа (highway network, 2015) складається зі стопки шарів такого вигляду: $$ \mathbf{x}' = \mathbf{t}\odot g(\mathbf{x}\cdot\mathbf{W}+\mathbf{b}) + (\mathbf{1}-\mathbf{t})\odot \mathbf{x}, ~~~~~~~~~~~~~~~ \mathbf{t}=\sigma(\mathbf{x}\cdot\mathbf{W}_T+\mathbf{b}_T). $$ Матриці $\mathbf{W},\,\mathbf{W}_T$ квадратні і відповідно розмірність виходу мережі $\mathbf{x}'$ збігається з розмірністю її входу $\mathbf{x}$. У цій мережі вихід звичайного повнозв’язного шару з активаційною функцією $g$ (наприклад ReLU) змішується з його входом. Ваги $\mathbf{t}$ змішування визначаються гейтом перетворення (transform gate), а $\mathbf{1}-\mathbf{t}$ є гейтом переносу (carry gate). За аналогією з LSTM, ця мережа дозволяє перенести деякі ознаки (компоненти $\mathbf{x}$) без змін від входу до виходу.


Типи мовних моделей і RNN

Нехай є послідовність з $N$ токенів (слів або букв): $w_1,...,w_N$. Пряма мовна модель (forward language model) оцінює ймовірності за історією зліва-направо (марковське ланцюгове правило): $$ p(w_1,...,w_N) = \prod^N_{k=1} p(w_k|w_1...w_{k-1}). $$

Умовні ймовірності $p(w_k|w_1,...,w_{k-1})$ можна отримувати за допомогою стопки $L$ рекурентних шарів з номерами $j=[1...L]$. Нехай $h_{kj}$ - прихований стан $k$-ї комірки на $j$-му шарі. Тоді при подачі на вхід першого шару контекстно незалежних векторів слів (що не знають контексту) на комірці $h_{kL}$ останнього шару виходять (після повнозв’язного шару і softmax-функції) розподіл ймовірностей для слова $w_{k+1}$.

Праворуч наведено найпростіший варіант такої мережі з одним рекурентним шаром. Жовті блоки є LSTM або GRU комірками, прихований стан яких передається як на вихід, так і в наступну комірку. Блакитний блок - це повнозв’язний шар (fc), після якого стоїть софтмакс функція (sm), що видає "ймовірності" токенів. Значення входу (внизу) і виходу (вгорі) наведені у процесі примусового навчання (teacher forcing) навчання мережі. Помилку при зворотному поширенні можна обчислювати як по всіх виходах, так і по кількох останніх (після накопичення інформації про послідовність).

Аналогічно можна використовувати передбачення на основі майбутнього контексту (future context): $$ p(w_1,...,w_N) = \prod^N_{k=1} p(w_k|w_{k+1}...w_{N}), $$ що також моделюється за допомогою рекурентних шарів, але зі зворотним потоком прихованих станів. Зауважимо, що якщо в мережі прямого з’єднання передбачувана послідовність (вихід шару) зсунута ліворуч, то для зворотного потоку вона повинна бути зсунута праворуч.

Нарешті, двонапрямлена рекурентна мережа, заснована на двох зустрічних RNN-шарах, може максимізувати таку величину: $$ \sum^N_{k=1}\Bigr[ \log\,p(w_k|w_1...w_{k-1}; \overrightarrow{\Theta\,}_f )+ \log\,p(w_k|w_{k+1}...w_{N}; \overleftarrow{\Theta}_b) \Bigr], $$ де символ $\overrightarrow{\Theta\,}_f$ означає параметри комірки RNN, з’єднані зліва-направо, а $\overleftarrow{\Theta\,}_b$ - справа-наліво. Просто скористатися двонапрямленою мережею для побудови такої мовної моделі не можна і потрібні деякі зміни.


Навчання на нерозмічених даних

Нижче на першому рисунку наведено значення входів і виходів двонапрямленої рекурентної мережі у процесі її примусового навчання. Нижній шар передбачає наступний токен, а верхній - попередній. Для генерації тексту (у процесі тестування) така архітектура не підходить. Однак іноді необхідно мати інтегральну інформацію про текст, наприклад, для задачі визначення тональності речення (sentiment analysis) або для отримання морфологічного вектора слова за векторами ембедингу його букв. У цьому випадку двонапрямлена модель навчається на нерозмічених даних передбачати зсунуту послідовність так, як представлено на рисунку. У режимі використання навченої мережі на її входи подається послідовність токенів і приховані стани шарів (усі або останні) об’єднуються (конкатенуються). Отриманий вектор далі використовується для розв’язання конкретних задач. Наприклад, для визначення тональності тексту він пропускається через повнозв’язний шар, ваги якого навчаються вже на розмічених даних.

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

Нарешті, можна навчати незалежним чином дві мережі (з напрямком зліва-направо і справа-наліво). Потім конкатенувати їхні виходи. Отриману конкатенацію виходів зустрічних шарів кожної пари комірок (вектор перед fc-sm блоком) можна використовувати як контекстно-залежний ембединг токенів. Справді, у цих прихованих станах міститься інформація не лише про поточний вхідний токен, але й про всю послідовність.


Суміш ембедингів

Для формування морфологічного вектора ембедингу слова, окрім згорткових мереж, можна також використовувати рекурентні мережі. Для цього береться двонапрямлена мережа (зазвичай з одного шару). На її вхід надходять вектори ембедингів букв. "Морфологічна модель" у процесі навчання тренується визначати на виході, наприклад, замасковану букву (вище другий рисунок). Далі береться конкатенація останніх прихованих станів кожного шару (що запам’ятали слово "від початку до кінця" і "від кінця до початку").

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

Звичайно, після попереднього і незалежного навчання морфологічному і семантичному ембедингу можна проводити їхню спільну тонку настройку.

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


ELMo

ELMo (Embeddings from Language Models) - є методом ембедингу, який враховує контекст речення, знімаючи тим самим семантичну неоднозначність, притаманну звичайному ембедингу. У цьому методі мовну модель створюють у результаті навчання стопки двонапрямлених рекурентних шарів. Потім навчена мережа використовується як "постачальник" контекстно залежних векторів ембедингу слів. Ці вектори є сумою прихованих станів усіх шарів з деякими коефіцієнтами, які слугують параметрами навчання вже в конкретній задачі. Розглянемо цю ідею детальніше.

Нехай є стопка з $L$ двонапрямлених рекурентних шарів. Позначимо звичайний (контекстно незалежний) вектор ембедингу $k$-го слова, що надходить на вхід $k$-ї комірки першого шару як $\mathbf{h}_{k0}$. Конкатенацію прихованих станів $k$-ї комірки $j$-го двонапрямленого шару позначимо як $\mathbf{h}_{kj}=[\mathbf{h}^\rightarrow_{kj},\, \mathbf{h}^\leftarrow_{kj}]$, де $\mathbf{h}^\rightarrow_{kj}$ - приховані стани шару з прямим проходом, а $\mathbf{h}^\leftarrow_{kj}$ - зі зворотним. Як контекстно залежні вектори ембедингу береться лінійна комбінація прихованих станів усіх шарів:

$$ \mathbf{v}_k = \gamma \sum^L_{j=0} s_j\,\mathbf{h}_{kj},~~~~~~~~~~~~~~~~~~~\sum^N_{j=0} s_j = 1. $$ Сума коефіцієнтів $s_j$ дорівнює одиниці (що забезпечується функцією softmax), а $\gamma$ є загальним масштабуючим множником.

Мережа навчається на нерозміченому корпусі текстів передбачати слова. Потім ваги шарів "заморожують" і мережа використовується як постачальник компонент $\mathbf{h}_{kj}$ контекстно залежних векторів у формулі вище. При цьому параметри $s_j$ і $\gamma$ підбирають у рамках розмічених навчальних даних у рамках конкретної задачі.


Література

Статті