DARPA Challenge в песочнице

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

image

Когда-то давно, бум online-образования только начинался, я прошел курс на ai-class.com. Захотелось сделать простую игру, в которой бы нейронная сеть обучалась, наблюдая за действиями пользователя. Игру хотелось сделать в стиле flappy birds, обучение должно было происходить в реальном времени, чтобы в любой момент можно было передать управление нейронной сети. В итоге я сделал маленький симулятор управления машинкой, которая обучается ездить сама. Получилась интересная комбинация pygame, pytorch и multiprocessing. Если интересно, добро пожаловать под кат.

Идею с игрой упростил до задачи управлять машинкой, которая едет по сгенерированной дороге со случайными препятствиями. Реализация симулятора была моим первым опытом с pygame.
На скриншотах, справа от дороги показаны веса всех слоев нейронной сети; слева — необученная сеть, справа — уже содержит тайные знания и что-то умеет.

Принцип работы


После запуска сеть инициализируется случайными значениями. На каждом кадре запоминаются нормированные показания 24х лидаров и последняя команда пользователя (left, right, straight). Таким образом получаем задачу классификации с тремя классами. Когда набирается N примеров для обучения (в данном случае 500), они отправляются в task_queue, где их ожидает модель для обучения в параллельном процессе. После обучения, состояние модели отправляется в result_queue, где в основном процессе обновляются параметры модели, рисуются новые значения весов, и пользователь может переключиться в режим автопилота.

Стоит отметить проблемы при обучении на таких данных:
  • Чаще всего приходится ехать прямо, поэтому обучающая выборка сильно не сбалансирована, и после обучения такая модель будет иметь тенденцию проезжать сквозь повороты. Исправить это можно отсечением примеров преобладающего класса (down-sample the majority class)
  • Когда автопилот попадает в критические ситуации, модель не знает что с этим делать, т.к. этого не было в обучающих данных. В моей версии машинка просто врежется, но решением было бы «телепортировать» машинку в критическую ситуацию и показать, как из нее выруливать.


Модель и обучение


Я использовал следующую модель из 24х входных нейронов и трех скрытых слоев, на выходе — 3 нейрона, максимальное значение есть предсказанная команда. Код выглядит вот так:
class Model(nn.Module):
    def __init__(self, in_features=24, hidden=[56, 48, 48], out_features=3):
        super().__init__()
        layer_sizes = [in_features] + hidden
        layers = []

        for i in range(len(layer_sizes) - 1):
            layers.append(nn.Linear(layer_sizes[i], layer_sizes[i + 1]))
            layers.append(nn.ReLU(inplace=True))

        layers.append(nn.Linear(layer_sizes[-1], out_features))
        self.layers = nn.Sequential(*layers)

    def forward(self, x):
        return self.layers(x)


Обучение — метод обратного распространения ошибки, можно найти в статьях по pytorch:
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.005)

epochs = 7000

for i in range(epochs):
    y_pred = model.forward(X_train)
    loss = criterion(y_pred, y_train)

    if i % 100 == 1:
        print(f'epoch: {i:2}  loss: {loss.item():10.8f}')

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()


Ниже видео, как это работает:


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

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

Спасибо за внимание!

P.S. Картинки предоставлены ilyar
Источник: https://habr.com/ru/post/526872/


Интересные статьи

Интересные статьи

Один из ключевых сценариев работы в CRM это общение с клиентом в удобном для него канале. По почте, по телефону, по SMS или в мессенджере. Особенно выделяется WhatsApp — интеграцию с ...
Возможность интеграции с «1С» — это ключевое преимущество «1С-Битрикс» для всех, кто профессионально занимается продажами в интернете, особенно для масштабных интернет-магазинов.
Но если для интернет-магазина, разработанного 3–4 года назад «современные» ошибки вполне простительны потому что перед разработчиками «в те далекие времена» не стояло таких задач, то в магазинах, сдел...
Несмотря на то, что “в коробке” с Битриксом уже идут модули как для SOAP (модуль “Веб сервисы” в редакции “Бизнес” и старше), так и для REST (модуль “Rest API” во всех редакциях, начиная с...
Если вы последние лет десять следите за обновлениями «коробочной версии» Битрикса (не 24), то давно уже заметили, что обновляется только модуль магазина и его окружение. Все остальные модули как ...