Домашнее задание от МТИ: пишем нейросеть для манёвров в дорожном трафике

в 21:13, , рубрики: deep learning, автопилот, беспилотный автомобиль, искусственный интеллект, нейросеть, Программирование

Домашнее задание от МТИ: пишем нейросеть для манёвров в дорожном трафике - 1

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

Участникам предлагают спроектировать агента ИИ, а именно, спроектировать и обучить нейронную сеть, которая покажет себя лучше конкурентов в плотном дорожном потоке. В управление агенту даётся один автомобиль (красного цвета). Он должен научиться маневрировать в потоке наиболее эффективным способом.

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

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

Базовый код

//<![CDATA[

// a few things don't have var in front of them - they update already existing variables the game needs
lanesSide = 0;
patchesAhead = 1;
patchesBehind = 0;
trainIterations = 10000;

var num_inputs = (lanesSide * 2 + 1) * (patchesAhead + patchesBehind);
var num_actions = 5;
var temporal_window = 3;
var network_size = num_inputs * temporal_window + num_actions * temporal_window + num_inputs;

var layer_defs = [];
layer_defs.push({
    type: 'input',
    out_sx: 1,
    out_sy: 1,
    out_depth: network_size
});
layer_defs.push({
    type: 'fc',
    num_neurons: 1,
    activation: 'relu'
});
layer_defs.push({
    type: 'regression',
    num_neurons: num_actions
});

var tdtrainer_options = {
    learning_rate: 0.001,
    momentum: 0.0,
    batch_size: 64,
    l2_decay: 0.01
};

var opt = {};
opt.temporal_window = temporal_window;
opt.experience_size = 3000;
opt.start_learn_threshold = 500;
opt.gamma = 0.7;
opt.learning_steps_total = 10000;
opt.learning_steps_burnin = 1000;
opt.epsilon_min = 0.0;
opt.epsilon_test_time = 0.0;
opt.layer_defs = layer_defs;
opt.tdtrainer_options = tdtrainer_options;

brain = new deepqlearn.Brain(num_inputs, num_actions, opt);

learn = function (state, lastReward) {
    brain.backward(lastReward);
    var action = brain.forward(state);

    draw_net();
    draw_stats();

    return action;
}

//]]>

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

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

Разные режимы Road Overlay позволяют понять, как работает и обучается нейросеть. В режиме Full Map вся дорога представлена в виде ячеек сетки, а в режиме Learning Input показано, какие ячейки учитываются на входе нейросети для решения о манёвре.

Домашнее задание от МТИ: пишем нейросеть для манёвров в дорожном трафике - 2

Размер «контрольной зоны» на входе нейросети определяется следующими переменными:

lanesSide = 1;
patchesAhead = 10;
patchesBehind = 0;
trainIterations = 10000;

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

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

Управление автомобилем осуществляет функция learn, которая учитывает текущее состояние агента (аргумент state), награду за предыдущий шаг (lastReward, средняя скорость в милях/ч) и возвращает одно из следующих значений:

var noAction = 0;
var accelerateAction = 1;
var decelerateAction = 2;
var goLeftAction = 3;
var goRightAction = 4;

То есть не предпринимать никаких действий (0, держаться своей полосы и скорости), ускориться (1), затормозить (2), перестроиться влево (3), перестроиться вправо (4).

Снизу от блока с кодом — некоторая служебная информация о состоянии нейросети, кнопки для начала обучения нейросети и для запуска испытаний.

Результатом испытательного заезда станет средняя скорость, которую показал агент на трассе (в милях/час). Свой результат вы можете сравнить с результатами других программистов. Но следует учитывать, что «испытательный заезд» показывает только примерную ориентировочную скорость, с небольшим элементом случайности. Во время этого теста нейросеть прогоняют через десять 30-минутных заездов с вычислением средней скорости в каждом заезде, а потом результат вычисляется как средняя медианная скорость десяти скоростей в этих заездах. Если отправить нейросеть на конкурс, то организаторы соревнований запустят свой собственный тест и определят истинную скорость, которую показывает беспилотный автомобиль.

Домашнее задание от МТИ: пишем нейросеть для манёвров в дорожном трафике - 3
Результат с 5 полосами, 10 клетками впереди, 3 сзади, 20000 итераций, 12 нейронами

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

layer_defs.push({
    type: 'fc',
    num_neurons: 1,
    activation: 'relu'
});

Пока что максимальные результаты на конкурсе показали преподаватель курса Лекс Фридман (74,45 мили/ч) и читатель Антон Печенко parilo (74,41 мили/ч). Возможно, в комментариях parilo объяснит, с какими настройками он это сделал. Интересно, изменял ли он код каким-то образом, или ограничился подбором четырёх базовых параметров и количества нейронов в скрытом слое.

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

Студенты курса 6.S094: Deep Learning for Self-Driving Cars обязаны показать в игре результат минимум 65 миль в час, чтобы преподаватель Лекс Фридман засчитал им это задание.

Автор: alizar

Источник

Поделиться

* - обязательные к заполнению поля