Итак, я читал о Q-learning и нейронных сетях. Я считаю, что у меня есть правильная идея, но я хотел бы получить второе мнение о моем коде для NN и обновлении с помощью Q-значений.Q-обучение в нейронной сети - Mountain Car
Я создал реализацию MatLab проблемы с Mountain Car и моей нейронной сетью. Я использую набор нейронных сетей для части NN.
Это сеть из 2-х входов, 5-20 скрытых (для экспериментов) и 3 выходов (соответствующих действий в горной машине)
скрытые блоки установлены на tansig, а выход purelin и обучение функции is traingdm
Это правильные шаги?
- получить inital состояние s -> [-0.5; 0.0]
- запустить сеть с Qs = net (s) ... это дает мне матрицу из 1x3 Q-значений, соответствующих каждому действию в исходном состоянии s.
- выбрать действие с помощью электронного жадного выбора
- имитировать горную машину и получить S'(новое состояние в результате выполнения действия а)
- запустить сеть с Qs_prime = нетто (S') в получить другую матрицу для значений Q s
Теперь я не уверен, что это правильно, так как мне нужно выяснить, как правильно обновлять весы для NN.
- Вычисление QTarget, то есть = вознаграждение + гамма * Максимальное значение Q от s '?
- Создайте матрицу Targets (1x3) с Q-значениями из inital s и измените соответствующее значение Q для выполненного действия a как QTarget
- use net = Train (net, s, Targets) to обновить весы в NN
- s =
- повторения 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
Благодаря