AtCoder Beginner Contest 145

結果

順位   297th / 5299
パフォーマンス   1889
レーティング  1906 → 1904(-2)

 まぁこんなもんだろうという成績。しかしとうとうmorio__氏にぶち抜かれてしまったので、時間は流れているなぁという感じ。

A - Circle

 素直。

 提出

B - Echo

 普通に i番目と i + \frac{N}{2}番目を比較していった。substr使うのは思い浮かばなかった。

 提出

C - Average Length

 賢くやる方法がありそうだとは思いつつ、制約が愚直にやっていいよと言ってくれているのでそのままやった。next_permutationを使うのが久しぶりで不安になりながらの実装だったけど、基本的にdo{}while();を使うのってここしかないしな。解説PDFの解法2はいやなるほどですね。

 提出

D - Knight

 ちょろっと図を描いてみたらパスカルの三角形が出てくるのでコンビネーションのライブラリを持ってきて終了。

 提出

E - All-you-can-eat

 最初は「一番最後に食べる料理を全探索」という方針で考えていたが、やっぱりここで O(N)取られるのがつらいので考え直してみると、美味しさが最大の料理は絶対採用して良いのだなということに気づく。採用する場合、末尾かそうでないかの二通りだが、末尾じゃない場合は先頭に置けば良く、そうするとその最大料理を食べた状態で同じ問題を解くことになるのでこれでほぼ解法が見える。美味しさでソートしておいて、大きい順に末尾or先頭に置いていけば良い。末尾に置く場合は直前までの料理で時間ギリギリになる最大の美味しさをDPで求めておけば良いので。2番目以降を末尾に置く場合もこのDPテーブルが使いまわせるのすごいなぁと思った。綺麗な問題だ。

 解説PDFの解法1(前後で2つDPテーブルを作る)のは思い浮かばなかった。解法2が自分のやつと一緒……ってあれ、所要時間の方でソートするのか? ん、でも美味しさ最大は絶対採用も間違ってはないよな。ほぼどちらでも大丈夫なのか。ふーん?

 提出

F - Laminate

  K = 0の場合の数え方すら全然わかってなくてさっぱりダメでしたね。そこが見えたとしてもDPに帰着して、 O(N^3)、高速化すれば O(N^2\log N)ですか。こういうの全然できないなぁ。

 提出

An Investigation of Model-Free Planningを読んだメモ

出典

 ICML(International Conference on Machine Learning)2019に採択。

 図は全て当論文から引用。

概要

 ConvLSTMを積み重ねたDeep Repeated ConvLSTM(DRC)というモデルを提案。プランニングが可能なエージェントが持つ性質を提案手法も持つことを実証

導入

  • モデル学習を学習してプランニングするという手法は高次元タスクでは上手くいっていない
  • モデルフリー手法でどのように計画を立てるか自体を学習する手法が生まれつつある
    • ネットワーク構造に工夫して木探索的振る舞いを実現
    • 本論文ではConvLSTMがプランニング特有の性質(次の3要素)を持つことを示す
      1. 様々な状況に対して簡単に一般化可能
      2. 少量のデータから効率的に学習可能
      3. 思考時間が伸びるほど性能向上

Deep Repeated ConvLSTM(DRC)

f:id:tokumini:20191109170411p:plain
Figure 1

  • 隠れ層が3次元テンソル、接続が畳み込み演算
  • 奥行き方向に D層積み重ねる
  • 時間方向には T回の演算を実行
  • 図にはないが
    •  eは1層目だけでなく全ての階層に入力
    • 1ステップ遅れて D層目から 1層目への接続もあり
    • プーリングした値も合わせて出力
  • Actor-Criticで学習

実験

単純な性能の比較

 Gridworld, 倉庫番, Boxworld, MiniPackmanなどの完全情報・2D見下ろし系のゲームでValue Iteration NetworkやI2Aと比べて高い性能(表1,2,図15)

層数やステップ数の比較

  D Nステップのモデルを \mathrm{DRC}(D, N)と表記

 倉庫番での性能

f:id:tokumini:20191109170455p:plain
Figure 3(a)

  • 普通のConvLSTMであるDRC(1,1)は性能が悪い
  • 層数は増やさずに時間ステップでの繰り返しだけ増やしたDRC(1,9)はDRC(1,1)よりは良いがまだ性能が低い
  • DRC(3,3)くらいがちょうど良い

アーキテクチャの比較

f:id:tokumini:20191109170550p:plain
Figure 3(b)

  • 普通の1次元LSTMでは性能低下
  • ResNetもスキップコネクションがあるため各層がRNN的な振る舞いを(つまりはプランニング的な振る舞いを)することが理論上可能ではあるが、提案手法の方が性能が高い

サンプル効率と汎化性能

  • 倉庫番でデータ数(初期配置の数)をLarge, Medium, Smallの3種類試行
  • Large Network(DRC(3,3))とSmall Network(DRC(1, 1))で汎化性能を比較

f:id:tokumini:20191109171017p:plain
Figure 4

  • 汎化性能が大差
  • データ数をSmallにしてもTrainデータにおける学習正解率が上がるわけではない
    • 探索の多様性がなくなることが原因?
  • DRC(3, 3)はTrainデータの正解率が100%になるが、Testデータで100%になるわけではない

学習データと異なる環境でテストする場合の性能

f:id:tokumini:20191109170835p:plain
Figure 13(a)

  • 箱の数を増やしてもDRC(3,3)は性能が落ちにくい

