Обучение с подкреплением — это типы нейронных сетей, которые решают проблему, которую другие методы обучения не могут решить в открытой среде. Давайте рассмотрим основы машинного обучения и узнаем, как применять метод обучения с подкреплением в играх Flappy Bird и Mario.

Введение

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

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

Давайте рассмотрим задачу: Получите изображение и предскажите тип животного на этом изображении.

Нам нужно найти входное изображение собаки или кошки, поэтому вывод должен быть в 2 измерениях, одно для собаки и одно для кошки. Мы пометим [1 0] для собаки и [0 1] для кошки.

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

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

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

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

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

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

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

Примените обучение с подкреплением в Flappy Bird

Благодаря Flappy Bird Clone Source мы можем легко получить данные игры в качестве входных данных.

Требования основной игры:

  • питон
  • пустышка, панды
  • пигейм

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

Во-первых, создайте сеть самостоятельно, чтобы нам было легче ее понять.

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

def sigmoid(x):
    return 1/(1+np.exp(-x))
def relu(x):
    return np.maximum(0, x)
def sigmoidDer(x):  
    return sigmoid(x)*(1. - sigmoid(x))
def reluDer(self, x): 
    return 1 * (x > 0)

Sigmoid и ReLu — это наша функция активации. Как мы видим в сети, иногда активируется не каждый узел. Кроме того, мы должны ввести значение от 0 до 1 в узел.

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

Сетевой класс:

def __init__(self, w1=None, w2=None):
    self.inputNode = 3
    self.outputNode = 1
    self.hiddenLayerNode = 5
    self.w1 = w1
    self.w2 = w2
    self.hOut = None
    self.fOut = None
def forward(self, X):
    # inputs to hidden layer
    hOut = sigmoid(np.dot(self.w1, X))
    self.hOut = hOut
    # final output
    fOut = sigmoid(np.dot(self.w2, hOut))
    self.fOut = fOut
    return fOut
def backward(self, X, error):
    deltaError = error*sigmoidDer(self.fOut)
    hiddenError = np.dot(deltaError, np.transpose(self.w2))
    deltaHidden = hiddenError.dot(self.w2.T)
    self.w1 += np.dot(np.transpose(X), deltaHidden)
    self.w2 += np.dot(np.transpose(self.hOut), deltaError)

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

Количество входных узлов равно 3, поэтому давайте ненадолго остановимся и посмотрим на нашу проблему с Flappy Bird.

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

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

  • Вертикальное положение следующей трубы
  • Расстояние
  • Высота птицы

Мы нормализуем его как вход в нейронную сеть.

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

def __init__(self):
    self.bestSOFar = 0
    self.score = 0
    self.gen = 0
    self.position = None
    self.brain = net()
    self.distance = None
    self.expectedPosition = None
    self.nextHole = None
    self.weight = np.random.rand(20,1)
    self.gen = 0
def initialize(self, position, distance, nextHole, expectedPosition):
    self.position = position
    self.distance = distance
    self.nextHole = nextHole
    self.expectedPosition = expectedPosition
def move(self):               
    self.score += 1/30
    jump = self.think()
    # print(jump)
    #print(self.score)
    if jump >= 0.705:
        return True
    else:
        return False
def think(self):
    self.brain.decode(self.weight)
    inputLayer = [self.position, self.distance, self.nextHole]
    maxValue = abs(max(max(inputLayer),min(inputLayer), key=abs))
    inputLayer = np.divide(inputLayer,maxValue)
    jump = self.brain.forward(inputLayer)
    self.learn()
    return jump
def learn(self):
    self.brain.backward([self.position, self.distance, self.nextHole], self.position - self.expectedPosition)
    self.weight = self.brain.encode()
    # print(self.weight)
def printBotStat(self):
    print('stat:\n{}\n{}\n{}'.format(self.distance, self.speed, self.upperPipe))
def dump(self):
    fil = open('weight.json', 'w')
    json.dump(self.weight, fil)
    fil.close()
    print('saved')
def increaseGen(self):
    self.gen += 1

Результат только нейронной сети

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

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

В этом случае должно работать метаобучение.

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

