Q-learning в нейронной сети - Mountain Car
Итак, я читал о Q-learning и нейронных сетях. Я считаю, что у меня есть правильная идея для этого, однако я хотел бы получить второе мнение о моем коде для NN и обновлении с Q-значениями.
Я создал MatLab-реализацию задачи Mountain Car и мою нейронную сеть, я использую набор инструментов нейронной сети для NN-части.
Это сеть из 2 входов, 5-20 скрытых (для экспериментов) и 3 выходов (соответствующих действиям в горной машине)
скрытые юниты настроены на tansig, а выходной результат - purelin, а обучающая функция - traingdm.
Это правильные шаги?
- получить исходное состояние s -> [-0,5; 0,0]
- запустить сеть с Qs=net(s) ... это дает мне матрицу Q-значений 1x3, соответствующих каждому действию в начальном состоянии s.
- выберите действие с помощью e-жадного выбора
- смоделируйте горный автомобиль и получите s' (новое состояние в результате выполнения действия a)
- запустите сеть с Qs_prime=net(s'), чтобы получить другую матрицу для Q-значений s'
Теперь вот где я не уверен, что это правильно, так как я должен выяснить, как правильно обновить веса для NN.
- Вычислить QTarget, то есть = вознаграждение + гамма * Макс. Значение Q из s'?
- Создайте матрицу Targets ( 1x3) с Q-значениями из начальных s и измените соответствующее Q-значение для выполненного действия a на QTarget
- используйте net=Train(net,s,Targets) для обновления весов в NN
- 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..
вот мой код Matlab (я использую 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
Спасибо
1 ответ
Представление проблемы
Использование нейронных сетей для представления функции "значение-действие" - хорошая идея. Было показано, что это хорошо работает для ряда приложений. Однако более естественным представлением для Q-функции была бы сеть, которая получает объединенный вектор действия состояния в качестве входных данных и имеет скалярный выходной сигнал. Но пока количество действий ограничено и невелико, должно быть возможно сделать это, как вы. Просто помните, что, строго говоря, вы изучаете не Q(s,a), а несколько функций значений V(s) (по одной для каждого действия), которые имеют одинаковые веса, за исключением последнего уровня.
тестирование
Это прямая жадная эксплуатация функции Q. Должно быть правильно.
Учусь
Здесь есть несколько подводных камней, о которых вам придется подумать. Первый - это масштабирование. Для обучения нейронной сети вам действительно необходимо масштабировать входные данные в том же диапазоне. Если вы используете сигмоидальную функцию активации в выходном слое, вам также может понадобиться масштабировать целевые значения.
Эффективность данных - это еще одна вещь, о которой нужно думать. Вы можете сделать несколько обновлений сети с каждым примером перехода. Обучение будет быстрее, но вы должны будете хранить каждый образец перехода в памяти.
Онлайн против партии: если вы храните свой образец, вы можете выполнить пакетное обучение и избежать проблемы, заключающейся в том, что последние образцы разрушают уже изученные части проблемы.
Литература
Вы должны взглянуть на