思考時間を増やすことで性能が向上するか

  • テスト時、各エピソードの開始時「何も行動しない」行動を数ステップ取らせる

f:id:tokumini:20191109171124p:plain
Figure 6

  • 最初に10ステップ追加すると解ける問題が5%増える

所感

 力技で無理やり学習させたという印象で、こんな手法で本当に上手くいってしまうのかという気持ちは拭えない。ネットワークのアーキテクチャを工夫して擬似的なプランニングをやらせるような手法群に対して、いくらか納得し難いところはあるんだが、それも良くない先入観だろうか。

 テスト時のエピソード開始時に何もしない行動を入れると性能が上がるというのが直感的に理解できない。思考時間と性能に正の相関が出ることは個人的に重要だと思っているんだけど、しかしそういうやり方になるのだろうか。こういう実験をしよう(こういう実験で結果が出るはずだ)という気持ちになるのが自然なことなのかがわからず、(Conv)LSTMの効果として期待されるものに対する感覚が磨かれていない。何かしらの方法で過去の情報も利用することは必要なのかなと思わないではないが……。

Model-Based Reinforcement Learning for Atariを読んだメモ

出典

 この文字色の部分は当記事筆者の感想

Introduction

  • モデルフリー強化学習手法は学習に実時間にして数週間ほどのプレイが必要
  • 一方人間は数分でAtariゲームを学習可能
    • 人間は行動結果の予測ができるからだと推測→モデルベース強化学習
  • 10万タイムステップ(おおよそ2時間分)に限った相互作用のみという設定での学習に挑戦
  • Simulated Policy Learning(SimPLe)という学習手法を提案
    • 離散的潜在変数を組み込んだ環境モデルを学習、モデルのみを利用した方策学習
    • 高いサンプル効率を達成

Simulated Policy Learning(SimPLe)

 学習の枠組みの名前(モデル名ではない)。実際の実験では以下のループ部分を15回ほど実行。方策学習をモデルのみで行うDyna、あるいは環境モデルを学習するためのサンプル収集を定期的に繰り返すWorld Modelsという印象

f:id:tokumini:20191104153533p:plain f:id:tokumini:20191106142842p:plain

環境モデル部分のアーキテクチャ

f:id:tokumini:20191106141822p:plain

  • 次状態予測部分(下半分):ボトルネックを持つConv, deConv
  • 確率性の導入(左上)
    • Convによる確定的な表現ベクトルと、確率的な潜在変数を連結(たぶん)
    • 学習時
      • VAEを使って次のフレームの潜在変数を推論して連結
    • 推論時
      • 過去の潜在変数系列から現在の潜在変数を予測するLSTMを学習しておき、それを利用 (ここがよくわからない。確率的潜在変数自体にそこまで確率的方向を決定づける情報があるのか? そうだとするとこのLSTM自体がほぼ環境モデルみたいなもの?)

離散化の意義

  • VAEをそのまま使う問題点
    1. KL項の係数がゲーム依存
    2. KL項の係数は1e-5~1-3程度であり、事後分布がN(0, 1)にそこまで近づかない→推論時に予測不可能な潜在値が発生
  • →離散化により解決できる(らしい。この辺はVQ-VAEの論文を読まないとよくわからないか)