У нас есть 3 входа, 1 выход и скрытый слой с 7 узлами, используя Keras, мы получаем более читаемый код.

for i in range(population):
    model = Sequential()
    model.add(Dense(output_dim=7, input_dim=3))
    model.add(Activation("sigmoid"))
    model.add(Dense(output_dim=1))
    model.add(Activation("sigmoid"))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
    model.compile(loss="mse", optimizer=sgd, metrics=["accuracy"])
    currentPool.append(model)
    fitness.append(-100)

Используя универсальное обучение, мы выполняем следующие шаги:

  • Шаг 1: Создайте 50 ботов, каждый из которых имеет свою собственную нейронную сеть, и дайте боту поиграть, поэтому мы немного изменим нейронную сеть, нам также нужен массив для хранения фитнеса, чтобы знать, какая птица получит лучший результат.
  • Шаг 2: Выберите 2 бота с лучшими результатами. Мы знаем, что это лучший по фитнес-функции. В Flappy Bird мы используем время выживания.
  • Шаг 3: Имея 2 ботов, мы используем их веса для генерации следующего поколения с кроссовером и мутацией.
  • Затем повторите шаг снова и снова, чтобы найти лучший вес без обратного распространения.

Результат генетического обучения

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

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

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

Формула говорит, что значение Q принимает состояние и действие в качестве параметра, равного функции вознаграждения, которая также является функцией состояния, действия и максимального вознаграждения будущего состояния для того же действия. Q(s’,a) снова зависит от Q(s’,a), у которого тогда будет коэффициент гаммы в квадрате. Итак, значение Q зависит от значений Q будущих состояний, как показано здесь:

В норме гамма равна 0,95 или 0,9, о гамме поговорим позже. Итак, с идеей, поскольку это рекурсивное уравнение, мы можем начать с произвольных предположений для всех значений q. С опытом она сойдется к оптимальной политике. В практических ситуациях это реализовано как обновление:

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

Значения q будут сохранены в виде файла json, например:

"-30_20_10": [124.90673597144435, 0]

Мы сохраним состояние как строку, в данном случае это:

  • -30: расстояние
  • 20: перепад высот = вертикальное согласование трубы — вертикальное согласование птицы
  • 10: скорость падения

Состояние «-30_20_10» имеет значение [124.90673597144435, 0], это среднее значение q, когда оно действует, действие jump(1) равно 124,906… а не jump равно 0.

Результат обучения q

Q Характеристика обучения

  • Весь прошлый опыт хранится у пользователя в памяти
  • Следующее действие определяется максимальным выходом Q-сети
  • Функция потерь здесь представляет собой среднеквадратичную ошибку предсказанного значения Q и целевого значения Q — Q*. Это в основном проблема регрессии. Однако здесь мы не знаем целевого или фактического значения, поскольку имеем дело с проблемой обучения с подкреплением.

Заключение по Q Learning

  • Deep Q Learning — это решение для конечного входного состояния.
  • Награда - выжить как можно дольше. Так что птица должна выжить, это наша политика. Согласно состоянию, птица сама будет оценивать значение q следующего этапа в зависимости от всех следующих состояний.
  • Общая сеть довольно хороша, однако на нашу производительность влияет множество случайных полей.
  • Глубокое обучение с подкреплением хорошо работает в открытой среде, оно исследует окружающую среду.

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

Сравнение

Итак, далее мы будем использовать новые алгоритмы, чтобы заставить бота играть в игру Марио.

Примените обучение с подкреплением в Super Mario

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

Идея алгоритмов асинхронного преимущества актера и критика

Объяснение простым языком (цитируется из лучшего объяснения Viet Nguyen)

Если вы уже знакомы с обучением с подкреплением в целом и A3C в частности, вы можете пропустить эту часть. Я пишу эту часть, чтобы объяснить, что такое алгоритм A3C, как и почему он работает, для людей, которые интересуются или любопытны в отношении A3C или моей реализации, но не понимают стоящий за ним механизм. Поэтому никаких предварительных знаний для прочтения этой части от вас не требуется ☺️

