Вы находитесь на странице: 1из 52

Главы: 36 – 58

Перевод, верстка: surround


Оглавление

Обучение и тестирование на разных распределениях .............................................................................. 2


Глава 36. Когда вы должны обучать и тестировать на разных распределениях ................................... 3
Глава 37. Как решить, использовать ли все ваши данные либо только часть ........................................ 5
Глава 38. Как решить, стоит ли включать противоречивые данные ....................................................... 7
Глава 39. «Взвешивание» данных .............................................................................................................. 8
Глава 40. Обобщение обучающей выборки на валидационную выборку ........................................... 10
Глава 41. Определение смещения, дисперсии и ошибки несоответствия данных ............................. 12
Глава 42. Решение ошибки несоответствия данных............................................................................... 14
Глава 43. Синтезирование искусственных данных ................................................................................. 15
Отладка алгоритмов вывода ....................................................................................................................... 17
Глава 44. Оптимизационный контрольный тест ..................................................................................... 18
Глава 45. Общая методика оптимизационного контрольного теста .................................................... 20
Глава 46. Пример обучения с подкреплением ....................................................................................... 21
Сквозное глубокое обучение....................................................................................................................... 23
Глава 47. Рост сквозного обучения (end-to-end learning) ....................................................................... 24
Глава 48. Дополнительные примеры сквозного обучения .................................................................... 26
Глава 49. Сквозное обучение: за и против .............................................................................................. 28
Глава 50. Выбор компонентов конвейера: доступность данных........................................................... 30
Глава 51. Выбор компонентов конвейера: простота задачи ................................................................. 32
Глава 52. Обучение с выходными данными, изобилующими информацией ...................................... 36
Анализ ошибок по частям ............................................................................................................................ 38
Глава 53. Анализ ошибок по частям ......................................................................................................... 39
Глава 54. Приписывание ошибки конкретной части .............................................................................. 42
Глава 55. Основной случай приписывания ошибок................................................................................ 44
Глава 56. Анализ ошибок по частям и сравнение с эффективностью на уровне человека................. 46
Глава 57. Обнаружение ошибок в ML конвейере ................................................................................... 48
Заключение.................................................................................................................................................... 50
Глава 58. Построй суперкоманду, поделись этими знаниями с товарищами ..................................... 51

1
Обучение и
тестирование на
разных
распределениях

2
Глава 36. Когда вы должны обучать и
тестировать на разных распределениях

Пользователи вашего приложения «Фото кошек» загрузили 10,000 изображений, которые вы


вручную разметили как содержащие или не содержащие кошек. У вас также есть больший набор из
200,000 изображений, которые вы скачали из интернета. Как определить обучающую (train set),
валидационную (dev set) и тестовую выборку (test set)?

Так как 10,000 изображений от пользователей близко отражают реальное распределение


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

Вместо того чтобы разбивать наши данные на обучающую, валидационную и тестовую выборки, мы
можем взять все имеющиеся 210,000 изображений, и случайно перетасовать их в обучающую,
валидационную и тестовую выборки. В этом случае, все данные поступают с одним и тем же
распределением. Но я не рекомендую использовать этот метод, потому что примерно на 97,6%
(205,000/210,000) ваша валидационная и тестовая выборки будут состоять из изображений,
скаченных из интернета, которые не отражают фактического распределения, на котором вы хотите
добиться успеха.

Рекомендация по определению валидационной и тестовой выборки:

 выбирайте валидационную и тестовую выборку для отражения данных, которые вы ожидаете


получить в будущем и с которыми хотите успешно работать.

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


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

1
Существует ряд научных исследований про обучение и тестирование моделей на различных распределениях.
Примеры включают «адаптацию предметной области», «трансферное обучение» и «многозадачное обучение».
Но по-прежнему существует огромный разрыв между теорией и практикой. Если вы обучаете модель на наборе
данных A и тестируете на наборе данных Б, который очень сильно отличается, удача может оказать огромное
влияние на эффективность вашего алгоритма. (Здесь «удача» включает ручной отбор признаков
исследователем для конкретной задачи, а также другие факторы, которые мы пока не понимаем.) Это делает
трудновыполнимым систематическое академическое исследование обучения и тестирования на различных
распределениях.

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

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

