Язык является одним из самых мощных средств коммуникации, которые у нас есть. Несмотря на выразительность, язык имеет нюансы и двусмысленность, что отчасти затрудняет нам создание компьютерных моделей, способных его освоить. В этом посте мы рассмотрим некоторые проблемы при использовании данных на естественном языке в условиях машинного обучения, например разреженность данных. Мы будем использовать подход, основанный на данных, основанный на теории информации, который поможет нам понять фундаментальные свойства общения посредством языка.

Я предполагаю, что у вас есть базовые знания о машинном обучении, но постараюсь объяснить все доступно. В качестве мотивации для этого анализа я поставлю задачу, в которой мы будем использовать модель машинного обучения и исследовать методы оптимизации. Я приведу некоторые основные детали модели, но если вам интересно, вы можете найти полную информацию здесь. Однако мы сосредоточимся на данных, а не на самой модели. Можно с уверенностью думать об этом как о черном ящике.

Задание

Наша задача — изучить рецензию на фильм и классифицировать ее как положительную или отрицательную (сентимент-анализ). Это наша очень сложная модель:

Внутри черного ящика наша модель будет сканировать слова в каждом отзыве, выполнять расчеты со скрытыми параметрами, а затем принимать решение. Во время обучения он также выучит представление для каждого слова, которое будет использоваться в вычислениях.

Мы используем базу данных обзоров фильмов IMDB для наших данных. Мы будем оценивать модель по ее точности (процент отзывов, которые она правильно классифицирует).

Базовые ожидания

Если наша модель научится отличать хороший отзыв от плохого, мы ожидаем, что ее точность приблизится к 100% (она всегда правильно предсказывает настроение данного отзыва). Если он не сможет учиться, в среднем он составит около 50% (а не 0%), поскольку наши данные делятся на 50/50 между положительными и отрицательными примерами. Если он не научился различать, он будет работать не лучше, чем случайный выбор между двумя вариантами.

Первая попытка: запустите и посмотрите, что произойдет

Мы запустим эту модель на данных за 5 эпох (эпоха — это один полный проход по всему обучающему набору) и сообщим о точности модели к концу каждой эпохи.

Поначалу все кажется замечательным: модель начинает узнавать об обучающих данных и значительно повышает свою точность к концу каждой эпохи обучения. Тогда что-то пойдет не так. После обучения мы запускаем модель на еще не просматриваемом наборе данных, тестовом наборе. Набор тестов демонстрирует, как модель работает с новыми данными, и, в конечном счете, это единственная метрика, которая нас интересует. Результаты этого испытания не так хороши.

Хотя точность обучения казалась почти идеальной, точность тестирования была намного ниже, что указывает на переподгонку нашей модели во время обучения. Переоснащение происходит, когда модель слишком много узнает о своих обучающих данных, изучает больше, чем обобщенные шаблоны, и начинает запоминать ошибки или шумы во входном сигнале. Это приводит к плохой производительности теста, потому что тестовый набор, вероятно, будет иметь другой шум, чем обучающий набор.

Есть много способов уменьшить переоснащение. Поскольку наш текстовый корпус большой, мы можем добиться больших улучшений, оптимизируя его. Мы хотели бы использовать наши выводы здесь, чтобы уменьшить изменчивость модели и улучшить классификацию обзоров фильмов.

Копаемся в данных

Наши данные представлены на естественном языке, поэтому давайте немного узнаем о словах в этом корпусе и их распределении, что, как мы надеемся, даст представление об общем наборе данных.

Во-первых, мы определим размер нашего словарного запаса (количество уникальных слов в корпусе). По моим подсчетам, IMDB содержит более 101 000 уникальных слов. Как бы вы ни считали, размер этого словаря довольно велик! Удивительно, что мы можем выучить так много разных слов и их значений. Или мы можем?