損失関数

  • 画像の出力:各ピクセルの値をL2回帰 or 256次元のソフトマックス
    • 上限を定数 Cクリッピング(L2回帰 C=10/256次元ソフトマックス C=0.03
    • 背景などのあまり意味がない領域での勾配を減らし、小さいが重要な領域に集中させる
      • クリッピングによって、たとえばソフトマックスなら正解値の出力が97%を超えるとそのピクセルから勾配は得られなくなる

Scheduled Sampling

  • 遷移予測を繰り返していくので誤差が積み重なっていく
    • 学習中、入力のいくつかのフレームを前のステップからの予測でランダムに置き換える
    • 学習ループの最初のループの半分へ到達する時点で100%置き換えになるように線形に混合確率を上昇

方策学習

  •  \gamma = 0.95のPPO
  • 遷移予測を繰り返すと誤差が積み重なるので短いロールアウトを使用
  • 50ステップごとに真のデータバッファから開始状態を一様サンプリングし、そこから環境モデルを利用
  • ロールアウトの最終ステップで価値の評価を報酬に追加
    • 価値関数はアドバンテージを求めるのにも利用

6. 実験

f:id:tokumini:20191104173819p:plainf:id:tokumini:20191104173829p:plain
Figure 3, Figure 4

 各ゲームでRainbow(Figure 3、左)、PPO(Figure 4、右)がSimPLeと同じ性能に至るまでにかかったタイムステップ。赤い線がSimPLeの基準である100Kで、どちらも多くのゲームで基準の赤線を超えていることからSimPLeのサンプル効率が良いことがわかる。またSimPLeは複数回試行したときに最高値は大きく出ることがあり、学習を安定化させられればより良い性能となる可能性がある。

所感

 自分はボードゲーム分野の人間なのでサンプル効率の良さが重要という意識があまりなくて、最高性能とか実学習時間こそを重視したくなってしまう。Atariゲームではリアルタイム性とかもあるので(?)学習したモデルを使ってプランニングまでするという感じではないのだろうか。ゲームによってはモデルの正確性もかなり高くできるとあったので精度の問題で使えないということではないのかなと推察するところだが。

 離散化が肝っぽい部分に見えるがそこの部分でVQ-VAEの成果にかなり頼っている感があって、そっちをちゃんと読まないといけなそう。確率性の入れ方についてはこれが確率的構造をどこまで厳密に捉えられるのかがよくわからない。ぼんやりと入れているようにも見えるし、学習に関わっているのでそれが十分に遷移の性質をカバーできるのかもしれない。

 学習のループ中に徐々に予測した状態から次の状態予測も行っていくようにしていくとサラッと書いてあるが、ここがかなり重要そうではあると思った。各ステップで予測自体は独立なのでこのような疑似マルチステップ学習がどこまで一貫性に影響するのかはわからないが、PlaNetにおけるOvershootingのような効果になるのだろう(あれもどこまで性能に貢献しているのかは微妙そうなところだったが)。

 この記事では省略したが分析も多く行われていた。特に上手くいかない場合の例として(1)画面上では小さいが意味的には重要なオブジェクト(小さい弾) (2)操作キャラクターが様々なシーンをワープするような画面全体の大きな変化 という二つの場合に環境モデルが対応できなくて方策もダメになるという話は面白かった。結局状態やオブジェクトの振る舞いに関して論理のような仕組みレベルで予測しているわけではなく、漫然と似たような動画の未来予測をしているという感じなのかもしれない。別に深層学習に限らなくてよいが、論理や法則を上手く学習する方法があるのかは気になるところだ。

Learning Latent Dynamics for Planning from Pixelsを読んだメモ

出典

概要

  • Deep Planning Network(PlaNet)の提案
    • 画像から環境モデルを学習
    • 決定的および確率的遷移要素の両方を組み合わせる
    • 潜在空間の中でマルチステップ学習を実行
    • 潜在空間でのプランニングを行うことで高い性能

提案手法:Recurrent State Space Model

f:id:tokumini:20191102110013p:plain
Figure 2

 (丸:確率変数 四角:決定的変数 実線:生成 破線:推論)

  • (a)既存1:確定的RNNによって過去の情報を陽に考慮するモデル
    • 確定的なのでモデルの予測ミスがプランニングに大きく影響してしまう
  • (b)既存2:確率的潜在変数がマルコフ性を満たすとして1ステップ分で遷移を考えるモデル
    • 複数のタイムステップに渡って情報を保持することが難しい
  • (c)提案:上記二つを組み合わせた手法

f:id:tokumini:20191101163123p:plain

 入力から再構成への決定論的なショートカットを回避するために、観測情報は必ず s_tへの確率的推定を経て h_tへ送られることが重要。

学習方法

  • モデルが非線形なので s_tの事後分布を陽には計算できない
    →encoder  q(s_{1:T}|o_{1:T}, a_{1:T}) = \prod_{t=1}^{T} q(s_t | s_{t-1}, a_{t-1}, o_t)を学習
     q(s_t | s_{t-1}, a_{t-1}, o_t)は平均と分散を持つ対角ガウスをCNN+全結合層で近似したもの)
  • 変分下限を最大化

f:id:tokumini:20191101163108p:plain

マルチステップ学習

f:id:tokumini:20191102105828p:plain
Figure 3

 (影付きの丸:対数尤度を計算する部分(再構成誤差) 波線:KL誤差を計算する部分)

  • (a)標準的な1ステップ学習
  • (b)再構成誤差を計算する組み合わせをマルチステップ化
    • 画像でやるには高コスト
  • (c)提案手法で採用:KL誤差を計算する組み合わせをマルチステップ化

学習方法

  dステップ先での変分下限

f:id:tokumini:20191101211135p:plain

 ステップ数について d = 1から Dまで合計

f:id:tokumini:20191101211149p:plain

ここで \beta-VAEのように各ステップにおける正則化項の強さに係数 \beta_dをつけている。

プランニングアルゴリズム

  • Cross Entropy Method(CEM)を利用
  • まず Hステップの計画をするとしたとき、 a_{t:t+H} \sim \mathrm{Normal}(\mu_{t:t+H}, \sigma^2_{t:t+H}\mathbb{I})で最適な行動系列に対する対角ガウス信念を初期化
  • 平均0、分散単位行列から始めて、 J個の行動系列をサンプリングし、モデルによって評価、上位 K行動系列に対角ガウス信念を再適合させる
  • 行動系列の評価はモデルによって軌道をサンプリングして平均報酬を合計する
    • 使うのはReward ModelだけでObservationモデルは使わない
  • Population-basedなOptimizerを使用しているので各行動系列からサンプリングするのは一回で良い(?)

実験

  • DeepMind control suiteの6つの連続制御タスクで検討
  • 1/100のエピソード数でA3Cよりも高い性能
  • 実時間でもA3CやD4PGと遜色ない結果
  • モデルフリー手法のSOTAであるD4PGと同程度の性能

モデルの比較

f:id:tokumini:20191101171208p:plain

  • 緑線(Fig2(b))や、赤線(Fig2(a))よりも提案手法が高性能

行動決定方法の比較

f:id:tokumini:20191101171504p:plain

  • エピソード収集時の行動選択がランダム(緑線)や行動決定時にCEMではなく1000系列から最適な行動を選択するものより提案手法が高性能

1エージェントでの学習

 どのタスクかという情報もなく、画面情報のみを与える。行動空間は全タスク分を常に用意。

f:id:tokumini:20191102110254p:plain

 個別のエージェントよりも学習は遅いものの単一のエージェントで複数のタスクが解けている。

マルチステップ学習(Overshooting)の効果(付録より)

f:id:tokumini:20191102110230p:plain

 提案手法部分で書いていたわりにはあまり効果がなさそう(付録に回されるのもわかる)。

