Содержание курса 11 / 37

11 / 37 · Нейросетевые модели последовательностей

CNN для классификации текстов

Одномерная свёртка по последовательности векторов слов находит локальные шаблоны n-грамм, а max-pooling собирает их в вектор фиксированного размера; на AG News результат достигает 0.90–0.91 правильных ответов, ниже базового уровня TF-IDF, а обучаемая таблица эмбеддингов при более длинном обучении закрывает бо́льшую часть разрыва.

На этой странице 10

Классификатор TF-IDF из заметки о мешке слов набирает 0.92 на AG News, игнорируя порядок слов и считая каждый токен не связанным ни с каким другим. Теперь у нас есть эмбеддинги, в которых родственные слова расположены рядом. Вопрос этой заметки — справится ли лучше сеть, которая читает последовательность эмбеддингов и потому видит короткие фразы. На этом наборе данных ответ — нет, и причины поучительнее, чем была бы победа.

Обозначения. Документ — последовательность из TT токенов с эмбеддингами x1,…,xT∈Rdx_1, \dots, x_T \in \mathbb R^{d}, собранными в X∈RT×dX \in \mathbb R^{T \times d}. Батч — тензор формы [B,T,d][B, T, d], где TT — длина самой длинной последовательности в батче. KK — число классов, здесь 4.

От последовательности векторов к одному вектору#

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

Батчи из последовательностей разной длины#

Прежде любой модели данные нужно сделать прямоугольными. Статьи имеют разную длину, батч — один тензор, поэтому короткие последовательности дополняются. Когда на входе предобученные векторы, дополнение — нулевой вектор, и батч имеет форму [B,Tmax⁡,d][B, T_{\max}, d] с d=100d = 100. После предобработки у половины обучающих статей AG News от 22 до 30 токенов, для которых есть вектор, а у 95% — не больше 39, так что Tmax⁡T_{\max} в перемешанном батче из 32 статей обычно около 50, и короткие статьи дополняются двадцатью и более нулевыми векторами.

Одномерная свёртка по времени#

Свёртка с размером ядра kk и dd входными каналами хранит для каждого выходного фильтра тензор весов w∈Rk×dw \in \mathbb R^{k \times d}. В позиции tt она вычисляет

yt=ReLU(∑j=0k−1∑c=1dwj,c xt+j, c+b),t=1,…,T−k+1.y_t = \mathrm{ReLU}\Big(\sum_{j=0}^{k-1}\sum_{c=1}^{d} w_{j,c}\, x_{t+j,\,c} + b\Big), \qquad t = 1, \dots, T - k + 1.

Один фильтр — скалярное произведение шаблона k×dk \times d с каждым окном из kk соседних векторов токенов; он откликается, когда окно похоже на шаблон. При doutd_{\text{out}} фильтрах выход — тензор [B,dout,T−k+1][B, d_{\text{out}}, T - k + 1] (PyTorch ставит каналы вторыми, поэтому вход сначала переставляется в [B,d,T][B, d, T]). Один и тот же фильтр применяется в каждой позиции, поэтому число параметров не зависит от TT: у фильтра k⋅d+1k \cdot d + 1 параметров, а у слоя из 100 фильтров размера 3 над 100-мерными входами — 100×(3×100+1)=30 100100 \times (3 \times 100 + 1) = 30\,100.

Поскольку входные векторы — эмбеддинги слов, фильтр размера 3 — выученный детектор шаблона из трёх слов в пространстве эмбеддингов, а поскольку у похожих слов похожие векторы, шаблон, выученный на stock market falls, срабатывает, хоть и слабее, и на share prices drop. Это тот перенос, которого не хватало n-граммной модели, и причина вообще использовать эмбеддинги.

Max-pooling по времени#

После свёртки каждый фильтр дал отклик в каждой позиции. Глобальный max-pooling оставляет для каждого фильтра наибольший отклик в документе:

zi=max⁡t yi,t,z∈Rdout.z_i = \max_{t}\, y_{i,t}, \qquad z \in \mathbb R^{d_{\text{out}}}.

