Это вторая статья с переводом отдельных глав книги Эндрю Ына «Страсть к машинному обучению». Перевод предыдущих глав вы можете почитать по ссылке.

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

Сквозное глубокое обучение



Глава 47. Рост сквозного обучения (end-to-end learning)



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

  • «Это отличная швабра!»

и следующий крайне отрицательным:

  • «Эта швабра низкого качества, жалею о покупке»

Проблема распознавания положительных и отрицательных мнений называется «классификацией настроений». Чтобы создать эту систему, вы можете построить «конвейер» из двух компонентов:

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

    • Это отличная{прилагательное} швабра{существительное}!

    1 В действительности парсер аннотирует текст гораздо богаче чем это описано, но данного упрощённого описания будет достаточно для объяснения сквозного (end-to-end) глубокого обучения.

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

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



В последнее время наблюдается тенденция к замене конвейеров единственным алгоритмом обучения. Алгоритм сквозного обучения (end-to-end learning algorithm) для этой задачи просто взял бы в качестве входных данных необработанный, оригинальный текст «Это отличная швабра!» и попытался бы непосредственно распознать его настроение:



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

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


Глава 48. Дополнительные примеры сквозного обучения



Представим, что вы хотите создать систему распознавания речи. Вы можете построить систему из трёх компонентов:



Компоненты работают следующим образом:

  1. Вычислительные функции: извлекают признаки, разработанные вручную, например, такие как MFCC (Mel-frequency cepstrum coefficients), которые пытаются захватить содержание высказывания, игнорируя менее важные свойства, такие как высота звука в динамике.
  2. Распознаватель фонем: некоторые лингвисты считают, что существуют базовые единицы звука, называемые «фонемами». Например, начальный звук «k» в «keep» — это та же фонема, что и звук «c» в «cake». Эта система пытается распознать отдельные фонемы в аудиозаписи.
  3. Конечный распознаватель: берёт последовательность распознанных фонем и пытается связать их вместе в выходную запись.

В противоположность этому «конвейеру» сквозная система может принять на входе аудиозапись и попытается напрямую перевести её в выходную запись:



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



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

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

Напротив, сквозной (end-to-end) подход может пытаться принимать на вход показания датчиков и по ним непосредственно выдавать поворот руля в нужном направлении:



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


Глава 49. Сквозное обучение: за и против



Рассмотрим предыдущий пример конвейера распознавания речи:



Многие его части спроектированы «вручную»:

  • MFCC – набор специально разработанных аудио-признаков (audio features). И хотя они предоставляют обоснованную сводку всего аудио, поступившего на вход, они также упрощают входящий сигнал, отбрасывая некоторую информацию.
  • Фонемы — это изобретение лингвистов. Они являются несовершенным представлением звуков речи. Поскольку фонемы являются плохим приближением к реальности, то алгоритм, использующий фонемы для представления речи, ограничит эффективность всей системы распознавания речи.

  • Признаки MFCC устойчивы (robust) к некоторым свойствам речи, которые не влияют на содержимое, например к высоте звука в динамике. Таким образом, они помогают упростить задачу для алгоритма обучения.
  • В той степени, в которой фонемы являются разумным представлением речи, они также могут помочь алгоритму обучения понять основные звуковые компоненты и, следовательно, повысить его эффективность.

Наличие большего числа компонентов, спроектированных вручную, чаще всего позволяет системе распознавания речи обучиться на меньшем количестве данных. Знания, полученные «вручную» с использованием MFCC и фонем, «дополняют» знания, которые наш алгоритм получает из данных. Когда у нас мало данных, эти знания полезны.

Теперь рассмотрим сквозную (end-to-end) систему:



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

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

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

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

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


Глава 50. Выбор компонентов конвейера: доступность данных



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

К примеру, рассмотрим такую архитектуру автономного вождения:



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

Напротив, рассмотрим чистую сквозную систему:



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

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

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


Глава 51. Выбор компонентов конвейера: простота задачи



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



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

  1. Определение является переэкспонированным (overexposed) представленное изображение (как в примере выше).
  2. Определение сделано ли изображение внутри помещения или снаружи.
  3. Определение есть ли на изображении кошка.
  4. Определение есть ли на изображении кошка с чёрно-белым мехом.
  5. Определение есть ли на изображении сиамская кошка (любая конкретная порода кошек).

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

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

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



Представим, что вы проектируете детектор сиамских кошек. Вот чистая сквозная архитектура:



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