Давайте рассмотрим второй пример. Предположим, вы строите систему распознавания речи для
транскрибирования адресов для голосового приложения «Навигатор». У вас есть 20,000 примеров, в
каждом из которых пользователь называет некоторый адрес. Но у вас также есть 500,000 других
аудиозаписей, в которых пользователи говорят на свободные темы. Вы можете взять 10,000
примеров с адресами для валидационной и тестовой выборок, а оставшиеся 10,000 примеров плюс
дополнительные 500,000 примеров включить в обучающую выборку.

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


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

4
Глава 37. Как решить, использовать ли
все ваши данные либо только часть

Предположим, что обучающая выборка вашего детектора кошек включает 10,000 загруженных
пользователем изображений. Пусть эти данные имеют то же распределение, что и в валидационной
и тестовой выборке, и именно для такого распределения вы хотите достичь максимального
результата. У вас также есть дополнительные 20,000 изображений, скаченных из интернета. Надо ли
включать все 20,000 + 10,000 = 30,000 изображений в обучающую выборку, или же лучше отбросить
20,000 интернет-изображений, опасаясь внесения погрешностей в ваш алгоритм обучения?

При использовании более ранних поколений алгоритмов обучения (например, таких как алгоритм
компьютерного зрения, спроектированный вручную, за которым стоит простой линейный
классификатор) был реальный риск того, что объединение данных из обоих источников может
ухудшить итоговые результаты. Таким образом, некоторые инженеры будут предостерегать вас от
включения 20,000 интернет-изображений.

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

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

Добавление 20,000 дополнительных интернет-изображений будет иметь следующие эффекты:

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

5
Чтобы объяснить второй эффект другими словами, мы можем обратиться к вымышленному
персонажу, Шерлоку Холмсу, который говорит, что ваш мозг похож на чердак, который имеет
ограниченное количество места. Он говорит, что «при каждом добавлении знаний вы забываете то,
что знали прежде. Поэтому крайне важно не допустить, чтобы бесполезные факты вытесняли
полезные».2

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

Но если у вас нет достаточно большой нейронной сети (или другого очень гибкого алгоритма
обучения), то вам следует уделять больше внимания вашим тренировочным данным,
соответствующим вашей валидационной и тестовой выборке.

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

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

2
«Этюд в багровых тонах», Артутр Конан Дойл, 1887

6
Глава 38. Как решить, стоит ли
включать противоречивые данные

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


дома (входное значение x), вы хотите предсказать цену (целевая метка y).

Цены на жилье в Нью-Йорке очень высоки. Предположим, у вас есть второй набор данных - цены на
жилье в Детройте, штат Мичиган, где цены на жилье намного ниже. Надо ли включать эти данные в
свой тренировочный набор?

Учитывая тот же размер х, цена дома у очень отличается в зависимости от того, находится ли он в
Нью-Йорке или в Детройте. Если вы заботитесь только о прогнозировании цен на жилье в Нью-
Йорке, то объединение двух наборов данных повредит вашей производительности. В этом случае
было бы лучше не использовать противоречивые данные из набора Детройта.3

Как этот пример с жильём Нью-Йорка и Детройта отличается от нашего примера с интернет-
изображениями кошек и изображениями из мобильного приложения?

Пример с изображениями кошек отличается тем, что, учитывая входное изображение x, можно
надежно предсказать метку y, указывающую, есть ли на нём кошка, даже не зная, получили ли мы
изображение из интернета или из мобильного приложения. Т.е. существует функция f(x), которая
надежно отражает соответствие входа x к целевому выходу у, даже не зная источника
происхождения х. Таким образом, задача распознавания интернет-изображений «соответствует»
задаче распознавания изображений из мобильного приложения. Это означает, что был небольшой
минус (кроме вычислительных затрат) от включения всех данных и некоторый возможный
значительный плюс. В отличие от примера с противоречивыми данными Нью-Йорка и Детройта, в
котором при одном и том же входном значении х (размер дома), цена очень отличается в
зависимости от того, в каком городе находится этот дом.

3
Существует один способ решения проблемы несовместимости данных Детройта с данными Нью-Йорка, а
именно добавление дополнительного признака в каждый пример обучения, т.е. указание города. Учитывая
входное значение x, которое теперь указывает город, целевое значение y теперь определено однозначно.
Однако на практике я так и не вижу, чтобы это делалось часто.

