Это мое резюме и классификационная заметка (урок 1) курса глубокого обучения. Этот курс предлагают Джереми Ховард и Рэйчел Томас (https://course.fast.ai/). Материалом для этого курса является книга Deep Learning for Coders with fastai и PyTorch. Искренняя благодарность авторам книги, Джереми Ховарду и Сильвену Гуггеру. На этом уроке мы изучим следующие темы:

1- Краткая история машинного обучения (ML)

2- Нейронные сети: краткая история

3. Взгляд Артура Сэмюэля на модель машинного обучения

4- Что такое нейронная сеть?

5- Современная терминология глубокого обучения

6- Ограничения, присущие машинному обучению

7- Получение сервера глубокого обучения GPU

8- Как работает распознаватель изображений fastai

Краткая история машинного обучения (МО)

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

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

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

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

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

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

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

Нейронные сети: краткая история

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

Создание математической модели искусственного нейрона началось в 1943 году, когда нейрофизиолог Уоррен МакКаллох и логик Уолтер Питтс пытались разработать такую ​​модель. Они поняли, что простое сложение и определение порога могут представлять собой упрощенную модель реального нейрона. Позже психолог по имени Франк Розенблатт продолжил работу над темой искусственных нейронов. Он построил устройство, Персептрон Mark I. Mark I Perceptron работал на основе разработки искусственного нейрона и придания ему способности к обучению. Профессор Массачусетского технологического института Марвин Мински и Сеймур Пейперт написали книгу под названием «Персептроны» (MIT Press) об этом изобретении. Они рассказали о двух важнейших аспектах этой модели. Во-первых, один слой этих устройств не мог изучить некоторые простые, но важные математические функции (такие как XOR). Во-вторых, мы можем устранить эти ограничения, используя несколько уровней устройств. К сожалению, первый инсайт заметили, а второй намек исследователи какое-то время игнорировали. В результате академическое сообщество отказалось от нейронных сетей на следующие два десятилетия. Самой ценной работой в области нейронных сетей за последние 50 лет стала многотомная работа «Параллельная распределенная обработка» (PDP) Дэвида Румельхарта, Джеймса Макклеллана и исследовательской группы PDP, выпущенная в 1986 году издательством MIT Press. Подход, используемый в PDP, очень похож на тот, который используется в современных нейронных сетях. Большинство моделей были построены со вторым слоем нейронов, чтобы решить проблему, упомянутую Мински и Пейпертом в 1980-х годах. Следовательно, академическое сообщество широко использовало нейронные сети для реального и практического проекта в 80-х и 90-х годах. Однако непонимание теоретических вопросов вернулось на поле. Теоретически, добавления всего одного дополнительного слоя нейронов было достаточно, чтобы с помощью этих нейронных сетей можно было выполнить аппроксимацию любой математической функции. Однако эти сети часто были слишком большими и слишком медленными, чтобы их можно было использовать на практике. В настоящее время большинство исследователей используют большее количество слоев нейронов, чтобы иметь хорошую производительность.

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

Взгляд Артура Сэмюэля на модель машинного обучения

В какой-то части статьи Артура Сэмюэля «Искусственный интеллект: рубеж автоматизации» в 1962 году он писал:

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

Следующие концепции обобщают взгляд Артура Сэмюэля на модель машинного обучения:

1- Идея назначения веса

2- автоматическое средство тестирования фактической производительности модели,

3. Необходимость в механизме

Мы обсудим эти концепции одну за другой здесь.

1 – Назначение веса

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

2 – Автоматически означает

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

3- Механизм

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

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

Что такое нейронная сеть?

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

Современная терминология глубокого обучения

Терминология изменилась с тех пор, как Сэмюэл работал в 1960-х годах. Современная терминология глубокого обучения пометила эти элементы в модели следующим образом:

1- Функциональная форма модели называется ее архитектурой.

2- веса равны параметрам.

3- прогнозы извлекаются из данных, не включая метки.

4. Результаты модели являются прогнозами.

5- Измерение эффективности осуществляется по потерям.

6- Проигрыш зависит как от прогнозов, так и от правильных меток.

Ограничения, присущие машинному обучению

Некоторые фундаментальные вещи об обучении модели глубокого обучения:

1- Нам нужны данные для создания модели.

2- Обучение в модели основано на образце, наблюдаемом во входных данных, используемых для ее обучения.

3- Это обучение только прогнозирует и не дает никаких рекомендаций.

4- Данных недостаточно. Это нужно было пометить (отсутствие помеченных данных).

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

Получение сервера глубокого обучения на GPU

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

https://course.fast.ai/start_colab

https://course.fast.ai/start_gradient

Что нужно для обучения модели?

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

Как работает распознаватель изображений Fastai

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

из импорта fastai.vision.all *

path = untar_data(URLs.PETS)/'изображения'

def is_cat(x): вернуть x[0].isupper()

dls = ImageDataLoaders.from_name_func(

путь, get_image_files(путь), valid_pct=0.2, seed=42,

label_func=is_cat, item_tfms=Изменить размер(224))

узнать = cnn_learner (dls, resnet34, metrics = error_rate)

Learn.fine_tune(1)

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

Шаг 1. Загрузите необходимые библиотеки

из импорта fastai.vision.all *

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

Шаг 2. Скачайте набор данных

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

path=untar_data(URLs.PETs)

path=Path("/notebook/storage/data/oxford_iii_pet")

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

Шаг 3. Загрузите и пометьте набор данных

dls = ImageDataLoaders.from_name_func(

путь, get_image_files(путь), valid_pct=0.2, seed=42,

label_func=is_cat, item_tfms=Изменить размер(224))

Чтобы превратить наши загруженные данные в объект DataLoaders (https://docs.fast.ai/data.load), нам нужно сообщить fastai эти четыре вещи (https://docs.fast.ai/vision.data):

1) С какими данными мы работаем

2) Как получить список предметов