Если поискать в Интернете, можно найти множество статей, представляющих или объясняющих A3C, а в некоторых даже приводится пример кода. Тем не менее, я хотел бы использовать другой подход: разбить название «Асинхронные агенты-критики» на более мелкие части и объяснить в агрегированном виде.

Актер-критик

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

Преимущество Актер-критик

Чтобы ребенок учился быстрее и стабильнее, папа вместо того, чтобы говорить сыну, насколько хорош его поступок, будет говорить ему, насколько его поступок лучше или хуже по сравнению с другими действиями (или «виртуальное» среднее действие). Пример стоит тысячи слов. Давайте сравним 2 пары папы и сына. Первый папа дает сыну 10 конфет за 10 класс и 1 конфету за 1 класс в школе. Второй папа, напротив, дает сыну 5 конфет за 10 класс, и «наказывает» сына, не разрешая ему смотреть любимый сериал в течение дня, когда он получит 1 класс. Как вы думаете? Второй папа кажется немного умнее, верно? В самом деле, вы редко сможете предотвратить плохие поступки, если будете «поощрять» их небольшим вознаграждением.

Актер-критик асинхронного преимущества

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

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

Итак, мы сделаем следующее:

  • Создайте 6 воркеров, у каждого воркера своя сеть
  • Создайте 6 оценщиков для 6 рабочих и 1 для глобального, чтобы увидеть, насколько хорошо работает бот.
  • И мы надеемся, что каждый бот немного «научится» у окружающей среды, чтобы внести свой вклад в нашу глобальную сеть.
  • Используйте нейронную сеть свертки для кадра в качестве входных данных A3C, мы называем состояние кадра

Актер — Критик — это модель, передающая кадр в нейронную сеть свертки, которая будет вводом каждого работника в A3C.

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

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

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

Результат

Заключение по А3С

  • A3C — это алгоритмы на основе ЦП, использующие гораздо меньше ресурсов, чем многие массивные методы.
  • Запуская больше воркеров асинхронно, вы, по сути, собираете гораздо больше обучающих данных, что ускоряет сбор данных.
  • Поскольку каждый рабочий экземпляр также имеет свою собственную среду, вы получите более разнообразные данные, которые, как известно, делают сеть более надежной и дают лучшие результаты! Нет воспроизведения поведения, поэтому не нужно много ресурсов.

Вывод

В этом длинном блоге мы познакомимся с основами машинного обучения и узнаем, как применять метод обучения с подкреплением в играх Flappy Bird и Mario. В NeurIPS 2020 представлена ​​статья об увеличении количества и качества обучения с подкреплением, представлены дополнительные идеи о модели актер-критик, q-обучение. Обучение с подкреплением — интересный и перспективный путь в будущем.

Расширить проблему

  • В робототехнике — эффективно находить комбинацию электрических сигналов для управления роботизированными руками (для выполнения действия) или ногами (для ходьбы).
  • В производстве — роботы для перевозки посылок или сборки конкретных деталей автомобилей.
  • В вооруженных силах - среди прочего для логистики и для оказания автоматической помощи людям в анализе окружающей среды перед действиями.
  • В управлении запасами — для сокращения времени прохождения и использования пространства или для оптимизации правил диспетчеризации. Энергетические системы — для прогнозирования и минимизации потерь при передаче.
  • В финансовом секторе — например, в торговых системах для генерации альфы или в качестве помощника, позволяющего трейдерам и аналитикам экономить время.
  • Управление автономным вертолетом
  • Для сложных симуляций — например. робот футбол
  • В маркетинге — для кросс-канальной оптимизации кампании и максимизации долгосрочной прибыли от кампании.
  • AdTech — оптимизация стратегии ценообразования для рекламы с целью максимизации отдачи в рамках заданного бюджета.
  • Оптимизация управления энергопотреблением — снижение затрат на электроэнергию в центре обработки данных на 40 %!

Читайте оригинальную и последнюю статью по адресу:

https://www.neurond.com/blogs/reinforcement-learning-apply-ai-in-open-environment

NeurondAI — это трансформационный бизнес. Свяжитесь с нами по адресу:

Веб-сайт: https://www.neurond.com/