LoginSignup
4
2

More than 5 years have passed since last update.

【dqn】dqnで遊んでみた♬

Posted at

時代は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人とほぼ同じでした。
figure_1-34hisho_10.png

20人と100人を並べると以下のとおり、どちらも理論値辺りで採用戦略を変更しているのが分かります。
figure_1-34hisho4_saiyou.png
figure_1hisho100_saiyo1.png
二人目の採用については、20人だと正解をだせそうですが、100人いると山がちょっとありますが、難しいかもしれません。
figure_1-34hisho_saiyo2.png
figure_1hisho100_saiyo2.png
実は、1000人もやってみましたが、こちらはほとんど学習できていません。
※ここはネットワークモデルの改善で行けるかためしてみたいと思います
あと、お気づきのとおり、グラフで日本語が文字化けしていますが、今のところ原因不明なのでこのまま載せることとしました、ご容赦ください

まとめ

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

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

4
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2