Поскольку мы надели наши исследовательские шляпы, давайте выдвинем гипотезу: словарь отлично выучен нашей моделью и полностью используется в задаче. Чтобы проверить эту теорию, проведем простой эксперимент. Мы снова запустим модель, но на этот раз сократим размер словарного запаса до 20% от общего количества (примерно 20 000 уникальных слов). Когда мы видим «неизвестное» слово (за пределами словарного запаса из 20 000 слов, который мы только что определили), мы будем рассматривать его как особый тип слова по умолчанию. Этот процесс также называется «UNK’ing», потому что тип слова обычно устанавливается на «UNK». Если наша гипотеза верна, мы должны ожидать худших результатов, чем раньше, что указывает на то, что больший словарный запас (например, полный словарь) полезен в задаче различения.

По иронии судьбы, используя меньше данных, наша модель не хуже различает отзывы (на самом деле, она может работать лучше). Это подтверждает, что наша модель ранее была переоснащена. Он попытался узнать слишком много информации об обучающих данных, чтобы зафиксировать обобщаемые закономерности, и в итоге также запомнил шум.

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

Как это может быть? Чтобы проиллюстрировать проблему, давайте посмотрим на график. Ниже приведены 600 наиболее часто используемых слов из всех обзоров. Можете ли вы угадать, какое слово используется чаще всего (почти 700 000 раз)?

Мы видим, что после первых нескольких сотен наиболее распространенных слов частота слова в нашем корпусе падает до 1. Теперь представьте, что из этого графика было вырезано еще 100 400 уникальных слов! Легче понять, почему у нашей модели могли возникнуть проблемы с изучением данных — так много слов встречаются только несколько раз каждое.

Мы видим, что у этого вопроса есть две стороны. У нас есть много слов, которые являются излишними в нашей задаче, но, возможно, они лишние, потому что мы не можем узнать о них достаточно, чтобы сделать их полезными.

Закон Ципфа, или (не) все слова одинаковы

Этот эффект называется Законом Ципфа. Он гласит, что в естественном языке более употребительные слова появляются значительно чаще, чем менее употребительные слова (часто на порядки). В частности, фактическая частотность слова обратно пропорциональна его рангу в частотной таблице. Это естественное свойство языка, которое проливает некоторый свет на структуру эффективной коммуникации.

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

Если мы преобразуем наш частотный график в логарифмическую шкалу, появится линейная линия тренда. Это (небольшая часть) классического дистрибутива Zipf. Интересно, что многие естественные языки, такие как русский, арабский, письменный китайский и другие, разделяют такое распределение лексики в повседневном общении. На самом деле, некоторые вербальные системы животных также имеют зипфианское распределение. Одним из таких примеров является дельфин-афалина, чей разнообразный свистящий словарь был проанализирован и сопоставлен с человеческой речью. Может быть, нам следует перевести эти обзоры IMDB на дельфинов, чтобы они могли помочь нам выбрать фильм для просмотра!

Сосредоточение внимания на важном

Анализ, который мы только что провели, исходит из теории информации, и в данном случае мы узнали об организации или «энтропии» нашего корпусного текста. Вернемся к нашей модели. Поскольку теперь мы знаем, что большая часть словарного запаса IMDB используется нечасто, мы можем принимать более разумные решения о том, какие слова оставить в нашем модельном словаре, а какие выбросить.

В нашей последней итерации мы просто сохранили первые 20% уникальных слов, обнаруженных в корпусе, в качестве нашего словаря — давайте теперь вместо этого выберем первые 10% по всему набору данных, оставив только наиболее часто используемые слова. Что произойдет, если мы добавим эти дополнительные ограничения, но сосредоточим модель только на часто используемых словах?

Наша модель снова улучшилась. Здесь интересно то, что, несмотря на то, что мы сохранили только 10% словарного запаса, мы все же сохранили 94,7% текста корпуса (что означает, что 5,3% корпуса составляют 90% уникальных слов в общем словаре).

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

Дальнейшие результаты

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

