atari - 模倣学習② 人間のデモを使って事前学習を行う

前回収集した人間のデモ操作データを使って事前学習を行います。

環境設定に関しては、前回の記事(模倣学習② 人間のデモを使って事前学習を行う)を参照して下さい。

(Ubuntu 19.10で動作確認しています。)

模倣学習

人間のデモ操作データであるbowling_demo.npzファイルrecorded_imagesフォルダを使って模倣学習を行うコードは以下の通りです。

[コード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import gym
import time
from stable_baselines import PPO2
from stable_baselines.common.vec_env import DummyVecEnv
from stable_baselines.gail import ExpertDataset, generate_expert_traj
from baselines.common.atari_wrappers import *

# 環境の生成
env = gym.make('BowlingNoFrameskip-v0')
env = MaxAndSkipEnv(env, skip=4) # 4フレームごとに行動を選択
env = WarpFrame(env) # 画面イメージを84x84のグレースケールに変換
env = DummyVecEnv([lambda: env])

# デモデータの読み込み
dataset = ExpertDataset(expert_path='bowling_demo.npz',verbose=1)

# モデルの生成
model = PPO2('CnnPolicy', env, verbose=1)

# モデルの読み込み
# model = PPO2.load('bowling_model', env=env)

# モデルの事前訓練
model.pretrain(dataset, n_epochs=1000)

# モデルの学習
# model.learn(total_timesteps=256000)

# モデルの保存
model.save('bowling_model')

# モデルのテスト
state = env.reset()
total_reward = 0
while True:
env.render() # 環境の描画
time.sleep(1/60) # スリープ
action, _ = model.predict(state) # モデルの推論
state, reward, done, info = env.step(action) # 1ステップ実行
total_reward += reward[0]
if done:
print('reward:', total_reward)
state = env.reset()
total_reward = 0

人間の操作したデータを事前学習するにはmodel.pretrain関数(24行目)を使います。
引数の意味は下記の通りです。

  • dataset(ExpertDataset型)
    データセット
  • n_epochs(int型)
    学習の反復回数
  • learning_rate(float型)
    学習率
  • adam_epsilon(float型)
    Adamオプティマイザーのε(エプシロン)
  • val_interval(int型)
    nエポック毎に学習と検証の損失を出力

また模倣学習を行った後、さらに強化学習を行う場合はmodel.learn関数(27行目)をコメントアウトします。

実行

実行すると、スコアは「120.2」になりました。(人間のデモ操作によって結果は変わります。)

模倣学習と合わせて強化学習も合わせて実行した結果や、強化学習のみで実行した結果も調査していきたいと思います。