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);
}
Нормализация ускоряет сходимость и предотвращает чрезмерное раскачивание весов.
Каждый эпизод служит отдельной итерацией градиентного шага, что позволяет постепенно улучшать стратегию агента.
Vol), что
упрощает формирование градиентов.learning_rate)
для предотвращения раскачивания.Методы градиента политики в ConvNetJS обеспечивают удобный инструмент для обучения агентов с вероятностными стратегиями, позволяя экспериментировать с архитектурами и параметрами в браузере без дополнительных серверных библиотек.