Kerasの深さで強化してFlappyBirdノートを遊ぶことを学びます

3241 ワード

githubコードアドレス:https://github.com/yanpanlau/Keras-FlappyBird
これはkerasで実装されたDQNアルゴリズムを用いてFlappyBirdを遊ぶアルゴリズムである.
コード構造は非常に簡単で,ゲーム関連コードを除いてアルゴリズムに関連する関数は全部で2つしかない.
buildmodel()   trainNetwork()

このうちbuildmodel()は、階調マップを用いて入力するボリュームニューラルネットワーク(CNN)を定義しているが、4フレームのアニメーションを連続的につなぎ合わせ、つまりCNNが小鳥の現在の速度情報を知ることができるようにしている.
ネットワークの最終出力は2つのニューロンであり,それぞれ2つの動作(何もしない/ジャンプする)に対応するq値を表す.ゲームの各ステップでは,agentが実際に実行する動作としてq値の高い動作を選択する.ゲームができるだけ高い点数を得るためには、CNNを実際の状態である動作値関数に近づけることを目標としています.
trainNetwork()は、アルゴリズムの重点部分であり、まずリストを定義します.
D = deque()

このリストを用いて,過去に経験したすべての遷移モデル(St,At)→(St+1,Rt)を保存した.Stは現在の状態、Atは現在の実行動作、St+1は次の状態、Rtは現在の動作に与える奨励である.
最初は、小鳥にランダムに動作させ、すべての状態遷移モデルと奨励金をDに格納します.
指定回数に達した後、Dからニューラルネットワーク(CNNパラメータの更新)をランダムにサンプリングしながら、最新のCNNパラメータを利用して小鳥の行動を指導し、最新の転移モデルをDに保存するのが記憶再生機構だ.動作に一定のランダム性を持たせるために,動作がネットワークによって指導されるかランダムにサンプリングされるかを決定する値epsilonを定義した.具体的なコードは以下の通りです.
if random.random() <= epsilon:
    print("----------Random Action----------")
    action_index = random.randrange(ACTIONS)
    a_t[action_index] = 1
else:
    q = model.predict(s_t)       #input a stack of 4 images, get the prediction
    max_Q = np.argmax(q)
    action_index = max_Q
    a_t[max_Q] = 1

再生を使用するのは、連続した状態Sに高い相関があるためであり、常に最新の環境インタラクティブデータを用いて訓練するとCNNが不安定になり(個人的にはニューラルネットワーク訓練におけるいわゆる忘却災害と同じ問題と考えられる)、再生をランダムにサンプリングすれば、この不安定性を解消し、訓練をスムーズにすることができる.
CNNの訓練は5行のコードだけが重要です.
minibatch = random.sample(D, BATCH)  #1、         

inputs = np.zeros((BATCH, s_t.shape[1], s_t.shape[2], s_t.shape[3]))   #32, 80, 80, 4
targets = np.zeros((inputs.shape[0], ACTIONS))                         #32, 2

#Now we do the experience replay
for i in range(0, len(minibatch)):
    state_t = minibatch[i][0]
    action_t = minibatch[i][1]
    reward_t = minibatch[i][2]
    state_t1 = minibatch[i][3]
    terminal = minibatch[i][4]
    # if terminated, only equals reward

    inputs[i:i + 1] = state_t    #I saved down s_t

    targets[i] = model.predict(state_t)  # Hitting each buttom probability #2、   Q(St,At) 
    Q_sa = model.predict(state_t1)#3、  Q(St+1,At+1)

    if terminal:
        targets[i, action_t] = reward_t
    else:
        targets[i, action_t] = reward_t + GAMMA * np.max(Q_sa)  #4、Rt + gamma*Qt+1     

# targets2 = normalize(targets)
loss += model.train_on_batch(inputs, targets)   #5、  CNN

これは実際には監督訓練があり、ほとんどの場合(ゲームが終わっていない)、私たちはStを入力として使用しています.理論的にはRt+を使うべきです.γ*Rt+1 + γ^2 Rt+2 + ... CNNタグとして、しかし注意しなければならないのは、実際に私達は後続のRt+kを知らないで、もし真実のRt+1を知っているならば、引き続きAt+1を実行しなければならなくて、このように押して、これは1つの無限の再帰の過程になって、理論は証明して、後続の累計奨励はγQt+1--これが有名なベルマン方程式です.
     :
Qt  = Rt + γRt+1 + γ^2*Rt+2 + γ^3*Rt+3 = ...
    = Rt + γ*Qt+1

いくつかの思考:
1、ここCNNは状態-行動値関数Q(St,At)であるべきであるが、ニューラルネットワーク入力はSのみであり、一見迷いがあるが、出力は各次元が対応する動作(ここでは2つの動作しかないので2つの次元)を表すことを限定し、同時にq(St,a 1_t)、q(St,a 2_t)を出力することになるだから本質的にはQ(St,At)である.
2、実際に訓練を行う過程で、小鳥は長い間最初の柱さえ通れないことがわかります.ここでは、より高品質のサンプルを得るための最適化手段を考えることができます.例えば、大量の小鳥をランダムに初期化して同時に動作させ、スコアの高いものだけをサンプルとして記憶Dに加える.同様に、記憶容量が上限に達した場合、Rの低いサンプルを優先的に削除することができる.
3、各サンプルに対してサンプリング重みを増加することができ、奨励金がもっと高い場合、サンプリングされる確率はもっと大きい.
keras/tensorflow深さ学習qq群へようこそ:272437322