На первом шаге (детектор кошек) будут распознаны все кошки на изображении.



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



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

И последний пример, давайте снова вспомним конвейер для задачи автономного вождения:



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

  • Распознать другие автомобили.
  • Распознать пешеходов.
  • Спланировать направление дальнейшего движения.

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

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


Глава 52. Обучение с выходными данными, изобилующими информацией



Алгоритм классификации изображений принимает на вход некоторое изображение X и выдаёт целое число, которое является меткой для категории объекта. Может ли алгоритм вместо этого вывести целое предложение, описывающее изображение?

Например:



Y = «Жёлтый автобус едет вниз по дороге на фоне деревьев и зелёной травы».

Традиционное применение обучения с учителем предполагает наличие обученной функции h:X>Y, где на выходе (y) обычно представлен целым или натуральным числом. Например:

Задача X Y
Антиспам Email Спам / не спам (0/1)
Распознавание изображений Изображение Целочисленная метка
Прогноз цен на недвижимость Характеристики дома Цена в долларах
Рекомендация товаров Характеристики товара и покупателя Вероятность покупки


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

Вот некоторые примеры:

Задача X Y Цитата из работы
Описание изображений Изображение Текст Mao и другие, 2014
Машинный перевод Текст на английском Текст на французском Suskever и другие, 2014
Ответы на вопросы Пара (текст + вопрос) Ответ на вопрос Bordes и другие, 2015
Распознавание речи Аудио Транскрипция Hannun и другие, 2015
Text-to-speech Текстовые признаки Аудио Van der Oord и другие, 2016


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

Анализ ошибок по частям


Глава 53. Анализ ошибок по частям



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

Давайте используем наш пример классификатора сиамских кошек:



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

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



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



Это означает, что классификатор породы кошек получит вот это изображение:



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

С другой стороны, если детектор кошек выдал следующую ограничивающую рамку:



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

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

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

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


Глава 54. Приписывание ошибки конкретной части



Продолжим с нашим примером:



Предположим, что детектор кошек выдал вот эту ограничивающую рамку:



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



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

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

  1. Замените выходные данные детектора кошек на рамку размеченную вручную.
  2. Пропустите соответствующее обрезанное изображение через классификатор породы. Если классификатор породы все еще неправильно классифицирует изображение, припишите ошибку классификатору породы. В противном случае, припишите ошибку детектору кошек.

Другими словами проведите эксперимент, в котором вы подадите на вход классификатора пород идеальные данные. В таком случае возможны 2 варианта:

  1. Даже с идеальной рамкой классификатор пород ошибочно выдаёт y = 0. В этом случае без сомнений виноват классификатор.
  2. Получив на вход идеальную рамку классификатор пород правильно выдал y = 1. Это показывает, что если бы только детектор кошек выдавал более совершенную ограничивающую рамку, тогда общий вывод системы был бы правильным. Таким образом, мы припишем ошибку детектору кошек.

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


Глава 55. Основной случай приписывания ошибок



Вот общие шаги для приписывания ошибок. Предположим, что конвейер имеет три этапа A, B и C, где A подается непосредственно в B, а B подается непосредственно в C.



Для каждой ошибки, которую система совершает на валидационной выборке:

  1. Попробуйте вручную заменить выход этапа A на “идеальную” выдачу (т.е. “идеальную” ограничивающую рамку для кота) и продолжите выполнение остальной части конвейера B, C с такой выдачей. Если алгоритм теперь выдаёт правильный результат, это указывает на то, что только этап A должен улучшить собственную выдачу, для того чтобы работа всего алгоритма стала корректной. Таким образом, вы можете приписать эту ошибку компоненту A. Иначе переходите к шагу 2.
  2. Попробуйте вручную заменить выход этапа B на “идеальную” выдачу. Если весь алгоритм стал работать корректно, то припишите ошибку компоненту B. Иначе переходите к шагу 3.
  3. Припишите ошибку к компоненту C.

Взглянем на более сложный пример:



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

