強化学習のサイクルを箇条書きしてみた
強化学習の勉強がてら大事だなーと思ったことを書き下してます。ご指摘・ご助言あれば幸いです。
強化学習とは試行錯誤を繰り返しながら環境(状態)に適応するようにエージェント(学習主体)が学習するものです。
強化学習は4つのステップを回すことで学習・実行しています。
① 状態の観察
エージェントは環境を「観察」することで「状態」を取得します。
状態とは エージェントの行動によって変化する環境の要素のことです。
ここで大事な点はいくつかあります。
・全ての状態を観察させようとすると学習に時間がかかりすぎるため、必要最低限の情報に留める必要があります。
・離散値(数や量では測れない値)を扱うときは「one-hot表現」を使用する必要があります。
(例えば、大学生がどのように昼食を取るのか予測する時、学生の選択を「(昼食を)0:食べない、1:食堂で食べる、2:それ以外の場所で食べる」と分類した場合、「0:食べない」と「2:それ以外の場所で食べる」をそれぞれ半分の確率で選ぶ生徒を連続値として学習すると「1:食堂で食べる」に近づいてしまいます。このように値に関連がない場合、離散値に適したone-hot表現を使用する必要があります)
・連続値を扱うときは「正規化」(あらかじめ指定した最大値と最小値の範囲におさまるように、データを整形)した方が学習効率が良いです。
・位置情報は絶対位置よりもエージェントとの相対位置で学習した方が「汎化性能」が向上します。
② 観察とポリシーを基に行動
観察したあと、「状態」に応じてエージェントが持つ「ポリシー」に従って行動を決定します。
ポリシーとはエージェントが持つ考え方や傾向のことです。
ここで大事な点は以下です。
・学習コストを抑えるため、行動の分類はなるべく少なくします。
(例えば、左に「0:移動しない、1:移動する」と右に「0:移動しない、1:移動する」と分類するよりも、「0:移動しない、1:左に移動する、2:右に移動する」とまとめて分類してしまった方が学習コストは低くなります)
③ 行動の結果に対する報酬
行動したあと、エージェントの行動の「結果」に対して「報酬」を与えます。
報酬の種類には行動に対してすぐに報酬が与えられる即時報酬とエピソード開始から現在までの合計の報酬が与えられる累計報酬(遅延報酬)が存在します。
ここで大事な点はいくつかあります。
・一般的に行動に対して「即時報酬」を与えるよりもエピソードの結果に対して「累計報酬」を与えた方が、良い学習につながります。言い換えれば、近視眼的な結果よりも将来的な結果を重視する方が良い学習につながります。
・多くの場合、「プラス報酬」の方が「マイナス報酬」よりもエージェントに良い学習をもたらします。過度に大きな「マイナス報酬」は「プラス報酬」につながる望ましい行動を回避させてしまう可能性があります。
メモ:UnityのML-Agentsでは報酬シグナルとして、以下の3つが存在します。
・環境の状態に対して与えられる外因性の報酬(Extrinsic)
・未知の状態を訪れることに対して与えられる好奇心の報酬(Curiosity)
・デモを模倣することに対して与えられる模倣の報酬(GAIL)
④ 報酬を基にポリシーを修正
報酬が与えられたあと、 エージェントは報酬に応じてポリシーを再評価・修正します。
メモ:UnityのML-Agentsでは訓練設定ファイル(*.yaml)に学習用のハイパーパラメータ(機械学習において人間が調整する必要があるパラメータ)が記述されています。ハイパーパラメータの一部を紹介します。
・max_steps:学習するステップ数
一般的に 5.0e5 ~ 1.0e7(問題の複雑さに比例して設定)
・time_horizon:エージェントが収集する経験(観察、行動、報酬)の数
一般的に32 ~ 2048(報酬が得られるまでの平均時間に比例して設定)
・summary_freq:統計情報の取得頻度(単位はステップ数)
TensorBoardのグラフのビン幅に相当
おまけ(学習上の問題とハイパーパラメータの関係)
起こりうる学習上の問題に対して、調整すべきハイパーパラメータ(UnityのML-Agentsのパラメータ名)をメモっておきます。
① 問題:学習量が足りない
対処:学習量(max_steps)を増やす
② 問題: エージェントが問題を理解できない
対処:ニューラルネットワークのサイズ(num_layers, hidden_units, vis_encode_type)を調整
③ 問題:エージェントが探索しすぎ・しなさすぎ
対処1:エントロピー(beta(PPO), init_entcoef(SAC))を調整
対処2:学習率(learning_rate, learning_rate_schedule)を調整