Использование Trie с элементами машинного обучения

Хорошо выразить что-то требует усилий. К счастью, чат-боты, воплощающие современный НЛП, такие как ChatGPT, очень полезны.

В этом посте мы смоделируем эту проблему с помощью Trie, соответствующим образом расширенного. Это Trie будет автоматически обнаруживать короткие последовательности слов, которые повторяются в корпусе без присмотра. Впоследствии он также выучит распространенные шаблоны «неловкой фразировки» из помеченного набора данных пар (неуклюжая фразировка, улучшенная фразировка).

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

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

Для этого использования Trie необходимо настроить с определенной предварительной обработкой и предварительной подготовкой. Мы описываем и то, и другое.

Такой подход — сам по себе —…

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

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

Примеры последовательности слов, используемые в этом посте, как неудобные, так и улучшенные фразы, были предоставлены ChatGPT в ответ на один запрос:

Приведите несколько примеров неуклюжих фраз, состоящих из двух-четырех слов.

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

В последнем разделе этого поста перечислены все неудобные фразы вместе с их улучшенными перефразировками. В том числе в ответе ChatGPT, которые не использовались в этом посте, потому что они были частью его ответа.

Первоначальная точка зрения: проблема оформлена как поиск

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

Теперь рассмотрим третье слово, хорошо. В корпусе не может быть предложений, соответствующих фразе (cooks|cooked) good.

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

