AIを使って不労所得の道へ(8)~エピソードの報酬がプロットされない問題~

AIを使って不労所得

はじめに

素人でも戦略的に取引したい

株やFXの知識がないため,戦略的な取引ができない素人が多いと思います.私もその一人です.
そこで,強化学習の力を借りて戦略的に取引をしようと思います.

AIncomeプロジェクト

AIで所得(Income)を得るため「AIncome」と名付けました.

前回までの取り組み

前回は強化学習とそれをシミュレーションするOpenAI Gymの説明をしました*1.さらには,ランダムで行動を決定して売り買いしてみたところ,ランダムでも利益が出るような結果になっていました*1.また,ランダム投資からPPO2へ深層学習強化学習のモデル投入*2やTensorboardで可視化*3,手数料の考慮*4などを取り組んでいました.
さらに,学習回数を10倍に増やしたりしてみましたところ,処理時間が大幅に増えてきました*5ので,並列化の知識を付け*6,FXのデータに適用してみました*7

今回の取り組みの概要

ある時気づいたら,エピソードの報酬がプロットされていませんでした.そこで,エピソードがプロットされるまでを記載します.

結論

学習回数が少なく,1エピソードも回っていないことが問題だったそうです.
なので,学習回数を増やしたところ,無事に表示れました.

デバッグに使ったコード

PPO2の後半にエピソード関係の記載がありました.

                if writer is not None:
                    total_episode_reward_logger(self.episode_reward,
                                                true_reward.reshape((self.n_envs, self.n_steps)),
                                                masks.reshape((self.n_envs, self.n_steps)),
                                                writer, self.num_timesteps)

さらに,total_episode_reward_loggerを深堀していくとこのような関数があります.

# ================================================================
# Logging
# ================================================================

def total_episode_reward_logger(rew_acc, rewards, masks, writer, steps):
    """
    calculates the cumulated episode reward, and prints to tensorflow log the output

    :param rew_acc: (np.array float) the total running reward
    :param rewards: (np.array float) the rewards
    :param masks: (np.array bool) the end of episodes
    :param writer: (TensorFlow Session.writer) the writer to log to
    :param steps: (int) the current timestep
    :return: (np.array float) the updated total running reward
    :return: (np.array float) the updated total running reward
    """
    with tf.variable_scope("environment_info", reuse=True):
        for env_idx in range(rewards.shape[0]):
            dones_idx = np.sort(np.argwhere(masks[env_idx]))
            print(len(dones_idx))

            if len(dones_idx) == 0:
                rew_acc[env_idx] += sum(rewards[env_idx])
            else:
                rew_acc[env_idx] += sum(rewards[env_idx, :dones_idx[0, 0]])
                summary = tf.Summary(value=[tf.Summary.Value(tag="episode_reward", simple_value=rew_acc[env_idx])])
                writer.add_summary(summary, steps + dones_idx[0, 0])
                for k in range(1, len(dones_idx[:, 0])):
                    rew_acc[env_idx] = sum(rewards[env_idx, dones_idx[k - 1, 0]:dones_idx[k, 0]])
                    summary = tf.Summary(value=[tf.Summary.Value(tag="episode_reward", simple_value=rew_acc[env_idx])])
                    writer.add_summary(summary, steps + dones_idx[k, 0])
                rew_acc[env_idx] = sum(rewards[env_idx, dones_idx[-1, 0]:])

    return rew_acc

デバッグしてみるとlen(dones_idx)が常に0と表示されていました.

--- episode ---
writer ...
0
---------------------------------------
| >>serial_timesteps | 99200          |
| approxkl           | 9.1708296e-07  |
| clipfrac           | 0.0            |
| episode_reward     | [195.23208227] |
| explained_variance | 1.71e-05       |
| fps                | 220            |
| n_updates          | 775            |
| policy_entropy     | 0.69300985     |
| policy_loss        | -2.8351438e-05 |
| time_elapsed       | 554            |
| total_timesteps    | 99200          |
| value_loss         | 388.58978      |
---------------------------------------
--- episode ---
writer ...
0
--------------------------------------
| >>serial_timesteps | 99328         |
| approxkl           | 3.5017035e-06 |
| clipfrac           | 0.0           |
| episode_reward     | [250.2519212] |
| explained_variance | -2.15e-06     |
| fps                | 181           |
| n_updates          | 776           |
| policy_entropy     | 0.6930624     |
| policy_loss        | -1.556566e-05 |
| time_elapsed       | 555           |
| total_timesteps    | 99328         |
| value_loss         | 380.206       |
--------------------------------------
--- episode ---
writer ...
0
---------------------------------------
| >>serial_timesteps | 99456          |
| approxkl           | 6.900662e-06   |
| clipfrac           | 0.0            |
| episode_reward     | [318.07204709] |
| explained_variance | -3.77e-05      |
| fps                | 220            |
| n_updates          | 777            |
| policy_entropy     | 0.6931266      |
| policy_loss        | -0.00024459884 |
| time_elapsed       | 555            |
| total_timesteps    | 99456          |
| value_loss         | 72.67572       |
---------------------------------------

ここで,学習回数を1000から100000に増やしたところ,無事に報酬がプロットされました.

file

参考サイト

コメント

タイトルとURLをコピーしました