

お世話になっております。

下記の記事を書いている者です。

[機械学習の理論を理解せずに tensorflow で オセロ AI
を作ってみた](http://qiita.com/sasaco/items/3b0b8565d6aa2a640caf)

今回お聞きしたいのは、  
上記の オセロ AI の訓練時に Q_max が小さいまま 訓練されない

ソースは上記URLにリンクがあります。(ttps://github.com/sasaco/tf-dqn-reversi.git)

  * train.py --- AI の訓練を行う
  * Reversi.py --- オセロゲームの管理
  * dqn_agent.py --- AI の訓練の管理

python3:train.py

[code]

        players[j].store_experience(state, targets, tr, reword, state_X, target_X, end)
        players[j].experience_replay()
    
[/code]

変数名  
\- state --- 盤面( = Reversi.screen[0～7][0～7] )  
\- targets --- 置いていい番号  
\- tr --- 選択した行動  
\- reward --- 行動に対する報酬 0～1  
\- state_X --- 行動した後の盤面  
\- targets_X --- 行動した後の置いていい番号  
\- end --- ゲームが終了＝True

python3:dqn_agent.py

[code]

    def store_experience(self, state, targets, action, reward, state_1, targets_1, terminal):
        self.D.append((state, targets, action, reward, state_1, targets_1, terminal))
    
    def experience_replay(self):
        state_minibatch = []
        y_minibatch = []
    
        # sample random minibatch
        minibatch_size = min(len(self.D), self.minibatch_size)
        minibatch_indexes = np.random.randint(0, len(self.D), minibatch_size)
    
        for j in minibatch_indexes:
            state_j, targets_j, action_j, reward_j, state_j_1, targets_j_1, terminal = self.D[j]
            action_j_index = self.enable_actions.index(action_j)
    
            y_j = self.Q_values(state_j)
    
            if terminal:
                y_j[action_j_index] = reward_j
            else:
                # reward_j + gamma * max_action' Q(state', action')
                qvalue, action = self.select_enable_action(state_j_1, targets_j_1)
                y_j[action_j_index] = reward_j + self.discount_factor * qvalue
    
            state_minibatch.append(state_j)
            y_minibatch.append(y_j)
    
        # training
        self.sess.run(self.training, feed_dict={self.x: state_minibatch, self.y_: y_minibatch})
    
        # for log
        self.current_loss = self.sess.run(self.loss, feed_dict={self.x: state_minibatch, self.y_: y_minibatch})
    
[/code]

下記のように毎ターン更新

[code]

        y_j[action_j_index] = reward_j + self.discount_factor * qvalue
        state_minibatch.append(state_j)
        y_minibatch.append(y_j)
    
    # training
    self.sess.run(self.training, feed_dict={self.x: state_minibatch, self.y_: y_minibatch})
    
[/code]

しているのに loss がほぼ0 のまま  
Q_max も 報酬(reward) 勝ったら1 を与えているのに 0.002 とか小さいのです。

参考にしたのが  
[超シンプルにTensorFlowでDQN (Deep Q Network) を実装してみる 〜導入編〜 | ALGO
GEEKS](http://blog.algolab.jp/post/2016/08/01/tf-dqn-simple-1/)  
です。

よろしくお願いいたします。


CC BY-SA 3.0
2016-11-11T01:38:04.920
30312
2016-11-12T14:48:10.933
2016-11-11T03:34:36.353
19521
19521
question
python 機械学習 tensorflow 深層学習
TensorFlowでDQN なぜかQ最大値が小さい


playerがランダムアクションする確率をexploration=0.1としているようですが，ここが最初から0.1という小さい値で固定されているのがおかしいと思います．  
最初からepsilonが小さいとまだ学習していないモデルがたまたま取るアクションについてばかり経験が蓄積されてしまい，学習がうまく進みません．  
最初の方は様々なアクションを試して経験を貯め，後の方は学習したモデルで収益を最大化するために，最初はexploration=1.0から始めて特定の値になるまで徐々に減らしていく（例えば，0.1になるまでアクションする度に0.00001ずつ減らしていく）という手法，いわゆるepsilon-
greedyがDQNの実装ではよく用いられているようです（実装が簡単だし効果もあるので）．

紹介されている「超シンプルにTensorFlowでDQN〜」のタスクはとても単純（アクションが左右のどちらかに動くという２種類しかない？）なのでexploration=0.1でも時間をかければ十分経験が蓄積されてうまく学習が進むのだと考えられます．

コードをちゃんと読んだわけではないので的はずれだったらすみません．


CC BY-SA 3.0
2016-11-12T14:40:31.453
30348
2016-11-12T14:48:10.933
2016-11-12T14:48:10.933
4548
4548
30312
answer