(Мы ввели хорошо на http://vectors.nlpl.eu/explore/embeddings/en/#, и самый сильный семантический ассоциат оказался хорошо с результатом 0,829.)

Выразим сказанное выше в потоке.

  1. Найдите в нашем корпусе предложений те, которые начинаются с Она готовит. Получите лучшие результаты Она готовит и Она готовит.
  2. Подставить хиты в зонд, т.е. получить Она готовит/готовит хорошо.
  3. Затем выполните поиск в нашем корпусе предложений с cooks/cooked good. Наладьтехорошее приготовление пищи как хороший хит. Оценивая это как хорошее попадание, также используйте то, что хорошо и хорошо являются семантическими ассоциациями, что может выявить сравнение их вложений слов.
  4. Замените попадание на соответствующую часть преобразованного ввода. Получаем Она хорошо готовит.

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

Также обратите внимание на следующее. На шаге 1 третье слово хорошо не играет роли. Это нужно как-то обнаружить, либо при препроцессинге, либо при самом поиске, либо при постобработке результатов.

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

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

Последовательный характер

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

Поиск в попытке

До сих пор мы несколько раз использовали термин «поиск в корпусе предложений». Теперь мы углубимся в то, как будет выполняться такой поиск.

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

Ну а что такое Трие? Вместо того, чтобы давать определение, мы проиллюстрируем его примером.

Trie в приведенном выше примере представляет собой последовательность слов в следующих двух предложениях: Собака погналась за кошкой и Новая работа хороша.

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

Это сопоставление также известно как выравнивание и может быть изображено ниже.

    New  job      good
     |    |         |
The new  job  is  good

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

Давайте начнем с более простого случая, когда есть некоторый путь, начинающийся от корня Trie, который точно представляет ввод. В дереве на рис. 1 Новая работа хороша является примером такого ввода.

Легко понять, как мы можем найти путь, представляющий ввод, выполняя сканирование слева направо на основе токенов во вводе.

Теперь рассмотрим не очень чистый зонд: Хорошая новая работа. В Trie на рисунке 1 нет пути, точно соответствующего этому зонду.

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

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

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

    New  job      good
     |    |         |
The new  job  is  good

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

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

В этом конкретном примере мы добавим две дуги пропуска в местах, показанных на рис. 2.

Можно спросить, зачем вообще использовать дуги с пропуском? Почему бы вместо этого не выполнить предварительный поиск?

Что, если бы мы захотели обработать несколько смежных отсутствующих токенов? Это вполне правдоподобно — скоро мы увидим пример. Нам нужно опережать некоторое положительное целое число, k, большее 1. Каким должно быть значение k? Если k лишь немного больше 1, мы не сможем обработать много смежных отсутствующих токенов, что вполне вероятно. Если вместо этого мы используем большое значение k, упреждающий поиск может привести к комбинаторному взрыву, т. е. не к масштабированию. Это связано с тем, что мы должны искать всех возможных потомков текущего узла, находящихся на расстоянии k. Число таких потомков может расти сверхэкспоненциально с ростом k.

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

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

I     go         store.
 |     |            |
I will go to the  store

Из этого мы можем научиться добавлять дугу пропуска из узла Trie [Я, буду, идти] к узлу [ я, буду, пойду, в, в]. Эта дуга пропуска позволит нам учесть to, отсутствующие в исходной фразе, по сравнению с улучшенной формулировкой в ​​приведенном выше примере.

Итак, I go store сопоставляется с определенным путем в Trie, исходящим из корня. Из этого пути нам нужно прочитать последовательность [Я, буду, пойду, в, магазин]. Вопрос в том, как мы можем выделить части жирным шрифтом?

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

Это частично контролируемое обучение

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

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

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

Предположение, лежащее в основе последнего, состоит в том, что задача обучения пропускным соединениям обладает обобщаемостью. Мы действительно видели такую ​​обобщаемость в примере, который мы рассмотрели ранее. Мы можем научиться учитывать слово The, отсутствующее в искаженной версии предложения, начинающегося с The dog, даже в одном помеченном экземпляре.

Пропустить дуги ближе к корню Обобщить больше

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

Теперь рассмотрим дугу пропуска, которая пропускает is в предложениях, начинающихся с The new job is. Это относится к более ограниченному набору предложений.

Дуги замещения и их изучение

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

Итак, мы начинаем с корня и перешагиваем дугу с надписью She. Теперь мы находимся в узле [She], но у него нет дочернего элемента [She, cook]. Ближайший ребенок — [Она, готовит]. Мы можем найти этого потомка, если нечетко сопоставим cooks с cook. Мы должны иметь в виду, что поиск наиболее подходящего дочернего элемента может занять некоторое время, если узел, в котором мы сейчас находимся, имеет много дочерних элементов.

Альтернативой такому нечеткому сопоставлению является изучение дуг замещения из размеченного набора данных.

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

She  cook   good
 |    |      |
She  cooks  well

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

Хотя на рис. 3 этого не видно, дуги замещения следует отличать от основных дуг, поскольку они используются немного по-другому.

Дуги замещения могут быть пройдены при обработке ввода. Например, на входе Она хорошо готовит мы будем идти по пути с пометкой [Она, готовит, хорошо] вторая и третья дуги которого являются дугами подстановки.

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

Дуги замещения и нечеткое соответствие токенов

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

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

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

В качестве примера рассмотрим выравнивание

He  is    a   lawyer
|    |    |     |
He  is    an  attorney

Слова юрист и адвокат совпадают, несмотря на отсутствие лексического сходства.

Самодуги и их изучение

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

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

        You    like  what
         |      |
What do you    like

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

Ниже представлен фрагмент Trie, моделирующий эту ситуацию.

Давайте рассмотрим, как мы будем обрабатывать входные данные [вам, нравится, что]. Мы начнем с корня, возьмем дугу пропуска, затем возьмем дуги с пометками вы и нравится и, наконец, дугу с пометкой что. Теперь мы соединим метки первых трех дуг на пути. Мы опустим метку четвертой дуги, так как мы знаем, что это собственная дуга.

Об уменьшении усилий по созданию помеченных и выровненных экземпляров

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

В связи с этим. можем ли мы уменьшить усилия по созданию помеченных экземпляров? Ответ: Да.

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

Сопоставление плохих последовательностей с чистыми попытками

Во-первых, давайте предположим, что у нас есть два набора данных, один из относительно чистых предложений, а второй — фраз более низкого качества. Представьте, что из первого набора данных мы изучаем Trie способом, описанным ранее. (Это Trie имеет только основные дуги.)

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

Как должен работать нечеткий сопоставитель? Он должен использовать операции просмотра вперед, чтобы разрешить маркеры на пути, отсутствующие в зонде. Он также должен использовать нечеткое сопоставление токенов, чтобы обеспечить замену.

Проиллюстрируем этот процесс. Рассмотрим Trie ниже.

Теперь рассмотрим тест Me go store. Предположим, мы знаем, что я и я являются семантическими ассоциациями. Мы воспользуемся этим знанием, чтобы сопоставить me с I, затем выполним предпросмотр 1, сопоставим go с go, выполните еще один просмотр вперед 1 и, наконец, выровняйте store с store. У нас есть желаемый расклад.

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

Можно спросить, а почему бы просто не использовать этот процесс нечеткого сопоставления во время логического вывода и вообще отказаться от контролируемого обучения? Две причины.

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

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

Использование лингвистических функций

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

воздействие

он юрист

Мы включили это в наш подход к выравниванию плохих последовательностей с чистым Trie следующим образом.

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

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

Проиллюстрируем это на простом примере.

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

Более подробный вариант

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

В этом разделе мы рассмотрим более детальный вариант, в котором последовательности слов, которые мы вводим в Trie, не обязательно являются полными предложениями, а скорее последовательностями слов, которые появляются в определенном доминирующем порядке.

Этот более детальный Trie может предложить улучшенные формулировки более коротких последовательностей слов, встроенных в предложение.

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

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

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

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

Во-первых, следующая терминология поможет.

Сумка для заказа

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

Мы используем термин multiset вместо set, чтобы одно и то же слово могло появляться в нем несколько раз.

Например, мультимножество {the, of} имеет доминирующий порядок [of, the].

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

Обнаружение пакетов для заказа в корпусе предложений

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

Представьте, что из этого корпуса вы получаете набор данных D1всех последовательностей токенов длины не менее двух. Далее мы создадим новый набор данных D2 из D1 следующим образом. На самом деле мы будем интерпретировать D2 как размеченный набор данных.

Для каждой последовательности y в D1 будет последовательность x в D2, где x получается из y путем сортировки его слов в лексикографическом порядке. Метка x в D2 будет y. То есть мы помечаем представление мультимножества слов y с определенным порядком y, который наблюдался.

Ниже приведен пример экземпляра в D2.

x = [рак, кожа], y = [кожа, рак]

Мы построим Trie из всех x в D2. Для любой пары (x, y) в D2 мы присоединим y в качестве спутниковых данных к узлу. в Trie, на котором заканчивается x.

Как только Trie будет построен, мы уплотним спутниковые данные о различных узлах Trie в два атрибута.

  1. Количество различных порядков, которые служат метками для x, оканчивающихся на этом узле.
  2. Распределение вероятностей по множеству порядков для x, заканчивающихся в этом узле. Для компактного представления этого распределения мы будем кодировать порядки, как описано ниже.

Назовем первый атрибут — количество различных заказов — support.

Конечно, этот Trie может быть огромным. Нас это не беспокоит.

Использование Trie для обнаружения неправильно упорядоченных подпоследовательностей

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

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

Пример

Например, после построения Trie, предположим, что крайний правый узел на пути [рак, кожа] имеет спутниковые данные (520, [кожа, рак] → 1). Это просто означает, что мешок {рак, кожа} наблюдался 520 раз в наборе данных, в каждом случае с порядком [кожа, рак].

Использование Orderable Bags Trie в качестве средства извлечения признаков в модели нейронного языка

Как только пакет Trie, который можно заказать, будет создан, мы можем использовать его в качестве экстрактора функций следующим образом.

Во-первых, давайте назначим уникальный идентификатор каждому пути в Trie. Этот идентификатор будет служить значением функции, связанной с этим путем.

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

Теперь мы заменим пути в этой последовательности их идентификаторами. Итак, у нас есть последовательность признаков. Для тех путей в этой последовательности, которые представляют собой отдельные слова, мы можем добавить дополнительные функции. Например, встраивание слов.

Проиллюстрируем этот процесс на примере ниже.

Учитывать

воздействие солнечных лучей вызывает рак кожи

Представьте, что с помощью пакетов Trie, которые можно заказать, мы сегментируем это на

воздействие → к → солнечному свету, причины, кожа → рак

который после того, как мы заменим пути на идентификаторы, станет

pid1, pid(причины), pid2

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

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

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

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

Проиллюстрируем это на простом примере. Учитывать

воздействие солнечного света вызывает рак кожи

Здесь мы считаем, что подпоследовательности, выделенные жирным шрифтом, являются доминирующими порядками и представлены в нашем Trie.

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

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

{
  exposure to sunlight causes skin cancer, 
  skin cancer is caused by exposure to sunlight
}

Из многих случаев формы {X вызывает Y, Y вызывается X} и предполагает, что X и Y представлены как пути доминирующего порядка в Trie, мы можем различить семантическую эквивалентность двух и использовать это обучение в определенных выводах или порождении. Например, если бы нас попросили перевыразить X вызывает Y по-другому, мы могли бы ответить Y вызывается X.

Сводка

В этом посте мы рассмотрели проблему обнаружения неудобных фраз — т. е. упорядочения последовательностей слов — и предложения улучшенных вариантов.

Мы смоделировали эту проблему, используя Trie. Это Trie автоматически обнаруживает, неконтролируемым образом, короткие последовательности слов, которые неоднократно появляются в корпусе. Контролируемый механизм в Trie также изучает некоторые распространенные шаблоны «неудобных фраз» из помеченного набора данных пар (неудобные фразы, улучшенные фразы).

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

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

Фразы из ChatGPT

Ниже приведены неудобные фразы и их улучшенные версии, предоставленные ChatGPT в ответ на запрос.

Приведите несколько примеров неуклюжих фраз, состоящих из двух-четырех слов.

В своем ответе ChatGPT отделил улучшенные перефразировки от неудобных. Я выровнял их для удобства читателя.

  • «Я иду в магазин». я пойду в магазин
  • — Что тебе нравится? Что вам нравится?
  • «Собака гонится за кошкой». Собака гонится за кошкой.
  • — Его здесь нет. Его нет здесь.
  • «Она хорошо готовит». Она хорошо готовит.
  • «Большой дом его». У него большой дом
  • — Забавная шутка. Это смешная шутка
  • «Дождь промокает». Дождь делает все мокрым.
  • «Машина едет быстро». Машина едет быстро.
  • «Хорошая новая работа». Новая работа хороша.

Дополнительная литература

  1. https://en.wikipedia.org/wiki/Sequence_alignment
  2. https://en.wikipedia.org/wiki/Trie