所感

 Overshootingという工夫は入れているもののそこまで性能に影響はしていないようだし、SSMとRNNを組み合わせて普通にやったという印象。個人的には確定的RNNはあまり信用していなくてSSM側で上手くやれれば良いなと思っているのだが、SSMでマルコフ性がちゃんと満たされるという仮定にはやはりいくらか無理があるのだろうか。その補助としてRNNを入れるというならそこまで腹も立たないかもしれない。

 今回は分野が連続値制御系なのもあってかプランニングにはCEMという手法が使われていたが、Policy, Valueを使う木探索でも上手くいくのかどうかは確かめてみたい。それについても以前は完全に木探索をやることが理想と思っていたが、そうではない使い方(I2Aみたいな)を模索した方が良いのかもしれないと揺れているところはある。

Imagination-Augmented Agents for Deep Reinforcement Learningを読んだメモ

出典

 記事中の図は論文から引用

概要

 モデルを利用して直接方策を構築するのではなく、ロールアウト結果を方策を構築する際の追加情報として利用するI2Aという手法を提案

アーキテクチャ

f:id:tokumini:20191030102146p:plain

  • Imagination Core
    • 環境モデルは現在の状態と行動から次の状態、報酬を予測
    • 内部方策は小さいモデルフリーネットワークで全体の方策を蒸留するように学習
  • Single imagination rollout
    • ある状態で可能な行動全てについて1つのロールアウトを実行(初手を固定)
    • 状態と報酬をCNNでエンコードし、LSTMで逆順にまとめ上げてRollout Encodingを獲得
  • Full I2A Atchitecture
    • Aggregator:単純な連結
    • Model-free pathは普通のCNN + 全結合層
    • 上2つから最終的な方策と価値を出力

環境モデル

  • 環境モデル:下図のようなものを確率的なモデルとして事前学習(同時学習よりよりこっちのほうが学習時間が短かったらしい)

f:id:tokumini:20191030104509p:plain

倉庫番ゲームでの実験

 箱を適切な順番で押していかないといけないのでプランニングが有効になりやすいタスク。入力は画像そのままで他の情報は利用しない

f:id:tokumini:20191030111018p:plain

  • 比較手法

    • standard(large) : モデルフリーパス部分だけのエージェントでネットワークが大きいもの
    • standard : モデルフリーパス部分だけのエージェント
    • no reward I2A : 環境モデルが報酬予測を行わないもの
    • cpoy-model I2A : 環境モデルに常に入力観測値をそのまま返すダミーを使用したもの
  • 提案手法の性能が良く、(環境モデルの事前学習分を考慮しても)サンプル効率も良い

  • ロールアウトを増やすと性能が上がる
  • copyモデルでは性能が低く、やはり環境モデルで先の状態を予測することが重要
  • 報酬を予測しないモデルではサンプル効率が悪いが3e9ステップまで学習すれば同じ性能に

不完全なモデルでの学習

 パラメータの数が少なく、性能が悪い環境モデルを用いた場合の実験

f:id:tokumini:20191030111931p:plain

  • Rollout Encoderを用いずシミュレーション結果から価値をそのまま推定するモンテカルロ(MC)より性能が良い
  • I2Aはpoor modelでもgood modelと同程度の性能を維持

完全なモデルを用いるプランニング手法との比較

 ほぼ完全なモデルが得られると想定して、@以下の正解率になるまでに必要な環境モデルの呼び出し回数を比較

f:id:tokumini:20191030113702p:plain

  • MCTS(ほぼAlphaZero式のPUCT)よりも環境モデルの呼び出し回数が少ない
  • 実験条件をどうすれば公平なのかよくわからなくて意味のある実験なのか判断つかなかった

汎化実験

 4箱の環境で学習したものを箱数が異なる環境で性能測定

f:id:tokumini:20191030114341p:plain

ミニパックマンでの実験

 パックマンのグラフィックを簡易化した一つドメインで異なるタスクを解く実験

f:id:tokumini:20191030115200p:plain

 ほぼI2Aが性能良く、特に計画が重要なタスクでcopyモデルやstandardと大きな差が出る。

所感

 実験結果が強いので気後れするところはあるが、やはりプランニング中にどの状態を重点的に考えるかという制御ができないことは気になる。あとはなんだかんだ実験ドメインが簡単な環境ではあると思うのでもっと複雑なドメインでどうかというところだが、環境モデルが不正確になるならむしろ提案手法の優位性が出てくるはずか。

 実際にLSTMがRollout Encodingを構築していくときにいったい何を見ているのかというのは気になるところではある。MCTSNetとかも(ちゃんと読んだわけではないが雑に眺めた限り)謎のベクトルをバックアップしていくわけで、単に価値を伝播させていくより効率の良いなにかがあるというのはそうなのかもしれない。根源的に強化学習とゲーム木探索は同じような振る舞いをしているはずなので、なんというか局所的な表現学習をしていると見なせるのだろうか。

Value Prediction Networkを読んだ際のメモ

出典

 Thirty-first Conference on Neural Information Processing Systems (NeurIPS 2017) に採択。

 ※この記事の図は全て論文中のもの

概要

  • 抽象表現での遷移を予測して内部的にプランニングを行うValue Prediction Networkを提案
  • 短い先読みでもDQNを上回っているので良い表現を獲得できている可能性