7
Глава 39. «Взвешивание» данных

Предположим, у вас есть 200,000 интернет-изображений и 5,000 изображений от пользователей


вашего мобильного приложения. Между размерами этих наборов данных существует соотношение
40:1. Теоретически, до тех пор, пока вы строите огромную нейронную сеть и обучаете ее достаточно
долго на всех имеющихся 205,000 примерах, нет ничего плохого в том, чтобы заставить алгоритм
работать хорошо как на интернет-изображениях, так и на мобильных изображениях.

Но на практике, имея в 40 раз больше интернет-изображений, чем изображений из мобильного


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

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


гораздо меньший вес в качестве компромисса.

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

min ∑ (ℎ𝜃 (𝑥 ) − 𝑦)2 + ∑ (ℎ𝜃 (𝑥 ) − 𝑦)2


𝜃
(𝑥,𝑦)∈ MobileImg (𝑥,𝑦)∈ InternetImg

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

min ∑ (ℎ𝜃 (𝑥 ) − 𝑦)2 + β ∑ (ℎ𝜃 (𝑥 ) − 𝑦)2


𝜃
(𝑥,𝑦)∈ MobileImg (𝑥,𝑦)∈ InternetImg

Если вы установите 𝛽 = 1/40, алгоритм даст равный вес 5000 мобильным изображениям и 200,000
интернет-изображениям. Вы также можете установить параметру 𝛽 другие значения, возможно,
подстраивая его под валидационную выборку.

Назначая интернет-изображениям меньшие веса, вам не нужно создавать массивную нейронную


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

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

9
Глава 40. Обобщение обучающеи
выборки на валидационную выборку

Предположим, что вы применяете ML в условиях, когда обучающая выборка отличается от


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

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


(предотвратимого) смещения (avoidable bias) распределения обучающей выборки.
2. Алгоритм хорошо работает на обучающей выборке, но плохо обобщается на новые
(прежде не показанные) данные, взятые с тем же распределением, что и в обучающей
выборке. Это высокая дисперсия (variance).
3. Алгоритм хорошо обобщается на новые (прежде не показанные) данные, взятые с тем же
распределением, что и в обучающей выборке, но не на данные из
валидационной/тестовой выборки. Мы называем эту проблему несоответствием данных
(data mismatch) по причине того, что данные обучающей выборки плохо соотносятся с
данными валидационной/тестовой выборок.

К примеру, предположим, что люди достигают почти совершенного результата в задаче


идентификации кошек. А ваш алгоритм достиг:

 1% ошибок на обучающей выборке


 1,5% ошибок на новых (прежде не показанных алгоритму) данных, имеющих то же
распределение, что и обучающая выборка
 10% ошибок на валидационной выборке

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

Чтобы диагностировать, в какой степени алгоритм страдает от каждой из проблем 1-3, описанных
выше, будет полезно иметь другой набор данных. В частности, вместо того, чтобы дать алгоритму все
имеющиеся данные для обучения, вы можете разделить их на две части: фактическую обучающую
выборку, на которой алгоритм будет обучаться, и отдельный набор, который мы будем называть
обучающе-валидационным (“trainig dev” set), который мы не будем использовать при обучении.

Таким образом, у вас появляется 4 набора данных:

 Обучающая выборка (training set). Это данные, на которых алгоритм будет обучаться (к
примеру, интернет-изображения + изображения из мобильного приложения). Эти данные не

10
обязательно должны браться с тем же распределением, на результат по которому мы в итоге
ориентируемся (валидационная/тестовая выборки).
 Обучающе-валидационная выборка (“training dev” set). Эти данные берутся с тем же
распределением, что и в обучающей выборке (к примеру интернет-изображения +
изображения мобильного приложения). Этот набор обычно меньше чем обучающая выборка,
при этом он должен быть достаточно большим, чтобы оценивать и отслеживать прогресс
нашего алгоритма обучения.
 Валидационная выборка (dev set). Эти данные берутся с тем же распределением, что и в
