4

だから私はQラーニングとニューラルネットワークについて読んでいます。私はそれについて正しい考えを持っていると信じていますが、NN のコードと Q 値での更新についてセカンドオピニオンを持ちたいと思います。

Mountain Car 問題とニューラル ネットワークの MatLab 実装を作成しました。NN 部分にはニューラル ネットワーク ツールボックスを使用しています。

これは、2 つの入力、5 ~ 20 の非表示 (実験用)、および 3 つの出力 (マウンテンカーでのアクションに対応) のネットワークです。

隠れユニットは tansig に設定され、出力は purelin で、トレーニング関数は traingdm です。

これは正しい手順ですか?

  1. 初期状態を取得 s -> [-0.5; 0.0]
  2. Qs=net(s) でネットワークを実行します ... これにより、初期状態 s の各アクションに対応する 1x3 Q 値の行列が得られます。
  3. e-greedy 選択を使用してアクションを選択する
  4. マウンテンカーをシミュレートし、s' (アクション a を実行した結果としての新しい状態) を取得します。
  5. Qs_prime=net(s') でネットワークを実行して、s' の Q 値の別の行列を取得します。

NN の重みを適切に更新する方法を理解する必要があるため、これが正しいかどうかはわかりません。

  1. QTarget を計算します。つまり、= 報酬 + ガンマ * s' からの最大 Q 値?
  2. 初期の s からの Q 値を使用してターゲット マトリックス (1x3) を作成し、実行されたアクション a の対応する Q 値を QTarget に変更します。
  3. net=Train(net,s,Targets) を使用して、NN の重みを更新します
  4. s=s'
  5. 新しい 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

ありがとう

4

1 に答える 1

0

問題表現

ニューラル ネットワークを使用してバリュー アクション関数を表現することをお勧めします。これは、多くのアプリケーションでうまく機能することが示されています。ただし、Q 関数のより自然な表現は、結合された状態とアクションのベクトルを入力として受け取り、スカラー出力を持つネットです。しかし、アクションの数が有限で小さい限り、あなたのようにそれを行うことができるはずです. 厳密に言えば、学習しているのは Q(s,a) ではなく、複数の値関数 V(s) (アクションごとに 1 つ) であり、最後のレイヤーを除いて同じ重みを共有していることを覚えておいてください。

テスト

これは、Q 関数の簡単な貪欲な利用です。正しいはずです。

学ぶ

ここにはいくつかの落とし穴があります。考えなければなりません。1つ目はスケーリングです。ニューラル ネットワークの学習では、入力を同じ範囲にスケーリングする必要があります。出力層でシグモイド活性化関数を使用する場合は、ターゲット値もスケーリングする必要がある場合があります。

もう 1 つの考慮事項は、データの効率性です。各遷移サンプルでネットの複数の更新を行うことができます。学習は高速になりますが、各遷移サンプルをメモリに保存する必要があります。

オンライン vs. バッチ: サンプルを保存すると、バッチ学習を行うことができ、最近のサンプルが問題の既に学習した部分を破壊するという問題を回避できます。

文学

あなたは見てみるべきです

于 2013-08-30T08:52:18.537 に答える