пример обучения нейронная сеть

Нейронные сети для начинающих. Часть 1

пример обучения нейронная сеть

Привет всем читателям Habrahabr, в этой статье я хочу поделиться с Вами моим опытом в изучении нейронных сетей и, как следствие, их реализации, с помощью языка программирования Java, на платформе Android. Мое знакомство с нейронными сетями произошло, когда вышло приложение Prisma. Оно обрабатывает любую фотографию, с помощью нейронных сетей, и воспроизводит ее с нуля, используя выбранный стиль. Заинтересовавшись этим, я бросился искать статьи и «туториалы», в первую очередь, на Хабре. И к моему великому удивлению, я не нашел ни одну статью, которая четко и поэтапно расписывала алгоритм работы нейронных сетей. Информация была разрознена и в ней отсутствовали ключевые моменты. Также, большинство авторов бросается показывать код на том или ином языке программирования, не прибегая к детальным объяснениям.

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

Первым и самым важным моим открытием был плейлист американского программиста Джеффа Хитона, в котором он подробно и наглядно разбирает принципы работы нейронных сетей и их классификации. После просмотра этого плейлиста, я решил создать свою нейронную сеть, начав с самого простого примера. Вам наверняка известно, что когда ты только начинаешь учить новый язык, первой твоей программой будет Hello World. Это своего рода традиция. В мире машинного обучения тоже есть свой Hello world и это нейросеть решающая проблему исключающего или(XOR). Таблица исключающего или выглядит следующим образом:

abc
000
011
101
110

Соответственно, нейронная сеть берет на вход два числа и должна на выходе дать другое число — ответ. Теперь о самих нейронных сетях.

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

пример обучения нейронная сеть

Нейронная сеть — это последовательность нейронов, соединенных между собой синапсами. Структура нейронной сети пришла в мир программирования прямиком из биологии. Благодаря такой структуре, машина обретает способность анализировать и даже запоминать различную информацию. Нейронные сети также способны не только анализировать входящую информацию, но и воспроизводить ее из своей памяти. Заинтересовавшимся обязательно к просмотру 2 видео из TED Talks: Видео 1, Видео 2). Другими словами, нейросеть это машинная интерпретация мозга человека, в котором находятся миллионы нейронов передающих информацию в виде электрических импульсов.

Какие бывают нейронные сети?

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

Для чего нужны нейронные сети?

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

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

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

Распознавание — в настоящее время, самое широкое применение нейронных сетей. Используется в Google, когда вы ищете фото или в камерах телефонов, когда оно определяет положение вашего лица и выделяет его и многое другое.

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

Что такое нейрон?

пример обучения нейронная сеть

Нейрон — это вычислительная единица, которая получает информацию, производит над ней простые вычисления и передает ее дальше. Они делятся на три основных типа: входной (синий), скрытый (красный) и выходной (зеленый). Также есть нейрон смещения и контекстный нейрон о которых мы поговорим в следующей статье. В том случае, когда нейросеть состоит из большого количества нейронов, вводят термин слоя. Соответственно, есть входной слой, который получает информацию, n скрытых слоев (обычно их не больше 3), которые ее обрабатывают и выходной слой, который выводит результат. У каждого из нейронов есть 2 основных параметра: входные данные (input data) и выходные данные (output data). В случае входного нейрона: input=output. В остальных, в поле input попадает суммарная информация всех нейронов с предыдущего слоя, после чего, она нормализуется, с помощью функции активации (пока что просто представим ее f(x)) и попадает в поле output.

пример обучения нейронная сеть

Важно помнить, что нейроны оперируют числами в диапазоне [0,1] или [-1,1]. А как же, вы спросите, тогда обрабатывать числа, которые выходят из данного диапазона? На данном этапе, самый простой ответ — это разделить 1 на это число. Этот процесс называется нормализацией, и он очень часто используется в нейронных сетях. Подробнее об этом чуть позже.

Что такое синапс?

пример обучения нейронная сеть

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

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

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

пример обучения нейронная сеть

В данном примере изображена часть нейронной сети, где буквами I обозначены входные нейроны, буквой H — скрытый нейрон, а буквой w — веса. Из формулы видно, что входная информация — это сумма всех входных данных, умноженных на соответствующие им веса. Тогда дадим на вход 1 и 0. Пусть w1=0.4 и w2 = 0.7 Входные данные нейрона Н1 будут следующими: 1*0.4+0*0.7=0.4. Теперь когда у нас есть входные данные, мы можем получить выходные данные, подставив входное значение в функцию активации (подробнее о ней далее). Теперь, когда у нас есть выходные данные, мы передаем их дальше. И так, мы повторяем для всех слоев, пока не дойдем до выходного нейрона. Запустив такую сеть в первый раз мы увидим, что ответ далек от правильно, потому что сеть не натренирована. Чтобы улучшить результаты мы будем ее тренировать. Но прежде чем узнать как это делать, давайте введем несколько терминов и свойств нейронной сети.

