🐈

Act 28. Q学習について学ぶ

2024/11/30に公開

はじめに

Act 01. AIで外国為替を自動売買するまでの道のりをベースに学習を進めて行く。

前回は強化学習の概要について再度学習した。
今回は、強化学習のアルゴリズムの一つであるQ学習(Q-Learning) について学習していく。

今後学習する内容は以下の通り。
学習はChatGTPさん考案の以下の順序で進めて行く。

学習順序

教師あり学習

  1. 線形回帰: 基本的な回帰問題を学ぶ。 2024/11/13 学習済み
  2. ロジスティック回帰: 分類問題の基本を理解する。 2024/11/17 学習済み
  3. 決定木: シンプルで直感的なモデル。 2024/11/20 学習済み
  4. ランダムフォレスト: 決定木のアンサンブル学習。 2024/11/22 学習済み

教師なし学習

  1. k平均法: クラスタリングの基本。 2024/11/24 学習済み
  2. 主成分分析(PCA): 次元削減の手法。 2024/11/28 学習済み

強化学習

  1. 基本的な概念: エージェント、環境、報酬の関係を理解する。 2024/11/30 学習済み
  2. Q学習: 簡単な強化学習アルゴリズム。

Q学習について学んだあとは、ディープラーニング(深層学習)について学んでいく。
段々とゴールに近づいている気がしていいねー。

1/41/3 くらいは進んでいるだろうから、あと少し頑張ろう!!

Q学習

ChatGTPさんの回答

今回もChatGTPさんにQ学習について詳しく教えてとお願いしてみた。
以下はChatGTPさんの回答となる。

Q学習(Q-learning)は、強化学習(Reinforcement Learning)の代表的なアルゴリズムで、エージェントが環境との相互作用を通じて最適な行動を学ぶための方法です。数式を使いながら詳しく説明しますが、基本的な概念から始めます。