Результат — вектор фиксированного размера при любом TT: «встретился ли этот шаблон где-нибудь и насколько сильно». Линейный слой отображает zz в KK логитов, а функция потерь — кросс-энтропия из заметки о TF-IDF. На max-pooling же уходит и информация о порядке: вектор после пулинга записывает, что шаблон сработал, но не где, поэтому два документа с одним и тем же набором трёхсловных шаблонов в разном порядке после пулинга неразличимы. Поэтому и считается, что свёрточные классификаторы текстов лучше всего работают на коротких текстах, где «какие фразы встречаются» — почти вся история.

Две архитектуры#

Многослойная CNN. Два свёрточных слоя по 100 фильтров с k=3k = 3, ReLU после каждого, глобальный max-pooling, линейный слой на 4 класса. Второй слой видит окна признаков первого слоя, поэтому его рецептивное поле — 5 токенов. Параметры: 2×30 100+(100×4+4)=60 6042 \times 30\,100 + (100 \times 4 + 4) = 60\,604.

TextCNN (Kim, 2014). Три параллельные свёртки с k=3,4,5k = 3, 4, 5 по 100 фильтров каждая применяются к одному и тому же входу; к каждой применяется max-pooling; три 100-мерных вектора конкатенируются в 300 признаков; затем дропаут (dropout, 0.1) и линейный слой на 4 класса. Ядра разных размеров ловят в одном слое фразы разной длины. Параметры: 30 100+40 100+50 100+(300×4+4)=121 50430\,100 + 40\,100 + 50\,100 + (300 \times 4 + 4) = 121\,504.

Рисунок

TextCNN: детекторы фраз и max-pooling

Архитектура TextCNNМатрица из 8 строк (oil, price, soar, time, record, posing, new, menace) и 6 столбцов. Окна шириной 3, 4 и 5 строк ведут к трём картам признаков из 6, 5 и 4 клеток. Наибольшая клетка каждой карты идёт в max-pooling, три результата по 100 чисел конкатенируются в 300 признаков, линейный слой с softmax даёт вероятности World, Sports, Business и Sci/Tech, из которых наибольшая у Business.вход [T, d]oilpricesoartimerecordposingnewmenaceкарты признаковпо одному фильтру каждой шириныk=3×100k=4×100k=5×100max по времени300конкатенацияlinearклассыWorldSportsBusinessSci/TechАрхитектура TextCNNэмбеддинги [B, T, 100]; свёртки k = 3, 4, 5; по 100 фильтров каждая; max по времени: 3 × [B, 100]; конкатенация [B, 300]; dropout, linear → 4 классаэмбеддинги [B, T, 100]свёртки k = 3, 4, 5по 100 фильтров каждаяmax по времени: 3 × [B, 100]конкатенация [B, 300]dropout, linear → 4 класса
Как TextCNN читает документ. Строки входа — векторы токенов начала заголовка AG News после предобработки (цвета клеток условны). Свёртка шириной k скользит по k соседним строкам сразу и в каждой позиции даёт одно число на фильтр: насколько окно похоже на выученный шаблон. Показано по одному фильтру каждой ширины и одному окну каждого цвета; в модели их по 100 на ширину, и каждый пробегает все T − k + 1 позиций. Max-pooling оставляет от каждой карты признаков её наибольший отклик (обведён), где бы он ни был, поэтому выход имеет фиксированный размер 3 × 100 = 300 при любой длине документа, а положение фразы теряется. Линейный слой с softmax превращает 300 признаков в вероятности четырёх тем; значения вероятностей условны.

Обе модели крошечные рядом с таблицей эмбеддингов, которую они читают (2.7 млн параметров: 27 451 слово при d=100d = 100); в первых двух экспериментах она заморожена.

Результаты на AG News#

Обучение: Adam с шагом обучения 10−410^{-4} и затуханием весов (weight decay) 10−310^{-3}, размер батча 32, 5 эпох; входные векторы — из модели Word2Vec, обученной только на предобработанных обучающих статьях.

МодельВходЭпохиДоля верных (тест)Потери (тест)
TF-IDF + логистическая регрессиясчётчики—0.918—
Многослойная CNNзамороженный Word2Vec, d=100d = 10050.8990.298
TextCNNзамороженный Word2Vec, d=100d = 10050.9010.288
TextCNNобучаемые эмбеддинги, d=100d = 100100.9110.269