Функция активации

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

пример обучения нейронная сеть

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

пример обучения нейронная сеть

Это самая распространенная функция активации, ее диапазон значений [0,1]. Именно на ней показано большинство примеров в сети, также ее иногда называют логистической функцией. Соответственно, если в вашем случае присутствуют отрицательные значения (например, акции могут идти не только вверх, но и вниз), то вам понадобиться функция которая захватывает и отрицательные значения.

пример обучения нейронная сеть

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

Тренировочный сет

Тренировочный сет — это последовательность данных, которыми оперирует нейронная сеть. В нашем случае исключающего или (xor) у нас всего 4 разных исхода то есть у нас будет 4 тренировочных сета: 0xor0=0, 0xor1=1, 1xor0=1,1xor1=0.

Итерация

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

Эпоха

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

пример обучения нейронная сеть

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

Ошибка

Ошибка — это процентная величина, отражающая расхождение между ожидаемым и полученным ответами. Ошибка формируется каждую эпоху и должна идти на спад. Если этого не происходит, значит, вы что-то делаете не так. Ошибку можно вычислить разными путями, но мы рассмотрим лишь три основных способа: Mean Squared Error (далее MSE), Root MSE и Arctan. Здесь нет какого-либо ограничения на использование, как в функции активации, и вы вольны выбрать любой метод, который будет приносить вам наилучший результат. Стоит лишь учитывать, что каждый метод считает ошибки по разному. У Arctan, ошибка, почти всегда, будет больше, так как он работает по принципу: чем больше разница, тем больше ошибка. У Root MSE будет наименьшая ошибка, поэтому, чаще всего, используют MSE, которая сохраняет баланс в вычислении ошибки.

пример обучения нейронная сеть

пример обучения нейронная сеть

пример обучения нейронная сеть

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

Задача

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

пример обучения нейронная сеть

H1input = 1*0.45+0*-0.12=0.45
H1output = sigmoid(0.45)=0.61

H2input = 1*0.78+0*0.13=0.78
H2output = sigmoid(0.78)=0.69

O1input = 0.61*1.5+0.69*-2.3=-0.672
O1output = sigmoid(-0.672)=0.33

Результат — 0.33, ошибка — 45%.

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

Источник

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

пример обучения нейронная сеть

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

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

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

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

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

пример обучения нейронная сеть

Искусственная нейронная сеть состоит из трех компонентов:

пример обучения нейронная сеть

Обучение нейросетей происходит в два этапа:

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

Прямое распространение ошибки

Зададим начальные веса случайным образом:

Умножим входные данные на веса для формирования скрытого слоя:

Выходные данные из скрытого слоя передается через нелинейную функцию (функцию активации), для получения выхода сети:

Обратное распространение

пример обучения нейронная сеть

Полученный результат затем вычитается из соответствующих весов.

В результате получатся следующие обновленные веса:

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

пример обучения нейронная сетьПопулярный мем о том, как Карлсон стал Data Science разработчиком

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

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

Частные производные

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

Разберем необходимость частных производных на примере.

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

пример обучения нейронная сеть

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

пример обучения нейронная сеть

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

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

пример обучения нейронная сеть

Гиперпараметры

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

Скорость обучения (learning rate)

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

пример обучения нейронная сеть

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

пример обучения нейронная сеть

Функция активации (activation function)

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

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

пример обучения нейронная сеть

Функция потери (loss function)

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

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

Функция потерь одномерна и не является вектором, поскольку она оценивает, насколько хорошо нейронная сеть работает в целом.

Некоторые известные функции потерь:

Cреднеквадратичное отклонение – самая простая фукция потерь и наиболее часто используемая. Она задается следующим образом:

пример обучения нейронная сеть

Функция потерь в нейронной сети должна удовлетворять двум условиям:

Глубокие нейронные сети

Глубокое обучение (deep learning) – это класс алгоритмов машинного обучения, которые учатся глубже (более абстрактно) понимать данные. Популярные алгоритмы нейронных сетей глубокого обучения представлены на схеме ниже.

