【dqn】dqnで遊んでみた♬


時代はDQNということで、久しぶりに遊んでみた。というか、ここからひと月毎日DQNで遊んでみようと思う。

その心機一転、Exampleから一つずつ遊び倒す。
まずは、インストールだが、以前の環境で動かそうとしたら、怒られた。

>python ddpg_pendulum.py
Using TensorFlow backend.
Traceback (most recent call last):
  File "ddpg_pendulum.py", line 8, in <module>
    from rl.agents import DDPGAgent
ImportError: No module named 'rl'
>pip install keras-rl
Collecting keras-rl
Requirement already satisfied: keras>=2.0.7 in c:\users\tosio\anaconda3\lib\site-packages (from keras-rl) (2.2.2)
Requirement already satisfied: keras-preprocessing==1.0.2 in c:\users\tosio\anaconda3\lib\site-packages (from keras>=2.0.7->keras-rl) (1.0.2)
Requirement already satisfied: pyyaml in c:\users\tosio\anaconda3\lib\site-packages (from keras>=2.0.7->keras-rl) (3.12)
Requirement already satisfied: scipy>=0.14 in c:\users\tosio\anaconda3\lib\site-packages (from keras>=2.0.7->keras-rl) (0.18.1)
Requirement already satisfied: h5py in c:\users\tosio\anaconda3\lib\site-packages (from keras>=2.0.7->keras-rl) (2.6.0)
Requirement already satisfied: six>=1.9.0 in c:\users\tosio\anaconda3\lib\site-packages (from keras>=2.0.7->keras-rl) (1.10.0)
Requirement already satisfied: numpy>=1.9.1 in c:\users\tosio\anaconda3\lib\site-packages (from keras>=2.0.7->keras-rl) (1.14.5)
Requirement already satisfied: keras-applications==1.0.4 in c:\users\tosio\anaconda3\lib\site-packages (from keras>=2.0.7->keras-rl) (1.0.4)
Installing collected packages: keras-rl
Successfully installed keras-rl-0.4.2

ということで、Exampleを動かせるようになりました。
ということで、まず倒立振り子を動かします。
うまく動きました。
次にちょっと気になっていた、あの秘書面接の話をやってみようと思います。
【参考】
DQNに秘書を面接させたら、美しい結果が得られた話

説明は上記のサイトを参照願います。
ということで、ここでは面接20人、100人、そして1000人をやってみました。
プログラムは上記サイトのとおりですが、以下だけ変更します。

NUMS = 100  # 応募者数
.
.
.
#env = Secretary(n=10)
#env.play()
d = DQNSecretary(n=NUMS, recycle=False)
h = d.train(nb_steps=200000, log_interval=10000, verbose=1)

d = DQNSecretary(n=NUMS, recycle=True)
h = d.test(nb_episodes=1, verbose=1, visualize=True)

h = d.test(nb_episodes=1000, visualize=False, verbose=0)
rwds = h.history['episode_reward']
win_rate = sum(rwd > 0 for rwd in rwds) / len(rwds)
print('採用成功率(1000回):' + str(win_rate))
visualize_adopting(d.env)

visualize_q(d, 1)
for i in range(2, 10):
    visualize_q(d, i)    

学習のnb_stepは面談者数に応じて、面談者数倍しました。

h = d.train(nb_steps=200000, log_interval=10000, verbose=1)

ということで、例えば面談者100人については、以下のような出力が得られました。

Testing for 1 episodes ...

100人中2人目(暫定順位:1位)

100人中3人目(暫定順位:1位)

100人中4人目(暫定順位:1位)

100人中5人目(暫定順位:1位)

100人中6人目(暫定順位:4位)

100人中7人目(暫定順位:2位)

100人中8人目(暫定順位:2位)

100人中9人目(暫定順位:2位)

100人中10人目(暫定順位:7位)

100人中11人目(暫定順位:6位)

100人中12人目(暫定順位:9位)

100人中13人目(暫定順位:2位)

100人中14人目(暫定順位:5位)

100人中15人目(暫定順位:8位)

100人中16人目(暫定順位:15位)

100人中17人目(暫定順位:16位)

100人中18人目(暫定順位:9位)

100人中19人目(暫定順位:8位)

100人中20人目(暫定順位:13位)

100人中21人目(暫定順位:11位)

100人中22人目(暫定順位:13位)

100人中23人目(暫定順位:19位)

100人中24人目(暫定順位:16位)

100人中25人目(暫定順位:1位)

100人中26人目(暫定順位:15位)

100人中27人目(暫定順位:16位)

100人中28人目(暫定順位:5位)

100人中29人目(暫定順位:18位)

100人中30人目(暫定順位:5位)

100人中31人目(暫定順位:20位)

100人中32人目(暫定順位:3位)

100人中33人目(暫定順位:23位)

100人中34人目(暫定順位:33位)

100人中35人目(暫定順位:34位)

100人中36人目(暫定順位:19位)

100人中37人目(暫定順位:11位)

100人中38人目(暫定順位:1位)

あなたは4番目に優秀な応募者を採用しました。
最良の応募者は55人目でした。
Episode 1: reward: 0.000, steps: 38
採用成功率(1000回):0.351

なんとなく、ウワンだといい人がいれば採用しちゃいそうですが、DQNはちゃんと25人目のそこまでの1位の人をスルーして38人目まで待っています。エライ!

ということで、100人にしても成功率の理論値1/e=0.3678、で37人スキップの通りの結果をほぼ導いています。
それにしても100人いてもそこから最善の秘書を3割以上の確率で選べるというのはすごいと思う。

また、収束性もほぼ同じで、例えば20人の場合の収束性は10人とほぼ同じでした。

20人と100人を並べると以下のとおり、どちらも理論値辺りで採用戦略を変更しているのが分かります。


二人目の採用については、20人だと正解をだせそうですが、100人いると山がちょっとありますが、難しいかもしれません。


実は、1000人もやってみましたが、こちらはほとんど学習できていません。
※ここはネットワークモデルの改善で行けるかためしてみたいと思います
あと、お気づきのとおり、グラフで日本語が文字化けしていますが、今のところ原因不明なのでこのまま載せることとしました、ご容赦ください

まとめ

・秘書面接のDQNは100人までスケールできることが分かった

・1000人だと学習ができなかったのでネットワークを改善して再トライしたい
・グラフで文字化けしているが、原因不明である
・ロジックなどの解析はしていないので、次回以降に記載したい