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

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

Фундаментальная проблема при оцифровке счетов-фактур заключается в том, чтобы определить, является ли документ счета-фактуры дебетом или фактически аккредитивом.

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

  • Счета бывают разных макетов и форматов. Еще больше усложняет ситуацию то, что некоторые поставщики имеют другую внутреннюю компоновку.
  • Каждый день мы добавляем в нашу систему сотни новых поставщиков и макетов. Имея это в виду, метод, основанный на чистом сопоставлении шаблонов, не будет масштабироваться.
  • Некоторые поставщики не печатают общую сумму как отрицательную, даже если это кредит, нам нужно сделать вывод, что счет действительно является кредитом, а не дебетом, интерпретируя весь документ.
  • У поставщиков есть разные способы представления отрицательных значений: одни используют «-123,45», а другие - «(123,45)» или «123,45-».
  • Поставщики используют разные условия для своих кредитных счетов: кредит, авизо, возврат, возврат и т. Д.
  • Ошибки, возникающие в тексте OCR, еще больше усугубляют указанные выше проблемы.

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

Техническое введение в проблему

В этом проекте мы имеем дело с проблемой классификации на два класса (кредитная или дебетовая).

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

Мы видим, что почти 20% дебетовых счетов (точнее 18%) путают с классом кредита. Учитывая большой объем счетов, обрабатываемых в Plate IQ, это привело бы к слишком большому количеству ложных срабатываний, не говоря уже о 21% кредитных счетов, которые нам не хватает.

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

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

Коллекция наборов данных

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

Поезд - Проверка - Разделение теста

Чтобы правильно протестировать модель машинного обучения, у нас должны быть отдельные и изолированные наборы данных для проверки и тестирования. Разделения на обучение, проверку и тестирование выполняются со следующими соотношениями: 0,7, 0,15, 0,15.

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

Функции

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

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

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

Модель и обучение

Для этой задачи классификации мы решили использовать сверточные нейронные сети (CNN).

В литературе мы можем найти статьи, которые решают проблемы классификации текстов на уровне символов, как мы это сделали здесь, например, [2], [3] и [4].

Из [2],

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

Слева вы можете увидеть архитектуру сети. Сначала мы выполняем «горячую» кодировку символов в тексте счета-фактуры и используем слой внедрения в качестве первого слоя. Остальная часть сети напоминает уменьшенную версию модели VGG16, но с одномерными сверточными слоями, поскольку текст - это одномерный сигнал. Здесь важно обратить внимание на уровень Global Average Pooling (GAP) ближе к концу этой сети. Слой GAP действует как структурная регуляризация [1]. Это также помогает нам получить карты активации классов, о которых мы расскажем в следующих разделах.

Функция потерь - это двоичная кросс-энтропия, оптимизатор - Адам.

Полученные результаты

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

Результаты на тестовом наборе выглядят намного лучше, чем то, с чего мы начали (просто проверяя, есть ли слово «кредит» в тексте счета или нет).

Вложения персонажей

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

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

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

Визуализация активации классов

В этом разделе мы попытаемся пролить свет на внутреннюю работу нашей модели CNN. Посмотрев на карты функций в слое Global Average Pooling, мы можем увидеть, на что модель обращает внимание, чтобы принять решение. Вот некоторые результаты:

Для получения этих результатов мы применили простую технику в [1]. Единственная разница в том, что в бумаге это применяется к изображениям. Однако эту технику можно легко перенести на одномерные данные, которыми является текст.

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

Мы получаем символы счета-фактуры с помощью OCR Engine. В результате мы знаем местоположение каждого персонажа на изображении. После получения одномерного CAM мы можем сопоставить его с исходным изображением счета.

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

Окончательные результаты

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

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

Заинтересованы в работе в Plate IQ и нарушении автоматизации бэк-офиса и AP? Мы набираем всех подряд. Посетите нашу страницу вакансий по адресу https://angel.co/plateiq/jobs

использованная литература

[1] Изучение глубоких функций для дискриминационной локализации: https://arxiv.org/pdf/1512.04150.pdf

[2] Понимание текста с нуля https://arxiv.org/pdf/1502.01710.pdf

[3] Сверточные сети на уровне символов для классификации текста https://arxiv.org/pdf/1509.01626.pdf

[4] Очень глубокие сверточные сети для классификации текста https://arxiv.org/pdf/1606.01781.pdf