1. Introduction

  • 次の観測情報を直接予測するモデル(Observation-Prediction Model)は観測情報の次元数が大きいときや遷移が確率的なとき困難
  • 生の観測情報は意思決定について不要な情報(背景など)が含まれる
    • 本当に欲しいものは次の観測情報ではなく価値→Value-Prediction Modelである必要

2. Related Work

 省略

3. Value Prediction Network

3.1 アーキテクチャ

  \boldsymbol{x}が観測、 \boldsymbol{s}が状態表現、 \boldsymbol{o}がオプション(行動)としてVPNは次の4モジュールを学習

f:id:tokumini:20191028153752p:plain

 これらを用いて次のようにRollout

f:id:tokumini:20191028153943p:plain

3.2 プランニング

  • 理論上MCTSとかもできるが今回は簡単なプランニング手法を利用
  • 深さ dまで上位 b手のみを展開してゲーム木を構築して、バックアップ時には現在の状態の価値と最善値を混ぜて返す
f:id:tokumini:20191028154407p:plainf:id:tokumini:20191028154421p:plain

3.3 学習

 nステップTD法のような形で行う。 \epsilon-greedy方策で軌道を生成し \boldsymbol{x}_t, \boldsymbol{o}_t, r_t, \gamma_t (1 \le t \le n + 1)を得る。時刻 t時点での損失は、3.2のように kステップのロールアウトを行った結果がどれも現時点での教師信号に合うように設計する。

$$ \mathcal{L}_t = \sum_{l = 1}^{k} (R_t - v_t^l)^2 + (r_t - r_t^l)^2 + (\log_\gamma \gamma_t - \log_\gamma \gamma_t^l)^2 $$

 ただし $$ R_t = \begin{cases} r_t + \gamma_t R_{t+1} & \mathrm{if}\; t \le n\\ \max_\boldsymbol{o} Q_{\theta^{-}}^d (\boldsymbol{s}_{n+1}, \boldsymbol{o}) & \mathrm{if}\; t = n + 1 \end{cases} $$ であり、 Q_{\theta^{-}}^d (\boldsymbol{s}_{n+1}, \boldsymbol{o})は固定したターゲットネットワークを利用して3.2における深さ dの探索を行う値。

3.4 他手法との関係

 VPNは価値の推定に抽象状態遷移を利用するという意味ではモデルベースに近く、しかし結局価値を重視して価値の推定を行うことが目的という点でモデルフリーと見なすこともできる。トレーニング中に先読みを用いて高精度な教師情報を生成できるため、通常のQ学習よりも収束が速い。

4. 実験

 主に検証する内容は次の三つ

  1. VPNDQNのようなモデルフリーのベースラインを超えるか?
  2. Observation-basedなプランニングと比べたVPNの利点とは何か?
  3. VPSAtariゲームのような高次元で敏感な入力を持つ難しいタスクに対して有効か?

4.1 実験設定

ネットワークアーキテクチャ
  • Encode : CNN
  • Transition : Optionごとに異なる1層CNN,差分を予測
  • Outcome : Optionごとに異なる1層CNN + 2層全結合層
  • Value : 2層全結合
実装詳細
  •  n-step Q学習を16並列で実行
  • 10Kステップごとにターゲットネットワークを同期
  • VPN特有のハイパーパラメータ
    • 学習における予測ステップ k
    • 学習における探索深さ d_{train}
    • 評価における探索深さ d_{test}
      • 明示しない場合 k = d_{train} = d_{test}としVPN( k)として表記
    • 探索時の枝分かれ量 b:深さ3までは4,それ未満は1
  • 比較手法として次の状態表現ではなく観測値を予測してプランニングするOPN( k)を用意

4.2 収集ゲームにおける実験

タスクの説明

f:id:tokumini:20191028180908p:plain

 見下ろし型2D迷路において、青いマスにできるだけ多く到達するタスク。各エピソード20ステップで、青いマスに到達すると+2.0、各時間ステップで-0.2の報酬を得る。観測情報は \mathbb{R}^{3\times 10 \times 10}の形式であり、加えて[0,1]の範囲に正規化された残り時間を連結した3次元テンソルが入力となる。通常の確定的環境に加えて、各青いマスが0.3の確率で1ブロック移動し、0.3の確率で同じ行動を複数回繰り返すことができる確率的環境でも実験した。

結果

f:id:tokumini:20191028181327p:plain

  • DQNより高性能
  • OPNは確率的環境で性能悪化するがVPNは良い
    • OPNは観測の期待値を予測しがちで、それを入力とした価値関数が期待値を出力するとは限らない
  • 探索深さが増えるほど性能が向上する
汎化性能

 学習した環境とは異なるようなゴールが少ない(8→5)環境(FGと呼ぶ)、壁が多い環境(MWと呼ぶ)でも性能を検証

f:id:tokumini:20191028182306p:plain

 やはりVPNの汎化性能が良い。

テスト時の探索深さ

f:id:tokumini:20191028182445p:plain

 学習時の探索深さが小さいとテスト時の探索深さを増やしたときに悪影響が出るが、探索深さ3以上で学習していればほぼ問題はない。そして探索深さは5だが学習中に10ステップ予測を行うもの(VPN(5)*)では性能は上がっていった。

4.3 Atariゲーム

  • 10ステップに渡って同じ行動を取り続ける
  • ゲーム画面は84×84のグレースケールに処理して4フレームを入力とする
  • 割引率は固定し、3オプションステップ先までの予測を行う(実時間的には0.5秒先まで)

f:id:tokumini:20191028183057p:plain f:id:tokumini:20191028183107p:plain

 性能が高く、学習も速い。たった3ステップ分の予測でも性能が良くなっていることから、表現学習に良い影響を与えた可能性がある。

