Как нам удалось добиться наибольшей точности распознавания многоязычных именованных объектов в Ntropy для обогащения финансовых транзакций

Эта статья написана в соавторстве с Tidor Pricope

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

Задача распознавания именованных объектов

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

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

Многоязычная модель против многих одноязычных моделей

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

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

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

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

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

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

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

Или, можно сказать, что у нас могла бы быть модель определения языка (рис. 1), которая перенаправляет на правильную модель, но все же, даже здесь, есть много случаев, когда это не выдерживает:

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

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

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

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

Разработка многоязычной модели

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

Чтобы лучше определить нашу цель и ожидания, нам нужно описать некоторые настройки этого проекта.

К ним относятся:

  • Сколько языков мы хотим охватить и какие языки?
  • Какие стратегии обучения можно было бы использовать?
  • Как мы измеряем успех и производительность по сравнению с одноязычными моделями?

Языки

Определение термина "многоязычный" подразумевает как минимум два языка. Здесь, в Ntropy, мы считаем, что маленькие шаги и постановка небольших целей на пути к успеху являются ключевыми, особенно когда мы не знаем, насколько сложна проблема на самом деле. Следовательно, первая итерация наших экспериментов состояла из использования двух языков. Однако, чтобы по-настоящему продемонстрировать силу этой техники и укрепить нашу теорию, мы также расширили ее до 3 языков. Кроме того, естественно, что сложность задачи возрастает по мере увеличения количества языков.

Возникает естественный вопрос: на каких языках основывать наши эксперименты? Конечно, мы обязаны выбрать один из преобладающих языков исходя из потребностей наших клиентов.

Лучшие из них (по порядку):

  1. Английский (рынки США, Великобритании, Австралии и др.)
  2. Португальский (Бразилия, рынки Португалии)
  3. Испанский (мексиканский рынок)
  4. Французский (европейский рынок)
  5. Немецкий (европейский рынок)
  6. Голландский (европейский рынок)

Однако здесь играет роль гораздо больше факторов:

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

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

Стратегии обучения

Мы обдумали множество идей, которые потенциально могли бы сработать для этого проекта:

  • Обучение всем языкам одновременно
  • Обучение каждому языку отдельно
  • Циклическое переключение между языками во время обучения
  • Плавное переключение между языками с помощью перевода
  • Обучение языку большинства и точная настройка языков меньшинства/большинства
  • Тестирование возможностей одного/несколько выстрелов для сбора информации о сходствах и различиях между языками.
  • И даже больше, что вы найдете в разделе «Дальнейшие исследования и возможные следующие шаги»!

Все языки одновременно

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

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

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

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

Каждый язык отдельно

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

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

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

Переключение между языками

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

Почему это должно работать лучше?

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

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

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

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

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

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

Чтобы еще больше описать это, требуется тщательное планирование скорости обучения и ранней остановки, чтобы по-прежнему предотвращать смещение новизны, которое присутствует, как в ранее описанном методе. Мы использовали затухание LR даже в зависимости от количества циклов для плавной тренировки. Забывание остается также большой проблемой. Кроме того, в этом контексте особенно важно иметь очень хорошие выдержанные тестовые наборы по сравнению с обычным учебным занятием по одному языку. Это связано с тем, что при циклическом обучении существует более высокий риск переобучения даже при меньшей скорости обучения, чем при одноязычных настройках (из-за многократного обучения каждому отдельному языку и незнания ландшафта функции потерь). Следовательно, нам абсолютно необходимо быть уверенными, что тестовый набор хорошо сконструирован и немного отличается от распределения по сравнению с набором для проверки и обучения.

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

Вот пример обучения французскому языку, а затем обучению португальскому языку:

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

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

Этот подход сработал лучше всего, и именно он в конечном итоге реализован в нашем стеке.

Плавное переключение между языками с помощью перевода

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

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

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

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

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

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

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

Как мы измеряем успех и производительность?

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

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

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

  • Общая сила f1 в многоязычной модели выше, чем в одноязычной модели на каждом языке.
  • Общая f1 для многоязычной модели такая же (+/- эпсилон), как и одноязычная сила для каждого языка.
  • Общий f1 в многоязычной модели находится в пределах шума (+/- 1,4 балла) одноязычной силы каждого языка.

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

Эксперименты — результаты на практике

Эксперименты на 2 языках (португальском и испанском). Результаты мы можем увидеть в таблице 1.

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

Одноязычные сильные стороны:

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

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

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

Результаты представлены в Таблице 2. Обратите внимание, что на этот раз нам потребовалось больше циклов для значимого вывода. После 11 циклов мы получаем те же результаты, что и сильные стороны одноязычных языков (что является важной вехой), однако с некоторой оптимизацией гиперпараметров и снижением LR по количеству циклов мы на самом деле получили лучшие результаты для 1 языка (и такие же баллы для других). ), что является еще большей вехой.

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

Интересной находкой и следствием является то, что для некоторых конкретных объектов мы получаем более высокие баллы. Например, одноязычная сила для португальского человека составляет 0,722, в то время как показатель португальского человека для последней модели, показанной в таблице 2, составляет 0,744 (приличное улучшение), но он немного проигрывает по показателю даты. Это имеет смысл, поскольку люди могут путешествовать по миру и, следовательно, появляться в нескольких регионах с одним и тем же именем.

На крутом графике показано соотношение потомков каждой языковой оценки многоязычной модели к силе одноязычной.

Тренировочные прогоны проводились на машине с несколькими GPU (4 Nvidia Tesla V100) и длились около 8 часов. Базовая предварительно обученная модель представлена ​​языковой моделью преобразователя XLM-R, предварительно обученной общим многоязычным задачам NER.

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

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

Данные не идеальны. Он содержит ошибки, и мы можем использовать разные решения для массовой маркировки для разных языков. Это означает, что если будет конфликт/противоречие по поводу популярных паттернов сущностей, мы просто продолжим терять очки хотя бы с одной стороны. Пример: шаблон xx/yy, где xx и yy — двузначные числа, где xx‹=yy. Если кто-то пометит их как «Дата для португальских транзакций», а другая команда пометит их как «Другие», то модель, вероятно, просто выберет класс большинства (если он не переобучается).

  • Возможно ли, чтобы многоязычная модель имела такую ​​же производительность, как и одноязычные модели, за счет внутренней адаптации модели определения языка, которая будет перенаправляться на другие внутренние одноязычные модели, таким образом, являясь прокси для нашего предыдущего конвейера?

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

  • Насколько масштабируемым является этот подход?

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

  • Насколько дорого обходится обслуживание такой большой модели?

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

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

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

Дальнейшие исследования и возможные следующие шаги

Конечно, мы не останавливаемся на достигнутом, у нас впереди еще много идей!

Среди них большое место занимает изучение дистилляции модельных знаний:

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

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

Оставайтесь с нами, скоро появятся новые сообщения!

Заключение

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

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