Мы снова проведем эксперимент с другими конфигурациями модели. Мы будем обучать одну модель с полным словарным запасом, одну со словарем из 10 000 наиболее часто встречающихся слов, одну с 8 000 самых популярных слов и одну с 6 000 самых популярных слов. Для надежности мы проведем по 10 испытаний для каждой версии. Кроме того, мы разделим небольшой кусок наших тестовых данных для проверки модели после каждой эпохи обучения. Это будет действовать как «мини-тест», чтобы дать нам представление о том, как модель будет работать на полном наборе тестов в каждой точке обучения.

Столы повернулись! Мы видим, что наши сокращенные модели достигают пиков примерно на том же уровне, что и модель полного словаря.

При ближайшем рассмотрении модель полного словаря достигает максимума в эпоху 2, затем точность проверки снижается. Это еще одно свидетельство того, что исходная модель соответствует обучающим данным. По мере того, как мы тренировались все больше и больше, на данных поезда становилось лучше, а на тестовых — хуже.

Чтобы играть честно, давайте представим, что мы используем «раннюю остановку» — технику, которая работает именно так, как звучит. Мы «остановим» каждую модель на максимальной точности проверки и сравним только эти значения.

Даже в этом случае уменьшенные модели работают лучше, чем полные модели, хотя и незначительно. Наконец, давайте рассмотрим результаты полного этапа тестирования (который в четыре раза больше, чем данные проверочного теста). Нет особых причин рассматривать результаты модели полного словарного запаса, поскольку теперь мы знаем, что она была значительно искажена переобучением во время обучения.

Судя по этим результатам, меньший словарный запас из 6000 слов кажется оптимальным выбором среди моделей, протестированных для этой задачи.

Вывод

Используя структурные знания естественного языка, мы успешно добились скромного, но эффективного улучшения производительности классификатора для анализа настроений.

Что наиболее важно, мы можем сэкономить не менее 90% пространства, используемого для хранения представлений слов, поскольку мы можем игнорировать эти слова, не влияя на производительность модели в задаче. Это компромисс между пространством и временем: мы можем сократить эти параметры модели за счет дополнительного обучения.

Мы можем отделить сигнал от шума, используя свойства нашего корпуса, обнаруженные в энтропийном анализе первого порядка (закон Ципфа). При этом наш классификатор учится лучше различать отзывы, сосредотачиваясь на обобщаемых закономерностях во входных данных. Хотя этот метод может быть полезен в других задачах, он, вероятно, будет менее полезен в более общих задачах понимания языка, которые требуют более обширного словарного запаса.

Открытые вопросы и направления для дальнейшего улучшения

Несмотря на то, что благодаря этому анализу мы обнаружили значительную экономию места, у нас все еще остается много открытых вопросов:

  • Какова качественная разница между репрезентациями слов, изученными в полном словаре, и в сокращенном словаре, особенно если ранняя остановка применяется после эпохи 2 для полного словаря?
  • Почему словарь из 8000 слов имел такой переменный рост в эпохи 1–3, когда словари из 6000 и 10000 слов были гораздо более стабильными?
  • Действительно ли необходимо выбрасывать данные? Можем ли мы лучше использовать наши редкие слова?

Помимо этих вопросов, есть несколько реальных стратегий, которые мы можем применить для улучшения выполнения задач. Для самой модели мы можем попробовать упорядочить параметры модели и добавить отсев. Оба эти метода полезны для уменьшения переобучения, помогая модели получить более обобщающую информацию о данных. Кроме того, мы можем провести дальнейший энтропийный анализ наших данных. Закон Ципфа, или энтропия первого порядка, затрагивает только поверхность языковой структуры. Мы можем рассмотреть возможность использования энтропии Шеннона более высокого порядка для выявления более длинных и значимых структурных паттернов в данных, которые мы могли бы использовать для принятия более разумных решений в нашем классификаторе. Кто знает, какие более глубокие закономерности мы можем изучить и использовать?