独学でプログラミングとかやってみる 〜ITとかの勉強レポート〜

ボクが勉強したプログラミングやIT関連の情報を記事にしていきます。機械学習や深層学習なども取り扱います。

DeepQ-NetworkでOpenAI Gymに挑戦!

DeepQ-Networkとは

一言で言うと多層のQネットワークです。 Qネットワークに隠れ層を追加して多層化したもので、 今回はExperience Replayというアルゴリズムを使って実装していきます。 メモリにステート、アクション、次のステート、次のアクションを記録していきます。 メモリの上限を超えたら端から消していくDouble Ended Queueと呼ばれる構造を使いたいと思います。

今回はカートポールというOpenAI Gymの有名なゲームに挑戦します。

Pythonでサクサクと実装していきます。 コードを全部載せると長いので省略して書いていきます。

#Q-Networkのクラス
class QNetwork:
    def __init__(self,learning_rate=0.01,state_size=4,action_size=2,hidden_size=10,name="QNetwork"):
        with tf.variable_scope(name):
            self.inputs_ = tf.placeholder(tf.float32,[None,state_size],name="inputs")
            self.actions_ = tf.placeholder(tf.int32,[None],name="actions")
            one_hot_actions = tf.one_hot(self.actions_,action_size)
            self.targetQs_ = tf.placeholder(tf.float32,[None],name="target")
            self.fc1 = tf.contrib.layers.fully_connected(self.inputs_,hidden_size)
            self.fc2 = tf.contrib.layers.fully_connected(self.fc1,hidden_size)
            self.output = tf.contrib.layers.fully_connected(self.fc2,action_size,activation_fn=None)
            self.Q = tf.reduce_sum(tf.multiply(self.output,one_hot_actions),axis=1)
            self.loss = tf.reduce_mean(tf.square(self.targetQs_-self.Q))
            self.opt = tf.train.AdamOptimizer(learning_rate).minimize(self.loss)
#MemoryObjectのクラス
from collections import deque
class Memory:
    def __init__(self,max_size=2000):
        self.buffer = deque(maxlen=max_size)
        
    def add(self,experience):
        self.buffer.append(experience)
        
    def sample(self,batch_size):
        idx = np.random.choice(np.arange(len(self.buffer)),size=batch_size,replace=False)
        return [self.buffer[i] for i in idx]
#Experience Memory
env.reset()
state,reward,done,_ = env.step(env.action_space.sample())
memory = Memory(max_size=memory_size)

for i in range(pretrain_length):
    action = env.action_space.sample()
    next_state,reward,done,_ = env.step(action)
    
    if done:
        next_state = np.zeros(state.shape)
        memory.add((state,action,reward,next_state))
        
        env.reset()
        state,reward,done,_ = env.step(env.action_space.sample())
    else:
        memory.add((state,action,reward,next_state))
        state = next_state

隠れ層は64個、トレーニング回数は2000回とします。
トレーニングが完了したらいつものように、ゲームを実行してみます。

ゲームのスコアは199.0でした!
最大スコアが200なのでうまく学習してくれたことがわかります。 強化学習は面白いですね!