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

Также доступно на испанском языке | También disponible en español

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

Примечание. Большую часть того, что я здесь рассказываю, я узнал из курса Углубленное обучение для программистов, который читал Джереми Ховард в Университете Сан-Франциско.

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

Первый крупный бенефициар: Computer Vision

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

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

Это то, что мы получаем, когда внедряем модели, предварительно обученные на огромном наборе данных ImageNet, который в настоящее время содержит более 14 миллионов изображений и почти 22 000 различных меток. Возможно, самый известный случай — это архитектура ResNet, победитель конкурса по распознаванию изображений, проведенного ImageNet в 2015 году. дать нашей сети возможность распознавать многие вещи с самого начала, что также потребует очень короткого времени обучения. Использование данных ImageNet в качестве отправной точки означало огромный скачок в области компьютерного зрения.

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

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

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

Стратегия обучения нейронной сети с трансферным обучением

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

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

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

Трансферное обучение для обработки естественного языка

Основной причиной радикальных улучшений, достигнутых пару лет назад в области обработки естественного языка (NLP), также было переносное обучение.

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

В 2018 году Джереми Ховард и Себастьян Рудер опубликовали статью, посвященную ULMFiT (тонкая настройка универсальной языковой модели), универсальному методу применения трансферного обучения к любой проблеме НЛП, привнося в эту область ранее достигнутые достижения в области компьютерного зрения. Следствие: наилучшие результаты, наблюдаемые на сегодняшний день (с повышением точности на 18–24 %), в нескольких классических наборах данных, таких как тот, который используется для классификации обзоров фильмов IMDB на положительные и отрицательные.

Шаги, предпринятые для этого примера и других подобных проблем, будут следующими:

1. Выберите предварительно обученную модель (или создайте и обучите новую) в более общей текстовой задаче в качестве отправной точки. В НЛП мы будем использовать то, что известно как языковая модель, которая пытается, например, предсказать следующее слово в предложении, как мы можем видеть в предиктивной клавиатуре. Эта задача требует глубокого знания языка и окружающего мира; работы с n-граммами (словами, которые обычно появляются вместе), как и раньше, недостаточно, чтобы приобрести способность, необходимую для продолжения предложений.
Но… что, если мы применим глубокое обучение, используя больший набор данных, такой как как большая куча статей, взятых из Википедии? Это кажется хорошей идеей!
Предсказание следующего слова не будет очень полезным для нашей окончательной задачи классификации, но, достигнув этого, мы приобретем очень ценные знания о языке и о реальности, в которой оно применяется. . Гораздо лучше, чем начинать со случайных параметров, не так ли?

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

2. Уточните языковую модель, применив трансферное обучение, чтобы создать новую, которая хорошо предсказывает следующее слово, но в пределах нашей конкретной области; в данном случае обзоры фильмов. Мы отправим в сеть наш набор данных, также называемый целевой корпус, и применим токенизацию (сегментацию текста на минимальные единицы или токены). ), нормализацию и нумерацию (будьте осторожны со специальными токенами). Рекомендуется использовать все доступные данные, включая тестовые образцы; поскольку их метки (которые будут использоваться для классификации) не нужны для предсказания следующего слова. Мы объединим все образцы и зарезервируем, например, 10% от общего количества для проверки модели.

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

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

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

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

Получившаяся модель после этого момента уже сможет различить, положительный отзыв или отрицательный :)

Вывод

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

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

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

P.S.- Взгляните на эти ноутбуки по Python для полных примеров использования fastai: Классификация изображений + Классификация обзоров IMDB.

Надеюсь, вам понравилось! Подпишитесь на #yottabytes, чтобы не пропустить такие статьи :)