神经网络中的Q学习 - 山地车

时间:2013-08-13 14:54:34

标签: matlab machine-learning artificial-intelligence neural-network q-learning

所以我一直在读关于Q学习和神经网络的知识。我相信我有正确的想法,但我希望对我的NN代码和Q值更新有第二意见。

我已经创建了Mountain Car问题的MatLab实现和我的神经网络,我正在使用NN部分的神经网络工具箱。

这是一个由2个输入组成的网络,5-20个隐藏(用于实验)和3个输出(对应于山地车中的动作)

隐藏单位设置为tansig,输出为purelin,训练功能为traingdm

这是正确的步骤吗?

  1. 获得初始状态s - > [-0.5; 0.0]
  2. 使用Qs = net(s)运行网络...这给了我一个1x3 Q值矩阵,对应于初始状态s中的每个动作。
  3. 使用电子贪婪选择选择一个动作
  4. 模拟山地车并获得s'(执行行动a后的新状态)
  5. 使用Qs_prime = net(s')运行网络,以获取s'
  6. 的Q值的另一个矩阵

    现在我不确定这是否正确,因为我必须弄清楚如何正确更新NN的权重。

    1. 计算QTarget,即=奖励+ gamma *来自s'的最大Q值?
    2. 使用来自初始值的Q值创建目标矩阵(1x3),并将执行的操作a的相应Q值更改为QTarget
    3. 使用net = Train(net,s,Targets)来更新NN中的权重
    4. S = S'
    5. 重复上述所有新内容
    6. 示例:

             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和神经网络工具箱)

      %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 个答案:

答案 0 :(得分:0)

问题陈述

使用神经网络来表示价值 - 动作函数是一个好主意。已经表明,这适用于许多应用。然而,Q函数的更自然的表示将是网络,其接收组合的状态动作向量作为输入并且具有标量输出。但只要行动的数量有限而且很小,就应该像你一样做。请记住,严格来说,您不是在学习Q(s,a),而是学习多个值函数V(s)(每个动作一个),它们共享相同的权重,除了最后一层。

<强>测试

这是对Q功能的直接贪婪的利用。应该是正确的。

<强>学习

这里有几个陷阱,你必须要考虑。第一个是缩放。对于神经网络学习,您确实需要将输入扩展到相同的范围。如果在输出图层中使用S形激活函数,则可能还需要缩放目标值。

数据效率是另一个值得思考的问题。您可以使用每个转换样本对网络进行多次更新。学习会更快,但您必须将每个转换样本存储在内存中。

在线与批次:如果您存储样本,您可以进行批量学习,避免最近的样本破坏已经学过的部分问题。

<强>文献

你应该看看