Можете промаркировать компоненты следующим образом:

  • A. Распознать автомобили.
  • B. Распознать пешеходов.
  • C. Спланировать путь.

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

  1. Попробуйте вручную изменить выход компонента A (распознавание автомобилей) на «идеальный» выход (т.е. вручную разметили бы другие автомобили). Запустите оставшуюся часть конвейера B и C как и прежде, но разрешив компоненту C (планирование маршрута) использовать «идеальный» выход компонента A. Если в таком случае алгоритм спланирует лучший маршрут, это указывает на то, что как только этап A улучшит собственную выдачу, то выдача всего алгоритма улучшится. Поэтому вы можете приписать эту ошибку компоненту A. Иначе переходите к шагу 2.
  2. Попробуйте вручную изменить выход компонента B (распознавание пешеходов) на «идеальный» выход. Если алгоритм стал выдавать верный результат, то припишите эту ошибку компоненту B. Иначе переходите к шагу 3.
  3. Припишите ошибку компоненту C.

Компоненты конвейера машинного обучения следует располагать в соответствии с направленным ациклическим графом (DAG), что означает, что вы должны иметь возможность вычислять их в некотором фиксированном порядке слева направо, и более поздние компоненты должны зависеть только от выходов более ранних компонентов. До тех пор, пока
расположение компонентов в порядке A>B>C соответствует порядку DAG, анализ ошибок будет проходить правильно.

Вы можете получить немного разные результаты, если поменяете местами А и В:

  • A. Распознать пешеходов (прежде было распознавание автомобилей)
  • B. Распознать автомобили (прежде было распознавание пешеходов)
  • C. Спланировать путь автомобиля

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


Глава 56. Анализ ошибок по частям и сравнение с эффективностью на уровне человека



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

Скажем, у вас есть некоторый набор данных о клиентах, покупающих вещи на веб-сайте. Дата-сайентист может проанализировать данные множеством разных способов. Он может сделать много разных выводов о том, должен ли сайт повышать цены, о ценности клиентов, приобретённых через различные маркетинговые кампании и так далее. Не существует единственного «правильного» способа анализа набора данных, есть много возможных полезных идей, которые могут возникнуть. Точно так же нет одного «правильного» способа провести анализ ошибок. Из этих глав вы узнали некоторые из самых распространенных шаблонов проектирования для получения полезной информации о вашей системе ML, но вы также можете свободно экспериментировать с другими способами анализа ошибок.

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



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

  1. Насколько далёк алгоритм распознавания автомобилей от эффективности человека при решении аналогичной задачи?
  2. Насколько далёк алгоритм распознавания пешеходов от эффективности человека при решении аналогичной задачи?
  3. Насколько далека эффективность системы в целом от уровня человека? Здесь эффективность на уровне человека предполагает, что человек должен планировать путь для автомобиля, учитывая только выходные данные из двух предыдущих компонентов конвейера (не имея доступа к изображениям с камеры). Другими словами, насколько эффективность компонента «Планирование пути» сравнима с характеристиками человека, когда человеку даются те же самые входные данные?

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

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

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


Глава 57. Обнаружение ошибок в ML конвейере



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



В предыдущей главе мы поставили вопрос: показывает ли каждый из трёх компонентов эффективность на человеческом уровне? Допустим ответ на все три вопроса — да. Тогда:

  1. Компонент, распознающий автомобили, имеет эффективность (примерно) на уровне человека в задачах распознавания автомобилей на изображениях с камеры.
  2. Компонент, распознающий пешеходов, имеет эффективность (примерно) на уровне человека в задачах распознавания пешеходов на изображениях с камеры.
  3. Компонент, планирующий путь автомобиля, имеет эффективность на схожем уровне, при сравнении с человеком, которому поставлена задача планирования пути автомобиля, при этом из входящих данных для принятия решения он имеет только выходы предыдущих двух компонентов (вместо доступа к изображению с камеры).

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

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

Предположим, вы понимаете, что водителю-человеку также необходимо видеть дорожную разметку. Это говорит о том, что вы должны перепроектировать конвейер следующим образом:4


4 В приведенном выше примере с беспилотным автомобилем, теоретически можно решить эту проблему, также подавая необработанную картинку с камеры в компонент планирования. Однако это нарушило бы принцип проектирования «Task simplicity», описанный в главе 51, потому что модуль планирования пути теперь должен получать на вход необработанное изображение, в результате чего он получит очень сложную задачу для решения. Вот почему добавление компонента «Обозначение полосы движения» является лучшим выбором — оно помогает получить важную и ранее отсутствующую информацию о разметке полос в модуле планирования пути, но при этом вы избегаете чрезмерного усложнения сборки/обучения отдельных модулей.

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

Заключение


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



Поздравляем с завершением этой книги!
В главе 2 мы говорили о том, как эта книга может помочь вам стать супергероем в своей команде.


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