1. Q学習の基本概念

  • エージェント:行動を選択する主体(例: ゲームをプレイするAI)。
  • 環境:エージェントが行動を実行し、その結果を受け取る場(例: ゲームの盤面)。
  • 状態(state, s:エージェントが現在いる状況。
  • 行動(action, a:エージェントが状態において選べる行動。
  • 報酬(reward, r:エージェントが行動の結果得る数値。行動の良さを示す。
  • Q値(Q-value, Q(s, a):特定の状態sで行動aを選んだときに得られる累積報酬の期待値。

エージェントはQ値を更新しながら、最適な行動ポリシーを学びます。

2. Q値の更新ルール

Q学習では、Q値を以下の式で更新します:

Q(s, a) \gets Q(s, a) + \alpha \left[ r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right]

式の各要素

  • Q(s, a):現在の状態sで行動aを選んだときのQ値。
  • \alpha:学習率(Learning rate, 0 < \alpha ≤ 1)。
    • 新しい情報をどの程度反映するかを決めるパラメータ。
  • r:現在の行動aを取った結果得られる報酬。
  • \gamma:割引率(Discount factor, 0 ≤ \gamma < 1)。
    • 将来の報酬をどれだけ重視するかを決める。
  • \max_{a'} Q(s', a'):次の状態s'で取り得る行動a'のうち、最大のQ値。
  • s':行動aを取った結果の次の状態。

3. Q学習の手順

  1. 初期化:
    • Q値をすべて0、またはランダムな値で初期化。
  2. 繰り返し更新:
    1. 現在の状態sを観測。
    2. \epsilon-Greedy法などで行動aを選択。
      • 確率\epsilonでランダムな行動を選ぶ(探索)。
      • 確率1-\epsilonで最も高いQ値を持つ行動を選ぶ(活用)。
    3. 行動aを実行し、次の状態s'と報酬rを観測。
    4. Q値を更新式に基づいて計算。
    5. 状態を次の状態s'に更新。
  3. 終了条件:
    • Q値の変化が収束する、または設定したエピソード数に到達するまで繰り返す。

4. 具体例:迷路を解く

問題設定

  • s:迷路内の位置。
  • a:上下左右の移動。
  • r:ゴールに到達したら+100、壁にぶつかったら-10、通常の移動は-1。

学習プロセス

  • 初めはQ値がランダムで、エージェントは迷路内を試行錯誤で探索します。
  • ゴールに到達する成功体験を通じて、ゴールに向かう行動のQ値が高くなります。
  • 最終的に、どの状態からでも最短経路でゴールに到達できる最適ポリシーを学習します。

5. メリットとデメリット

メリット

  • 単純明快:実装が比較的簡単。
  • モデルフリー:環境の動的モデル(遷移確率など)を知らなくても学習可能。

デメリット

  • 状態空間の爆発:状態や行動が多いとQ値をすべて記録するのが難しい(大規模問題では深層Q学習(DQN)を使用)。
  • 効率性:探索と活用のバランスを取るのが難しい。

6. Q学習がFXに役立つか

FXに応用する場合、状態sはチャートの形状やテクニカル指標、行動aは「買い」「売り」「待機」、報酬rは利益や損失に置き換えることで利用可能です。ただし、FXでは環境が非常に複雑でノイズが多いため、Q学習単体ではなく、深層Q学習や他の手法との併用が現実的です。

理解を深めるため、コード例や具体的なシミュレーションもお見せできます。必要であればお知らせください!

自分なりに解説

前回で強化学習について学んだからか、なんとなーく理解できる。
もう少し自分が納得できる形に落とし込んでいこうと思う。

1. Q学習の基本概念

ここに関しては前回学んだため難しくないと思うが、どうせなのでFXをイメージして書いていく。

  • エージェント:行動を選択する主体(例: FXの自動売買を行うAI)
  • 環境:エージェントが行動を実行し、その結果を受け取る場(例: 為替チャート)
  • 状態(state, s:エージェントが現在いる状況(例: ポジションなし、買いポジションあり)
  • 行動(action, a:エージェントが状態において選べる行動(例: 買い、売り、利確、損切)
  • 報酬(reward, r:エージェントが行動の結果得る数値。行動の良さを示す(例: 利益、損失)
  • Q値(Q-value, Q(s, a):特定の状態sで行動aを選んだときに得られる累積報酬の期待値(例: 持っているポジションを決済したときの利益・損失)

報酬とQ値は似ているように思えるが、それぞれ役割と意味が異なる。

  • 報酬
    エージェントが特定の行動をとった結果、即座に環境から受け取る値。
    つまり、行動の良し悪しを瞬間的にフィードバックする。

  • Q値
    特定の状態(s)で特定の行動(a)を取った場合に得られる累積報酬の期待値。
    将来の報酬を考慮した行動評価。

表にすると以下のようなイメージ。

項目 報酬 (r) Q値 (Q(s, a))
タイミング 行動を取った瞬間 状態や行動に基づく長期的な期待値
スコープ 短期的(即時) 長期的(将来の報酬の合計を考慮)
役割 行動結果の評価 状態・行動の価値を示し、次の行動を選ぶ指標
値の性質 環境が直接与える 学習によって更新される

2. Q値の更新ルール

エージェントはQ値を更新しながら最適な行動ポリシーを学んでいくが、そもそもどうやってQ値の更新を行うのか。
とりあえずQ値の更新を行う際の公式を載せておく。

Q(s, a) \gets Q(s, a) + \alpha \left[ r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right]

式の各要素

  • Q(s, a):現在の状態sで行動aを選んだときのQ値。
  • \alpha:学習率(Learning rate, 0 < \alpha ≤ 1)。
    • 新しい情報をどの程度反映するかを決めるパラメータ。
  • r:現在の行動aを取った結果得られる報酬。
  • \gamma:割引率(Discount factor, 0 ≤ \gamma < 1)。
    • 将来の報酬をどれだけ重視するかを決める。
  • \max_{a'} Q(s', a'):次の状態s'で取り得る行動a'のうち、最大のQ値。
  • s':行動aを取った結果の次の状態。

まあぱっと見よく分からん!
ということでめちゃくちゃ簡単に書いていく。

まず、Q値を更新する公式は「現在のQ値を実際の結果に近づける作業」と考えると分かりやすい。
以降で、各部分について記載していく。

1. 現在のQ値 (Q(s, a))

状態 s で行動 a を取った場合の「予測される評価(累積報酬の期待値)」となる。
このQ値をより正確なものにアップデートしていく。

正確なQ値が求められると、特定の状態で取る行動が最適化されていることになる。

2. 実際の結果 (r + \gamma \max_{a'} Q(s', a'))

ここの個所は「実際に得られる価値の予測」となる。

  • r: 今の行動をとったことで得られた報酬(短期的な評価)
  • \gamma \max_{a'} Q(s', a'): 次の状態s'で得られる未来の最大価値(長期的な評価)
    となるため、「今の行動の後に期待できる本当の価値」が計算されることになる。

例えば、とある相場(状態)で買い注文をしていたとする。
r(報酬)が+50だったが、\max_{a'} Q(s', a')+40だった場合は、今の状態で利確(行動)するのではなく、未来に利確していた方がよかったことになる。

この、「未来で利確していたら+90の利益だった」というのが実際に得られる価値になる。

3. 差分 (r + \gamma \max_{a'} Q(s', a') - Q(s, a))

先ほど求めた実際の結果から現在の予測値(Q(s, a))を引くことで、「ズレ(誤差)」を求めている。
このズレを元にQ値を更新することで、特定の状態でとるべき行動を最適化していく。

4. 学習率 (\alpha)

求めた差分をQ値に反映するわけだが、この修正幅を調整する係数が \alpha になる
\alpha が大きいと一気に修正、小さいと少しずつ修正する。
※行動(Action)の a ではなく、\alpha(アルファ)なので注意

5. 具体例

Q値の更新を具体的な数字を使って書いていこうと思う。もちろんFXの内容で。

Q学習をFXに当てはめる

  • 状態 (s): 現在の相場の状態(例: 移動平均線やRSIなどのテクニカル指標)
  • 行動 (a): 「買い」「売り」「何もしない」
  • 報酬 (r): トレード後の利益または損失(例: 利益 +10、損失 -5 など)
  • Q値 (Q(s, a)): 特定の相場で行動を選択した場合に期待される「累積利益」

具体的なFXシナリオ

  1. 現在の相場(状態):
    • RSIが30(売られすぎ)→ 状態 s = \text{RSI=30}
  2. 選んだ行動:
    • 「買い」→ 行動 a = \text{買い}
  3. 報酬:
    • トレード後の利益は r = +50(pips)
  4. 次の状態:
    • RSIが40になった → 状態 s' = \text{RSI=40}
  5. 次の状態での行動の最大Q値:
    • 将来的にはさらに上昇していた → \max_{a'} Q(s', a') = +30
  6. 現在のQ値:
    • Q(s, a) = +20(このくらいの利益は出るだろうという、買いに対する期待値)
  7. 学習率 (\alpha):
    • \alpha = 0.5(修正を50%反映)
  8. 割引率 (\gamma):
    • \gamma = 0.9(未来の報酬を90%考慮)

簡単に言うと、RSIが30で売られすぎな相場(s)だから、ここで買い注文(a)を入れれば\text{+20pips}(Q(s, a))はとれるだろう。

実際に取引してみたら\text{+50pips}(r)だった!さらに未来では\text{+30pips}(\max_{a'} Q(s', a'))も上がっていた…。

\text{+30pips}逃しているから、50\%の学習率(\alpha)でずれを反映しよう。って感じかな?

実際に計算している流れを記載すると以下の通り。

更新の流れ

  1. 「実際の結果」を計算
    報酬 r と次の状態の未来の期待値(割引率を考慮したQ値)を合計する。

    r + \gamma \max_{a'} Q(s', a') = 50 + 0.9 \times 30 = 50 + 27 = 77
  2. 「ズレ」を計算
    実際の結果 77 と、現在のQ値 20 の差を求める。

    \text{ズレ} = 77 - 20 = 57
  3. Q値を修正
    このズレを学習率 \alpha = 0.5 分だけ反映する。

    Q(s, a) = Q(s, a) + \alpha \times \text{ズレ}
    Q(s, a) = 20 + 0.5 \times 57 = 20 + 28.5 = 48.5

結果
状態「RSI=30」で「買い」を選んだときのQ値は、もともと 20 だったが、実際の結果を反映して 48.5 に更新された。

さいごに

勉強になった。Q値の更新の具体的な流れもある程度は理解できたと思う。
この記事は定期的に読み直して、Q学習をしっかり記憶に残そう。

次はPythonでQ学習を試してみたい。が、どうせならFXの実際の為替チャートをデータセットにしたい。
ということでGMOコインのAPIで実際のチャートデータを取得する流れを記事にするかもしれない。

ではまた。

Discussion