Оглавление
- Введение
- Определение проблемы
- Предпосылки
- Источник данных
- Понимание данных
- Исследовательский анализ данных
- Предварительная обработка данных
- Подготовка данных и конвейер данных
- Эталонное решение (модель ванильного кодера-декодера)
- Механизм внимания
- Монотонное внимание
- Вывод (жадный поиск VS поиск BEAM)
- Результаты и сравнение моделей
- Развертывание модели и прогнозы
- Будущая работа
- Репозиторий Github и Linkedin
- использованная литература
1. Введение
Исправление грамматических ошибок, как следует из названия, представляет собой процесс, посредством которого выполняется обнаружение и исправление ошибки в тексте. Проблема кажется простой для понимания, но на самом деле она сложна из-за разнообразия словарного запаса и набора правил в языке. Кроме того, мы собираемся не только выявить ошибку, но и требуется ее исправление.
Применение:
- У этой проблемы есть множество применений, причина в том, что письмо — очень распространенный способ обмена идеями и информацией. Это может помочь писателю ускорить свою работу с минимальной вероятностью ошибки.
- Кроме того, может быть много людей, которые не владеют в совершенстве определенным языком. Таким образом, эти типы моделей гарантируют, что язык не является барьером в общении.
2. Определение проблемы
Теперь мы определим поставленную задачу как задачу машинного обучения. Проблема, с которой мы имеем дело, относится к типу проблем НЛП (обработки естественного языка). NLP — это область машинного обучения, которая занимается взаимодействием между человеческими языками и компьютерами. Я бы порекомендовал просмотреть эту статью, чтобы узнать, как продвигаются подходы, используемые для решения проблемы.
Подход, который мы собираемся изучить, — это модель Sequence to Sequence. Короче говоря, модель глубокого обучения получит последовательность (в данном случае неправильный текст) и выведет другую последовательность (в данном случае исправленный текст).
Метрика производительности
Теперь, когда мы определили нашу проблему как проблему машинного обучения, есть еще одна очень важная идея, с которой необходимо разобраться, — это метрика производительности. Метрика производительности — это математическая мера, которая помогает понять производительность нашей модели машинного обучения.
Очень популярной метрикой производительности для задач НЛП является оценка BLEU (двуязычная оценка дублера), поэтому мы собираемся использовать ее и для нашей модели. Вы можете обратиться к этому видео, чтобы узнать больше о баллах BLEU.
3. Предпосылки
Прежде чем мы углубимся в детали этого тематического исследования, я предполагаю, что читатели знакомы с концепциями машинного обучения и глубокого обучения. Чтобы быть конкретным, идеи LSTM, кодеров-декодеров, механизма внимания должны быть знакомы.
Я постараюсь предоставить несколько хороших ссылок по пути.
4. Источник данных
Как я уже упоминал выше, с этой проблемой сложно справиться, одной из причин которой является отсутствие набора данных хорошего качества. В своем исследовании я нашел некоторые из них полезными и рассмотрел следующие два набора данных.
- Набор данных Ланг-8
- Корпус нормализации и перевода текстов в социальных сетях NUS
Оба этих набора данных находятся в открытом доступе, если вы заинтересованы в работе с ними.
5. Понимание данных
5.1 Набор данных Ланг-8
Это японский веб-сайт, который занимается изучением языка. Пользователи могут публиковать сообщения на языке(ах), которые они изучают, и этот пост будет виден носителям этого языка для исправления. Набор данных с этого веб-сайта содержит данные в следующем столбце, разделенном \t :
- Количество поправок
- Серийный номер
- Номер предложения
- 0 это заголовок
- Предложение, написанное изучающим английский язык
- Исправленные предложения (если есть)
Из этого мы извлекли пары входное предложение и исправленное предложение для тех точек данных, для которых существуют оба этих предложения.
5.2 Корпус нормализации и перевода текстов социальных сетей NUS
Это набор данных Национального университета Сингапура (NUS), который представляет собой текстовые данные социальных сетей. Размер набора данных составляет 2000 точек данных. Данные в необработанном виде имеют три строки для каждой точки данных.
- Первая строка — текст социальной сети.
- Вторая строка - это правильный формальный перевод на английский язык.
- Третья строка — это данные, переведенные на китайский язык.
Из них мы можем использовать первые две строки каждой точки данных для нашей задачи.
6. Исследовательский анализ данных
После того, как мы извлекли данные в требуемой форме, теперь это очень неотъемлемый шаг, который представляет собой исследовательский анализ данных, который дает возможность понять и развить хорошее представление о наборе данных.
Я извлек и предварительно обработал набор данных в требуемой форме, которая будет обсуждаться в следующем разделе.
6.1 Основная статистика
Во-первых, мы соберем общую информацию о наборе данных, такую как количество точек данных, типы данных, средние или медианные значения числовых данных и т. д.
# TOTAL DATAPOINTS df.shape # CHECK FOR NULL VALUES df.info()
Таким образом, имеется около 500 тыс. точек данных, и отсутствуют нулевые значения.
У нас есть два столбца в наборе данных, один из которых является входным, а другой — выходным или целевым. Давайте посмотрим один за другим анализ для каждого столбца.
6.2 Анализ распределения длины текста и количества слов
Неправильный текст
Ввод представляет собой текстовую функцию, которую мы можем анализировать по длине текста и распределению количества слов.
- Распределение длины символов и количества слов во входных данных сильно искажено.
- Оба распределения почти следуют одной и той же схеме.
- Количество символов во входных данных может достигать 2000, а количество слов — до 400 слов.
- Соотношение большей длины слов или символов значительно меньше.
- Более 99 процентов входных данных имеют количество символов менее 200 и количество слов менее 50.
Исправленный текст
То же самое делается и для выходного текста.
И, что удивительно, наблюдения для входного текста верны и для выходного текста.
6.3 Анализ облака слов на неправильный и исправленный текст
Облако слов — отличная визуализация, позволяющая узнать наиболее часто встречающиеся слова в тексте.
Наиболее распространенными словами в обоих текстах являются:
- считать
- хотеть
- сегодня
- Япония
- английский
6.4 Анализ неправильных и исправленных слов
Здесь неправильные слова — это те слова, которые присутствуют во входных данных, но отсутствуют в целевых предложениях, а исправленные слова — это те, которые присутствуют в целевых предложениях, но отсутствуют во входных предложениях. Я извлек все эти слова и провел для них анализ облака слов.
- Наблюдая образы неправильных и исправленных слов, мы можем наблюдать изменение формы употребляемого глагола.
go ==> going go ==> went study ==> studying use ==> using
6.5 Маркировка POS
В этой части анализа мы свяжем слова с их частями речи и нанесем на график 10 наиболее часто встречающихся частей речи. Ниже приведены сюжеты:
- Это показывает, что часть речи, используемая максимальное количество раз, — это существительное (NN), за которым следует предлог (IN).
- Общее количество частей речи остается одинаковым для входных и выходных предложений, но количество различается в NNS (существительное во множественном числе) и PRP (личные местоимения).
7. Предварительная обработка данных
Теперь мы увидим, как удалить ненужные данные из нашего набора данных. Мы знаем, что данные в текстовом формате, поэтому необходимо удалить все специальные символы, ненужные пробелы и выполнить деконтракцию сокращенных слов. Мы также собираемся преобразовать весь текст в более низкий, чтобы уменьшить сложность задачи. Следующий код выполняется для выполнения всех вышеупомянутых операций:
После этого мы также можем выполнить некоторые другие операции, такие как удаление нулевых значений и дедупликация, которые доступны в библиотеке pandas.
8. Подготовка данных и конвейер данных
Прежде чем мы отправим наши данные в модель DL, их необходимо преобразовать в форму, понятную машине. Итак, для этой проблемы мы собираемся использовать токенизацию и заполнение, чтобы преобразовать набор данных в последовательность целых чисел одинаковой длины.
При формировании конвейера данных для модели мы собираемся дополнить последовательность, чтобы длина всех точек данных была одинаковой. Максимальная длина, используемая для заполнения, составляет 99-й процентиль распределения количества слов.
Конвейер данных
Данные должны быть преобразованы в пакеты, чтобы ввести их в модель глубокого обучения. Следующий код используется для формирования конвейера для набора данных.
9. Эталонное решение (модель ванильного кодера-декодера)
В качестве эталонного решения я использую ванильную модель последовательности для последовательности, также известную как модель кодировщика-декодера. Эта модель принимает входные данные в форме последовательности и предсказывает другую последовательность в качестве выходных данных. Благодаря этому он имеет множество приложений в задачах машинного перевода.
Следующий код используется для формирования слоев Encoder-Decoder в модели.
Это — действительно хороший блог, чтобы получить представление о моделях Encoder-Decoder.
Я пробовал множество вариантов моделей Vanilla Encoder-Decoder, таких как использование предварительно обученных вложений Word2Vec и FastText, вы можете проверить их в моем профиле GitHub.
Поэкспериментировав с этими моделями, я обнаружил, что в моем случае обучаемые встраивания работают лучше, чем предварительно обученные, поэтому их следует использовать для продвинутых моделей.
СИНИЙ балл, полученный для Encoder-Decoder для нашего набора данных, составляет 0,4603.
10. Механизм внимания
Механизм внимания — очень гениальная идея машинного обучения, которая клонирует гуманистический способ восприятия информации. Кроме того, существуют определенные недостатки простой модели кодер-декодер, которые преодолевает модель внимания. Некоторые из популярных техник механизма внимания, используемых сегодня, - это механизм внимания Багданау, механизм внимания Лоунга.
Позвольте мне дать краткое представление об этапах механизма расслабленного внимания, который я широко использовал в своем тематическом исследовании. Если быть точным, эта идея известна как Механизм глобального внимания.
Часть кодировщика остается такой же, как и ванильный кодер-декодер, который выводит скрытые состояния входной последовательности. Теперь в части декодера для каждого временного шага мы должны вычислить нечто, называемое вектором контекста. Этот вектор контекста содержит соответствующую информацию от кодера о словах, которые должны быть предсказаны на этом временном шаге. Это может показаться сложным, но как только вы узнаете, как это вычисляется, все встанет на свои места.
- Во-первых, когда мы достигаем всех скрытых состояний кодировщика (ht) и предыдущих скрытых состояний декодера (hs) из RNN, мы находим альфа-значения ().
В статье Лунг и другие представили три варианта вычисления оценки.
- После вычисления альфа-значений вектор контекста вычисляется как средневзвешенное значение по всем скрытым состояниям кодировщика, при этом веса являются альфа-значениями.
- Учитывая целевое скрытое состояние и контекстный вектор исходной стороны, слои простой конкатенации используются для объединения информации из обоих векторов для создания скрытого состояния внимания следующим образом:
- Затем вектор внимания h˜t проходит через слой softmax для создания следующего слова в последовательности.
Этот тип механизма внимания называется Глобальным механизмом внимания, потому что все скрытые состояния кодера учитываются на каждом временном шаге декодера для создания вектора контекста.
В этом примере я реализовал Loung Attention Mechanism с нуля с помощью подкласса модели. Ниже приведен код слоя Внимание для оценки типа Dot. Полный код вы можете найти в моем профиле GitHub.
Метрика производительности для моделей Attention значительно лучше, чем у наших эталонных моделей.
BLEU Score Dot Scoring 0.5055 General Scoreing 0.5545 Concat Scoreing 0.5388
11. Монотонное внимание
Прежде чем мы углубимся в детали монотонного внимания, давайте посмотрим на некоторые недостатки простого механизма внимания и на то, в чем была необходимость монотонного внимания.
Мы знаем, что в механизмах внимания на каждом временном шаге декодера необходимо обращаться ко всем скрытым состояниям кодировщика. Это создает квадратичную временную сложность, что затрудняет его использование в сетевых настройках.
Поэтому, чтобы преодолеть этот недостаток, вводится концепция монотонного внимания, которая просто говорит, что нет необходимости проверять все веса внимания на каждом временном шаге. Мы собираемся проверять скрытые состояния в определенном порядке (слева направо на английском языке), и одно из скрытых состояний выбирается в качестве вектора контекста на каждом временном шаге. После проверки конкретной записи она не будет проверяться на следующем временном шаге.
Наиболее важным преимуществом этого подхода является линейная временная сложность, поэтому его можно использовать для онлайн-настроек.
Здесь мы собираемся реализовать очень простой тип монотонного внимания, как описано в этом блоге и статье. Следует иметь в виду, что изменения будут происходить только на уровне внимания, но уровни кодировщика и декодера останутся прежними. Вот шаги для монотонного внимания:
- Учитывая предыдущие скрытые состояния, мы собираемся вычислить оценку или энергию, для которой мы собираемся использовать те же методы, которые использовались выше в механизме внимания Лунга.
- После того, как оценка вычислена, она преобразуется в вероятности с помощью сигмовидной функции.
- Внимание для текущего временного шага вычисляется по следующей формуле:
- Как только мы получим веса внимания, мы проделываем аналогичные шаги по вычислению взвешенной суммы, чтобы получить вектор контекста и объединить его со скрытым состоянием декодера для прохождения через слой softmax.
В этом примере я реализовал только один вариант монотонного слоя внимания. Для получения дополнительной информации обратитесь к блогу и коду Колина Раффела, где он дал полную реализацию этого слоя.
Производительность монотонного внимания сравнима с простым вниманием, но, как упоминалось в статье, оно дает некоторое преимущество во временной сложности.
12. Вывод (жадный поиск VS лучевой поиск)
Если вы знаете о последовательности для моделей, то вы должны знать о том факте, что мы должны внести определенные изменения в модель, чтобы предсказать требуемый результат во время вывода.
Опять же, для этого у нас есть два варианта: один известен как жадный поиск, а другой — поиск по лучу. Давайте посмотрим на них обоих один за другим.
Жадный поиск
В жадном поиске для каждого временного шага мы рассматриваем токен с максимальной вероятностью и игнорируем все оставшиеся токены, даже если они имеют сопоставимые значения вероятностей после слоя softmax.
В коде вы можете увидеть функцию argmax на выходе плотного слоя активации softmax.
Это имеет недостаток, потому что, если какое-либо из предсказанных слов на временном шаге неверно, это также повлияет на результат будущих временных шагов.
ЛУЧ Поиск
Лучшим способом прогнозирования является поиск BEAM, в котором на каждом временном шаге предоставляется выбор наиболее вероятных токенов, которые имеют числа, равные ширине BEAM, а общий балл для каждой из прогнозируемых последовательностей равен произведением вероятностей каждого слова в последовательности.
Для этого примера я взял ширину луча, равную 3. Чтобы узнать больше, вы можете просмотреть этот блог.
13. Результаты и сравнение моделей
Для этого тематического исследования я попробовал в общей сложности 12 моделей с определенными вариациями. Ниже приведены результаты.
- Результаты механизма внимания лучше, чем у простого кодировщика-декодера, и среди моделей внимания производительность не сильно отличается.
- Мы также можем заметить, что оценка BLEU для поиска луча лучше, чем для жадного поиска, как и ожидалось.
14. Развертывание модели и прогнозы
Я выполнил развертывание модели для модели монотонного внимания, которая вычисляет оценку с помощью точечного произведения. Ознакомиться с моделью можно по ссылке эта.
Некоторые из предсказаний для приведенной выше модели следующие:
15. Будущая работа
- Для будущей работы я хотел бы поработать с другими вариантами механизма Monotonic Attention.
- Если лучший набор данных станет общедоступным, это действительно может улучшить производительность модели.
16. Репозиторий Github и Linkedin
Я попытался дать краткую информацию о работе, которую я проделал в этом проекте. Если вы хотите увидеть полный подробный код, где я прокомментировал каждую строку, загляните в мой репозиторий Github. Смело подключайтесь на Linkedin.
Если вы дошли до этого момента, помогите мне улучшить содержание, оставив комментарий. Это много для меня значит :)
17. Ссылки
- https://colinraffel.com/blog/online-and-linear-time-attention-by-enforcing-monotonic-alignments.html
- Проект под руководством Хины Шармы на курсе прикладного ИИ: https://www.appliedaicourse.com/course/11/Applied-Machine-learning-course
- Loung Attention Paper: https://arxiv.org/pdf/1508.04025.pdf
- Документ монотонного внимания: https://arxiv.org/pdf/1409.0473.pdf
- Реализация монотонного внимания: https://github.com/craffel/mad/blob/b3687a70615044359c8acc440e43a5e23dc58309/example_decoder.py#L22
- Блог автора Ришанг Прашнани