Q-learning в нейронной сети - Mountain Car

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

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

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

скрытые юниты настроены на tansig, а выходной результат - purelin, а обучающая функция - traingdm.

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

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

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

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

Пример:

       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. Должно быть правильно.

Учусь

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

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

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

Литература

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

Другие вопросы по тегам