4

Итак, я читал о Q-learning и нейронных сетях. Я считаю, что у меня есть правильная идея, но я хотел бы получить второе мнение о моем коде для NN и обновлении с помощью Q-значений.Q-обучение в нейронной сети - Mountain Car

Я создал реализацию MatLab проблемы с Mountain Car и моей нейронной сетью. Я использую набор нейронных сетей для части NN.

Это сеть из 2-х входов, 5-20 скрытых (для экспериментов) и 3 выходов (соответствующих действий в горной машине)

скрытые блоки установлены на tansig, а выход purelin и обучение функции is traingdm

Это правильные шаги?

  1. получить inital состояние s -> [-0.5; 0.0]
  2. запустить сеть с Qs = net (s) ... это дает мне матрицу из 1x3 Q-значений, соответствующих каждому действию в исходном состоянии s.
  3. выбрать действие с помощью электронного жадного выбора
  4. имитировать горную машину и получить S'(новое состояние в результате выполнения действия а)
  5. запустить сеть с Qs_prime = нетто (S') в получить другую матрицу для значений Q s

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

  1. Вычисление QTarget, то есть = вознаграждение + гамма * Максимальное значение Q от s '?
  2. Создайте матрицу Targets (1x3) с Q-значениями из inital s и измените соответствующее значение Q для выполненного действия a как QTarget
  3. use net = Train (net, s, Targets) to обновить весы в NN
  4. s =
  5. повторения S'все выше для нового s

Пример:

 actions 
     1  2  3 
Qs = 1.3346 -1.9000 0.2371 

selected action 3(corresponding to move mountain car forward) 

Qs' = 1.3328 -1.8997 0.2463 

QTarget=reward+gamma*max(Qs') = -1+1.0*1.3328 = 0.3328 

s= [-5.0; 0.0] and Targets = 1.3346 -1.9000 0.3328 

Or I have this wrong and the Targets are 0 0 0.3328 

since we don't know how good the other actions are.. 

вот моя Матла б кода (я использую R2011 и Neural Network Toolbox)

%create a neural network 
num_hidden=5 
num_actions=3 
net= newff([-1.2 0.6; -0.07 0.07;], [num_hidden,num_actions], {'tansig', 'purelin'},'traingdm'); 

%network weight and bias initalization 
net= init(net); 

%turn off the training window 
net.trainParam.showWindow = false; 

%neural network training parameters 
net.trainParam.lr=0.01; 
net.trainParam.mc=0.1; 
net.trainParam.epochs=100 

%parameters for q learning 
epsilon=0.9; 
gamma=1.0; 


%parameters for Mountain car task 
maxEpisodes =10; 
maxSteps=5000; 
reset=false; 
inital_pos=-0.5; 
inital_vel=0.0; 

%construct the inital state 
s=[inital_pos;inital_vel]; 
Qs=zeros(1,3); 
Qs_prime=zeros(1,3); 

%training for maxEpisodes 
for i=1:maxEpisodes 
%each episode is maxSteps long 
for j = 1:maxSteps 

    %run the network and get Q values for current state Qs-> vector of 
    %current Q values for state s at time t Q(s_t) 
    Qs=net(s); 


    %select an action 
    if (rand() <= epsilon) 
     %returns max Q value over all actions 
     [Qs_value a]=max(Qs); 
    else 
     %return a random number between 1 and 3(inclusive) 
     a = randint(1,1,3)+1; 
    end 

    %simulate a step of Mountain Car 
    [s_prime, action, reward, reset] = SimulateMC(s,a); 

    %get new Q values for S_prime -> Q(s_t+1) 
    Qs_prime=net(s_prime); 

    %Compute Qtarget for weight updates given by r+y*max Q(s_t+1) over all 
    %actions 
    Q_target = reward+gamma*max(Qs_prime); 

    %Create a Targets matrix with the orginal state s q-values 
    Targets=Qs; 

    %change q-value of the original action to the QTarget 
    Targets(a)=Q_target; 


    % update the network for input state s and targets 
    [net TR]=train(net,s,Targets); 
    %update the state for next step 
    s=s_prime; 
    %display exactly where the car is to user the NN learns if this output reaches -0.45 
    disp(s(1)) 

    if reset==true 
     bestSteps=j 
     break 
    end 
end 
%reset for new episode 
reset=false; 
s=[inital_pos;inital_vel]; 
end 

%test the network 
%reset state 
s=[inital_pos;inital_vel]; 
for i=1:maxEpisodes 
    for j=1:maxSteps 
     %run the network and get Q values for current state 
     Qs=net(s); 

     %select the max action always 
     [Qs_value a]=max(Qs); 

     %simulate a step of Mountain Car 
     [s_prime, action, reward, reset] = SimulateMC(s,a); 

     s=s_prime; 
     disp(s(1)) 
    end 
    s=[inital_pos;inital_vel]; 
end 

Благодаря

ответ

0

Проблема представления

Использование нейронных сетей для представления функции стоимости действия является хорошей идеей. Было показано, что это хорошо работает для ряда приложений. Однако более естественным представлением для Q-функции будет сеть, которая принимает объединенный вектор действия действия как входной сигнал и имеет скалярный выход. Но пока количество действий является конечным и небольшим, должно быть возможно сделать это, как и вы. Просто помните, что, строго говоря, вы не изучаете Q (s, a), а несколько функций значения V (s) (по одному для каждого действия), которые имеют одинаковые веса, за исключением последнего слоя.

Испытание

Это прямо вперед жадная эксплуатация функции Q. Должно быть правильно.

Изучение

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

Эффективность данных - еще одна вещь, о которой нужно думать. Вы можете делать несколько обновлений сети с каждым примером перехода. Обучение будет быстрее, но вам нужно будет хранить каждый образец перехода в памяти.

Online vs. batch: Если вы храните свой образец, вы можете выполнять пакетное обучение и избегать проблемы, когда последние образцы уничтожают уже обнаруженные части проблемы.

Литература

Вы должны взглянуть на

Смежные вопросы