пример обучения нейронная сетьПопулярные алгоритмы нейронных сетей (http://www.asimovinstitute.org/neural-network-zoo)

Более формально в deep learning:

Пример

Рассмотрим однослойную нейронную сеть:

пример обучения нейронная сеть

Здесь, обучается первый слой (зеленые нейроны), он просто передается на выход.

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

пример обучения нейронная сеть

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

пример обучения нейронная сеть

Не следует путать с широкой нейронной сетью.

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

Изучая английскую грамматику, требуется знать огромное число понятий. В этом случае однослойная широкая нейронная сеть работает намного лучше, чем глубокая нейронная сеть, которая значительно меньше.

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

Главное — баланс

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

Проклятье размерности

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

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

Компромисс

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

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

пример обучения нейронная сеть

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

Следовательно, как правило, невозможно иметь маленькое смещение и маленькую дисперсию одновременно.

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

Источник

Нейросеть — обучение без учителя. Метод Policy Gradient

Доброго времени суток, Хабр

Настоящей статьей открываю цикл статей о том, как обучать нейронные сети без учителя.
(Reinforcement Learning for Neuron Networks)

В цикле планирую сделать три статьи по теории и реализации в коде трех алгоритмов обучения нейронных сетей без учителя. Первая статья будет по Policy Gradient, вторая по Q-learning, третья статья заключительная будет по методу Actor-Critic.

Статья Первая — Обучение без учителя методом Policy Gradient
(Policy Gradient for Reinforcement Learning)

Введение

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

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

Алгоритму обучающемуся без учителя достаточно только давать обратный отклик на его действия или решения — хороши они были или нет.

Глава 1. Обучение с учителем

Так что же это такое — Обучение с учителем или без. Разберемся более подробно в этом на примерах из современного машинного обучения и задач которые оно решает.

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

На примере задачи классификации для датасета Mnist правильным ответом который дает человек алгоритму — это будет метка класса цифры в обучающей выборке.

пример обучения нейронная сеть

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

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

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

Это и есть ключ к пониманию того, чем принципиально алгоритм обучения с учителем отличается от алгоритма обучения без учителя.

Глава 2. Обучение без учителя

Разобравшись что же это такое — обучение с учителем, разберемся теперь, что же это такое — обучение без учителя.

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

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

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

Поэтому конечному результату мы и дадим алгоритму понять, хорошо он решил нашу задачу или нет.

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

пример обучения нейронная сеть

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

пример обучения нейронная сеть

пример обучения нейронная сеть

пример обучения нейронная сеть

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

Глава 3. Агент, Среда и Награда

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

Настало время ввести нам терминологию которой мы будем пользоваться в дальнейшем.
Агентом мы будем называть наш алгоритм который умеет анализировать состояние среды и совершать в ней какие-то действия.

Среда — виртуальный мир в котором существует наш Агент и своими действиями может менять его состояние…

Награда — обратная связь от Среды к Агенту как ответ на его действия.

пример обучения нейронная сеть

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

Если более подробно рассмотреть процесс взаимодействия агента со средой то его можно выразить следующей схемой

пример обучения нейронная сеть

St — состояние среды (state) на шаге t
at — действие агента (action) на шаге t
rt — награда (reward) на шаге t

В каждый момент времени t наш агент наблюдает состояние среды — St, выполняет действие — at, за что получает от среды награду — rt, поле чего среда переходит в состояние St+1, которое наблюдает наш агент, выполняет действие — at+1, за что получает от среды награду — rt+1 и таких состояний t у нас может быть бесконечное множество — n.

Глава 4. Параметризация задачи обучения без учителя

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

2) v(s) — value function
Функция ценности состояния — s. Она показывает нам насколько состояние s вообще ценно для нас с точки зрения награды

3) Q(s,a) — Q-function
Q функция оптимальной стратегии. Она позволяет нам согласно данной оптимальной стратегии в состоянии — s выбрать оптимальное для этого состояния действие — a

Первой рассмотрим функцию — policy function, как наиболее простую и интуитивно понятную для понимания функцию reinforcement learning.

Поскольку мы собираемся решать задачи reinforcement learning посредством нейронных сетей. То схематично мы можем параметризовать policy function через нейронную сеть следующим образом.

пример обучения нейронная сеть

На вход нейронной сети, будем подавать состояния — s, а выход нейросети сконструируем таким образом, чтобы выходным слоем нейросети был слой SoftMax, с количеством выходов равным количеству действий возможных для агента в нашей среде. Таким образом пропустив через слои нейросети состояние s на выходе мы получим распределение вероятностей для действий агента в состоянии s. Что собственно нам и требуется для того чтобы начать через алгоритм обратного распространения ошибки обучать нашу нейросеть и итеративно улучшать policy function, которая теперь по сути является нашей нейронной сетью.