тестовой выборке и должны полностью отражать распределение данных, на которых мы и
стремимся достигнуть максимального улучшения (к примеру, изображения из мобильного
приложения).
 Тестовая выборка (test set). Эти данные берутся с тем же распределением, что и в
валидационной выборке (к примеру, изображения из мобильного приложения).

Вооружившись этими четырьмя отдельными наборами данных вы можете оценивать:

 Ошибку обучения (training error), путём оценки на обучающей выборке.


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

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

11
Глава 41. Определение смещения,
дисперсии и ошибки несоответствия
данных
Предположим, что люди достигают почти идеальной эффективности (ошибка ≈0%) в задачах
обнаружения кошек, и, таким образом, оптимальный коэффициент ошибок составляет около 0%.

Предположим, у вас есть:

 1% ошибок на обучающей выборке


 5% ошибок на обучающе-валидационной выборке
 5% ошибок на валидационной выборке

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

Теперь предположим ваш алгоритм достиг:

 10% ошибок на обучающей выборке


 11% ошибок на обучающе-валидационной выборке
 12% ошибок на валидационной выборке

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

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

 10% ошибок на обучающей выборке


 11% ошибок на обучающе-валидационной выборке
 20% ошибок на валидационной выборке

Этот алгоритм страдает от высокого смещения (avoidable bias) и от несоответствия данных (data
mismatch) и в то же время не испытывает проблем с высокой дисперсией на обучающей выборке.

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

12
Распределение А: Распределение Б:
Интернет-изображения + Изображения из
изображения из мобильного
мобильного приложения приложения
Эффективность, Человеческая ошибка
доступная человеку (≈0%) Предотвратимое
смещение
Ошибка на примерах, Ошибка обучающей
на которых алгоритм выборки (training error)
обучался 10%
Ошибка на примерах, Ошибка обучающе- Ошибка
на которых алгоритм валидационной выборки валидационной Дисперсия
не обучался (training-dev error) 11% выборки (dev-test
error) 20%

Ошибка несоответствия данных

Продолжая с примером детектора изображений кошек, вы можете видеть, что по оси X есть два
разных распределения данных (распределение А и распределение Б). По оси Y у нас есть три типа
ошибок: человеческая ошибка, ошибка на примерах, на которых обучался алгоритм, и ошибка на
примерах, на которых алгоритм не обучался. Мы можем заполнить ячейки таблицы различными
типами ошибок, которые мы определили в предыдущей главе.

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

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

13
Глава 42. Решение ошибки
несоответствия данных

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


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

Я рекомендую вам: (i) попытаться понять, какие свойства отличаются у данных из обучающей и
валидационной выборок; (ii) постарайтесь найти больше обучающих данных, которые лучше
соответствуют примерам из валидационной выборки, с которыми у вашего алгоритма есть
проблемы.4

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

Если ваша обучающая и обучающе-валидационная выборка включают звук, записанный в


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

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

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

14
Глава 43. Синтезирование
искусственных данных

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

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


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

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


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

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

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

15
Возьмем еще один пример, предположим, вы создаете систему компьютерного зрения для
распознавания автомобилей. Допустим, вы сотрудничаете с компанией, занимающейся
видеоиграми, которая имеет модели нескольких автомобилей, созданные с помощью компьютерной
графики. Чтобы обучить свой алгоритм, вы используете эти модели для генерации синтетических
изображений автомобилей. Даже если синтезированные изображения выглядят очень реалистично,
этот подход (который независимо друг от друга предлагался многими людьми), вероятно, не будет
работать хорошо. Видеоигра может иметь примерно 20 моделей автомобилей. Создать
качественную 3D-модель автомобиля очень дорого, если бы вы играли в игру, вы, вероятно, не
заметили бы, что вы видите одни и те же автомобили снова и снова, возможно, только окрашенные
по-разному. Т.е. эти данные выглядят очень реалистично для вас. Но по сравнению с разнообразием
всех автомобилей на дорогах, и следовательно с тем набором, который вы вероятно увидите в
валидационной/тестовой выборке - этот набор из 20 синтезированных моделей захватывает только
крошечную долю всего мирового разнообразия автомобилей. Таким образом, если ваши 100,000
обучающих примеров целиком получены на основе этих 20 автомобилей, то ваша система будет
переобучена этими конкретными моделями, и она не сможет хорошо обобщаться на
валидационную/тестовую выборки, которые включают в себя другие модели автомобилей.

При синтезе данных, подумайте, действительно ли вы генерируете репрезентативный набор


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

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

16
Отладка алгоритмов
вывода

17
Глава 44. Оптимизационныи
контрольныи тест

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


вход аудиозапись A, и рассчитывает некоторую оценку ScoreA(S) для каждого возможного выходного
предложения S. Например, вы можете попытаться оценить ScoreA(S) = P(S|A), т.е. вероятность того,
что правильной выходной транскрипцией является предложение S, учитывая, что на вход была
подана аудиозапись A.

Учитывая способ расчёта ScoreA(S), вам необходимо найти такое предложение на английском языке,
которое будет иметь максимальную оценку:

𝑂𝑢𝑡𝑝𝑢𝑡 = arg max 𝑆𝑐𝑜𝑟𝑒𝐴 (𝑆)


𝑆
Как рассчитать «arg max» из примера выше? В английском языке существует 50,000 слов, в таком
случае есть (50,000)N возможных предложений длины N. Это слишком много, чтобы их перечислить.

Итак, вам нужно применить алгоритм приближённого поиска, чтобы попытаться найти значение S,
которое оптимизирует (максимизирует) оценку ScoreA(S). Одним из примеров такого алгоритма
является «лучевой поиск» (beam search), который сохраняет только K лучших кандидатов в процессе
поиска. (Для целей этой главы вам не нужно разбираться в деталях работы лучевого поиска.)
Подобные алгоритмы не гарантируют нахождение значения S, которое максимизирует показатель
ScoreA(S).

Представим, что на некоторой аудиозаписи кто-то произнёс «Я люблю машинное обучение». Но


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

1. Проблемы в алгоритме поиска. Алгоритм приближённого поиска (beam search) неверно


нашёл значение S, которое максимизирует ScoreA(S).
2. Объективная проблема с оценочной функцией. Наша оценка ScoreA(S) = P(S|A) была не
точной. В частности выбранная оценка ScoreA(S) не позволила верно распознать правильную
транскрипцию «Я люблю машинное обучение».

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

Встретившись с подобной ситуацией, некоторые исследователи случайным образом решают


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

18
Пусть Sout будет выходной транскрипцией («Я люблю роботов»). Пусть S* будет правильной
транскрипцией («Я люблю машинное обучение»). Чтобы понять какая из двух проблем
перечисленных выше стоит перед нами, вы можете провести оптимизационный контрольный тест
(Optimization Verification test): сначала рассчитайте оценки для ScoreA(S*) и для ScoreA(Sout). Затем
проверьте, какая из двух оценок будет иметь большее значение. Существуют две вероятности:

1. ScoreA(S*) > ScoreA(Sout), т.е. оценка для правильной транскрипции выше оценки для
выданной (неправильной).

В этом случае ваш алгоритм обучения верно назначает более высокую оценку для верной
транскрипции S*. Тем не менее алгоритм приближённого поиска выбирает неверную
транскрипцию Sout. Это говорит о том, что алгоритм приближённого поиска ошибся в выборе
значения S, которое максимизирует оценку ScoreA(S). В этом случае оптимизационный
контрольный тест указывает на ошибку в поисковом алгоритме, и вам нужно сфокусироваться
именно на нём. Например, вы можете попробовать увеличить ширину луча при использовании
лучевого поиска (beam search).

2. ScoreA(S*) ≤ ScoreA(Sout), т.е. оценка для правильной транскрипции не превышает оценку для
выданной (неправильной).

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

Наше обсуждение затронуло единственный пример. Чтобы применить оптимизационный


контрольный тест на практике вы должны проверить ошибки вашей валидационной выборки. Для
каждой ошибки вы должны проверить, что оценка для ожидаемой (верной) транскрипции выше
оценки выходной (неверной) транскрипции, т.е. ScoreA(S*) > ScoreA(Sout). Каждый пример из
валидационной выборки, для которого такое неравенство сохранится будет помечен как ошибка,
вызванная оптимизационным алгоритмом. Каждый пример, для которого это неравенство не
сохранится, будет считаться ошибкой из-за неверного способа расчёта ScoreA(.).

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

19
Глава 45. Общая методика
оптимизационного контрольного теста

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


знаете, как рассчитать оценку ScoreX(y), которая указывает, как хорошо соответствует выходное
значение y данному x на входе. Кроме того, вы используете алгоритм приближённого поиска, чтобы
найти arg maxY ScoreX(y), но подозреваете, что алгоритм поиска ошибается при нахождении
максимума. В предыдущем примере с системой распознавания речи x=A и представлял собой
аудиозапись, а y=S и являлся выходной транскрипцией.

Предположим y* это правильное выходной значение, но вместо него алгоритм выдаёт yout. Тогда
главное проверить как соотносятся ScoreX(y*) и ScoreX(yout). Если первая оценка больше второй, то
причина ошибки в оптимизационном алгоритме, в противном случае вина лежит на функции расчёта
оценки ScoreX(y).

Давайте рассмотрим ещё один пример. Предположим, вы создаёте систему машинного перевода с
китайского языка на английский. Ваша система работает, получая на вход предложение C,
рассчитывает оценку ScoreC(E) для каждой возможной версии перевода E. Например, вы можете
использовать оценку ScoreC(E)=P(E|C), т.е. вероятность того, что переводом является E, учитывая, что
на вход было подано предложение C.

Ваш алгоритм машинного перевода текста пытается рассчитать:

𝑂𝑢𝑡𝑝𝑢𝑡 = arg max 𝑆𝑐𝑜𝑟𝑒𝐶 (𝐸)


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

Предположим ваш алгоритм выдаёт неверный перевод Eout чаще, чем некоторый правильный
перевод E*. Тогда оптимизационный контрольный тест позволит рассчитать неравенство ScoreC(E*) >
ScoreC(Eout). Если оно сохраняется, то оценка ScoreC(.) верно распознаёт E* как лучшее выходное Eout,
поэтому вы отнесёте эту ошибку на долю алгоритма приближённого поиска, в противном случае на
функцию расчёта ScoreC(.).

Это очень общий паттерн в ИИ: сначала обучаем аппроксимирующую функцию оценки Scorex(.),
потом используем приближённый алгоритм максимизации. Если вы запомните этот паттерн, то вы
сможете использовать оптимизационный контрольный тест, чтобы найти источник ошибок.

20
Глава 46. Пример обучения с
подкреплением

Предположим, вы используете машинное обучение, чтобы научить вертолёт совершать сложные


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

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

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


R(.), которая выдаёт оценку, показывающую насколько хороша была каждая возможная траектория
T. Например, если траектория T привела к падению вертолёта, то пусть награда R(T) = -1000, т.е.
имеет большое отрицательное значение. Траектория T, завершившаяся удачной посадкой, будет
иметь положительную оценку R(T), в точности отражающую зависимость того насколько гладкой
была посадка. Функция вознаграждения R (.) обычно выбирается вручную, чтобы определить
количественно, насколько желательны различные траектории T. Она должна компенсировать
различные факторы: насколько сильно трясло при посадке, приземлился ли вертолет точно в нужном
месте, насколько спуск был тяжёлым для пассажиров и так далее. Хорошие функции вознаграждения
разработать нелегко.

21
С учётом функции вознаграждения R(T), задача алгоритма обучения с подкреплением состоит в том,
чтобы управлять вертолетом так, чтобы достичь maxT R(T). Тем не менее, алгоритмы обучения с
подкреплением делают много приближений и могут не преуспеть в достижении этой максимизации.

Предположим, вы определили функцию награды R(.) и запустили свой алгоритм обучения. Тем не
менее, его эффективность гораздо хуже, чем у пилота-человека – сильно трясёт при посадке и она
кажется менее безопасной. Как определить, связана ли ошибка с алгоритмом обучения с
подкреплением, который пытается следовать траектории maxT R(T), или ошибка связана с функцией
вознаграждения, которая пытается измерить и определить идеальное соотношение между
допустимой тряской при посадке и точностью места приземления?

Применим оптимизационный контрольный тест. Пусть Thuman будет траекторией, которой следовал
пилот-человек, а Tout будет траекторией, которую выбрал алгоритм. Следуя описанию выше,
согласимся, что траектория Thuman лучше чем Tout, тогда ключевым вопросом тестирования будет -
соответствует ли действительности R(Thuman) > R(Tout).

