Три года прошло с момента публикации первых глав книги Эндрю Ына (Andrew Ng) «Machine Learning Yearning». Если вы подписаны на хаб «Машинное обучение», то нет никакой нужды представлять вам её автора и скорее всего саму книгу вы уже давно прочитали на языке первоисточника. Перевод первой половины книги на русский язык сделал alexey_nichnikov, к этому моменту он опубликован на Хабре в серии статей.
Представляю вашему вниманию свой вариант перевода второй половины книги, а именно глав 36-58. Планируется разбить его на две статьи для удобства публикации. Кроме того вы можете скачать полностью готовый перевод этих глав, свёрстанный в pdf, возможно кому-то такой формат покажется для чтения более удобным.
В первой статье речь пойдёт об обучении и тестировании на разных распределениях, а так же об отладке алгоритмов вывода.
Пользователи вашего приложения «Фото кошек» загрузили 10,000 изображений, которые вы вручную разметили как содержащие или не содержащие кошек. У вас также есть больший набор из 200,000 изображений, которые вы скачали из интернета. Как определить обучающую (train set), валидационную (dev set) и тестовую выборку (test set)?
Так как 10,000 изображений от пользователей близко отражают реальное распределение вероятностей тех данных, с которыми вы в дальнейшем хотите успешно работать, вы можете использовать это для своей валидационной и тестовой выборки. Если вы тренируете алгоритм глубокого обучения, который требователен к количеству обучающих примеров, вы можете дать ему для обучения дополнительно 200,000 изображений, скаченных из интернета. Таким образом, данные в валидационной и тестовой выборке будут иметь разное распределение вероятностей. Как это повлияет на результат вашей работы?
Вместо того чтобы разбивать наши данные на обучающую, валидационную и тестовую выборки, мы можем взять все имеющиеся 210,000 изображений, и случайно перетасовать их в обучающую, валидационную и тестовую выборки. В этом случае, все данные поступают с одним и тем же распределением. Но я не рекомендую использовать этот метод, потому что примерно на 97,6% (205,000/210,000) ваша валидационная и тестовая выборки будут состоять из изображений, скаченных из интернета, которые не отражают фактического распределения, на котором вы хотите добиться успеха.
Рекомендация по определению валидационной и тестовой выборки:
Большая часть академической литературы по машинному обучению предполагает, что обучающая, валидационная и тестовая выборки — все имеют одинаковое распределение.1 На заре становления машинного обучения данные были скудными. Обычно у нас был только один набор данных с некоторым распределением вероятностей. Поэтому мы случайным образом делили весь набор на обучающую, валидационную и тестовую выборки, предполагая, что все данные поступили из одного и того же источника, что как правило соответствовало действительности.
Но в эпоху больших данных у нас теперь есть доступ к огромным обучающим наборам, таким как изображения с кошками из интернета. Даже если обучающая выборка имеет распределение, отличающееся от распределений валидационной и тестовой выборок, мы все еще хотим использовать её для обучения, так как это может дать много дополнительной информации.
В примере с детектором кошек вместо того, чтобы помещать все 10,000 загруженных пользователями изображений в валидационную и тестовую выборку, мы могли бы поместить в них только 5,000 изображений. А оставшиеся 5,000 примеров мы можем поместить в обучающую выборку. Таким образом, обучающая выборка будет состоять из 205,000 примеров, и будет включать в себя данные, имеющие то же распределение, что и в валидационной и тестовой выборке, плюс 200,000 интернет-изображений. В следующей главе мы обсудим, почему этот метод полезен.
Давайте рассмотрим второй пример. Предположим, вы строите систему распознавания речи для транскрибирования адресов для голосового приложения «Навигатор». У вас есть 20,000 примеров, в каждом из которых пользователь называет некоторый адрес. Но у вас также есть 500,000 других аудиозаписей, в которых пользователи говорят на свободные темы. Вы можете взять 10,000 примеров с адресами для валидационной и тестовой выборок, а оставшиеся 10,000 примеров плюс дополнительные 500,000 примеров включить в обучающую выборку.
Мы продолжим предполагать, что наши данные валидационной и тестовой выборок имеют одинаковое распределение. Но важно понимать и помнить, что разные распределения в обучающей и валидационной/тестовой выборках приведут к особым проблемам.
Предположим, что обучающая выборка вашего детектора кошек включает 10,000 загруженных пользователем изображений. Пусть эти данные имеют то же распределение, что и в валидационной и тестовой выборке, и именно для такого распределения вы хотите достичь максимального результата. У вас также есть дополнительные 20,000 изображений, скаченных из интернета. Надо ли включать все 20,000 + 10,000 = 30,000 изображений в обучающую выборку, или же лучше отбросить 20,000 интернет-изображений, опасаясь внесения погрешностей в ваш алгоритм обучения?
При использовании более ранних поколений алгоритмов обучения (например, таких как алгоритм компьютерного зрения, спроектированный вручную, за которым стоит простой линейный классификатор) был реальный риск того, что объединение данных из обоих источников может ухудшить итоговые результаты. Таким образом, некоторые инженеры будут предостерегать вас от включения 20,000 интернет-изображений.
Но в современную эпоху мощных, гибких алгоритмов обучения, таких как большие нейронные сети, этот риск значительно уменьшился. Если вы можете позволить себе построить нейронную сеть с достаточно большим количеством скрытых слоев, вы можете смело добавлять 20,000 интернет-изображений в свою обучающую выборку. Добавление изображений, скорее всего, повысит ваш итоговый результат.
Это наблюдение опирается на тот факт, что существует некоторое соответствие x > y, которое хорошо работает для обоих типов данных. Другими словами, существует какая-то система, которая получив либо интернет-изображение, либо изображение из мобильного приложения надежно предсказывает метку, даже не зная источник изображения.
Добавление 20,000 дополнительных интернет-изображений будет иметь следующие эффекты:
Чтобы объяснить второй эффект другими словами, мы можем обратиться к вымышленному персонажу, Шерлоку Холмсу, который говорит, что ваш мозг похож на чердак, который имеет ограниченное количество места. Он говорит, что «при каждом добавлении знаний вы забываете то, что знали прежде. Поэтому крайне важно не допустить, чтобы бесполезные факты вытесняли полезные».2
К счастью, если у вас есть вычислительные мощности, необходимые для построения достаточно большой нейронной сети, т. е. «достаточно большой чердак», то это «вытеснение», описанное выше, не является серьезной проблемой. У вас достаточно возможностей для обучения как на интернет-изображениях, так и на изображениях из мобильного приложения, при этом оба типа данных не конкурируют за способность распознавания. «Мозг» вашего алгоритма достаточно велик, чтобы вам не приходилось беспокоиться о том, что вам вдруг не хватит «места на чердаке».
Но если у вас нет достаточно большой нейронной сети (или другого очень гибкого алгоритма обучения), то вам следует уделять больше внимания вашим тренировочным данным, соответствующим вашей валидационной и тестовой выборке.
Если вы считаете, что у вас есть данные, которые не приносят никакой пользы, вы должны просто исключить их для ускорения вычислений. Например, предположим, что ваши валидационная и тестовая выборка в основном содержат случайные фотографии людей, мест, знаков и указателей, а также животных. Предположим, у вас также есть большая коллекция отсканированных исторических документов:
Эти документы не содержат ничего похожего на кошку. Они также выглядят совершенно не похожими на данные из вашей валидационной и тестовой выборки. Нет смысла включать эти данные в качестве отрицательных примеров, потому что в этом случае выгода, описанная в первом эффекте, будет ничтожна. Ваша нейронная сеть по этим данным не сможет узнать почти ничего, что она могла бы применить к вашей валидационной и тестовой выборке. Включение этих примеров приведет к потере вычислительных ресурсов и снижению представительной способности нейронной сети.
Предположим, вы хотите научиться прогнозировать цены на жилье в Нью-Йорке. Учитывая размер дома (входное значение x), вы хотите предсказать цену (целевая метка y).
Цены на жилье в Нью-Йорке очень высоки. Предположим, у вас есть второй набор данных — цены на жилье в Детройте, штат Мичиган, где цены на жилье намного ниже. Надо ли включать эти данные в свой тренировочный набор?
Учитывая тот же размер х, цена дома у очень отличается в зависимости от того, находится ли он в Нью-Йорке или в Детройте. Если вы заботитесь только о прогнозировании цен на жилье в Нью-Йорке, то объединение двух наборов данных повредит вашей производительности. В этом случае было бы лучше не использовать противоречивые данные из набора Детройта.3
Как этот пример с жильём Нью-Йорка и Детройта отличается от нашего примера с интернет-изображениями кошек и изображениями из мобильного приложения?
Пример с изображениями кошек отличается тем, что, учитывая входное изображение x, можно надежно предсказать метку y, указывающую, есть ли на нём кошка, даже не зная, получили ли мы изображение из интернета или из мобильного приложения. Т.е. существует функция f(x), которая надежно отражает соответствие входа x к целевому выходу у, даже не зная источника происхождения х. Таким образом, задача распознавания интернет-изображений «соответствует» задаче распознавания изображений из мобильного приложения. Это означает, что был небольшой минус (кроме вычислительных затрат) от включения всех данных и некоторый возможный значительный плюс. В отличие от примера с противоречивыми данными Нью-Йорка и Детройта, в котором при одном и том же входном значении х (размер дома), цена очень отличается в зависимости от того, в каком городе находится этот дом.
Предположим, у вас есть 200,000 интернет-изображений и 5,000 изображений от пользователей вашего мобильного приложения. Между размерами этих наборов данных существует соотношение 40:1. Теоретически, до тех пор, пока вы строите огромную нейронную сеть и обучаете ее достаточно долго на всех имеющихся 205,000 примерах, нет ничего плохого в том, чтобы заставить алгоритм работать хорошо как на интернет-изображениях, так и на мобильных изображениях.
Но на практике, имея в 40 раз больше интернет-изображений, чем изображений из мобильного приложения, может потребоваться потратить в 40 раз больше вычислительных ресурсов, чем в случае, когда бы вы обучали сеть только на 5,000 изображений.
Если у вас нет огромных вычислительных ресурсов, вы можете придать интернет-изображениям гораздо меньший вес в качестве компромисса.
Например, предположим, что ваша цель оптимизации — квадрат ошибки (это не очень хороший выбор для задачи классификации, но это упростит наше объяснение). Таким образом, ваш алгоритм обучения пытается оптимизировать:
Первая сумма выше составляет итоговую ошибку для 5000 мобильных изображений, а вторая сумма составляет итоговую ошибку для 200,000 интернет-изображений. Вместо этого вы можете провести оптимизацию с помощью дополнительного параметра :
Если вы установите = 1/40, алгоритм даст равный вес 5000 мобильным изображениям и 200,000 интернет-изображениям. Вы также можете установить параметру другие значения, возможно, подстраивая его под валидационную выборку.
Назначая интернет-изображениям меньшие веса, вам не нужно создавать массивную нейронную сеть, чтобы убедиться, что алгоритм хорошо справляется с обоими типами задач. Этот способ «перевзвешивания» необходим только в том случае, если вы подозреваете, что дополнительные данные (интернет-изображения) имеют сильно отличающееся распределение от данных в валидационной и тестовой выборках, или если дополнительных данных намного больше, чем данных, полученных с тем же распределением, что и в валидационной и тестовой выборке (мобильные изображения).
Предположим, что вы применяете ML в условиях, когда обучающая выборка отличается от валидационной/тестовой. Скажем, обучающая выборка содержит интернет-изображения + мобильные изображения, а валидационная/тестовая выборки содержат только мобильные изображения. Тем не менее, алгоритм работает не очень хорошо: он имеет гораздо более высокую ошибку на валидационной/тестовой выборке, чем хотелось бы. Вот некоторые причины того, что может быть не так:
К примеру, предположим, что люди достигают почти совершенного результата в задаче идентификации кошек. А ваш алгоритм достиг:
В этом случае, у вас определённо имеется проблема несоответствия данных (data mismatch). Чтобы разрешить её вы можете попробовать сделать обучающую выборку более схожей c валидационной/тестовой. Некоторые техники этого приёма мы обсудим позже.
Чтобы диагностировать, в какой степени алгоритм страдает от каждой из проблем 1-3, описанных выше, будет полезно иметь другой набор данных. В частности, вместо того, чтобы дать алгоритму все имеющиеся данные для обучения, вы можете разделить их на две части: фактическую обучающую выборку, на которой алгоритм будет обучаться, и отдельный набор, который мы будем называть обучающе-валидационным (“trainig dev” set), который мы не будем использовать при обучении.
Таким образом, у вас появляется 4 набора данных:
Вооружившись этими четырьмя отдельными наборами данных вы можете оценивать:
Большинство рекомендаций, которые были даны в главах 5-7 этой книги для выбора размера валидационной выборки, так же применимы и для обучающе-валидационной выборки.
Предположим, что люди достигают почти идеальной эффективности (ошибка ?0%) в задачах обнаружения кошек, и, таким образом, оптимальный коэффициент ошибок составляет около 0%.
Предположим, у вас есть:
О чём это нам говорит? Вы знаете, что у вас высокая дисперсия (variance). Методы уменьшения дисперсии, описанные ранее, должны позволить вам добиться некоторого прогресса.
Теперь предположим ваш алгоритм достиг:
Это говорит о том, что у вас высокое предотвратимое смещение (avoidable bias) на обучающей выборке. Т.е. алгоритм выдаёт плохие результаты на обучающей выборке, но методы уменьшения смещения должны помочь.
В двух приведенных выше примерах алгоритм страдает только высоким смещением (avoidable bias) или только высокой дисперсией (variance). Так же алгоритм может страдать от любой комбинации высокого смещения, высокой дисперсии и несоответствия данных. Например:
Этот алгоритм страдает от высокого смещения (avoidable bias) и от несоответствия данных (data mismatch) и в то же время не испытывает проблем с высокой дисперсией на обучающей выборке.
Возможно, будет проще понять, как разные типы ошибок соотносятся друг с другом, вписав их в следующую таблицу:
Продолжая с примером детектора изображений кошек, вы можете видеть, что по оси X есть два разных распределения данных (распределение А и распределение Б). По оси Y у нас есть три типа ошибок: человеческая ошибка, ошибка на примерах, на которых обучался алгоритм, и ошибка на примерах, на которых алгоритм не обучался. Мы можем заполнить ячейки таблицы различными типами ошибок, которые мы определили в предыдущей главе.
При желании вы также можете заполнить оставшиеся две ячейки в этой таблице: вы можете заполнить поле в правом верхнем углу («Эффективность доступная человеку на изображениях из мобильного приложения»), попросив кого-то разметить изображения кошек из мобильного приложения и измерить после этого его ошибку. Вы можете заполнить следующее поле, взяв изображения кошек из мобильного приложения (распределение Б) и поместив их небольшую часть в обучающий набор, чтобы нейронная сеть тоже училась на нём. Затем вы измеряете ошибку обученной модели на этом подмножестве данных. Заполнение этих двух дополнительных полей может иногда дать дополнительное понимание того, как алгоритм работает на двух различных распределениях (распределение A и Б) данных.
Понимая, от каких типов ошибок алгоритм страдает в наибольшей степени, вы сможете лучше определить, следует ли сосредоточиться на уменьшении смещения, уменьшении дисперсии или уменьшении несоответствия данных.
Предположим, вы разработали систему распознавания речи, которая очень хорошо работает на обучающей выборке и на обучающе-валидационной выборке. Однако алгоритм плохо работает на вашей валидационной выборке: у вас есть проблема несоответствия данных. Что вы можете сделать?
Я рекомендую вам: (i) попытаться понять, какие свойства отличаются у данных из обучающей и валидационной выборок; (ii) постарайтесь найти больше обучающих данных, которые лучше соответствуют примерам из валидационной выборки, с которыми у вашего алгоритма есть проблемы.4
Например, предположим, что вы выполняете анализ ошибок валидационной выборки для системы распознавания речи: вы вручную проходите 100 примеров и стараетесь понять, где алгоритм допускает ошибки. Вы обнаружите, что ваша система работает плохо, потому что большинство аудиозаписей из валидационной выборки сделаны находясь внутри автомобиля, тогда как большинство примеров обучающей выборки были записаны на фоне тишины. Двигатель и дорожный шум резко ухудшают эффективность вашей системы распознавания речи. В этом случае вы можете попытаться получить больше обучающих примеров, содержащих аудиозаписи, сделанные в автомобиле. Целью анализа ошибок является понимание существенных различий между обучающей и валидационной выборкой, которые и приводят к несоответствию данных.
Если ваша обучающая и обучающе-валидационная выборка включают звук, записанный в автомобиле, вам также следует перепроверить эффективность вашей системы на этом наборе данных. Если она хорошо работает на «автомобильных» примерах из обучающей выборки, но не на «автомобильных» примерах из обучающе-валидационной выборки, то это еще раз подтверждает гипотезу о том, что получение большего количества «автомобильных» примеров поможет. Вот почему в предыдущей главе мы обсуждали возможность включения в вашу обучающую выборку набора некоторых данных, имеющих то же распределение, что и в валидационной/тестовой выборках. Это позволяет сравнить эффективность системы на «автомобильных» примерах в обучающей выборке против аналогичных примеров валидационной/тестовой выборки.
К сожалению, в этом деле нет никаких гарантий. Например, если у вас нет возможности получить больше обучающих данных, которые бы лучше соответствовали данным валидационной выборки, у вас может не быть четкого пути к повышению эффективности.
Ваша система распознавания речи нуждается в большем количестве данных, которые звучат так, как будто аудиозаписи этих примеров сделаны в автомобиле. Вместо того чтобы собирать много данных во время езды, может быть более простой способ получить эти данные: путем их искусственной генерации.
Предположим, вы получаете большое количество аудиозаписей с дорожным/автомобильным шумом. Вы можете скачать эти данные с нескольких сайтов. Предположим, у вас также есть большой обучающий набор, в примерах которого люди разговаривают, находясь в тихой комнате. Если вы берете аудиозапись говорящего человека и «добавляете» к ней звуки автомобильного/дорожного шума, вы получите аудиозапись, которая звучит так, как если бы этот человек говорил, находясь в шумной машине. Используя этот процесс, вы можете синтезировать огромное количество данных, которые звучат так, как будто они были собраны внутри автомобиля.
В целом, существует несколько обстоятельств, когда генерация искусственных данных позволяет создать огромный набор данных, который разумно соответствует валидационной выборке. Давайте возьмём детектор изображений кошек в качестве второго примера. Вы заметили, что изображения в валидационной выборке имеют гораздо больше размытия при движении, потому что они, как правило, получены от пользователей мобильных телефонов, которые слегка двигают телефоном во время съёмки. Вы можете взять резкие интернет-изображения из обучающей выборки и добавить к ним имитацию размытия в движении, тем самым делая их более похожими на изображения в валидационной выборке.
Имейте в виду, что у синтеза искусственных данных есть свои проблемы: иногда проще создать синтетические данные, которые кажутся человеку реалистичными, чем создавать данные, которые покажутся реалистичными для компьютера. Например, предположим, что у вас есть 1000 часов записей речи в обучающей выборке, но только 1 час автомобильного шума. Если вы неоднократно используете один и тот же час автомобильного шума с частями, отличными от исходных 1000 часов обучающей выборки, вы получите синтетический набор данных, в котором один и тот же автомобильный шум повторяется снова и снова. Хотя человек, слушающий этот звук, вероятно, не сможет назвать его особенности — все автомобильные шумы звучат одинаково для большинства из нас, но возможно, что алгоритм обучения переобучится на 1 часу автомобильного шума. Таким образом, он может плохо обобщаться на новые аудиозаписи, в которых автомобильный шум звучит иначе.
В качестве альтернативы, предположим, что у вас есть 1000 уникальных часов автомобильного шума, но для их записи были использованы только 10 разных автомобилей. В таком случае алгоритм может переобучиться на записях этих 10 автомобилей и покажет плохую эффективность при тестировании записи из другого автомобиля. К сожалению, эти проблемы трудно обнаружить.
Возьмем еще один пример, предположим, вы создаете систему компьютерного зрения для распознавания автомобилей. Допустим, вы сотрудничаете с компанией, занимающейся видеоиграми, которая имеет модели нескольких автомобилей, созданные с помощью компьютерной графики. Чтобы обучить свой алгоритм, вы используете эти модели для генерации синтетических изображений автомобилей. Даже если синтезированные изображения выглядят очень реалистично, этот подход (который независимо друг от друга предлагался многими людьми), вероятно, не будет работать хорошо. Видеоигра может иметь примерно 20 моделей автомобилей. Создать качественную 3D-модель автомобиля очень дорого, если бы вы играли в игру, вы, вероятно, не заметили бы, что вы видите одни и те же автомобили снова и снова, возможно, только окрашенные по-разному. Т.е. эти данные выглядят очень реалистично для вас. Но по сравнению с разнообразием всех автомобилей на дорогах, и следовательно с тем набором, который вы вероятно увидите в валидационной/тестовой выборке — этот набор из 20 синтезированных моделей захватывает только крошечную долю всего мирового разнообразия автомобилей. Таким образом, если ваши 100,000 обучающих примеров целиком получены на основе этих 20 автомобилей, то ваша система будет переобучена этими конкретными моделями, и она не сможет хорошо обобщаться на валидационную/тестовую выборки, которые включают в себя другие модели автомобилей.
При синтезе данных, подумайте, действительно ли вы генерируете репрезентативный набор примеров. Старайтесь не давать синтезированным данным свойств, которые
позволят алгоритму обучения отличать синтезированный пример от не синтезированного, как в случаях, когда все синтезированные данные получены на основе одной из 20 моделей автомобилей, или все синтезированные звуки получены только из 1 часа автомобильного шума. Следовать этому совету может быть очень трудно.
Во время работы над синтезом данных нашей команде иногда требовались недели, прежде чем мы создавали данные с деталями, которые были достаточно близки к фактическому распределению синтезированных данных имеющих значительный эффект. Но если вы сможете получить правильные детали, это внезапно откроет вам доступ к гораздо большей обучающей выборке, чем раньше.
Представим, вы разрабатываете систему распознавания речи. Ваша система работает, принимая на вход аудиозапись A, и рассчитывает некоторую оценку ScoreA(S) для каждого возможного выходного предложения S. Например, вы можете попытаться оценить ScoreA(S) = P(S|A), т.е. вероятность того, что правильной выходной транскрипцией является предложение S, учитывая, что на вход была подана аудиозапись A.
Учитывая способ расчёта ScoreA(S), вам необходимо найти такое предложение на английском языке, которое будет иметь максимальную оценку:
Как рассчитать «arg max» из примера выше? В английском языке существует 50,000 слов, в таком случае есть (50,000)N возможных предложений длины N. Это слишком много, чтобы их перечислить.
Итак, вам нужно применить алгоритм приближённого поиска, чтобы попытаться найти значение S, которое оптимизирует (максимизирует) оценку ScoreA(S). Одним из примеров такого алгоритма является «лучевой поиск» (beam search), который сохраняет только K лучших кандидатов в процессе поиска. (Для целей этой главы вам не нужно разбираться в деталях работы лучевого поиска.) Подобные алгоритмы не гарантируют нахождение значения S, которое максимизирует показатель ScoreA(S).
Представим, что на некоторой аудиозаписи кто-то произнёс «Я люблю машинное обучение». Но вместо правильной транскрипции ваша система выдаёт на выходе неверное «Я люблю роботов». Существуют две возможные причины, что могло пойти не так:
В зависимости от того что из этого послужило причиной ошибки системы, вы должны по-разному расставить приоритеты для дальнейших усилий. В первом случае вы должны работать над улучшением поискового алгоритма, во втором случае вам следует работать над алгоритмом обучения, который рассчитывает оценку ScoreA(S).
Встретившись с подобной ситуацией, некоторые исследователи случайным образом решают работать над поисковым алгоритмом, другие случайно выбирают работу над улучшениями обучения функции оценки ScoreA(S). Но пока вы не узнаете истинных причин ошибки системы, все ваши усилия могут быть потрачены зря. Как же принять более системное решение о том над чем стоит работать?
Пусть Sout будет выходной транскрипцией («Я люблю роботов»). Пусть S* будет правильной транскрипцией («Я люблю машинное обучение»). Чтобы понять какая из двух проблем перечисленных выше стоит перед нами, вы можете провести оптимизационный контрольный тест (Optimization Verification test): сначала рассчитайте оценки для ScoreA(S*) и для ScoreA(Sout). Затем проверьте, какая из двух оценок будет иметь большее значение. Существуют две вероятности:
Наше обсуждение затронуло единственный пример. Чтобы применить оптимизационный контрольный тест на практике вы должны проверить ошибки вашей валидационной выборки. Для каждой ошибки вы должны проверить, что оценка для ожидаемой (верной) транскрипции выше оценки выходной (неверной) транскрипции, т.е. ScoreA(S*) > ScoreA(Sout). Каждый пример из валидационной выборки, для которого такое неравенство сохранится будет помечен как ошибка, вызванная оптимизационным алгоритмом. Каждый пример, для которого это неравенство не сохранится, будет считаться ошибкой из-за неверного способа расчёта ScoreA(.).
Например, вы обнаружили, что 95% ошибок вызваны работой оценочной функции при расчёте ScoreA(.), и только 5% ошибок вызваны оптимизационным алгоритмом. Теперь вы знаете, что неважно как сильно вы улучшите свою функцию оптимизации, в реальности это поможет устранить не более 5% ошибок. Поэтому вы должны сфокусироваться на улучшении способа расчёта ScoreA(.).
Вы можете применить оптимизационный контрольный тест, когда получая на вход некоторый 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.
Ваш алгоритм машинного перевода текста пытается рассчитать:
Однако набор всех возможных предложений E на английском языке настолько велик, что вам приходится полагаться на эвристический поисковой алгоритм.
Предположим ваш алгоритм выдаёт неверный перевод Eout чаще, чем некоторый правильный перевод E*. Тогда оптимизационный контрольный тест позволит рассчитать неравенство ScoreC(E*) > ScoreC(Eout). Если оно сохраняется, то оценка ScoreC(.) верно распознаёт E* как лучшее выходное Eout, поэтому вы отнесёте эту ошибку на долю алгоритма приближённого поиска, в противном случае на функцию расчёта ScoreC(.).
Это очень общий паттерн в ИИ: сначала обучаем аппроксимирующую функцию оценки Scorex(.), потом используем приближённый алгоритм максимизации. Если вы запомните этот паттерн, то вы сможете использовать оптимизационный контрольный тест, чтобы найти источник ошибок.
Предположим, вы используете машинное обучение, чтобы научить вертолёт совершать сложные манёвры. Вверху покадровое изображение вертолёта, управляемого компьютером, который совершает посадку с отключенным двигателем.
Этот манёвр называется посадкой на авторотации. Он позволяет вертолёту приземлиться, даже если двигатель внезапно вышел из строя. Пилоты-люди отрабатывают этот манёвр как часть своей подготовки. Ваша цель – использовать алгоритм машинного обучения, чтобы вертолёт мог пролететь по некоторой траектории T и в конце безопасно приземлиться.
Чтобы применить обучение с подкреплением, вы должны разработать «функцию вознаграждения» R(.), которая выдаёт оценку, показывающую насколько хороша была каждая возможная траектория T. Например, если траектория T привела к падению вертолёта, то пусть награда R(T) = -1000, т.е. имеет большое отрицательное значение. Траектория T, завершившаяся удачной посадкой, будет иметь положительную оценку R(T), в точности отражающую зависимость того насколько гладкой была посадка. Функция вознаграждения R (.) обычно выбирается вручную, чтобы определить количественно, насколько желательны различные траектории T. Она должна компенсировать различные факторы: насколько сильно трясло при посадке, приземлился ли вертолет точно в нужном месте, насколько спуск был тяжёлым для пассажиров и так далее. Хорошие функции вознаграждения разработать нелегко.
С учётом функции вознаграждения 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), который является лучшим выходом по эффективности для вашего текущего алгоритма обучения (даже если он не «оптимальный»), то оптимизационный контрольный тест может показать, будет ли более перспективным улучшить алгоритм оптимизации или функцию оценки.
[Продолжение]
Представляю вашему вниманию свой вариант перевода второй половины книги, а именно глав 36-58. Планируется разбить его на две статьи для удобства публикации. Кроме того вы можете скачать полностью готовый перевод этих глав, свёрстанный в pdf, возможно кому-то такой формат покажется для чтения более удобным.
В первой статье речь пойдёт об обучении и тестировании на разных распределениях, а так же об отладке алгоритмов вывода.
Обучение и тестирование на разных распределениях
Глава 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 и тестируете на наборе данных Б, который очень сильно отличается, удача может оказать огромное влияние на эффективность вашего алгоритма. (Здесь «удача» включает ручной отбор признаков исследователем для конкретной задачи, а также другие факторы, которые мы пока не понимаем.) Это делает трудновыполнимым систематическое академическое исследование обучения и тестирования на различных распределениях.
Но в эпоху больших данных у нас теперь есть доступ к огромным обучающим наборам, таким как изображения с кошками из интернета. Даже если обучающая выборка имеет распределение, отличающееся от распределений валидационной и тестовой выборок, мы все еще хотим использовать её для обучения, так как это может дать много дополнительной информации.
В примере с детектором кошек вместо того, чтобы помещать все 10,000 загруженных пользователями изображений в валидационную и тестовую выборку, мы могли бы поместить в них только 5,000 изображений. А оставшиеся 5,000 примеров мы можем поместить в обучающую выборку. Таким образом, обучающая выборка будет состоять из 205,000 примеров, и будет включать в себя данные, имеющие то же распределение, что и в валидационной и тестовой выборке, плюс 200,000 интернет-изображений. В следующей главе мы обсудим, почему этот метод полезен.
Давайте рассмотрим второй пример. Предположим, вы строите систему распознавания речи для транскрибирования адресов для голосового приложения «Навигатор». У вас есть 20,000 примеров, в каждом из которых пользователь называет некоторый адрес. Но у вас также есть 500,000 других аудиозаписей, в которых пользователи говорят на свободные темы. Вы можете взять 10,000 примеров с адресами для валидационной и тестовой выборок, а оставшиеся 10,000 примеров плюс дополнительные 500,000 примеров включить в обучающую выборку.
Мы продолжим предполагать, что наши данные валидационной и тестовой выборок имеют одинаковое распределение. Но важно понимать и помнить, что разные распределения в обучающей и валидационной/тестовой выборках приведут к особым проблемам.
Глава 37. Как решить, использовать ли все ваши данные либо только часть
Предположим, что обучающая выборка вашего детектора кошек включает 10,000 загруженных пользователем изображений. Пусть эти данные имеют то же распределение, что и в валидационной и тестовой выборке, и именно для такого распределения вы хотите достичь максимального результата. У вас также есть дополнительные 20,000 изображений, скаченных из интернета. Надо ли включать все 20,000 + 10,000 = 30,000 изображений в обучающую выборку, или же лучше отбросить 20,000 интернет-изображений, опасаясь внесения погрешностей в ваш алгоритм обучения?
При использовании более ранних поколений алгоритмов обучения (например, таких как алгоритм компьютерного зрения, спроектированный вручную, за которым стоит простой линейный классификатор) был реальный риск того, что объединение данных из обоих источников может ухудшить итоговые результаты. Таким образом, некоторые инженеры будут предостерегать вас от включения 20,000 интернет-изображений.
Но в современную эпоху мощных, гибких алгоритмов обучения, таких как большие нейронные сети, этот риск значительно уменьшился. Если вы можете позволить себе построить нейронную сеть с достаточно большим количеством скрытых слоев, вы можете смело добавлять 20,000 интернет-изображений в свою обучающую выборку. Добавление изображений, скорее всего, повысит ваш итоговый результат.
Это наблюдение опирается на тот факт, что существует некоторое соответствие x > y, которое хорошо работает для обоих типов данных. Другими словами, существует какая-то система, которая получив либо интернет-изображение, либо изображение из мобильного приложения надежно предсказывает метку, даже не зная источник изображения.
Добавление 20,000 дополнительных интернет-изображений будет иметь следующие эффекты:
- Это даст вашей нейронной сети больше примеров того, как выглядят / не выглядят кошки. Это полезно, поскольку интернет-изображения и изображения загруженные пользователями мобильного приложения имеют некоторое сходство. Ваша нейронная сеть может применить некоторые знания, полученные из интернет-изображений для изображений из мобильного приложения.
- Это заставляет нейронную сеть тратить часть своих ресурсов, на распознавание свойств, которые специфичны для интернет-изображений (например, более высокое разрешение, различные способы оформления и т. д.) Если эти свойства значительно отличаются от изображений из мобильного приложения, это «израсходует» часть представительских возможностей нейронной сети. Таким образом, останется меньше возможностей для распознавания данных, полученных из мобильного приложения, и это то, что должно вас действительно волновать. Теоретически, это может ухудшить эффективность вашего алгоритма.
Чтобы объяснить второй эффект другими словами, мы можем обратиться к вымышленному персонажу, Шерлоку Холмсу, который говорит, что ваш мозг похож на чердак, который имеет ограниченное количество места. Он говорит, что «при каждом добавлении знаний вы забываете то, что знали прежде. Поэтому крайне важно не допустить, чтобы бесполезные факты вытесняли полезные».2
2 «Этюд в багровых тонах», Артутр Конан Дойл, 1887
К счастью, если у вас есть вычислительные мощности, необходимые для построения достаточно большой нейронной сети, т. е. «достаточно большой чердак», то это «вытеснение», описанное выше, не является серьезной проблемой. У вас достаточно возможностей для обучения как на интернет-изображениях, так и на изображениях из мобильного приложения, при этом оба типа данных не конкурируют за способность распознавания. «Мозг» вашего алгоритма достаточно велик, чтобы вам не приходилось беспокоиться о том, что вам вдруг не хватит «места на чердаке».
Но если у вас нет достаточно большой нейронной сети (или другого очень гибкого алгоритма обучения), то вам следует уделять больше внимания вашим тренировочным данным, соответствующим вашей валидационной и тестовой выборке.
Если вы считаете, что у вас есть данные, которые не приносят никакой пользы, вы должны просто исключить их для ускорения вычислений. Например, предположим, что ваши валидационная и тестовая выборка в основном содержат случайные фотографии людей, мест, знаков и указателей, а также животных. Предположим, у вас также есть большая коллекция отсканированных исторических документов:
Эти документы не содержат ничего похожего на кошку. Они также выглядят совершенно не похожими на данные из вашей валидационной и тестовой выборки. Нет смысла включать эти данные в качестве отрицательных примеров, потому что в этом случае выгода, описанная в первом эффекте, будет ничтожна. Ваша нейронная сеть по этим данным не сможет узнать почти ничего, что она могла бы применить к вашей валидационной и тестовой выборке. Включение этих примеров приведет к потере вычислительных ресурсов и снижению представительной способности нейронной сети.
Глава 38. Как решить, стоит ли включать противоречивые данные
Предположим, вы хотите научиться прогнозировать цены на жилье в Нью-Йорке. Учитывая размер дома (входное значение x), вы хотите предсказать цену (целевая метка y).
Цены на жилье в Нью-Йорке очень высоки. Предположим, у вас есть второй набор данных — цены на жилье в Детройте, штат Мичиган, где цены на жилье намного ниже. Надо ли включать эти данные в свой тренировочный набор?
Учитывая тот же размер х, цена дома у очень отличается в зависимости от того, находится ли он в Нью-Йорке или в Детройте. Если вы заботитесь только о прогнозировании цен на жилье в Нью-Йорке, то объединение двух наборов данных повредит вашей производительности. В этом случае было бы лучше не использовать противоречивые данные из набора Детройта.3
3 Существует один способ решения проблемы несовместимости данных Детройта с данными Нью-Йорка, а именно добавление дополнительного признака в каждый пример обучения, т.е. указание города. Учитывая входное значение x, которое теперь указывает город, целевое значение y теперь определено однозначно. Однако на практике я так и не вижу, чтобы это делалось часто.
Как этот пример с жильём Нью-Йорка и Детройта отличается от нашего примера с интернет-изображениями кошек и изображениями из мобильного приложения?
Пример с изображениями кошек отличается тем, что, учитывая входное изображение x, можно надежно предсказать метку y, указывающую, есть ли на нём кошка, даже не зная, получили ли мы изображение из интернета или из мобильного приложения. Т.е. существует функция f(x), которая надежно отражает соответствие входа x к целевому выходу у, даже не зная источника происхождения х. Таким образом, задача распознавания интернет-изображений «соответствует» задаче распознавания изображений из мобильного приложения. Это означает, что был небольшой минус (кроме вычислительных затрат) от включения всех данных и некоторый возможный значительный плюс. В отличие от примера с противоречивыми данными Нью-Йорка и Детройта, в котором при одном и том же входном значении х (размер дома), цена очень отличается в зависимости от того, в каком городе находится этот дом.
Глава 39. «Взвешивание» данных
Предположим, у вас есть 200,000 интернет-изображений и 5,000 изображений от пользователей вашего мобильного приложения. Между размерами этих наборов данных существует соотношение 40:1. Теоретически, до тех пор, пока вы строите огромную нейронную сеть и обучаете ее достаточно долго на всех имеющихся 205,000 примерах, нет ничего плохого в том, чтобы заставить алгоритм работать хорошо как на интернет-изображениях, так и на мобильных изображениях.
Но на практике, имея в 40 раз больше интернет-изображений, чем изображений из мобильного приложения, может потребоваться потратить в 40 раз больше вычислительных ресурсов, чем в случае, когда бы вы обучали сеть только на 5,000 изображений.
Если у вас нет огромных вычислительных ресурсов, вы можете придать интернет-изображениям гораздо меньший вес в качестве компромисса.
Например, предположим, что ваша цель оптимизации — квадрат ошибки (это не очень хороший выбор для задачи классификации, но это упростит наше объяснение). Таким образом, ваш алгоритм обучения пытается оптимизировать:
Первая сумма выше составляет итоговую ошибку для 5000 мобильных изображений, а вторая сумма составляет итоговую ошибку для 200,000 интернет-изображений. Вместо этого вы можете провести оптимизацию с помощью дополнительного параметра :
Если вы установите = 1/40, алгоритм даст равный вес 5000 мобильным изображениям и 200,000 интернет-изображениям. Вы также можете установить параметру другие значения, возможно, подстраивая его под валидационную выборку.
Назначая интернет-изображениям меньшие веса, вам не нужно создавать массивную нейронную сеть, чтобы убедиться, что алгоритм хорошо справляется с обоими типами задач. Этот способ «перевзвешивания» необходим только в том случае, если вы подозреваете, что дополнительные данные (интернет-изображения) имеют сильно отличающееся распределение от данных в валидационной и тестовой выборках, или если дополнительных данных намного больше, чем данных, полученных с тем же распределением, что и в валидационной и тестовой выборке (мобильные изображения).
Глава 40. Обобщение обучающей выборки на валидационную выборку
Предположим, что вы применяете ML в условиях, когда обучающая выборка отличается от валидационной/тестовой. Скажем, обучающая выборка содержит интернет-изображения + мобильные изображения, а валидационная/тестовая выборки содержат только мобильные изображения. Тем не менее, алгоритм работает не очень хорошо: он имеет гораздо более высокую ошибку на валидационной/тестовой выборке, чем хотелось бы. Вот некоторые причины того, что может быть не так:
- Алгоритм не очень хорошо работает на обучающей выборке. Это проблема высокого (предотвратимого) смещения (avoidable bias) распределения обучающей выборки.
- Алгоритм хорошо работает на обучающей выборке, но плохо обобщается на новые (прежде не показанные) данные, взятые с тем же распределением, что и в обучающей выборке. Это высокая дисперсия (variance).
- Алгоритм хорошо обобщается на новые (прежде не показанные) данные, взятые с тем же распределением, что и в обучающей выборке, но не на данные из валидационной/тестовой выборки. Мы называем эту проблему несоответствием данных (data mismatch) по причине того, что данные обучающей выборки плохо соотносятся с данными валидационной/тестовой выборок.
К примеру, предположим, что люди достигают почти совершенного результата в задаче идентификации кошек. А ваш алгоритм достиг:
- 1% ошибок на обучающей выборке
- 1,5% ошибок на новых (прежде не показанных алгоритму) данных, имеющих то же распределение, что и обучающая выборка
- 10% ошибок на валидационной выборке
В этом случае, у вас определённо имеется проблема несоответствия данных (data mismatch). Чтобы разрешить её вы можете попробовать сделать обучающую выборку более схожей c валидационной/тестовой. Некоторые техники этого приёма мы обсудим позже.
Чтобы диагностировать, в какой степени алгоритм страдает от каждой из проблем 1-3, описанных выше, будет полезно иметь другой набор данных. В частности, вместо того, чтобы дать алгоритму все имеющиеся данные для обучения, вы можете разделить их на две части: фактическую обучающую выборку, на которой алгоритм будет обучаться, и отдельный набор, который мы будем называть обучающе-валидационным (“trainig dev” set), который мы не будем использовать при обучении.
Таким образом, у вас появляется 4 набора данных:
- Обучающая выборка (training set). Это данные, на которых алгоритм будет обучаться (к примеру, интернет-изображения + изображения из мобильного приложения). Эти данные не обязательно должны браться с тем же распределением, на результат по которому мы в итоге ориентируемся (валидационная/тестовая выборки).
- Обучающе-валидационная выборка (“training dev” set). Эти данные берутся с тем же распределением, что и в обучающей выборке (к примеру интернет-изображения + изображения мобильного приложения). Этот набор обычно меньше чем обучающая выборка, при этом он должен быть достаточно большим, чтобы оценивать и отслеживать прогресс нашего алгоритма обучения.
- Валидационная выборка (dev set). Эти данные берутся с тем же распределением, что и в тестовой выборке и должны полностью отражать распределение данных, на которых мы и стремимся достигнуть максимального улучшения (к примеру, изображения из мобильного приложения).
- Тестовая выборка (test set). Эти данные берутся с тем же распределением, что и в валидационной выборке (к примеру, изображения из мобильного приложения).
Вооружившись этими четырьмя отдельными наборами данных вы можете оценивать:
- Ошибку обучения (training error), путём оценки на обучающей выборке.
- Способность алгоритма обобщаться на новые данные, с тем же распределением, что и в обучающей выборке, путём оценки на обучающе-валидационной выборке.
- Эффективность алгоритма в целом для решаемой задачи, путём оценки на валидационной и(или) тестовой выборке.
Большинство рекомендаций, которые были даны в главах 5-7 этой книги для выбора размера валидационной выборки, так же применимы и для обучающе-валидационной выборки.
Глава 41. Определение смещения, дисперсии и ошибки несоответствия данных
Предположим, что люди достигают почти идеальной эффективности (ошибка ?0%) в задачах обнаружения кошек, и, таким образом, оптимальный коэффициент ошибок составляет около 0%.
Предположим, у вас есть:
- 1% ошибок на обучающей выборке
- 5% ошибок на обучающе-валидационной выборке
- 5% ошибок на валидационной выборке
О чём это нам говорит? Вы знаете, что у вас высокая дисперсия (variance). Методы уменьшения дисперсии, описанные ранее, должны позволить вам добиться некоторого прогресса.
Теперь предположим ваш алгоритм достиг:
- 10% ошибок на обучающей выборке
- 11% ошибок на обучающе-валидационной выборке
- 12% ошибок на валидационной выборке
Это говорит о том, что у вас высокое предотвратимое смещение (avoidable bias) на обучающей выборке. Т.е. алгоритм выдаёт плохие результаты на обучающей выборке, но методы уменьшения смещения должны помочь.
В двух приведенных выше примерах алгоритм страдает только высоким смещением (avoidable bias) или только высокой дисперсией (variance). Так же алгоритм может страдать от любой комбинации высокого смещения, высокой дисперсии и несоответствия данных. Например:
- 10% ошибок на обучающей выборке
- 11% ошибок на обучающе-валидационной выборке
- 20% ошибок на валидационной выборке
Этот алгоритм страдает от высокого смещения (avoidable bias) и от несоответствия данных (data mismatch) и в то же время не испытывает проблем с высокой дисперсией на обучающей выборке.
Возможно, будет проще понять, как разные типы ошибок соотносятся друг с другом, вписав их в следующую таблицу:
Продолжая с примером детектора изображений кошек, вы можете видеть, что по оси X есть два разных распределения данных (распределение А и распределение Б). По оси Y у нас есть три типа ошибок: человеческая ошибка, ошибка на примерах, на которых обучался алгоритм, и ошибка на примерах, на которых алгоритм не обучался. Мы можем заполнить ячейки таблицы различными типами ошибок, которые мы определили в предыдущей главе.
При желании вы также можете заполнить оставшиеся две ячейки в этой таблице: вы можете заполнить поле в правом верхнем углу («Эффективность доступная человеку на изображениях из мобильного приложения»), попросив кого-то разметить изображения кошек из мобильного приложения и измерить после этого его ошибку. Вы можете заполнить следующее поле, взяв изображения кошек из мобильного приложения (распределение Б) и поместив их небольшую часть в обучающий набор, чтобы нейронная сеть тоже училась на нём. Затем вы измеряете ошибку обученной модели на этом подмножестве данных. Заполнение этих двух дополнительных полей может иногда дать дополнительное понимание того, как алгоритм работает на двух различных распределениях (распределение A и Б) данных.
Понимая, от каких типов ошибок алгоритм страдает в наибольшей степени, вы сможете лучше определить, следует ли сосредоточиться на уменьшении смещения, уменьшении дисперсии или уменьшении несоответствия данных.
Глава 42. Решение ошибки несоответствия данных
Предположим, вы разработали систему распознавания речи, которая очень хорошо работает на обучающей выборке и на обучающе-валидационной выборке. Однако алгоритм плохо работает на вашей валидационной выборке: у вас есть проблема несоответствия данных. Что вы можете сделать?
Я рекомендую вам: (i) попытаться понять, какие свойства отличаются у данных из обучающей и валидационной выборок; (ii) постарайтесь найти больше обучающих данных, которые лучше соответствуют примерам из валидационной выборки, с которыми у вашего алгоритма есть проблемы.4
4 Существует несколько исследований «доменной адаптации» (domain adaptation) — как обучить алгоритм на одном распределении и обобщить его на другое распределение. Эти методы обычно применимы только в проблемах особого рода и гораздо менее широко используются, чем идеи, описанные в этой главе.
Например, предположим, что вы выполняете анализ ошибок валидационной выборки для системы распознавания речи: вы вручную проходите 100 примеров и стараетесь понять, где алгоритм допускает ошибки. Вы обнаружите, что ваша система работает плохо, потому что большинство аудиозаписей из валидационной выборки сделаны находясь внутри автомобиля, тогда как большинство примеров обучающей выборки были записаны на фоне тишины. Двигатель и дорожный шум резко ухудшают эффективность вашей системы распознавания речи. В этом случае вы можете попытаться получить больше обучающих примеров, содержащих аудиозаписи, сделанные в автомобиле. Целью анализа ошибок является понимание существенных различий между обучающей и валидационной выборкой, которые и приводят к несоответствию данных.
Если ваша обучающая и обучающе-валидационная выборка включают звук, записанный в автомобиле, вам также следует перепроверить эффективность вашей системы на этом наборе данных. Если она хорошо работает на «автомобильных» примерах из обучающей выборки, но не на «автомобильных» примерах из обучающе-валидационной выборки, то это еще раз подтверждает гипотезу о том, что получение большего количества «автомобильных» примеров поможет. Вот почему в предыдущей главе мы обсуждали возможность включения в вашу обучающую выборку набора некоторых данных, имеющих то же распределение, что и в валидационной/тестовой выборках. Это позволяет сравнить эффективность системы на «автомобильных» примерах в обучающей выборке против аналогичных примеров валидационной/тестовой выборки.
К сожалению, в этом деле нет никаких гарантий. Например, если у вас нет возможности получить больше обучающих данных, которые бы лучше соответствовали данным валидационной выборки, у вас может не быть четкого пути к повышению эффективности.
Глава 43. Синтезирование искусственных данных
Ваша система распознавания речи нуждается в большем количестве данных, которые звучат так, как будто аудиозаписи этих примеров сделаны в автомобиле. Вместо того чтобы собирать много данных во время езды, может быть более простой способ получить эти данные: путем их искусственной генерации.
Предположим, вы получаете большое количество аудиозаписей с дорожным/автомобильным шумом. Вы можете скачать эти данные с нескольких сайтов. Предположим, у вас также есть большой обучающий набор, в примерах которого люди разговаривают, находясь в тихой комнате. Если вы берете аудиозапись говорящего человека и «добавляете» к ней звуки автомобильного/дорожного шума, вы получите аудиозапись, которая звучит так, как если бы этот человек говорил, находясь в шумной машине. Используя этот процесс, вы можете синтезировать огромное количество данных, которые звучат так, как будто они были собраны внутри автомобиля.
В целом, существует несколько обстоятельств, когда генерация искусственных данных позволяет создать огромный набор данных, который разумно соответствует валидационной выборке. Давайте возьмём детектор изображений кошек в качестве второго примера. Вы заметили, что изображения в валидационной выборке имеют гораздо больше размытия при движении, потому что они, как правило, получены от пользователей мобильных телефонов, которые слегка двигают телефоном во время съёмки. Вы можете взять резкие интернет-изображения из обучающей выборки и добавить к ним имитацию размытия в движении, тем самым делая их более похожими на изображения в валидационной выборке.
Имейте в виду, что у синтеза искусственных данных есть свои проблемы: иногда проще создать синтетические данные, которые кажутся человеку реалистичными, чем создавать данные, которые покажутся реалистичными для компьютера. Например, предположим, что у вас есть 1000 часов записей речи в обучающей выборке, но только 1 час автомобильного шума. Если вы неоднократно используете один и тот же час автомобильного шума с частями, отличными от исходных 1000 часов обучающей выборки, вы получите синтетический набор данных, в котором один и тот же автомобильный шум повторяется снова и снова. Хотя человек, слушающий этот звук, вероятно, не сможет назвать его особенности — все автомобильные шумы звучат одинаково для большинства из нас, но возможно, что алгоритм обучения переобучится на 1 часу автомобильного шума. Таким образом, он может плохо обобщаться на новые аудиозаписи, в которых автомобильный шум звучит иначе.
В качестве альтернативы, предположим, что у вас есть 1000 уникальных часов автомобильного шума, но для их записи были использованы только 10 разных автомобилей. В таком случае алгоритм может переобучиться на записях этих 10 автомобилей и покажет плохую эффективность при тестировании записи из другого автомобиля. К сожалению, эти проблемы трудно обнаружить.
Возьмем еще один пример, предположим, вы создаете систему компьютерного зрения для распознавания автомобилей. Допустим, вы сотрудничаете с компанией, занимающейся видеоиграми, которая имеет модели нескольких автомобилей, созданные с помощью компьютерной графики. Чтобы обучить свой алгоритм, вы используете эти модели для генерации синтетических изображений автомобилей. Даже если синтезированные изображения выглядят очень реалистично, этот подход (который независимо друг от друга предлагался многими людьми), вероятно, не будет работать хорошо. Видеоигра может иметь примерно 20 моделей автомобилей. Создать качественную 3D-модель автомобиля очень дорого, если бы вы играли в игру, вы, вероятно, не заметили бы, что вы видите одни и те же автомобили снова и снова, возможно, только окрашенные по-разному. Т.е. эти данные выглядят очень реалистично для вас. Но по сравнению с разнообразием всех автомобилей на дорогах, и следовательно с тем набором, который вы вероятно увидите в валидационной/тестовой выборке — этот набор из 20 синтезированных моделей захватывает только крошечную долю всего мирового разнообразия автомобилей. Таким образом, если ваши 100,000 обучающих примеров целиком получены на основе этих 20 автомобилей, то ваша система будет переобучена этими конкретными моделями, и она не сможет хорошо обобщаться на валидационную/тестовую выборки, которые включают в себя другие модели автомобилей.
При синтезе данных, подумайте, действительно ли вы генерируете репрезентативный набор примеров. Старайтесь не давать синтезированным данным свойств, которые
позволят алгоритму обучения отличать синтезированный пример от не синтезированного, как в случаях, когда все синтезированные данные получены на основе одной из 20 моделей автомобилей, или все синтезированные звуки получены только из 1 часа автомобильного шума. Следовать этому совету может быть очень трудно.
Во время работы над синтезом данных нашей команде иногда требовались недели, прежде чем мы создавали данные с деталями, которые были достаточно близки к фактическому распределению синтезированных данных имеющих значительный эффект. Но если вы сможете получить правильные детали, это внезапно откроет вам доступ к гораздо большей обучающей выборке, чем раньше.
Отладка алгоритмов вывода
Глава 44. Оптимизационный контрольный тест
Представим, вы разрабатываете систему распознавания речи. Ваша система работает, принимая на вход аудиозапись A, и рассчитывает некоторую оценку ScoreA(S) для каждого возможного выходного предложения S. Например, вы можете попытаться оценить ScoreA(S) = P(S|A), т.е. вероятность того, что правильной выходной транскрипцией является предложение S, учитывая, что на вход была подана аудиозапись A.
Учитывая способ расчёта ScoreA(S), вам необходимо найти такое предложение на английском языке, которое будет иметь максимальную оценку:
Как рассчитать «arg max» из примера выше? В английском языке существует 50,000 слов, в таком случае есть (50,000)N возможных предложений длины N. Это слишком много, чтобы их перечислить.
Итак, вам нужно применить алгоритм приближённого поиска, чтобы попытаться найти значение S, которое оптимизирует (максимизирует) оценку ScoreA(S). Одним из примеров такого алгоритма является «лучевой поиск» (beam search), который сохраняет только K лучших кандидатов в процессе поиска. (Для целей этой главы вам не нужно разбираться в деталях работы лучевого поиска.) Подобные алгоритмы не гарантируют нахождение значения S, которое максимизирует показатель ScoreA(S).
Представим, что на некоторой аудиозаписи кто-то произнёс «Я люблю машинное обучение». Но вместо правильной транскрипции ваша система выдаёт на выходе неверное «Я люблю роботов». Существуют две возможные причины, что могло пойти не так:
- Проблемы в алгоритме поиска. Алгоритм приближённого поиска (beam search) неверно нашёл значение S, которое максимизирует ScoreA(S).
- Объективная проблема с оценочной функцией. Наша оценка ScoreA(S) = P(S|A) была не точной. В частности выбранная оценка ScoreA(S) не позволила верно распознать правильную транскрипцию «Я люблю машинное обучение».
В зависимости от того что из этого послужило причиной ошибки системы, вы должны по-разному расставить приоритеты для дальнейших усилий. В первом случае вы должны работать над улучшением поискового алгоритма, во втором случае вам следует работать над алгоритмом обучения, который рассчитывает оценку ScoreA(S).
Встретившись с подобной ситуацией, некоторые исследователи случайным образом решают работать над поисковым алгоритмом, другие случайно выбирают работу над улучшениями обучения функции оценки ScoreA(S). Но пока вы не узнаете истинных причин ошибки системы, все ваши усилия могут быть потрачены зря. Как же принять более системное решение о том над чем стоит работать?
Пусть Sout будет выходной транскрипцией («Я люблю роботов»). Пусть S* будет правильной транскрипцией («Я люблю машинное обучение»). Чтобы понять какая из двух проблем перечисленных выше стоит перед нами, вы можете провести оптимизационный контрольный тест (Optimization Verification test): сначала рассчитайте оценки для ScoreA(S*) и для ScoreA(Sout). Затем проверьте, какая из двух оценок будет иметь большее значение. Существуют две вероятности:
- ScoreA(S*) > ScoreA(Sout), т.е. оценка для правильной транскрипции выше оценки для выданной (неправильной).
В этом случае ваш алгоритм обучения верно назначает более высокую оценку для верной транскрипции S*. Тем не менее алгоритм приближённого поиска выбирает неверную транскрипцию Sout. Это говорит о том, что алгоритм приближённого поиска ошибся в выборе значения S, которое максимизирует оценку ScoreA(S). В этом случае оптимизационный контрольный тест указывает на ошибку в поисковом алгоритме, и вам нужно сфокусироваться именно на нём. Например, вы можете попробовать увеличить ширину луча при использовании лучевого поиска (beam search). - ScoreA(S*) ? ScoreA(Sout), т.е. оценка для правильной транскрипции не превышает оценку для выданной (неправильной).
В этом случае вы понимаете, что виноват способ расчёта ScoreA(.): он ошибочно выдал большее значение для некорректного выхода Sout. Оптимизационный контрольный тест указывает на ошибку в оценочной функции. Поэтому вам необходимо сфокусироваться на улучшениях того как вы обучаете или аппроксимируете оценку ScoreA(S) для различных выходных предложений S.
Наше обсуждение затронуло единственный пример. Чтобы применить оптимизационный контрольный тест на практике вы должны проверить ошибки вашей валидационной выборки. Для каждой ошибки вы должны проверить, что оценка для ожидаемой (верной) транскрипции выше оценки выходной (неверной) транскрипции, т.е. ScoreA(S*) > ScoreA(Sout). Каждый пример из валидационной выборки, для которого такое неравенство сохранится будет помечен как ошибка, вызванная оптимизационным алгоритмом. Каждый пример, для которого это неравенство не сохранится, будет считаться ошибкой из-за неверного способа расчёта ScoreA(.).
Например, вы обнаружили, что 95% ошибок вызваны работой оценочной функции при расчёте ScoreA(.), и только 5% ошибок вызваны оптимизационным алгоритмом. Теперь вы знаете, что неважно как сильно вы улучшите свою функцию оптимизации, в реальности это поможет устранить не более 5% ошибок. Поэтому вы должны сфокусироваться на улучшении способа расчёта ScoreA(.).
Глава 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.
Ваш алгоритм машинного перевода текста пытается рассчитать:
Однако набор всех возможных предложений E на английском языке настолько велик, что вам приходится полагаться на эвристический поисковой алгоритм.
Предположим ваш алгоритм выдаёт неверный перевод Eout чаще, чем некоторый правильный перевод E*. Тогда оптимизационный контрольный тест позволит рассчитать неравенство ScoreC(E*) > ScoreC(Eout). Если оно сохраняется, то оценка ScoreC(.) верно распознаёт E* как лучшее выходное Eout, поэтому вы отнесёте эту ошибку на долю алгоритма приближённого поиска, в противном случае на функцию расчёта ScoreC(.).
Это очень общий паттерн в ИИ: сначала обучаем аппроксимирующую функцию оценки Scorex(.), потом используем приближённый алгоритм максимизации. Если вы запомните этот паттерн, то вы сможете использовать оптимизационный контрольный тест, чтобы найти источник ошибок.
Глава 46. Пример обучения с подкреплением
Предположим, вы используете машинное обучение, чтобы научить вертолёт совершать сложные манёвры. Вверху покадровое изображение вертолёта, управляемого компьютером, который совершает посадку с отключенным двигателем.
Этот манёвр называется посадкой на авторотации. Он позволяет вертолёту приземлиться, даже если двигатель внезапно вышел из строя. Пилоты-люди отрабатывают этот манёвр как часть своей подготовки. Ваша цель – использовать алгоритм машинного обучения, чтобы вертолёт мог пролететь по некоторой траектории T и в конце безопасно приземлиться.
Чтобы применить обучение с подкреплением, вы должны разработать «функцию вознаграждения» R(.), которая выдаёт оценку, показывающую насколько хороша была каждая возможная траектория T. Например, если траектория T привела к падению вертолёта, то пусть награда R(T) = -1000, т.е. имеет большое отрицательное значение. Траектория T, завершившаяся удачной посадкой, будет иметь положительную оценку R(T), в точности отражающую зависимость того насколько гладкой была посадка. Функция вознаграждения R (.) обычно выбирается вручную, чтобы определить количественно, насколько желательны различные траектории T. Она должна компенсировать различные факторы: насколько сильно трясло при посадке, приземлился ли вертолет точно в нужном месте, насколько спуск был тяжёлым для пассажиров и так далее. Хорошие функции вознаграждения разработать нелегко.
С учётом функции вознаграждения 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), который является лучшим выходом по эффективности для вашего текущего алгоритма обучения (даже если он не «оптимальный»), то оптимизационный контрольный тест может показать, будет ли более перспективным улучшить алгоритм оптимизации или функцию оценки.
[Продолжение]