Глава 5. Улучшение policy function через обучение нейросети

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

пример обучения нейронная сеть

где:
1 — истинные метки * log(предсказанные метки)
2 — сумма по всем примерам

Однако как же нам обучать нейросеть если у нас пока нет правильных меток для действий агента в состояниях S0-Sj? А они нам и не нужны, мы вместо правильных меток будем использовать награду которую агент получил от среды выполнив действие которое ему предсказала нейросеть.

пример обучения нейронная сеть

Имеем полное право так сделать потому что, для Cross Entropy Loss — yj — это истинные метки и для правильного класса и они равны единице, а для Policy Function Loss — rj — награда которую среда начислила агенту за действие которое он совершил. То есть rj служит как бы весом для градиентов при обратном распространении ошибки когда мы обучаем нейросеть.

Получена положительная награда — значит нужно увеличить веса нейросети куда градиент направлен.

пример обучения нейронная сеть

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

Глава 6. Сборка ДатаСета для обучения

Для того чтобы обучать нашего Агента — нейросеть средствами классического Machine Learning — через метод обратного распространения ошибки, нам нужно собрать датасет.

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

пример обучения нейронная сеть

а Y — который мы соберем в соответствии с состоянием S, это будет предсказанное действие нейросети — а и награда которую среда начислила агенту за это действие — r

пример обучения нейронная сеть

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

пример обучения нейронная сеть

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

Выйти из данной ситуации можно двумя способами:

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

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

пример обучения нейронная сеть

Гамма — коэффициент дисконтирования (убывания награды). Он всегда находится в диапазоне от 0 до 1. Обычно гамму берут в районе 0.95

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

Глава 7. Внутреннее устройство агента и среды

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

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

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

Глава 8. Обучение Агента

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

пример обучения нейронная сеть

Немного кода как собираем статистику

пример обучения нейронная сеть

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

Код для организации буфера памяти:

пример обучения нейронная сеть

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

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

пример обучения нейронная сеть

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

пример обучения нейронная сеть

пример обучения нейронная сеть

пример обучения нейронная сеть

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

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

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

Это и есть петля обучения при обучении без учителя методом Policy Gradient.

Глава 9. Эксперименты с Агентом и Средой

Запустим серию экспериментов по обучению нашего Агента.

Для экспериментов выберем следующие параметры среды:

пример обучения нейронная сеть

Для Агента выберем — сконструируем нейросеть — она будет сверточной (т.к. работаем с изображением) на выходе у нее будет 9 выходов (1-вправо, 2-влево, 3-вверх, 4-вниз, 5-вправо-вверх, 6-влево-вверх, 7-вправо-вниз, 8-влево-вниз, 9-ничего не делать) и SoftMax, чтобы получать вероятность для каждого действия.

Архитектура нейросети

Первый Conv2d слой 32 нейрона размер изображения 1*32*16
MaxPool2d слой размер изображения 32*16*8
Второй Conv2d слой 32 нейрона размер изображения 32*16*8
MaxPool2d слой размер изображения 32*8*4
Flatten — выпрямляем изображение в размер 1024
Linear слой на 1024 нейрона
Dropout(0.25) слой
Linear слой на 512 нейронов
Linear слой на 256 нейронов
Linear слой на 9 нейронов и SoftMax

пример обучения нейронная сеть

Код создания нейросети на Pytorch

пример обучения нейронная сеть

Поочередно запустим три цикла обучения Агента в Среде параметры которых разобрали выше:

Эксперимент № 1 — Агент научился решать задачу за 13600 циклов игры

Начальное состояние Агента

пример обучения нейронная сеть

График тренировки Агента

пример обучения нейронная сеть

Обученное состояние Агента

пример обучения нейронная сеть

Эксперимент № 2 — Агент научился решать задачу за 8250 циклов игры

Начальное состояние Агента

пример обучения нейронная сеть

График тренировки Агента

пример обучения нейронная сеть

Обученное состояние Агента

пример обучения нейронная сеть

Эксперимент № 3 — Агент научился решать задачу за 19800 циклов игры

Начальное состояние Агента

пример обучения нейронная сеть

График тренировки Агента

пример обучения нейронная сеть

Обученное состояние Агента

пример обучения нейронная сеть

Глава 10. Выводы

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

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

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

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

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

Таким образом запустив на практике эксперименты с обучением без учителя по методу Policy Gradient мы убедились, что обучение без учителя имеет место быть, и оно реально работает.
Агент самостоятельно обучился максимизировать свою награду в игре.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *