Policy gradient methods

ConvNetJS — это JavaScript-библиотека для построения и обучения нейронных сетей, включая сверточные сети и сети общего назначения. Среди методов обучения с подкреплением она поддерживает реализацию policy gradient — подхода, при котором оптимизируется стратегия агента напрямую через градиент функции вознаграждения.

Представление политики

Политика ( _(a|s) ) в методах градиента политики задаётся нейронной сетью, параметризованной вектором (). На вход сети подается состояние среды (s), а на выходе формируется вероятностное распределение по действиям (a). В ConvNetJS сеть может быть реализована как многослойный перцептрон (MLP):

var layer_defs = [];
layer_defs.push({type:'input', out_sx:1, out_sy:1, out_depth:state_size});
layer_defs.push({type:'fc', num_neurons:128, activation:'relu'});
layer_defs.push({type:'fc', num_neurons:action_size, activation:'softmax'});
var net = new convnetjs.Net();
net.makeLayers(layer_defs);

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

Вычисление градиента политики

Градиент политики выводится из функции вознаграждения (R) и логарифма вероятности выбранного действия:

[ _J() = *{} ]

В ConvNetJS логарифм вероятности действия вычисляется через net.forward() и выбор действия:

var state_vol = new convnetjs.Vol(state);
var action_probs = net.forward(state_vol);
var action = sampleAction(action_probs); // случайный выбор по вероятностям

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

var dlogps = new convnetjs.Vol(action_probs.w.slice());
for(var i=0;i<action_size;i++){
    dlogps.w[i] = (i === action ? 1.0 : 0.0) - action_probs.w[i];
}

Обновление параметров сети

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

for(var i=0;i<dlogps.w.length;i++){
    dlogps.w[i] *= discounted_reward;
}
net.backward(dlogps);

Здесь discounted_reward — накопленное вознаграждение с дисконтом по времени. Обновление параметров выполняется через встроенный оптимизатор ConvNetJS:

var trainer = new convnetjs.SGDTrainer(net, {learning_rate:0.01, momentum:0.9});
trainer.update();

Обработка дисконтов и нормализация

Эффективная реализация policy gradient требует нормализации дисконтов для стабилизации градиентов:

function discount_rewards(rewards, gamma){
    var discounted = [];
    var running_add = 0;
    for(var t=rewards.length-1; t>=0; t--){
        running_add = running_add * gamma + rewards[t];
        discounted[t] = running_add;
    }
    return discounted;
}
function normalize(arr){
    var mean = arr.reduce((a,b)=>a+b)/arr.length;
    var std = Math.sqrt(arr.map(x=>(x-mean)*(x-mean)).reduce((a,b)=>a+b)/arr.length);
    return arr.map(x => (x-mean)/std);
}

Нормализация ускоряет сходимость и предотвращает чрезмерное раскачивание весов.

Практическая организация обучения

  1. Инициализация сети — создание MLP с softmax на выходе.
  2. Сбор эпизода — выбор действий по вероятностной политике и накопление вознаграждений.
  3. Обработка вознаграждений — вычисление дисконтов и нормализация.
  4. Обратное распространение — формирование градиентов через логарифм вероятности и умножение на вознаграждение.
  5. Обновление параметров — применение оптимизатора ConvNetJS для изменения весов.

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

Преимущества использования ConvNetJS

  • Полная реализация нейронных сетей на клиентской стороне без серверных зависимостей.
  • Прямой доступ к внутренним структурам сети (Vol), что упрощает формирование градиентов.
  • Гибкость в настройке архитектуры для сложных задач с большим числом состояний и действий.

Рекомендации по стабилизации обучения

  • Использовать небольшие шаги обучения (learning_rate) для предотвращения раскачивания.
  • Применять нормализацию вознаграждений и дисконтов.
  • Добавлять скрытые слои с ReLU или tanh для повышения выразительности политики.
  • Пакетное обновление градиентов по нескольким эпизодам для снижения дисперсии оценок.

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