Три наблюдения.

CNN проигрывают базовому уровню на счётчиках. Тему новостного заголовка несёт то, какие слова в нём есть, а у TF-IDF уже каждое слово — признак с подобранным весом. CNN должна сжать ту же информацию через 100 фильтров и максимум и немного проигрывает. Заявленное преимущество нейросетевых классификаторов проявляется в задачах, где фразы важнее словаря, и на бо́льших обучающих выборках.

Несколько размеров ядра немного помогают. TextCNN лучше многослойной CNN на 0.2 пункта — в пределах шума на 7600 тестовых примерах — при вдвое большем числе параметров. Механизм (фразы нескольких длин) здравый; данные здесь его не вознаграждают.

Лучший результат — у обучаемой таблицы при более длинном обучении. Третий запуск меняет сразу три вещи: таблица эмбеддингов получает градиенты функции потерь классификации, она начинается со случайных векторов вместо Word2Vec, а шаг обучения и число эпох удвоены. Вместе это даёт целый пункт и сокращает разрыв с базовым уровнем больше чем вдвое, но запуск не говорит, какая часть пункта приходится на обучение таблицы; для этого нужны замороженная и обучаемая таблицы с одинаковой инициализацией, шагом и числом эпох. Правдоподобный механизм: векторы слов, выученные на задаче, сближают слова, предсказывающие одну и ту же тему, независимо от того, встречаются ли они вместе, — это та геометрия, которая нужна классификатору, а не та, которую даёт Word2Vec.

Обучаемые эмбеддинги#

Входной конвейер меняется: документы переводятся в целочисленные идентификаторы по словарю Word2Vec с добавленным идентификатором [PAD], батчи дополняются этим идентификатором, а модель начинается с nn.Embedding(|V| + 1, 100), выход которого идёт в ту же TextCNN. Таблица эмбеддингов теперь — 2.7 млн обучаемых параметров рядом с 0.12 млн в свёртках; шаг обучения и число эпох удваиваются, чтобы таблица успела сдвинуться от случайной инициализации. Распространённый промежуточный путь, который здесь не запускался, — инициализировать таблицу предобученными векторами и затем дообучить её; так сохраняется покрытие предобучения и появляется геометрия, подогнанная под задачу.

Что использует классификатор#

Свёрточный классификатор нельзя интерпретировать по весам, но его можно прощупать возмущениями: удалить из документа один токен, снова прогнать модель и записать, как изменилась вероятность истинного класса. Токен, удаление которого снижает вероятность, был свидетельством за класс; токен, удаление которого её повышает, — свидетельством против. Если применить пробу к TextCNN с обучаемыми эмбеддингами на четырёх обучающих заголовках, wall и street оказываются сильнейшими свидетельствами за Business в статье об Уолл-стрит, а reuters — сильнейшим против; в статье из Business о технологической компании, которая судится с бывшими сотрудниками, company тянет к Business, а technology — прочь; в статье об олимпийском плавании к Sports тянут athens, olympic и swimmer. Сильнейшее свидетельство за Sci/Tech в статье о проверке сделки Microsoft регуляторами ЕС — метка новостного агентства ap, впереди msft и microsoft: проба заодно показывает, что классификатор выучил из артефактов набора данных. Проба дешёвая (один прямой проход на токен, батчами) и локальная; она говорит, что использовала эта модель для этого документа, а не что означает класс.

Что изменилось#

TF-IDF + линейная модельCNN поверх эмбеддингов
ЕдиницаСчётчики токеновОкна из kk векторов токенов
Похожие словаНе связанные признакиБлизкие входы одного фильтра
ПорядокНет (n-граммы как доп. признаки)Внутри окна из kk; теряется при пулинге
ПризнакиОдин вес на запись словаря100–300 выученных детекторов фраз
ПараметрыK×∣V∣K \times \lvert V \rvertЭмбеддинги ∣V∣×d\lvert V \rvert \times d + 0.06–0.12 млн
AG News0.9180.899–0.911