f:id:tokumini:20191028183318p:plain

 実際に予測した行動系列を可視化してみても良さそうな予測に高い価値が割り当てられている。

所感

 Transition部分の損失は明示的には組み込まれておらず、数ステップ先の価値を予測することで間接的に学習されることが期待されているのみのようだ。きっぱりしていてすごいが、状態の予測(環境モデルの学習)というよりは価値を予測する際の補助という意味合いが強いのかもしれない。

 適用ドメインも(おそらく)全部一人ゲームだと思うので、これをボードゲーム等に適用するとどうなるかはわからない。探索深さもあまり深くはないし、(実験ドメインの性質かもしれないが)Figure7を見るに探索を増やしてもすぐ頭打ちになっているところはやや気になる。

 遷移して画像レベルで再構成することは難しいし無駄が多いという感覚はあるが、一方で表現ベクトルまでいく前の「何がどこにある」というレベルでの特徴は正確に遷移が予測できて欲しいとも思う。そういう特徴抽出もニューラルネットワークがやっているわけなので難しいところだが、遷移の予測がいくらか補助タスクとして表現学習に有用そうだという結果がちらほら出ている感じなのは悪い材料ではなさそうだ。

 個人的には、遷移を考えるために有用な特徴と良さを判断するうえで重要な特徴は、重なりがありつつも全く同じではないと思われる。いくらか浅い層の部分で遷移を考えてそこから何層か加えて表現を深めて価値を推定するという形などを考えてみたいところだが果たして。

AtCoder Beginner Contest 144

結果

順位   109th / 5557
パフォーマンス   2266
レーティング  1872 → 1918(+46)

 全完できたのでかなりパフォーマンスが良い値になった。余計な誤答がなければ100位以内になったかもしれなかったが、F問題を解けたのも運っぽいのでこんなもんだろう。

A - 9x9

 場合分けをする。よく見たら1以上という部分は制約にあるのでそこは不要だったのか。そこを省けるなら3項演算子で書く長さだったな。

 提出

B - 81

 forループを書きます。

 提出

C - Walk on Multiplication Table

 すぐには解法がわからなくて一瞬おや? って思ったけど落ち着けば \sqrt{N}まで考えて約数ですねと。約数列挙特有の i \times i = Nの場合分けが要らなくて気分が良かった。

 提出

D - Water Bottle

 もうね、頭が全然回らないのでこういう問題をサッと処理できないんですよ。入力例が親切で露骨に場合分けをしなさいというメッセージを発しているのに最初は混乱していてなんか入力例1のような場合だけを考えていて「あれ?  xが角度を求めるときに必要にならないぞ?」みたいなことを考えていた。

 ちゃんと場合分けを考えてからもatan2がよくわからなくて普通のatanに戻ったり、弧度法と度数法の変換で頭おかしいことをやっていたりと、かなりひどかった。

 さらにプログラムの最初の方でstd::coutstd::setprecisionを指定するときに、手癖でstd::endlも流してしまって1WA。全ケースWAという表示を見たときの驚きといったら!

 提出

E - Gluttony

 まず答えは二分探索で求めそうというのはパッと思いついて、後は判定部分をどうするか。降順にソートした食べ物から見て、担当する人を二分探索で見つければ良さそうという解法を書いたが、1ケースを残してTLEという前回の悪夢が蘇る結果に。懲りないものでまたよくわからん高速化をして提出したらむしろTLEが増えて、しかし増えるということは時間制限すれすれなのだということがわかり、つまり時間制限が本当に改善でなんとかなりそうということだと判断した。

 毎ループ回std::multisetを構築していたのを、外部で1回構築してループ中ではコピーして利用するようにしたら通った。解説PDFを見たら、この二分探索は不要で先頭からマッチさせていくだけで良かったのか。考察が足りなかった。

 提出

F - Fork in the Road

 気持ちとして大きいコストに繋がりそうなところを塞ぎたい。塞ぐことを考えない場合はDPで単純にコストは求まって、 dp_iを求めるときには「遷移確率 ×  dp_j」を足しこんでくるわけだけど、遷移確率は一定なのでこの dp_jが一番大きいところへの遷移を塞ぎたくなった。DPテーブルを構築していくときに部屋iから進める部屋jで一番コストが大きいものを記録していって、あとでそれを除いてみてDPをやるということを N回やれば全体で O(NM)で通るという仕組み。

 しかし自分でコードを書いたときはループの形が3重になるので、「あとで除いてみてDPを N回」ところでかかる計算量が O(N^2M)になっていると思いこんでいた。「TLEだろうな〜」と思って投げてみたら通ってしまい、通った後に冷静に考えれば O(NM)だった、みたいな。TLEになると思いながら提出するのもよくわからないし、計算量の見積もりを間違っているのもアホなので怪我の功名でしかない。

 提出

AtCoder Beginner Contest 143

結果

 5完。E問題で12回の誤答と、ハマりにハマって大変なことになった。

 なんかレート更新がされていなくていつもの成績表が貼れない。

A - Curtain

 問題文が理解できなかったが、結局こういうことを要求されているんだろうという推測を書いたら通った。

 提出

B - TAKOYAKI FESTIVAL 2019

 for文が書けますかというだけの問題では。

 提出

C - Slimes

 終端の処理とかがやや怖かと一瞬疑ったけど別にそうでもなくてfor文が書けますかというだけの問題。

 解説PDF見ていて知ったけど、std::uniqueという手段があるのか。うーん、そりゃあるよな。

 提出

