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

- Джон Галл

«Gallia est omnia divisa in partes tres»

-Юлий Цезарь, Commentarii de Bello Gallico

Если вы собираетесь построить сложную систему, вам следует начать с простой системы. Кажется очевидным. И все же, если вы создаете системы машинного обучения (ML) в среде с высоким давлением, вы подвергаетесь различным нагрузкам, которые могут подтолкнуть вас к действиям вопреки этому мудрому совету. Изучающие латынь с трепетом (или со стиснутыми зубами) вспомнят привычку Юлия Цезаря не только делить Галлию на три части, но почти все остальное на списки из трех (вспомните: «пришел, увидел, победил»), своего рода «Закон галлов», если хотите. Вдохновленный тем, что я неправильно воспринял закон Галла (см. выше) как «закон Галла», я начал разбивать свои проекты по обработке естественного языка (NLP) на три этапа: сквозная эвристика и маркировка, некоторые компоненты ML и систематические модели ML. .

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

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

На заключительном этапе я заменяю подсистемы (вплоть до всей системы) более сложными моделями.

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

Чтобы сделать это более конкретным, я покажу, как я следовал закону Галла при создании парсера контактной информации Salesforce. Анализатор контактной информации — это библиотека, которая обнаруживает, извлекает, анализирует и улучшает неструктурированные контактные данные для создания высококачественных объектов контактов Salesforce. Его использование включает автоматическое создание контактов из подписей электронной почты и данных визитных карточек OCR.

Сквозная эвристика и маркировка

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

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

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

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

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

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

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

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

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

Систематические модели машинного обучения

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

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

Практические последствия

И последнее замечание: вы могли заметить, что ранее я использовал странную фразу «различная степень завершенности». Это подводит меня к последней и, вероятно, самой важной причине, почему вы должны следовать Закону Галлии. Как можно раньше у вас была система, которая выполняла требуемую задачу. Возможно, она была несложной и требовала жесткого компромисса между точностью и полнотой, но обеспечивала сквозную функциональность. В мире ИИ все быстро меняется. Вы можете работать в организации, которая хвастается своей «гибкостью» и заглядывает в будущее всего на две недели. Вероятность того, что у вас будет достаточно ресурсов для завершения проекта по самым высоким стандартам, почти равна нулю. Если вы планируете свою работу так, что ничего не делается, пока не будет сделано все, вы вряд ли когда-нибудь закончите. Следование закону Галла позволяет вам выпускать что-то, когда организационные приоритеты и ресурсы смещаются от вашего проекта, и предоставляет дополнительные данные о производительности, чтобы помочь сохранить ресурсы как можно дольше.