Ограничения#

  • Рецептивное поле. Фильтр видит kk токенов; наслоение слоёв медленно его расширяет. Зависимости через всё предложение недостижимы.
  • Пулинг отбрасывает позицию. После максимума модель знает, какие шаблоны сработали, но не где и не в каком порядке.
  • Только короткие тексты. Архитектура предполагает, что документ — мешок фраз. Длинным документам нужны либо иерархические модели, либо модели последовательностей из следующих заметок.
  • У замороженных векторов неправильная для задачи геометрия. Сходство по совместной встречаемости — не сходство по меткам; исправление (обучение таблицы) стоит меток и вычислений.
  • Нет порождения. Архитектура выдаёт один вектор на документ; она не может предсказать следующий токен или породить текст. Рекуррентные модели из следующей заметки умеют и то и другое.

Что нужно запомнить#

  • Одномерная свёртка по последовательности эмбеддингов — набор выученных детекторов n-грамм; число её параметров не зависит от длины последовательности.
  • Глобальный max-pooling превращает отклики переменной длины в вектор фиксированного размера и убирает позицию.
  • На AG News: TF-IDF 0.918; CNN на замороженном Word2Vec 0.899–0.901; TextCNN с обучаемыми эмбеддингами 0.911. Сильный базовый уровень на счётчиках трудно превзойти в классификации по темам.
  • Здесь обучаемая таблица (случайный старт, удвоенные шаг и число эпох) обошла замороженный Word2Vec на пункт; запуск меняет сразу три вещи, поэтому вклад самого обучения таблицы он не выделяет. Распространённый выбор по умолчанию — инициализировать предобученными векторами и дообучать.
  • Возмущение (удалить токен, измерить изменение) — дешёвая проба того, на что опирается классификатор текстов.

Ноутбук#

week02_NN_text_classification.ipynb. Номера ячеек считают все ячейки, включая текстовые, начиная с 1. Приведённые числа взяты из прогона, сохранённого в курсе; у ячеек, изменённых с тех пор под текущие версии библиотек, сохранённого выхода нет.

  • Ячейки 5–12 загружают AG News и предобрабатывают каждый текст (нижний регистр, токены \w+, удаление стоп-слов, леммы WordNet).
  • Ячейка 13 обучает 100-мерную модель Word2Vec на обучающих текстах; ячейки 14–15 переводят каждый текст в последовательность векторов; ячейка 17 строит гистограмму длин текстов.
  • Ячейки 19–24 строят наборы данных и загрузчики с collate_fn, который дополняет последовательности нулевыми векторами; ячейка 24 печатает батч и его метки.
  • Ячейки 26–31 определяют многослойную CNN, цикл обучения (nn.CrossEntropyLoss, Adam, логирование в Weights & Biases) и оценку под torch.inference_mode() и приводят долю правильных ответов на тесте 0.8987 после 5 эпох.
  • Ячейки 34–38 определяют TextCNN с размерами ядер 3, 4, 5 и приводят 0.9011.
  • Ячейки 40–43 определяют и обучают однослойный классификатор на GRU на тех же входах (его описывает заметка о RNN) и печатают его долю правильных ответов на тесте; в сохранённом прогоне у них нет вывода.
  • Ячейки 45–57 перестраивают данные в целочисленные идентификаторы с индексом [PAD], определяют EmbeddingTextCNN, обучают 10 эпох с шагом обучения 2×10−42\times10^{-4} и приводят 0.9109.
  • Ячейки 59–66 реализуют пробу с удалением одного токена (explain), применяют её к EmbeddingTextCNN и раскрашивают токены четырёх обучающих заголовков по их влиянию (синий — свидетельство за класс, красный — против); примеры выше прочитаны по этим цветам.

Дальше#

Свёртка видит окно; документ — последовательность. Следующая заметка вводит сеть, которая читает по одному токену, неся состояние, так что в принципе каждый токен может влиять на представление каждого следующего. Она умеет классифицировать и умеет предсказывать следующий токен, что делает её первой нейросетевой языковой моделью курса и возвращает измерение перплексии из n-граммной заметки.

Литература#