3) Как маркировать эти предметы

4) Как создать проверочный набор

Когда мы используем DataLoader, мы должны уточнить, с какими данными мы работаем. В этом примере мы используем изображения в качестве наших данных (входных данных), поэтому мы используем ImageDataLoaders. Как получить список элементов, см. https://docs.fast.ai/vision.data. Другая важная часть информации, которую мы должны сообщить Fastai, — это то, как маркировать данные. Следующий документ fastai помогает узнать, как маркировать наши данные:



Здесь мы используем эту функцию для маркировки наших данных:

def is_cat(x): вернуть x[0].isupper()

Затем проверочный набор используется для оценки модели во время обучения, чтобы предотвратить переоснащение. Определив набор проверки, мы можем убедиться, что производительность модели обусловлена ​​тем, что она изучает соответствующие функции для использования для прогнозирования, а не из-за обмана или запоминания набора данных (переоснащение). Поэтому проверочный набор используется для измерения точности модели. По умолчанию 20% данных выбираются случайным образом в качестве проверочного набора.

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

Наконец, мы определяем Transform. Преобразование содержит код, который автоматически применяется во время обучения. У нас есть много предопределенных преобразований в fastai. Мы также можем добавить новые, поскольку их легко создать (как функцию Python). Существует два разных типа преобразования. Item_tfms применяются к каждому элементу (в данном случае размер каждого элемента изменяется до квадрата размером 224 пикселя), а Batch_tfms применяется к пакету элементов одновременно с использованием графического процессора.

Переоснащение

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

Шаг 4. Обучение модели

На этом этапе мы должны уточнить, какую архитектуру использовать. Фастаи имеют множество различных архитектур. В этом примере используется сверточная нейронная сеть (CNN). Он указывает, какую архитектуру использовать или какую модель создать. Мы должны добавить, на каких данных мы хотим его тренировать, и какую метрику использовать.

узнать = cnn_learner(dls, resnet34, metrics=error_rate)

Структура CNN аналогична тому, как работает зрительная система человека. Это современный подход к созданию компьютерного зрения. Ученик CNN также содержит параметр, называемый предварительно обученным. По умолчанию установлено значение True.

Здесь мы используем resnet34. 34 ссылки на количество слоев в этом варианте архитектуры. Есть и другие параметры, такие как 18, 50, 101 и 152. Самое важное, о чем здесь следует помнить, это то, что модели, использующие больше слоев в архитектуре, могут столкнуться с проблемой переобучения.

Метрика — это функция, измеряющая качество предсказаний модели. Он использует набор проверки и распечатывает в конце каждой эпохи. В этом примере используется error_rate, который сообщает нам, какой процент изображений в проверочном наборе классифицируется неправильно. Другой распространенной метрикой для классификации является точность, которая составляет всего 1,0-error_rate. Метрика отличается от концепции потерь. Потеря обеспечивает меру производительности системы обучения для автоматического обновления весов. Таким образом, хороший выбор для проигрыша также является отличным выбором для SGD. Метрики дают вам информацию о том, насколько вы близки к тому, что вы хотите, чтобы модель делала.

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