Вариант 1: если это неравенство сохраняется, то функция вознаграждения R(.) верно оценила
траекторию Thuman. Но алгоритм обучения с подкреплением выбрал хуже оценённую траекторию Tout.
Это означает, что стоит поработать над улучшением нашего алгоритма обучения с подкреплением.

Вариант 2: это неравенство не сохранилось, т.е. R(Thuman) ≤ R(Tout). Это значит, что функция
вознаграждения R(.)присвоила худший результат для Thuman, хотя это и заведомо лучшая траектория.
Вы должны поработать над улучшением R(.), чтобы выявить лучшие соотношения факторов, которые
соответствуют хорошей посадке.

Многие приложения машинного обучения имеют этот «шаблон» оптимизации функции


приблизительной оценки Scorex(.), использующей алгоритм приближённого поиска. Иногда у нас нет
точно заданного ввода x, так что оптимизация сводится только к функции оценки Score(.). В примере
выше, оценочной функцией была функция вознаграждения Score(T) = R(T), а алгоритмом
оптимизации был алгоритм обучения с подкреплением, пытающийся рассчитать хорошую
траекторию T.

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

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

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

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

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

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

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

Проблема распознавания положительных и отрицательных мнений называется «классификацией


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

1. Парсер: система, которая аннотирует текст информацией, идентифицируя наиболее важные


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

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

2. Классификатор настроений: алгоритм обучения, который берёт на вход аннотированный


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

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

В последнее время наблюдается тенденция к замене конвейеров единственным алгоритмом


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

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

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

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

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

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

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

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


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

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


попытается напрямую перевести её в выходную запись:

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

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

6
https://en.wikipedia.org/wiki/Mel-frequency_cepstrum

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

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


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

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

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

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

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

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

 MFCC – набор специально разработанных аудио-признаков (audio features). И хотя они


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

Эти компоненты, спроектированные вручную, ограничивают потенциальную эффективность системы,


однако их использование также имеет ряд преимуществ:

 Признаки MFCC устойчивы (robust) к некоторым свойствам речи, которые не влияют на


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


сложности:

1. Определение является переэкспонированным (overexposed) представленное изображение


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

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

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

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

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

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

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

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

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

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

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

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

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

 Распознать другие автомобили.


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

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

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

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

Алгоритм классификации изображений принимает на вход некоторое изображение X и выдаёт целое


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

Например:

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


деревьев и зелёной травы»

Традиционное применение обучения с учителем предполагает наличие обученной функции h:X->Y,


где на выходе (y) обычно представлен целым или натуральным числом. Например:

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

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

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

Задача X Y Цитата из работы:


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

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

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

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

Предположим, ваша система построена с использованием сложного конвейера машинного


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

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

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

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

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

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

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


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

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

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

Допустим, вы прошли 100 неправильно классифицированных образов валидационной выборки и


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

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

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

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

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

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

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

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

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

1. Замените выходные данные детектора кошек на рамку размеченную вручную.

2. Пропустите соответствующее обрезанное изображение через классификатор породы. Если


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

Другими словами проведите эксперимент, в котором вы подадите на вход классификатора пород


идеальные данные. В таком случае возможны 2 варианта:

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

Проведя такой анализ неправильно классифицированных изображений из валидационной выборки,


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

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

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

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

1. Попробуйте вручную заменить выход этапа A на “идеальную” выдачу (т.е. “идеальную”


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

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

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

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

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

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


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

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

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


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

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

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


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

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

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

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

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

Вернемся к приложению для беспилотного автомобиля, в котором алгоритм обнаружения


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

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

1. Насколько далёк алгоритм распознавания автомобилей от эффективности человека при


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

46
«Планирование пути» сравнима с характеристиками человека, когда человеку даются те же
самые входные данные?

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

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

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

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

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

В предыдущей главе мы поставили вопрос: показывает ли каждый из трёх компонентов


эффективность на человеческом уровне? Допустим ответ на все три вопроса - да. Тогда:

1. Компонент, распознающий автомобили, имеет эффективность (примерно) на уровне


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

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

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

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

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

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

49
Заключение

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

Поздравляем с завершением этой книги!

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

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

51