трансферное обучение нейронные сети
Трансферное обучение нейронные сети
Transfer Learning (трансферное обучение) — это подраздел машинного обучения, целью которого является применение знаний, полученные из одной задачи, к другой целевой задаче. Существует множество решений, который могут помочь Data Scientist’у применить его к своей проблеме, поэтому нет необходимости изобретать велосипед.
Например, знания, полученные при обучении классификации статей Википедии, можно использовать для решения задачи классификации медицинских текстов. Можно пойти дальше, и использовать модель, обученную для решения классификации автомобилей, чтобы распознавать птиц в небе, как одну из задач компьютерного зрения (Computer Vision).
История Transfer Learning
История трансферного обучения восходит к 1993 году. В своей статье «Передача между нейронными сетями на основе различимости (англ. Discriminability-Based Transfer between Neural Networks)» Lorien Pratt открыла ящик Пандоры и представила миру потенциал трансферного обучения [1]. В июле 1997 года журнал Machine Learning опубликовал серию статей о трансферном обучении [2]. По мере развития смежные области, например многозадачное обучение (multi-task learning), также были включены в трансферное обучение. Сегодня Transfer Learning является мощным инструментом искусственного интеллекта. Andrew Ng предсказывает подъём трансферного обучения с точки зрения коммерческого успеха [3].
Ожидание Andrew Ng коммерческого успеха подразделов машинного обучения
Как работает Transfer Learning
Прежде всего стоит обратить внимание на 2 аспекта при использовании Transfer Learning:
Предварительно обученная модель — это модель, созданная и обученная кем-то другим для решения проблемы, аналогичной нашей. На практике кто-то, имея большие вычислительные ресурсы, они конструируют большую нейронную сеть для решения конкретной проблемы, тренируют её на большом наборе данных (Big Data), например ImageNet или Wikipedia Corpus. Так, например, VGG19 имеет 143.667.240 параметров и используется для классификации изображений. Под «открытой» моделью мы подразумеваем, что она обнародована, и её можно свободно использовать.
Ресурсы с предварительно обученными моделями:
В редких случаях предварительно обученные модели хорошо работают для целевой задачи. Как правило, их необходимо поднастроить по следующим причинам:
Предварительно обученные сети используются для дообучения (fine-tuning) или выделения признаков (feature extraction).
Дообучение
В архитектурах Deep Learning начальные слои изучают общую информацию, а слои на последнем уровне более специфичные признаки. Например, первые слои запониманют текстуру, цвет, общую картину, а последние слои глаза, рот, родинки и т.д. Многие модели обучены на всевозможных ситуациях, например, ImageNet содержит 1 миллион изображений с 1000 классами, поэтому нет необходимости изменять общую картину, которую видит текущая модель. Вместо этого полезнее дополнить новыми конкретными признаками, дообучив только последние слои, чтобы перепрофилировать её для собственных нужд.
Затрагивая больше слоев для дообучения, повышается риск переобучения (overfitting). Например, модель VGG19 может после полного переобучения показать непредсказуемые результаты в рамках Transfer Learning, причем не в пользу Data Scientist’а. Поэтому часто обходятся двумя-тремя последними слоями.
Выделение признаков
Для выделения признаков используются представления, полученные предыдущей моделью, для извлечения признаков из новых образцов, которые затем пропускаются через новый классификатор. В этом методе просто добавляется классификатор, который будет обучаться с нуля, поверх предварительно обученной модели для решения целевой функции.
В сверточные архитектуры нейронных сетей (CNN) обычно состоят из двух частей: сверточной и полносвязной. Для выделения признаков (feature extraction) сверточная часть остаётся неизменной. В то время как Fine Tuning захватывает несколько последних сверточных слоев.
Сверточная основа не используется по причине их универсальности. Так, например, они имеют представления о присутствии объектов и их местоположении. С другой стороны, полносвязные слои не имеют знаний о местоположении объектов, т.е. не обладают свойством инвариантности, поэтому их безбоязненно можно поменять на собственные.
Выделение признаков в Transfer Learning реализуется двумя способами:
Что выбрать дообучение или выделение признаков
Оба метода могут повысить точность модели, но при условии наличия достаточного объёма данных, в противном случае сеть не «почувствует» изменений от нового набора данных и не сможет перепрофилироваться.
Выделение признаков применяется в том случае, когда решаемая задача прошлой сети схожа с целевой. А вот если есть существенные отличия, то используется дообучение, которое является более затратной с вычислительной точки зрения.
Transfer Learning: как быстро обучить нейросеть на своих данных
Машинное обучение становится доступнее, появляется больше возможностей применять эту технологию, используя «готовые компоненты». Например, Transfer Learning позволяет использовать накопленный при решении одной задачи опыт для решения другой, аналогичной проблемы. Нейросеть сначала обучается на большом объеме данных, затем — на целевом наборе.
В этой статье я расскажу, как использовать метод Transfer Learning на примере распознавания изображений с едой. Про другие инструменты машинного обучения я расскажу на воркшопе «Machine Learning и нейросети для разработчиков».
Если перед нами встает задача распознавания изображений, можно воспользоваться готовым сервисом. Однако, если нужно обучить модель на собственном наборе данных, то придется делать это самостоятельно.
Для таких типовых задач, как классификация изображений, можно воспользоваться готовой архитектурой (AlexNet, VGG, Inception, ResNet и т.д.) и обучить нейросеть на своих данных. Реализации таких сетей с помощью различных фреймворков уже существуют, так что на данном этапе можно использовать одну из них как черный ящик, не вникая глубоко в принцип её работы.
Однако, глубокие нейронные сети требовательны к большим объемам данных для сходимости обучения. И зачастую в нашей частной задаче недостаточно данных для того, чтобы хорошо натренировать все слои нейросети. Transfer Learning решает эту проблему.
Transfer Learning для классификации изображений
Нейронные сети, которые используются для классификации, как правило, содержат N выходных нейронов в последнем слое, где N — это количество классов. Такой выходной вектор трактуется как набор вероятностей принадлежности к классу. В нашей задаче распознавания изображений еды количество классов может отличаться от того, которое было в исходном датасете. В таком случае нам придётся полностью выкинуть этот последний слой и поставить новый, с нужным количеством выходных нейронов
Зачастую в конце классификационных сетей используется полносвязный слой. Так как мы заменили этот слой, использовать предобученные веса для него уже не получится. Придется тренировать его с нуля, инициализировав его веса случайными значениями. Веса для всех остальных слоев мы загружаем из предобученного снэпшота.
Существуют различные стратегии дообучения модели. Мы воспользуемся следующей: будем тренировать всю сеть из конца в конец (end-to-end), а предобученные веса не будем фиксировать, чтобы дать им немного скорректироваться и подстроиться под наши данные. Такой процесс называется тонкой настройкой (fine-tuning).
Структурные компоненты
Для решения задачи нам понадобятся следующие компоненты:
В нашем примере компоненты (1), (2) и (3) я буду брать из собственного репозитория, который содержит максимально легковесный код — при желании с ним можно легко разобраться. Наш пример будет реализован на популярном фреймворке TensorFlow. Предобученные веса (4), подходящие под выбранный фреймворк, можно найти, если они соответствуют одной из классических архитектур. В качестве датасета (5) для демонстрации я возьму Food-101.
Модель
В качестве модели воспользуемся классической нейросетью VGG (точнее, VGG19). Несмотря на некоторые недостатки, эта модель демонстрирует довольно высокое качество. Кроме того, она легко поддается анализу. На TensorFlow Slim описание модели выглядит достаточно компактно:
Веса для VGG19, обученные на ImageNet и совместимые с TensorFlow, скачаем с репозитория на GitHub из раздела Pre-trained Models.
Датасет
В качестве обучающей и валидационной выборки будем использовать публичный датасет Food-101, где собрано более 100 тысяч изображений еды, разбитых на 101 категорию.
Скачиваем и распаковываем датасет:
Пайплайн данных в нашем обучении устроен так, что из датасета нам понадобится распарсить следующее:
Все вспомогательные функции, ответственные за обработку данных, вынесены в отдельный файл data.py :
Обучение модели
Код обучения модели состоит из следующих шагов:
После запуска обучения можно посмотреть на его ход с помощью утилиты TensorBoard, которая поставляется в комплекте с TensorFlow и служит для визуализации различных метрик и других параметров.
В конце обучения в TensorBoard мы наблюдаем практически идеальную картину: снижение Train loss и рост Validation Accuracy
Тестирование модели
Теперь протестируем нашу модель. Для этого:
Весь код, включая ресурсы для построения и запуска Docker контейнера со всеми нужными версиями библиотек, находятся в этом репозитории — на момент прочтения статьи код в репозитории может иметь обновления.
На воркшопе «Machine Learning и нейросети для разработчиков» я разберу и другие задачи машинного обучения, а студенты к концу интенсива сами представят свои проекты.
Нежное введение в трансферное обучение для глубокого обучения
Дата публикации 2017-12-20
Это популярный подход в глубоком обучении, когда предварительно обученные модели используются в качестве отправной точки в задачах компьютерного зрения и обработки естественного языка, учитывая огромные вычислительные и временные ресурсы, необходимые для разработки моделей нейронных сетей для решения этих проблем и огромных скачков в навыках. что они предоставляют по связанным проблемам.
В этом посте вы узнаете, как вы можете использовать трансферное обучение для ускорения обучения и повышения производительности вашей модели глубокого обучения.
Прочитав этот пост, вы узнаете:
Что такое трансферное обучение?
Трансферное обучение и адаптация предметной области относятся к ситуации, в которой то, что было изучено в одном сеттинге… используется для улучшения обобщения в другом сеттинге.
Трансферное обучение связано с такими проблемами, как многозадачное обучение и дрейф понятий, и не является исключительно областью изучения для глубокого обучения.
Тем не менее, трансферное обучение популярно в сфере глубокого обучения, учитывая огромные ресурсы, необходимые для обучения моделям глубокого обучения или большим и сложным наборам данных, на которых обучаются модели глубокого обучения.
Трансферное обучение работает только при глубоком обучении, если особенности модели, полученные из первого задания, являются общими.
При обучении с переносом мы сначала обучаем базовую сеть базовому набору данных и задаче, а затем перенаправляем изученные функции или переносим их во вторую целевую сеть для обучения набору целевых данных и задаче. Этот процесс будет работать, если функции являются общими, то есть подходящими как для базовых, так и для целевых задач, а не специфическими для базовой задачи.
Эта форма трансферного обучения, используемая в глубоком обучении, называется индуктивным переводом. Это где область возможных моделей (смещение модели) выгодно сужается путем использования модели, подходящей для другой, но связанной задачи.
Хотите лучших результатов с глубоким обучением?
Пройдите мой бесплатный 7-дневный курс по электронной почте сейчас (с примером кода).
Нажмите, чтобы зарегистрироваться, а также получите бесплатную PDF-версию курса Ebook.
Как использовать трансферное обучение?
Вы можете использовать трансферное обучение в своих собственных задачах прогнозного моделирования.
Два общих подхода следующие:
Разработать модельный подход
Предварительно обученный модельный подход
Этот второй тип трансферного обучения распространен в области глубокого обучения
Примеры трансферного обучения с глубоким обучением
Давайте сделаем это конкретным из двух общих примеров трансферного обучения с использованием моделей глубокого обучения.
Передача обучения с данными изображения
Распространенное обучение выполнено с задачами прогнозного моделирования, которые используют данные изображения в качестве входных данных.
Это может быть задача прогнозирования, которая принимает фотографии или видеоданные в качестве входных данных.
Для задач такого типа обычно используется модель глубокого обучения, предварительно подготовленная для большой и сложной задачи классификации изображений, такой какImageNetКонкурс на классификацию фотографий класса 1000.
Научно-исследовательские организации, которые разрабатывают модели для этого конкурса и успешно делают свою окончательную модель под разрешительной лицензией для повторного использования. Эти модели могут занимать дни или недели, чтобы тренироваться на современном оборудовании.
Эти модели могут быть загружены и включены непосредственно в новые модели, которые ожидают данные изображения в качестве входных данных.
Три примера моделей этого типа включают в себя:
Дополнительные примеры см. ВКафе Модель Зоопаркгде более предварительно обученные модели являются общими.
Этот подход эффективен, потому что изображения обучались на большом наборе фотографий и требуют, чтобы модель делала прогнозы относительно большого числа классов, в свою очередь, требуя, чтобы модель эффективно училась извлекать элементы из фотографий, чтобы хорошо выполнять на эта проблема.
В своем Стэнфордском курсе «Сверточные нейронные сети для визуального распознавания» авторы предостерегают, чтобы тщательно выбрать, какую часть предварительно обученной модели использовать в вашей новой модели.
Функции [Convolutional Neural Networks] являются более общими на ранних уровнях и более специфичными для набора данных на более поздних уровнях
Перенос обучения с использованием языковых данных
Распространенное обучение проводится с задачами обработки естественного языка, которые используют текст в качестве ввода или вывода.
Для задач такого типа используется вложение слов, которое представляет собой отображение слов в многомерное непрерывное векторное пространство, где разные слова с одинаковым значением имеют одинаковое векторное представление.
Существуют эффективные алгоритмы для изучения этих распределенных представлений слов, и исследовательские организации обычно выпускают предварительно обученные модели, обученные на очень больших объемах текстовых документов, по разрешающей лицензии.
Два примера моделей этого типа включают в себя:
Эти распределенные модели представления слов могут быть загружены и включены в модели языка глубокого изучения либо при интерпретации слов как входных данных, либо при генерации слов как выходных данных модели.
В своей книге «Глубокое обучение для обработки естественного языка» Йоав Голдберг предостерегает:
… Можно загрузить предварительно обученные векторы слов, которые были обучены на очень больших количествах текста […] различия в режимах обучения и базовых корпусах оказывают сильное влияние на результирующие представления, и что имеющиеся предварительно обученные представления могут быть не самыми лучшими выбор для [вашего] конкретного варианта использования.
Когда использовать трансферное обучение?
В целом, не очевидно, что использование трансферного обучения в данной области будет выгодно до тех пор, пока модель не будет разработана и оценена.
Лиза Торри и Джуд Шавлик вих глава о трансферном обученииОпишите три возможных преимущества, которые нужно искать при использовании трансферного обучения:
В идеале вы должны увидеть все три преимущества от успешного применения трансферного обучения.
Это способ попробовать, если вы можете идентифицировать связанную задачу с обильными данными, и у вас есть ресурсы для разработки модели для этой задачи и повторного использования ее для вашей собственной проблемы, или есть предварительно подготовленная модель, которую вы можете использовать как отправная точка для вашей собственной модели.
По некоторым проблемам, когда у вас может не быть много данных, трансферное обучение может позволить вам разработать умелые модели, которые вы просто не могли бы развить в отсутствие трансферного обучения.
Выбор исходных данных или исходной модели является открытой проблемой и может потребовать экспертных знаний и / или интуиции, разработанной на основе опыта.
Дальнейшее чтение
Этот раздел предоставляет больше ресурсов по теме, если вы хотите углубиться
книги
документы
Предварительно обученные модели
статьи
Резюме
В этом посте вы узнали, как вы можете использовать трансферное обучение для ускорения обучения и повышения производительности вашей модели глубокого обучения.
В частности, вы узнали:
У вас есть вопросы?
Задайте свои вопросы в комментариях ниже, и я сделаю все возможное, чтобы ответить.
Трансферное обучение: почему deep learning стал доступнее
Что помогает стартапам использовать методы глубинного обучения в своих проектах?
Раньше глубинное обучение требовало огромных мощностей, денежных инвестиций и времени, поэтому было недоступно небольшим компаниям. В последние годы ситуация меняется: стартапы и даже энтузиасты-одиночки могут использовать методы глубинного обучения в своих проектах. Разработчик Калеб Кайзер делится своими наблюдениями о том, почему deep learning становится все доступнее.
Раньше для того, чтобы заняться глубинным обучением, вы должны были иметь доступ к большому очищенному набору данных и самостоятельно разработать и обучить эффективную модель. Значит, проекты без существенной поддержки извне были невозможны по умолчанию. Однако за последние пару лет всё изменилось. Движущая сила такого роста — трансферное обучение.
Что такое трансферное обучение?
Идея трансферного обучения строится на том, что знания, накопленные в модели, подготовленной для выполнения одной задачи — скажем, распознавания цветов на фотографии — могут быть перенесены на другую модель, чтобы помочь в построении прогнозов для другой, родственной задачи, например, для задачи выявления меланомы.
Существуют различные подходы к трансферному обучению, но один из них — тонкая настройка (finetuning) — находит особенно широкое применение.
При таком подходе команда берет предварительно обученную модель и удаляет или переучивает последние слои этой модели, чтобы сфокусироваться на новой, схожей задаче. Например, AI Dungeon — это текстовая приключенческая игра с открытым миром, которая стала очень популярной из-за того, насколько убедительны сюжеты, написанные с помощью искусственного интеллекта:
Примечательно, что AI Dungeon не была разработана исследовательской лабораторий Google, это проект одного человека, сделанный во время хакатона.
Ник Уолтон, создатель AI Dungeon, не построил ее с нуля, а с помощью новейшей NLP-модели — GPT-2 компании OpenAI — доработал ее тонкой настройкой и дал возможность писать свои тексты для приключений.
Причина, по которой это вообще работает, в том, что в нейросетях базовые слои фокусируются на простых, общих паттернах, тогда как последние слои фокусируются на более специфичных паттернах для задач классификации или регрессии. Профессор Стенфордского университета Эндрю Ын визуализирует слои и их относительные уровни специфичности, представляя модель распознавания образов:
Общее содержание базовых слоев, оказывается, часто хорошо перекладывается на другие задачи. Например, в случае AI Dungeon GPT-2 обладала современным пониманием разговорного английского языка, ей просто потребовалась небольшая перетренировка в заключительных слоях для хороших результатов в создании собственных приключенческих сюжетов.
С помощью этого процесса один разработчик может развернуть модель, которая за несколько дней достигнет современных уровней развития в новой области.
Небольшие наборы данных больше не помеха
Глубинное обучение, как правило, требует больших объемов размеченных данных, а во многих областях таких данных просто не существует. Трансферное обучение может решить эту проблему. Например, команда, связанная с Гарвардской медицинской школой, недавно развернула модель, которая может на основе рентгенограмм грудной клетки прогнозировать смертность в долгосрочной перспективе, в том числе не связанную с раком.
Несмотря на то, что у исследователей был набор данных, состоявший примерно из 50 000 размеченных изображений, они не могли тренировать собственную свёрточную нейросеть с нуля. Вместо этого они взяли подготовленную модель Inception-v4 (которая обучается на наборе данных, состоящем более чем из 14 миллионов изображений ImageNet) и использовали трансферное обучение и небольшие архитектурные модификации для адаптации модели к своему набору данных.
В результате их нейросеть научилась рассчитывать уровень риска по одному изображению грудной клетки пациента.
На обучение моделей теперь требуются минуты, а не дни
Обучение модели на огромном объеме данных требует не только приобретения этих данных, нужны также ресурсы и время.
Например, когда в Google разрабатывали свою state of the art модель классификации изображений Xception, были подготовлены две версии: одна на датасете ImageNet (14 миллионов изображений), а другая на наборе данных JFT (350 миллионов изображений).
Обучение на 60 графических процессорах NVIDIA K80 с различными оптимизациями заняло три дня для проведения одного эксперимента с ImageNet. Эксперимент с JFT занял больше месяца. Однако теперь, когда предварительно обученная модель Xception выпущена, команды могут провести тонкую настройку своих версий намного быстрее.
Например, команда из Университета штата Иллинойс и Аргоннской национальной лаборатории недавно подготовила модель для классификации изображений галактик.
Несмотря на то, что их набор данных составляет всего 35 000 размеченных изображений, они смогли настроить Xception всего за восемь минут с помощью графических процессоров NVIDIA.
Полученная модель способна классифицировать галактики с точностью 99,8% при сверхчеловеческой скорости.
Машинное обучение становится экосистемой
В программировании мы видим, как экосистемы «взрослеют» по довольно стандартным шаблонам. Появляется новый язык программирования с интересными возможностями, и его используют для определенных сценариев, исследовательских проектов и игр. Сегодня каждый, кто будет им пользоваться, должен собирать вспомогательные программы с нуля.
В итоге сообщество разрабатывает библиотеки и проекты, которые абстрагируются от общих утилит до тех пор, пока инструментарий не будет достаточно устойчив и работоспособен для использования. На этом этапе разработчики не думают об отправке HTTP-запросов или о подключении к базам данных, а сосредоточены исключительно на создании своего продукта.
Другими словами, большие компании создают свои модели, а разработчики используют их для создания продуктов. По мере того, как компании вроде OpenAI, Google, Facebook и других технологических гигантов выпускают мощные модели с открытым исходным кодом, инструменты в распоряжении разработчиков машинного обучения становятся все более мощными и стабильными.
Вместо того чтобы тратить время на построение модели с нуля при помощи PyTorch или TensorFlow, датасаентисты используют модели с открытым исходным кодом и трансферное обучение для создания продуктов, а значит, придет новое поколение программного обеспечения на основе программного обучения.
Теперь разработчикам машинного обучения остается думать только о том, как бы запустить эти модели в производство.