D - Triangles

 最初はやや混乱したけど、まぁ辺のうち二つは全探索して残りは条件に合うものを適切に探すんだろうなという方針は早めに立った。後は冷静に条件を考えてコード中のような考察をしてAC。解説PDFの通り、大きい二つを全探索というようにすればもっと無駄が省けたんだな。

 提出

E - Travel by Car

 正確な計算量の見積もりはできていないけど、結局(給油回数, 現在の燃料量)をコストとしてダイクストラ N回やれば良いと判断した。感覚だけど、各ノードに到達したとき給油回数は最善に比べてせいぜい1多い場合があり得るだけなので計算量的には大丈夫そう。だが重要な問題として「給油回数は少ない方が良いが、現在の燃料量は多い方が良い」というこの二つで比較方法が逆である点にめちゃくちゃ苦しめられた。

 コストの更新部分でまず間違えて1WAをくらい、そこを修正すると1ケースだけTLEになるというところから地獄が始まる。1ケースだけTLEだとcinの高速化とか変数をグローバルに置くとかで行けそうだと錯覚してしまい、そういう些細なお気持ち程度の高速化をして提出してはTLEということを繰り返した結果12ペナ。最終的にpriority_queueから取り出す順番の比較関数で現在の燃料量を小さい順に取り出していたところを修正したらAC。そうなんだよ、ダイクストラ法でTLEくらう場合ってたいていpriority_queueから取り出す順番が間違っているっていうことをすっかり忘れていた。最近はもう全然競技プログラミングに触ってないのでこういう典型的なミスに対する嗅覚が錆びついていく一方だ。AtCoderがシビアな時間制限にすることもそんなにないし、感覚がダメ。コンテスト中にしっかり考えていく根気が足りてなくて、高速化で通ってくれと思考停止してしまっていたのが最悪だった。

 解説PDFとはやや違うけど、まぁ別に嘘解法ではないと思う。というか解説の方法がむしろよくわからないな。それでいけるのか、うーん。言われればそんな気もするが確信が持てなくて実装し始めるには躊躇するくらいだなぁ。

 提出

F - Distinct Numbers

  K個ビンを用意して、現在最小値のものに詰めていく感じだと O(N^2)だなぁという考察しか進まなかった。解説PDF読んで通したが、なにこれ頭が良すぎる。こういう発想ができるようになれる気がしない。

 提出

AtCoder Grand Contest 039

結果

順位   642nd / 3114
パフォーマンス   1676
レーティング  1917 → 1895(-22)

A - Connection and Disconnection

 2WA。まず一回目は「S一つを考えたときに必要な操作回数を数えて K倍し、Sの末尾とSの先頭が同じなら K - 1回プラス」という方針。しかしこれは

aabaaa
2

に対して5と答えてしまうので全然ダメ。

 二つ目の提出は Kが3未満のときは構築して愚直に、3以上のときは3つ連結したものを考えて、先頭・中間・末尾として扱って中間で必要な操作回数だけ K - 2倍するというもの。しかし

aaa
5

に対して8と答えてしまうのでダメ。文字が1種類だと中間が常に同じ消し方になるとは限らない。最初に条件分けを追加してAC。

 AGCのA問題をWAなしで通せる気がしない。

 提出

B - Graph Partition

 3WA。A問題でWAを出すとそれ以降の問題に対してもやや投げやりに提出してしまうところはあるかもしれない。

 まずいろいろ考えていると、だいたいグラフの端っこっぽいところからBFSをすれば良さそうという気持ちが芽生える。(2部グラフになっていなかったら途中で弾く)

 グラフの端を見つけたい。適当に頂点0からダイクストラ法で距離最大となる頂点を探し、そこからBFSをするという方針で1WA。木の直径の話を思い出して、最初にダイクストラをやって最大距離となる頂点からもう一回ダイクストラやって最大距離となる頂点からBFSをやるようにしてもう1WA。ひょっとして次数が1の頂点ならどこからBFSしても同じなのではと思って提出してさらにWA。

 ここで冷静になって、計算量的に間に合うんだからBFSし始める点を全探索すればいいじゃんということに気づいてAC。解説PDFとは違うけど、たぶん正当、かな?

 提出

C - Division by Two with Something

 いろいろ実験をしているうちに、ループするのが Nの奇数の約数をビット幅にもってb ~b b ~b b ... b ~b bのような形になる場合だと考えて、 X = 2^N - 1の場合は解けそうだと思ったのでその特殊ケースについてずっと考えていた。残り十数分というところでそれについては解けた(提出)が、しかし X \lt 2^N - 1の制約では全然わからずお手上げ。

 解説PDFを読んでも結構厳しい感じ。書いてある通りに実装して包除もよくわからないままに適当に書いたらなんか通ってしまった。2倍にするとか偶奇性とかで異常に脳がこんがらがる。難しい。

 提出

Why Does Hierarchy (Sometimes) Work So Well in Reinforcement Learning?を読んだ際のメモ

出典

読んだ理由

 前回、コンピュータ将棋における現状の強化学習の課題として、特定の戦型に弱く、探索が偏っているのではないかという問題意識を持った。居飛車振飛車のような方針からして大きく異なる戦法を探索できる必要があり、それは階層的強化学習のような枠組みで考えることで解決できる可能性があると考えている。そのあたりを調べていたところ、階層的強化学習が効率的な探索に貢献するという主張をしている論文があったので読んだ。

概要

 階層的強化学習が上手くいく理由を仮説として4つにまとめ、それぞれの正当性を検証した。実験結果は階層的にすることで探索が効率化されるため性能が良くなることを示唆しており、それをもとに非階層的強化学習でも行える実装が容易な改善方法を示した。

1. Introduction

 省略

2. Related Work

 省略

3. 階層的強化学習

 基本的な枠組みとしては上位レベルの方策が1つ以上の下位レベルの方策を指定、指示することを階層的強化学習という。

  1. Option型
    • 数ステップごとに上位方策が一つの下位方策を指定、その期間は指定された下位方策が行動を決定
  2. Goal-conditioned型
    • 数ステップごとに上位方策が(連続値の)目標を出力
      • この"目標"は抽象的なものではなくX,Y座標のような具体的なものに限定される? それだと応用範囲が狭そうに思えるが
    • 下位方策は状態 + 目標を入力として行動を決定

4. 階層的強化学習が上手くいく理由の仮説

  1. 上位方策がステップ数が圧縮しているので報酬が伝播しやすく学習が効率的
  2. 上位方策が複数ステップごとに使われるので時間的に相関する状態をまとめて探索可能
  3. 上位方策が意味のある行動系列を直接的に扱うため報酬との相関が強く学習が効率的
  4. 上位方策が意味のある行動系列を用いて探索することで探索が効率化

 仮説同士の関係は

抽象化する対象\効率化する対象 学習 探索
時間 仮説1 仮説2
意味 仮説3 仮説4

 (正直仮説2と仮説4の違いがあまりよくわかっていない)

 この論文はそれぞれの理由を独立に検証する実験を行い、結果は2,4の探索の効率化が性能向上に大きく寄与するということを示した。

5. 実験

 物理エンジンの中で4本足のエージェントを動かして、特定の位置に移動、ブロックを特定の位置に動かすなどのタスクを解かせる。

f:id:tokumini:20191002175329p:plain
Figure 1

 前提として、階層型強化学習(左3つ)だとそこそこ上手くいくが、単にマルチステップ報酬を使う非階層型エージェント(右3つ)はボロボロ。

5.1 仮説1,2の検証

  • 上位方策が行動を時間的に拡張することが重要かを検証
  • 上位方策を呼び出すステップ間隔 cを以下の2つに分解
    • 学習時の報酬総和を取る間隔 c_{\mathrm{train}}(学習の時間的な圧縮に対応)
    • 行動決定時の呼び出し間隔 c_{\mathrm{expr}}を別々に設定(探索の時間的な圧縮に対応)
  • 結果

f:id:tokumini:20191002173356p:plain
Figure 2

どちらもやや大きめの方が良さそうではあるが、あまり大きな差ではないとも言える。

5.2 仮説1,3の検証

  • 階層型エージェントによって収集された軌道を一部用いて非階層的なエージェントを学習(Shadow Agentと命名
    • 探索が効率化されていることが大きいならこの非階層的なエージェントも性能が良いはず
    • 行動を時間的にor意味的にまとめることが重要なら階層的エージェントと非階層的エージェントの性能差が大きくなるはず
  • 仮説1の影響を排除するため非階層的エージェントも c_{\mathrm{rew}}ステップ分をまとめるマルチステップ強化学習を実行
  • 結果

f:id:tokumini:20191002174100p:plain
Figure 3

 c_{\mathrm{rew}} = 3だと階層的エージェントとほぼ同等の性能→重要なのは探索

5.3 仮説2,4の検証

  • これまでの結果を踏まえて非階層型だが上手く探索できる手法を提案
    Explore & Exploit
  • Goal-conditioned型に近い形
    •  c_{\mathrm{switch}}ステップごとに2つのエージェントを確率的に選択(80%と20%)
      • 環境報酬を最大化するエージェント(上位方策に類似)
      • 目標を達成するためのエージェント(下位方策に類似)
    • 両方共環境が提供する行動に対する方策を学習
    • 2つのエージェントでリプレイバッファは共有
      Switching Ensemble
  • Option型に近い形
  • 複数の(5くらい)非階層型エージェントを学習
  •  c_{\mathrm{switch}}ステップごとにエージェントの一つをランダムに選択
    (要するに上位方策を一様分布にしただけ)

f:id:tokumini:20191002182538p:plain
Figure 4

 AntBlockMazeにおけるExplore & ExploitとAntPushにおけるSwitching Ensemble以外は階層型手法と同程度の性能を達成。

 それぞれのエージェントは別々のネットワークを使用することが重要。ネットワークの入力に近い側をボディとして共有し、エージェントの数だけヘッドを分岐させる方法では性能低下(付録より)

f:id:tokumini:20191002184117p:plain
Figure 7

所感

 階層的強化学習が探索で効果的だという説は、感触としてはイメージ通り。Switching Ensemble型で上手く結果が出るなら、たとえば将棋なら居飛車エージェントと振飛車エージェントの二つを用意して確率的に選択するなどでも効果が出そうだと期待したくなるところ。しかし二つの方策を作って学習させてもそれらが似通ってしまったら意味がないので、どうやってバラけさせるかは問題になりそう。実験ドメインボードゲーム分野とはかなり異なるので将棋に応用してすぐ結果が出るかは微妙そうだ。

 エージェント間でネットワークを共有させると性能が落ちるという点は気になるところ。そうなるとそもそも学習で得られる表現自体が各エージェントで全然別のものになっているのだろうか。強化学習における表現学習という方向でももっと調べてみたい。