画像to画像のネットワークに二桁の足し算を学習させる

 手頃な大きさのニューラルネットワークが、画像を入力とし画像を出力する形で二桁の足し算を解くことができるのかどうかを検証した。

実験方法

データ形式

 入力画像に「A+B=」という式を画像化したもの、教師画像として「A+B=C」の正しい式を画像化したものを与え、入力から教師を予測できるように学習する。たとえば以下のようなデータペアが与えられる。

f:id:tokumini:20211128183016p:plainf:id:tokumini:20211128183026p:plain
左:入力画像 右:教師画像

 詳細には、入力・教師画像は

  • サイズは256×256
  • 白黒の1ch画像
  • ネットワーク入力時、値は[0, 1]

である。

データの作り方

 0~99までの2つの値の足し算の式を全部生成し、計100 * 100 = 10000通りのデータを作り、ランダムに選んだ9000個を学習用データ、残り1000個をvalidation用データとする。

学習モデル

 これを適当なネットワークで処理する。AutoEncoderなりなんなり、入力・出力が画像で行えるものならなんでも良かったのだが、今回は実装を手抜きするために以下のセマンティクスセグメンテーション向けのライブラリを利用した。

 入力・出力をともに1chとして、出力の最後にはsigmoid関数をかけて出力を[0, 1]にする。出力と教師画像の二乗誤差を損失として勾配法で学習を行う。

実装全体

結果

 1周期Cosine annealingを用いて50エポックくらい回すと検証損失は収束している見た目になった。

f:id:tokumini:20211128182929p:plain

 最終エポックまで終わったパラメータについて、検証データからランダムに18データ選んでネットワーク出力を見てみると以下のようになった。

f:id:tokumini:20211128183223p:plain f:id:tokumini:20211128183230p:plain f:id:tokumini:20211128183254p:plain f:id:tokumini:20211128183259p:plain f:id:tokumini:20211128183307p:plain f:id:tokumini:20211128183312p:plain f:id:tokumini:20211128183318p:plain f:id:tokumini:20211128183330p:plain f:id:tokumini:20211128183338p:plain f:id:tokumini:20211128183345p:plain f:id:tokumini:20211128183401p:plain f:id:tokumini:20211128183407p:plain f:id:tokumini:20211128183415p:plain f:id:tokumini:20211128183423p:plain f:id:tokumini:20211128183430p:plain f:id:tokumini:20211128183639p:plain f:id:tokumini:20211128183647p:plain f:id:tokumini:20211128183654p:plain

 最後の画像など、少し数字が滲んでいて怪しいところはあるが、基本的に多くの場合で計算自体は合っている(と思う、目視で確認しているのでもしかしたら漏れがあるかもしれない)。

所感

 こういうことができそうだなぁと思ったが上手く論文を見つけられなかったので自分で試してみた。想定していたことがそれなりにできていそうで、こういう「これぐらいの大きさのニューラルネットワークでこれくらいのことができそう」という感覚はできるだけ持っておきたいところ。

 整数の足し算など、おそらくTransformerで大量に学習させた言語モデルに突っ込めばできるものだとは思うが、数字をトークン化して入力している事自体がある程度のヒントであるとも思える。また、ごちゃごちゃしてtex形式だと大変なことになる数式や、画像(グラフなど)と文章がセットになっている文書などを読む場合とかも考えると、文章自体を画像として捉える手法の重要性もそれなりにあるのかなと想像しているところではある。

 今後、タスクの難易度を上げる方法として

  • 引き算、掛け算を追加する(割り算は整数に閉じないからどうだろう?)
  • 値の上限をもっと増やす
  • 項の数を増やす

などがパッと思い浮かぶ。

 タスクの難易度上昇なのかは明確にはわからないが、他にもデータ拡張として

  • 数式表示位置をランダムに少しズラす
  • 数式のフォント、フォントサイズをランダムに変える

といったことをすることも考えられる。

 精度向上のためには単純にもっと巨大モデルを用いても良いので、そのあたりでどこまでできるものなのかは少し検証してみたい。

『Which are you?』 その2 Transformerの採用

 前回

 前回は『Which are you?』というトイタスクを考え、LSTMを使って方策勾配法を用いることで10回中7回でそれなりな正答率になった。

 今回は時系列モデルをLSTMからTransformerへと変更した。

実装

 Transformerで時系列を扱う場合、過去の入力情報が必要になるので、適当にstd::vectorで確保しておく。LSTMのときに状態リセットAPIを用意していたので、それが呼ばれたタイミングでstd::vectorを空にする。

 学習時にエピソード全体を一気に推論することがあり、そのときには未来情報を見ないようにmaskを作る必要がある。これは以下のような形で作れるというのは学びだった。

  torch::Tensor mask = torch::ones({seq_len, seq_len}).to(device);
  mask = torch::triu(mask);
  mask = mask.transpose(0, 1);

 PyTorchではmaskがbool値である場合は「Trueであるところが計算対象外」となるが、float値である場合は(0,1でなく中間の値も使えるように)maskの値がAttentionに直接かかるので、「1であるところが計算対象、0であるところが計算対象外」となり、意味が逆転するという罠があることも初めて知った。

 以下が推論部の実装。seq_lenを一度に入力される場合(学習時)でも、seq_lenを1個ずつ切り出して入力される場合(実行時)でも、上手く動くようになっている。Valueを出力する機構も準備しているが、今回はValueは損失計算などに使用していない。

std::tuple<torch::Tensor, torch::Tensor> Network::forward(torch::Tensor x) {
  // xのshapeは(seq_len, batch, input_size)
  // 出力shape policy:(seq_len, batch, POLICY_DIM) value(seq_len, batch, 1)

  const int64_t seq_len = x.size(0);

  const torch::Device& device = transformer_->parameters().front().device();
  x = x.view({-1, 1, input_size_});

  // 過去の情報と結合
  input_history_.push_back(x);
  x = torch::cat(input_history_, 0);
  x = x.to(device);

  // 1層目
  x = first_layer_(x);

  // maskを作る
  torch::Tensor mask = torch::ones({seq_len, seq_len}).to(device);
  mask = torch::triu(mask);
  mask = mask.transpose(0, 1);

  torch::Tensor output = transformer_->forward(x, mask);
  const int64_t output_len = output.size(0);
  output = output.slice(0, output_len - seq_len, output_len);

  torch::Tensor policy = policy_head_->forward(output);
  torch::Tensor value = value_head_->forward(output);

  return std::make_tuple(policy, value);
}

void Network::resetState() { input_history_.clear(); }

結果

f:id:tokumini:20211127115638p:plain

 10回中10回で正答率は80%を超えるようになり、ちゃんと学習できていそうなことがわかった。

 1回はほぼ100%に張り付くような形になったが、他では85%~95%あたりで止まってしまっている。これは、1回目の行動がランダムエージェントと被り(確率25%)、そこで行動を続けずに二択を回答すると確率50%で外れて、合わせて12.5%で外すような形になっているのではないかと思われる。

所感

 Transformerが強いというよりも、過去の情報をCPUメモリに直接保持する形だと解きやすいのは当然な気がする。計算量が間に合うなら別にTransformerの構造でなくとも全結合ネットワークに放り込んでもこれくらいできるのではないかという気はするが、まぁ計算量の抑え方というのも重要なところではあるか。(今回のタスクでは系列長が2とかになっているはずなので正直なんでも解けるとは思うが)。

 とはいえ入力系列が長くなっていくとこれではメモリが足りなくなったりといったことは起こるはずなので、そういうときには先日読んだような手法を使っていくことになるのだろう。

Not All Memories are Created Equal: Learning to Forget by Expiringを読んだメモ

概要

 Transformerに与える系列に対して、記憶が有効である期限を事前に計算し、不要な記憶は捨てていくような機構を導入する。

提案手法

 前提として、毎回のタイムステップで、表現ベクトル h _ tがやってくる。これをTransformerで処理して、過去の情報を考慮しつつOutputを出力するような状況を考える。

 普通にやると h _ 1, \dots, h _ tをTransformerに全部入力する。Transformerだと基本的に O(N ^ 2)かかるので、系列が長くなると計算時間が大変なことになる。

 提案手法では以下のようにする。

f:id:tokumini:20211125124933p:plain

 あるタイムステップで表現ベクトル h _ tがやってきたときに、まずそれの期限(Span) e _ tを計算する。 h _ tはその期限が切れるまでの間だけTransformerで考慮されることにする。

  tは現在時刻であり、添字がかぶるので、過去のステップを iとする。

  e _ iの計算方法は

 e _ i = L \sigma (w h _ i + b)

ようするに1層の線形層に、活性化関数としてシグモイド関数をかけて、0からLの範囲になるように引き伸ばす。Lは最大の期限として設定するハイパーパラメータ。

 現在のステップ tにおける、ステップ iデータの寿命を計算する

 r _ {ti} = e _ i - (t - i)

 これが0より大きいものだけ取り出して、Transformerに入力するということをしたい。しかしそういうことを完全にやってしまうと、0以下のものに対して勾配が流れなくなってしまうので、学習中は以下のようにやや緩和して行う。

 m _ {ti} = \max (0, \min(1, 1 + r _ {ti} / R))

 ここで Rはハイパーパラメータである。この式が何をしたいかというと

f:id:tokumini:20211125213830p:plain

らしい。

 メモリを削減していきたいので、学習のときは e _ iにL1ノルムで制約をかける。 \alphaをハイパーパラメータとして、

 L _ {total} = L _ {task} + \alpha \sum _ i e _ i / T

という形で損失を付け加える。

学習の工夫

 計算効率とかのために少し手を加えるらしい。興味が持てなかったのでパス。

実験

 過去に一つ重要な情報があり、それをずっと保持しなければいけないようなトイプロブレム的な強化学習や系列のコピーでは全体的に良い。(もちろん提案手法の有効性を主張するためのタスク設定なので当然なのだけど、やや恣意的だなと感じるところはある)

 言語モデリングや物体衝突に関する認識的なやや実践よりのタスクだと、Transformerを用いて過去の情報を持ち越してくるような手法として、Compressive TransformerとAdaptive-Spanというものと比較している。精度とかメモリ効率とか計算効率がそれなりに良いという主張ではあるらしい。

f:id:tokumini:20211126053922p:plain

 ちゃんと有効そうなところへ長い期限が割り当てられていそうという分析は面白かった。

f:id:tokumini:20211126054306p:plain

所感

 不要な記憶は捨てたいよねというモチベーション自体はわかるが、保持すると決めた表現ベクトルが加工されないまま残ることはちょっと違和感があるかもしれない。覚えておくべき事柄も、だんだん洗練された形式で記憶を保持していくということはできないのかな。その点は比較されているCompressive Transformerの方が良さそうな印象はある。まぁでもそれを言っていくとPerceiverになっていくのかな……。

ICML2021のPoster採択論文一覧を眺める

 なんかoralは上手く反応しないのでPosterだけ。AbstだけGoogle翻訳にかけて、明らかに誤訳そうなところだけは少し手直しして貼り付けておく。結局これが手間と後で見返したとき便利さのバランスとして適当そう。

MuZero系

多くの重要な現実世界の問題には、高次元、連続、またはその両方のアクションスペースがあり、考えられるすべてのアクションを完全に列挙することは不可能です。 代わりに、ポリシーの評価と改善を目的として、アクションの小さなサブセットのみをサンプリングできます。 この論文では、そのようなサンプリングされたアクションサブセットに対するポリシー評価と改善について原則的な方法で推論するための一般的なフレームワークを提案します。 このサンプルベースのポリシー反復フレームワークは、原則として、ポリシー反復に基づく強化学習アルゴリズムに適用できます。 具体的には、サンプリングされたアクションを計画することにより、任意に複雑なアクション空間を持つドメインで学習できるMuZeroアルゴリズムの拡張であるSampledMuZeroを提案します。 このアプローチを、囲碁の古典的なボードゲームと、DeepMind ControlSuiteとReal-WorldRLSuiteの2つの連続制御ベンチマークドメインで示します。

 4月に出ていたSampled MuZeroというやつが通っている。当時読んだときはMuZeroの真っ当な拡張という印象ではあった。まぁサンプリングであってもそれなりの試行回数があればある程度動きそうという感覚はあり、ちゃんと上手くいくんだなくらいで流している。もしかしたらもっと重要なことが書いてあるのかもしれないが。


モデルベースのRLの分野における最近の開発は、さまざまな環境、特に計画が不可欠な環境で成功していることが証明されています。 ただし、そのような成功は、決定論的な完全に観察された環境に限定されています。 確率的で部分的に観察可能な環境を処理する新しいアプローチを提示します。 私たちの重要な洞察は、離散オートエンコーダーを使用して、確率的環境でのアクションの複数の可能な効果をキャプチャすることです。 モンテカルロ木探索の確率的変形を使用して、エージェントのアクションと環境の応答を表す離散潜在変数の両方を計画します。 私たちのアプローチは、対戦相手が環境の一部と見なされるチェスの確率論的解釈において、オフラインバージョンのMuZeroを大幅に上回っています。 また、私たちのアプローチが、大規模な視覚的観察と部分的な観察可能性を備えた一人称3D環境であるDeepMindLabに対応していることも示しています。

 確率的な環境に対応するために、離散Auto Encoderを使って確率的サンプリングをしつつ環境遷移を行って、MCTSもちょっと変形して探索的なことをしようという内容だと認識している。アイデアとして自然な気がするので有力そう。いつかちゃんと読む。

ゲーム系

StarCraft IIでGrandMasterレベルに到達するAIであるAlphaStarは、複雑なリアルタイムストラテジーRTS)ゲームで深層強化学習が何を達成できるかを示す注目すべきマイルストーンです。 ただし、ゲーム、アルゴリズム、システムの複雑さ、特に必要な膨大な量の計算は、コミュニティがこの方向でさらに調査を行う上での大きな障害です。 深層強化学習エージェント、スタークラフトコマンダー(SCC)を提案します。 計算が桁違いに少なく、テストマッチでGrandMasterプレーヤーを、ライブイベントでトッププロプレーヤーを打ち負かす最高の人間のパフォーマンスを示しています。 さらに、それは様々な人間の戦略に対して強い頑健性を示し、人間の遊びからは見えない新しい戦略を発見します。 このホワイトペーパーでは、StarCraftIIフルゲームの効率的な模倣学習と強化学習に関する重要な洞察と最適化について説明します。

 StarCraftというゲームがどんなもんかピンときてないんだけど、妙に題材にされているし、なんか深層強化学習でやりやすい要素があるのだろうか。ゲームとして違いすぎるので将棋に活かせるような話がどれだけあるかはわからないけど、とても時間が余っていたら読んでみても良いかも。


ゲームは現実世界を抽象化したものであり、人工エージェントは他のエージェントと競争して協力することを学びます。さまざまな完全情報ゲームと不完全情報ゲームで大きな成果が得られていますが、3人用のカードゲームであるDouDizhu(別名Fighting the Landlord)はまだ解決されていません。 DouDizhuは非常に挑戦的なドメインであり、競争、コラボレーション、不完全な情報、広い状態空間、そして特に合法性がターンごとに大幅に異なる可能性のあるような大量の行動セットといった難点があります。残念ながら、現代の強化学習アルゴリズムは主に単純で小さなアクションスペースに焦点を合わせており、当然のことながら、DouDizhuでは満足のいく進歩を遂げていないことが示されています。この作業では、概念的にシンプルでありながら効果的なDouDizhu AIシステム、つまりDouZeroを提案します。これは、ディープニューラルネットワーク、アクションエンコーディング、および並列アクターを使用して従来のモンテカルロ法を強化します。 DouZeroは、4つのGPUを備えた単一のサーバーでゼロから始め、トレーニングの数日で既存のすべてのDouDizhu AIプログラムを上回り、344のAIエージェントの中でBotzoneリーダーボードで1位にランクされました。 DouZeroを構築することにより、複雑なアクションスペースを持つハードドメインで強力な結果を提供するために、従来のモンテカルロ法を作成できることを示します。コードとオンラインデモはこのURLでリリースされており、この洞察が将来の作業の動機付けになることを期待しています。

 これまた知らないゲームだけど、多人数カードゲームとは難しそうな題材だ。こういうのは革命的な工夫を論文から読み取るというよりも、細かいゲームへの適応方法とか、分析方法とか、そういうところが学びになったりならなかったりしそう。

環境モデルが関わっていそうな強化学習

正則化されたポリシーの最適化と補助的な損失としてのモデル学習を組み合わせた新しいポリシーの更新を提案します。 提案手法(以下、Muesli)は、アタリでのMuZeroの最先端のパフォーマンスと一致します。 特に、Muesliは詳細検索を使用せずにこれを行います。ポリシーネットワークと直接連携し、モデルフリーのベースラインに匹敵する計算速度を備えています。 Atariの結果は、広範なアブレーション、および連続制御と9x9囲碁に関する追加の結果によって補完されます。

 なんか大渡さんが実装していたのをちらっと眺めたことはあるけど、それだけなのであまり深くはわかっていない。探索系となるとちょっとは気になるな。


計画-大規模な問題の構造を分析し、それを相互に関連するサブ問題に分解する能力-は、人間の知性の特徴です。深層強化学習(RL)は、比較的単純な制御タスクを解決するための大きな期待を示していますが、ますます複雑化する環境を処理するために、既存の深層RLパラダイムに計画を最適に組み込む方法は未解決の問題です。 1つの著名なフレームワークであるモデルベースRLは、世界モデルを学習し、段階的な仮想ロールアウトを使用して計画を立てます。このタイプの世界モデルは、計画期間が長くなるとすぐに現実から逸脱するため、長期計画で苦労します。エージェントに時間的に拡張された推論を行う能力を与える世界モデルをどのように学ぶことができますか?この作業では、スパースなマルチステップ遷移で構成されるグラフ構造の世界モデルを学習することを提案します。グラフ上のノードとしてゴール空間全体に(到達可能性の観点から)散在する潜在的なランドマークを学習するための新しいアルゴリズムを考案します。この同じグラフでは、エッジはQ関数から抽出された到達可能性の推定値です。ロボット操作からナビゲーションに至るまでのさまざまな高次元連続制御タスクで、L3Pという名前の方法が以前の作業を大幅に上回り、モデルフリーRLの堅牢性と一般化の両方を活用できる唯一の方法であることが多いことを示します。グラフ検索アルゴリズムの。私たちの仕事は、強化学習におけるスケーラブルな計画に向けた重要なステップであると信じています。

 パッと概要見た感じではアイデア的には良さそう。世界モデルと、行動決定の階層性、目標の抽象化あたりは強化学習の重要な点になるとは思うので、この論文の手法かどうかはともかく、なにか対策を入れるのがスタンダードにはなると勝手に予想している。


画像などの生の高次元観測のみを利用しながら将来を計画する機能は、自律エージェントに幅広い機能を提供できます。将来の行動を直接計画する視覚モデルベースの強化学習(RL)手法は、短期間の推論のみを必要とするタスクで印象的な結果を示していますが、これらの手法は時間的に拡張されたタスクで苦労しています。アクションの効果は時間の経過とともに大きく複雑になり、最適化するのが難しいため、アクションだけでなく状態のシーケンスを計画することで、長期的なタスクを解決する方が簡単であると主張します。これを達成するために、最適制御文献で長期的なタスクで良好な結果を示したコロケーションのアイデアを利用し、学習した潜在状態空間モデルを利用して画像ベースの設定に適応させます。結果として得られる潜在選点法(LatCo)は、潜在状態の軌道を最適化します。これは、報酬がまばらで長期的な目標を持つタスクで、ビジュアルモデルベースのRLに対して以前に提案されたShooting法よりも優れています。

 人間が1秒単位のことも1年単位のことも考えられたりするのすごそうなことに思えるが、まぁどうにかすればなんとかできてしまう話ではあるのかなぁという気もする。多分時間というのは環境の変化と結びついているところが大きそうだから環境モデルとの関連は重要そうだよねーとは思いつつ、これは環境モデルというよりは表現空間よりの話なのかな? ちゃんと読んでみないとわからないところ。

強化学習における表現学習

画像ベースの環境で効果的な表現を学習することは、サンプルの効率的な強化学習(RL)にとって非常に重要です。残念ながら、RLでは、表現学習はエージェントの探索的経験と混同されます。有用な表現を学習するには多様なデータが必要ですが、効果的な探索は一貫性のある表現でのみ可能です。さらに、タスク全体を一般化するだけでなく、効率的なタスク固有のトレーニングのためにダウンストリームの探索を加速する表現を学びたいと思います。これらの課題に対処するために、Proto-RLを提案します。これは、表現学習とプロトタイプ表現による探索を結び付ける自己監視フレームワークです。これらのプロトタイプは、同時に、エージェントの探索的経験の要約として、また観察を表すための基礎として機能します。ダウンストリームのタスク情報がない環境で、これらのタスクに依存しない表現とプロトタイプを事前にトレーニングします。これにより、一連の困難な継続的制御タスクに関する最先端のダウンストリームポリシー学習が可能になります。

 強化学習における表現学習部分と方策決定部分はある程度分けてやれるんじゃないかという派閥の一つに見える。プロトタイプを作るというの、数個上でもあった表現空間でのランドマークというのとちょっと近かったりする?

 実験はDeepMind Control Suiteでやっているらしい。そういえばMuJoCoが無料で使えるようになったのでこのタスクでの検証っていうのはわりと自分のPCでもできるはずではあるのか。


計装されていない(精密でない? 元の語"uninstrumented")環境での直接的な相互作用を介して自律的に行​​動を学習する能力は、生産性を向上させたり、家のような構造化されていない環境でケアを提供したりできるジェネラリストロボットにつながる可能性があります。このような計装されていない設定では、車載カメラやジョイントエンコーダーなど、ロボットの固有受容センサーのみを使用した操作が保証されます。これは、高次元性と部分的な可観測性の問題により、ポリシーの学習が困難になる可能性があります。強化学習の表現としてRRL:Resnetを提案します。これは、固有受容感覚の入力から直接複雑な行動を学習できる、簡単で効果的なアプローチです。 RRLは、事前にトレーニングされたResnetから抽出された特徴を標準の強化学習パイプラインに融合し、州から直接学習するのに匹敵する結果を提供します。最先端の方法が大幅な進歩を遂げることができない、シミュレートされた器用な操作ベンチマークでは、RRLは接触が豊富な動作を提供します。 RRLの魅力は、表現学習、模倣学習、強化学習の分野からの進歩をまとめるという単純さにあります。複雑な高次元領域であっても、視覚入力から直接行動を学習し、状態から直接学習するパフォーマンスとサンプル効率を一致させることにおけるその有効性は明らかではありません。

 表現抽出器としてResNet使った方がいいんじゃねって、それはそうじゃねという気はするけど、なにかすごく新規的なことが言われているのかよくわからない。まぁでもちゃんと検証したという話ならそれはそれで重要なのかな。


画像からの深層強化学習(RL)における報酬駆動型特徴学習の制限を克服するために、表現学習をポリシー学習から分離することを提案します。この目的のために、Augmented Temporal Contrast(ATC)と呼ばれる新しい教師なし学習(UL)タスクを導入します。これは、畳み込みエンコーダーをトレーニングして、画像の拡張とコントラスト損失を使用して、短い時間差で分離された観測のペアを関連付けます。オンラインRL実験では、ATCのみを使用してエンコーダーをトレーニングすると、ほとんどの環境でエンドツーエンドのRLと一致するか、それよりも優れていることがわかります。さらに、専門家のデモンストレーションでエンコーダーを事前トレーニングし、RLエージェントで重みを凍結して使用することにより、いくつかの主要なULアルゴリズムベンチマークを行います。 ATCでトレーニングされたエンコーダーを使用しているエージェントは、他のすべてのエージェントよりもパフォーマンスが優れていることがわかります。また、複数の環境からのデータでマルチタスクエンコーダーをトレーニングし、さまざまなダウンストリームRLタスクへの一般化を示します。最後に、ATCコンポーネントをアブレーションし、新しいデータ拡張を導入して、RLで拡張が必要な​​場合に、事前にトレーニングされたエンコーダーからの(圧縮された)潜像の再生を可能にします。私たちの実験は、DeepMind Control、DeepMind Lab、およびAtariの視覚的に多様なRLベンチマークにまたがっており、完全なコードはこのURLで入手できます。

 時間的な近さで対比学習をさせるというのは、将棋とかで少し考えたことがある。しかしせっかく時系列的な要素があるなら環境遷移という形で学習させたくなる気もする? 対比学習はそれはそれで面白そうな内容の一つではあるのだけど。

強化学習その他

強化学習におけるクレジットの割り当ては、将来の報酬に対する行動の影響を測定する問題です。 特に、これにはスキルと運を分ける必要があります。 報酬に対する行動の影響を、外部要因およびその後の行動の影響から解きほぐします。 これを達成するために、因果関係理論からの反事実の概念をモデルフリーのRLセットアップに適応させます。 重要なアイデアは、軌道から関連情報を抽出することを学習することにより、将来のイベントで価値関数を調整することです。 次に、これらを将来の条件付きベースラインおよびポリシー勾配アルゴリズムの批評家(Critic)として使用することを提案し、エージェントのアクションに関する情報を含まないように後知恵情報を制約することで偏りをなくしながら、分散が明らかに低い有効で実用的なバリアントを開発します。 いくつかの実例となる問題について、アルゴリズムの有効性と妥当性を示します。

 反実仮想という言葉が最近少し気になりつつあるので釣られてしまった。とはいえそういう話が実用性の高いタスクに対して現状ものすごく有効という印象はなく……。強化学習に関する論文はどのタスクで検証したかが重要(トイプロブレムでの検証なのか、Atari系のゲームか、ボードゲームか、ロボット的シミュレーションかで話が結構違う)ので、そこについてだけチラッと論文の中身を見てみたけどトイプロブレムっぽかったかな。


強化学習の探索は困難な問題です。最悪の場合、エージェントは状態空間のどこにでも隠されている可能性のある高報酬の状態を検索する必要があります。エージェントに成功した結果の例が提供される、より扱いやすいクラスのRL問題を定義できますか?この問題設定では、状態を成功または失敗として分類するように分類器をトレーニングすることにより、報酬関数を自動的に取得できます。適切に訓練された場合、そのような分類器は、良好な状態への進歩を促進し、補正された探査ボーナスを提供する、整った客観的Landscapeを提供することができます。この作業では、不確実性を意識した分類器が、探索を奨励し、前向きな結果に向けた指示されたガイダンスを提供することによって、困難な強化学習の問題を解決できることを示します。正規化された最尤(NML)分布を計算するための償却手法に基づいて、これらのキャリブレーションされた不確実性を意識した分類器を取得するための新しいメカニズムを提案します。これを扱いやすくするために、メタ学習を使用してNML分布を計算するための新しい方法を提案します。結果として得られるアルゴリズムは、カウントベースの探索方法と報酬関数を学習するための以前のアルゴリズムの両方に多くの興味深い接続を持ち、同時に目標に向けてより効果的なガイダンスを提供することを示します。私たちのアルゴリズムが、以前の方法では困難または不可能であることが判明した、多くの困難なナビゲーションおよびロボット操作タスクを解決することを示します。

 内発的動機づけとどのあたりが違いそうなのかはAbst読んだだけではイマイチ判然としない感じではあるけど、本当に疎な報酬のみから強化学習をやっていくのはやや無謀なのではないかと思うことも度々あり、この手の話題も少しはさらってみたい気分。


目標条件付き強化学習は、エージェントに多種多様なスキルを与えますが、より時間的に拡張された推論を必要とするタスクを解決するのに苦労することがよくあります。この作業では、複雑なタスクの学習を容易にするために、想像上のサブゴールをポリシー学習に組み込むことを提案します。想像されたサブゴールは、ポリシーとその批評家と同時に訓練される別の高レベルのポリシーによって予測されます。この高レベルのポリシーは、到達可能性メトリックとして値関数を使用して、目標の途中で中間状態を予測します。これらのサブゴールに明示的に到達するためのポリシーは必要ありません。代わりに、それらを使用して事前ポリシーを定義し、この事前ポリシーをKL制約付きポリシー反復スキームに組み込んで、学習を高速化および正規化します。想像されたサブゴールは、ポリシーの学習中に使用されますが、学習されたポリシーのみを適用するテスト時間には使用されません。複雑なロボットナビゲーションおよび操作タスクに対するアプローチを評価し、既存の方法を大幅に上回っていることを示しています。

 サブゴールの作成とか階層的強化学習とか、そういうのも時間方向の抽象化の一つではあるっぽい。とはいえそれをベタにやっていくというよりも、なんか認知的な基盤の上で曖昧にやっていくのが強化学習の今後の方向性になるんじゃないかと個人的には思っている。

継続学習・生涯学習

継続的な学習(多くのタスクを順番に学習する能力)は、人工学習システムにとって重要です。しかし、ディープネットワークの標準的なトレーニング方法は、新しいタスクを学習すると以前のタスクの知識が消去されるという壊滅的な忘却に悩まされることがよくあります。壊滅的な忘却は問題にラベルを付けますが、タスク間の干渉の理論的な理由は不明なままです。ここでは、教師と生徒の設定で継続的な学習を研究することにより、理論と実践の間のこのギャップを狭めることを試みます。教師と生徒のセットアップにおける2層ネットワークでの以前の分析作業を複数の教師に拡張します。各教師を使用して異なるタスクを表現し、教師間の関係が、タスクが切り替わったときに生徒が示す忘却と転送の量にどのように影響するかを調査します。最近の研究と一致して、タスクが類似の機能に依存している場合、中間のタスクの類似性が最大の忘却につながることがわかりました。ただし、機能の類似性は、タスクを関連付けることができる1つの方法にすぎません。教師と生徒のアプローチにより、読み出し(非表示から出力への重み)および機能(入力から非表示への重み)のレベルでタスクの類似性を解きほぐすことができます。両方のタイプの類似性、初期転送/忘却率、最大転送/忘却、および長期転送/忘却の間に複雑な相互作用が見られます。一緒に、これらの結果は壊滅的な忘却に寄与する多様な要因を明らかにするのに役立ちます。

 ニューラルネットワークの破滅的忘却についての研究。そもそも「タスクが類似の機能に依存している場合、中間のタスクの類似性が最大の忘却につながる」というのを知らなかったな。タスクの違いというか、強化学習での状況が少し異なる場合とかでもこういう問題って起きていないんだろうか。


多様なタスクにわたる効果的な生涯学習には、多様な知識の伝達が必要ですが、無関係な知識の伝達は、干渉や壊滅的な忘却につながる可能性があります。 深いネットワークでは、適切な粒度の知識を転送することは転送メカニズムと同じくらい重要であり、タスク間の関係によって推進される必要があります。 最初に、いくつかの現在の深層学習アーキテクチャ生涯学習パフォーマンスが、適切なレイヤーで転送することによって大幅に改善できることを示します。 次に、期待値最大化(EM)メソッドを開発して、適切な転送構成を自動的に選択し、タスクネットワークの重みを最適化します。 このEMベースの選択的転送は非常に効果的であり、いくつかの生涯にわたるオブジェクト分類シナリオの3つのアルゴリズムで示されているように、すべてのタスクの転送パフォーマンスと壊滅的な忘却のバランスを取ります。

 生涯学習(Lifelong Learning)について、知識伝達の粒度? あたりの工夫を入れて改善するなどの話らしい。この分野も気になっているので最新の動向を一本くらいは追ってみたい。


この論文では、ベイズ推定フレームワークに生成的正則化を追加することにより、壊滅的な忘却を克服するための新しい方法を提案します。 ベイジアン法は、継続的な学習のための一般的なフレームワークを提供します。 エネルギーベースモデルとランジュバン動力学サンプリングを活用して各タスクで学習した機能を強化することにより、特定のすべての分類モデルの生成正則化項をさらに構築できます。 識別的損失と生成的損失を組み合わせることにより、提案された方法がさまざまなタスクで最先端の方法よりも優れており、継続的な学習における壊滅的な忘却を回避することを経験的に示します。 特に、提案された方法は、Fashion-MNISTデータセットで15%以上、CUBデータセットで10%以上ベースライン方法を上回っています。

 こういう方向からのアプローチは自分が別に数学詳しくないのでよくわからない気分になりがち。Fashion-MNISTでの検証とかってどうなんだろう。継続学習の良い測り方みたいなの全然知らないな。


 Tutorialでもこの手の話題があったみたい。

その他

宝くじの仮説(LTH)は、密なネットワークの当選チケット(スパースだが重要なサブネットワーク)の存在を明らかにします。これは、ランダムな初期化とは別にトレーニングして、後者の精度に一致させることができます。ただし、当選チケットを見つけるには、特に大規模なデータセット(ImageNetなど)で、train-prune-retrainプロセスで面倒な計算が必要になり、実際のメリットが制限されます。このホワイトペーパーでは、完全なトレーニングセットを使用するのではなく、プルーニング対応クリティカルセット(PrACセット)と呼ばれる特別に選択されたデータのサブセットのみを使用して、宝くじをより効率的に見つけるための新しい視点を探ります。 PrACセットの概念は、深いネットワークにはトレーニング中に覚えるのが難しいか、剪定中に忘れやすいサンプルがあるという最近の観察に触発されました。したがって、PrACセットは、高密度モデルの最も困難で有益な例をキャプチャすると仮定されます。非常にコンパクトなPrACセットで高密度ネットワークをトレーニングおよびプルーニングすることで、高品質の当選チケットを見つけることができます。これにより、チケット検索プロセスのトレーニングの反復を大幅に節約できます。広範な実験により、さまざまなデータセットとネットワークアーキテクチャにわたる提案が検証されます。具体的には、CIFAR-10、CIFAR-100、およびTiny ImageNetで、有効なPrACセットをトレーニングセットサイズの35.32%〜78.19%に配置します。さらに、対応する高密度ネットワークで同じ競争力のある当選チケットを取得できますが、トレーニングの反復回数はそれぞれ最大82.85%〜92.77%、63.54%〜74.92%、76.14%〜86.56%節約できます。重要なのは、見つかったPrACセットがさまざまなネットワークアーキテクチャ間で再利用可能であることを示しています。これにより、PrACセットを見つけるための追加コストを償却し、効率的な宝くじの検索のための実用的な体制を実現できます。

 データセットのうち重要そうなものだけ取り出してきても宝くじの判別が上手くできるので高速にサイクル回せて良さそうという主張をしているように見えた。

 この論文に限らず、画像データセットだと学習初期ですぐ判別できるデータ点と、暗記する必要がある難しいデータ点があると言われているような気がするけど、ボードゲームだとどうなんだろう。単なる難易度というよりも、現状の方策で即負けになるような読み抜けをこそ埋める必要がある気がしていて、そこが強化学習の重要性に繋がっているような気がするんだけど(既存の棋譜教師あり学習したときは、損失値はそこそこ良くなるのに読み抜け多発してどうにも強くならなかった)。


バックプロパゲーションを使用した深部残余ニューラルネットワーク(ResNets)のトレーニングには、ネットワークの深さに対して直線的に増加するメモリコストがあります。この問題を回避する方法は、リバーシブルアーキテクチャを使用することです。この論文では、勢い(Momentum)の項を追加することにより、ResNetのフォワードルールを変更することを提案します。結果として得られるネットワークである運動量残余ニューラルネットワーク(Momentum ResNets)は、可逆です。以前の可逆アーキテクチャとは異なり、既存のResNetブロックのドロップイン置換として使用できます。 Momentum ResNetsは、微小ステップサイズレジームで2階常微分方程式(ODE)として解釈でき、運動量を追加することでMomentumResNetsの表現能力がどのように漸進的に増加するかを正確に特徴付けることができます。私たちの分析によると、Momentum ResNetsは乗法係数までの線形マッピングを学習できますが、ResNetsは学習できません。固定小数点への収束が必要な設定を最適化するための学習では、既存の可逆アーキテクチャが失敗する一方で、私たちの方法が成功することを理論的および経験的に示します。 CIFARとImageNetで、Momentum ResNetsはResNetsと同じ精度でありながら、メモリフットプリントがはるかに小さいことを示し、事前にトレーニングされたMomentumResNetsがモデルの微調整に有望であることを示します。

 面白そうではあるんだけどこれがスタンダードになっていくってことがあり得るのか? という気がしないでもない。


注意メカニズムは、長期記憶を必要とするシーケンスモデリングタスクで有望な結果を示しています。最近の研究では、メモリの保存と保存の計算コストを削減するメカニズムが調査されました。ただし、過去のすべてのコンテンツを覚えておくことが等しく重要であるとは限りません。最も重要な情報を保持し、無関係な情報を期限切れにすることを学習する方法であるExpire-Spanを提案します。この記憶の忘却により、以前のタイムステップのすべての状態が保持されるわけではないため、Transformersは数万を超える以前のタイムステップに効率的に参加できるように拡張できます。 Expire-Spanは、モデルが重要な情報を識別して保持するのに役立ち、この機能に挑戦するように特別に設計された強化学習タスクで強力なパフォーマンスを達成できることを示します。次に、Expire-Spanが数万のサイズのメモリに拡張できることを示し、文字レベルの言語モデリングやフレームごとの移動オブジェクトタスクなどの非常に長いコンテキストタスクに新しい最先端を設定します。最後に、既存のアプローチと比較したExpire-Spanの効率を分析し、トレーニングが速く、メモリの使用量が少ないことを示します。

 Transformerによる言語モデルで重要情報だけを後に残しつつ推論していく? そんなことがあっさり可能なのかどうかよくわからないけど、中短期的記憶は強化学習でも重要そうなのでちょっと興味がある。読んでみたい。


機械エージェントが実際の環境で人間とうまく対話するには、人間の精神生活についての理解を深める必要があります。直感的な心理学、つまり観察可能な行動を促進する隠れた精神的変数について推論する能力は、自然に人々にもたらされます。言語前の乳児でさえ、エージェントが制約を与えられた目標を達成するために効率的に行動することを期待して、エージェントをオブジェクトから区別できます。他のエージェントについて推論する機械エージェントへの最近の関心にもかかわらず、そのようなエージェントが人間の推論を推進するコア心理学の原則を学習または保持するかどうかは明らかではありません。直感的な心理学に関する認知発達研究に触発され、手続き的に生成された3Dアニメーションの大規模なデータセットであるAGENT(Action, Goal, Efficiency, coNstraint, uTility)を提示します。 これは、コアとなる直感的な心理学の主要な概念を精査する4つのシナリオ(目標の好み、行動の効率、観察されない制約、およびコストと報酬のトレードオフ)を中心に構成されています。 AGENTを人間の評価で検証し、一般化を強調する評価プロトコルを提案し、ベイズ逆計画と心の理論ニューラルネットワークに基づいて構築された2つの強力なベースラインを比較します。私たちの結果は、人間レベルでコア直感心理学の設計されたテストに合格するには、モデルは、ユーティリティ計算とオブジェクトと物理学のコア知識を組み合わせて、エージェントが計画する方法の表現を取得または組み込む必要があることを示唆しています。

 他者のメンタルモデルを考慮するというのは少し気になっているが、本質的には環境モデルの学習により獲得されて欲しいものなのかなという気もする。


プログラム合成や文書要約などの多くのシーケンス学習タスクでは、重要な問題は、可能な出力シーケンスの広いスペースを検索することです。特に検索を目的とした出力の表現を学習することを提案します。目的の出力を指定するのに十分なリッチでありながら、検索をより効率的にするのに十分コンパクトです。個別の潜在コードは、高度な組み合わせ検索戦略を自然に可能にするため、この目的には魅力的です。潜在コードは、自己監視学習原理を使用して学習されます。この原理では、最初に離散オートエンコーダーが出力シーケンスでトレーニングされ、次に結果の潜在コードがエンドツーエンドシーケンス予測タスクの中間ターゲットとして使用されます。これらの洞察に基づいて、\ emph {潜在プログラマー}を紹介します。これは、最初に入出力例から個別の潜在コードを予測し、次にターゲット言語でプログラムを生成するプログラム合成方法です。文字列変換プログラムの合成と自然言語記述からのプログラムの生成という2つのドメインで潜在プログラマーを評価します。離散潜在表現が合成精度を大幅に向上させることを示します。

 コード生成についても少し気になっているので記録しておく。離散AutoEncocerちょろちょろ見かけるのでわりと重要技術ではあるのかもしれない。

所感

 ちょっと今はやりたいテーマがぼんやりとしているので、論文タイトルがズラッと並んでいるところを眺めて自分がどういうものに惹かれるのかという点について検証してみたくなった。

 相変わらず環境モデル的な強化学習はつい拾ってしまう。ボードゲームは部分的にはもういいんじゃないという気がするところはありつつ、とはいえもちろん解決されていない話も多いのでやる価値は十分にある。

 ニューラルネットワークの記憶的なところに少し興味があり、継続学習やら長い系列データへの対処やらは何本かでいいから読んでみたいところではある。ボードゲームだと「AIは定跡を暗記しているだけ」みたいな、まぁ的外れだとは思う批判があったりするわけだけど、ニューラルネットワークだとそれってあながち間違いとも言えないんじゃないかと考え直すところがなくもない。法則の学習とかができていることを示すには、やっぱり探索的なことがニューラルネットワークの内部でできていてほしいところ?

深層強化学習の実装練習

 深層強化学習プログラムの実装練習として『Which are you?』というトイタスクを考えて、エージェントを実装した。

1.『Which are you?』の説明

概要

 以下のような5×5マスの2次元グリッドの世界を考える。

#####
#...#
#A.B#
#...#
#####

 A, Bはこの2次元グリッドを移動する存在であり、どちらかがあなたであるが、ゲーム開始時点でどちらがあなたであるかはわからない。あなたは1ターンに1度移動を選択することができ、あなたである方の文字は選択した移動方向へ移動する。あなたでない方の文字は、毎ターン上下左右ランダムに(25%ずつの確率で)移動する。# マスは壁マスであり、そこへ移動することはできない。.は空きマスであり、そこへ移動できる。

 たとえば上の状態であなたが上方向への移動を選択したとする。あなたがAであった場合、Aは意図通り上に動く。Bはランダムに移動方向が決まり、左に動いたとする。その場合2ターン目の状態は以下のようになる。

#####
#A..#
#.B.#
#...#
#####

 あなたは各ターンで移動する代わりに「自分はAであると回答する/自分はBであると回答する」という行動を取ることもできる。この行動を選択した場合、ゲームは終了し、回答の正否によって報酬が与えられる。

人手で解く場合の想定解法

 上下左右適当に行動を選択し、盤面がどのように遷移するかを観察して、自分の入力通りに動いたものを答える。自分ではない方の文字は25%ずつ各方向へランダムに動くので、毎ターン75%で異なる動き方をすることになり、自分がどちらか特定可能になる。

タスクを解くために必要な情報

 このタスクでは特定のターンだけの盤面を何時間凝視していてもどちらが自分だかわかることはない。「過去の自分の行動」と「その際の盤面遷移」を結びつけることで十分な情報になる。

 おそらく遷移確率などを詳細に定義していけば部分観測マルコフ決定過程の一例として正確に定義できるのだと思う。

2.解くために作成したプログラム

 適当に過去の情報を持ちつつ処理していけばこの問題自体を解くことはできるが、今回の目的は深層強化学習の実装練習であるため、(深層であるかはともかく)LSTMを用いて実装を行った。

エージェント

 LSTMを持ち、各ターンで取るべき行動を6次元(上下左右の移動、A/Bであるという回答)のSoftmax方策で出力する。LSTMは各エピソード開始時刻に隠れ状態・メモリセルを0初期化する。

入力特徴量

 盤面の5×5について、プレイヤーA,B,壁の3種類のどれかについてOnehotベクトルにした5×5×3を与える。空きマスは[0, 0, 0]になる。

 また直前のターンでどのような行動を取ったかという情報も入れる必要があるため、前ターンに上下左右どの方向への行動を選択したかという情報を4次元のOnehotベクトルで与える。

 盤面と行動合わせて5×5×3 + 4次元の0 or 1がエージェントのネットワークへと与えられる。

学習

 毎回1エピソードを終えたらその結果を用いて方策勾配法で学習を行う。リプレイバッファなどはなし、分散でエピソードを集めることもしていない。

細かい実装点

  • 回答をせず移動だけで10ターン経過した場合、強制的に不正解とする。(ずっと移動し続けて終わらなくなってしまう状態になることがあったため)
  • A, Bの初期位置は(3,1),(3, 3)で固定する。
  • 正解した場合の報酬は1/(回答までのターン数), 間違えた場合(および10ターン経過した場合)は-0.1
  • 壁に対して移動した場合、なにも起こらない
  • 移動はA、Bの順番で処理される。AとBが同じ位置に移動しようとした場合、Aが優先される

3.結果

 1万ステップの学習を独立に10回試行した。200ステップごとに直近200ステップの正答率をプロットした結果が以下となる。

f:id:tokumini:20211113131404p:plain

 1万ステップ時点で10回中7回は正答率が80%を超える結果となったが、それ以外ではチャンスレートと同程度だった。一応学習はできているが、不安定な様子がグラフからもわかる。また上手くいっている場合も正答率100%には達さない点が気にかかる。

 今回はかなり雑な形でLSTMに入力しているので、ちゃんと特徴抽出に気を払ったり行動入力の与え方をどうにかすることでもう少し安定化できるのではないか。今後やる気があればそのあたりを触ってみる予定。

4.あとがきと余談

 とりあえず基本形としてこういうタスクが解ける場合もあるということがわかったのは良かった。

 今回このようなタスクを考えたのは、個人的に「最も原始的な形の自己意識」とはこのタスクのように自分の行動と環境の変化を結びつけ、世界の中で自分(意志により動かせるもの)を発見することにあるのではないかと考えているからである。

 私はこの肉体が(そしてこの肉体のみが)「自分」と感じられることについて不思議さを覚えることがあり、その発達についてあり得たかもしれない道筋が少しでも見えればなぁと思うところである。

合法なラベル数の計算

 前回、検証データにおいて1回でも出現する出現するラベル数を記録したところ、1411種類だとわかった。

 ネットワークの出力の都合上、2187クラスとしてクラス分類を行っているが、その中には将棋の指し手としてあり得ないものもある。

 簡単に計算したところ、これが間違っているという指摘を山下さんからいただいたため、本記事でできるだけ慎重に考えてみる。

分類

 将棋の指し手としてあり得ないものは、以下の4種類として分類できると思われる。

  • 打つ手として不可能
  • 移動方向として不可能
  • 成りとして不可能
  • 桂馬の不成として不可能

 以下一つずつ数を数えていく。

打つ手として不可能

 3分類の中でこれが最も数えやすいものであり、最奥段に歩、香車、桂馬、および二段目に桂馬が打てないため、以下のようになる。

f:id:tokumini:20210919151502p:plain

移動方向として不可能

 たとえば1一の地点に右下からやってくることはできないなどの不可能性がある。

 移動方向としては上下左右斜めの8方向 + 桂馬の2方向からあることに注意して計算する。

 一番移動元の候補が少ないのが1九、9九であり、1九では上、左上、左の3方向からしか来る可能性が無いので7通りが不可能である。

 またこれら移動のラベルは成り・不成によらず不可能であるため、合計の2倍が不可能な手の数になる。(冒頭のツイートではこれも失念していた)

 2021/09/19 17:22追記 八段目へ桂馬で移動するようなものをカウントし忘れていたので追加。

f:id:tokumini:20210919170646p:plain

成りとして不可能

 指摘いただいた成りとしてあり得ない手がここに当たる。移動不可能なものは上で数えたので、移動自体は可能であるが、成りながら移動することが不可能であるもののみを数えることに注意する。

 また上方向からやってくる行動は、移動幅1マスとは限定していないため、飛車を自陣に引きながら成るという手が可能であることに注意する。斜め方向についても角があるため、引きながら成る手が成立しうる。

 正直やや複雑な条件になっているので正しく数えられている自信はないが、おそらく以下のような感じになる。

 2021/09/19 17:22追記 4九への左上からの引き成り、6九への右上からの引き成りが不可能であることをカウントし忘れていたので追加。

f:id:tokumini:20210919170732p:plain

桂馬の不成として不可能

 2021/09/19 16:20追記

 桂馬で奥の二段に移動する手については不成が非合法であることにも気づいた。

f:id:tokumini:20210919161038p:plain

まとめ

 2187ラベルのうち、あり得ないラベルは

  • 打つ手として不可能 : 36通り
  • 移動方向として不可能 : 308通り
  • 成りとして不可能 : 315通り
  • 桂馬の不成として不可能 : 32通り

であるため、あり得るラベルは1496通りである。dlshogiとの調査とも一致しているようなのでおそらく合っているのではないか。

 前回の記事ではfloodgate2015年のレート3400を超える対局について集計したが、やや緩和してレート3200を超える対局について集計してデータ数を増やしたところ、1回でも出現するラベルの数は1482通りとなった。あり得るのに出現していない手が14通りある。それらは

  • ▲6八角成(左下方向への移動)
  • ▲8九角成(左下方向への移動)
  • ▲9九角成(左下方向への移動)
  • ▲9八角成(左下方向への移動)
  • ▲7九角成(左下方向への移動)
  • ▲5七角成(右下方向への移動)
  • ▲4八角成(右下方向への移動)
  • ▲3九角成(右下方向への移動)
  • ▲1九角成(右下方向への移動)
  • ▲2三飛成(左方向への移動)
  • ▲1九飛成(下方向への移動)
  • ▲9九飛成(下方向への移動)
  • ▲4九飛成(下方向への移動)
  • ▲3九飛成(下方向への移動)

であった。角や飛車を自陣の奥まで引きつけながら成る手の一部が出てきていないようだった。

Policy正解ラベルの偏り調査

 深層学習系の将棋ソフトでは主にPolicyを教師あり学習などで訓練する。しかし、将棋を普通にプレイしている上で出やすい手と出にくい手があると考えられ、正解ラベルにはクラスごとの偏りが大きくあると思われる。今回はその偏りについて調査した。

ラベルの作り方

 Policyの出力はdlshogiと同じく、9×9マスに対して27方向から駒が動いてくる可能性があるとして、合計2187クラスのクラス分類として行っている。

 指し手は全て先手のものとして見る。後手であれば盤面を180度反転させる。

 27方向というのは、まず盤上の駒が動くものが上下左右斜めの8方向 + 桂馬の2方向で10方向あり、これらについては成りつつ動くものとそうでないものを区別して20方向とする。そして手駒から打つ指し手が歩、香車、桂馬、銀、金、角、飛車の7種類があり得るので、合わせて27種類ということになる。

 より具体的には、方向の順番は

上、左上、右上、左、右、下、左下、右下、左上(桂馬)、右上(桂馬)

であり、成りなら+10する。手駒から打つ場合は20+歩、香車、桂馬、銀、金、角、飛車の順番となる。

 マスのidは以下のようになっている。

f:id:tokumini:20210917194745p:plain

 たとえば8八に居る角を▲7七角と上がる手であるなら、7七のマスへ右上方向として動く移動であり、マスのidが60、方向のidが2になる。これらから60 + 2 * 81 = 222としてクラスラベルを作成する。

データ

 普段検証データとして利用している、floodgateの2015年のデータを用いた。対局者のレートの高い方が3400を超える対局のみを抽出した。重複局面削除も導入して、50528局面が得られた。

 重複局面削除の際には、一つの同じ局面についてPolicy正解ラベルは取りまとめている。(各指し手が指された割合に応じた値を正解値としている。)たとえば初期局面などは▲2六歩が30%、▲7六歩が25%、…以下指し手が続き、合計で100%になるようになっている(数値は例であり実際に確認したものではない)。

結果

f:id:tokumini:20210917193217p:plain

 頻度が多い順に並べると図のような結果になった。

 上位の指し手を見てみると次のようなものであった。

順位 指し手の移動先 移動方向 頻度 割合 多そうな指し手
1 2四 829.644 1.64% ▲2四歩とか▲2四飛車
2 8六 687 1.36% 相手の△8六歩に対する▲同歩
3 3六 635.693 1.26% ▲3六歩
4 6六 587.545 1.16% ▲6六歩
5 4六 559.747 1.11% ▲4六歩
6 5六 458.679 0.91% ▲5六歩
7 6五 449.611 0.89% ▲6五歩
8 7七 右上 441.831 0.87% ▲7七角
9 8八 左上 436.574 0.86% ▲8八銀
10 3五 432.5 0.86% ▲3五歩
11 3七 左上(桂馬) 430 0.85% ▲3七桂馬

 要するに序盤の駒組で歩を突く指し手が多いということがわかった。ここまでで概ね10%ほどにはなっていると思われる。

 指し手が一回でも正解ラベルに出てきたのは1411種類であり、1412番目以降の指し手は一回も正解ラベルとして現れていないようだった。

所感

 前々から正解ラベルに偏りがあるだろうとは思っていたが、調べてみた感じでは思ったよりも偏りが大きいかもしれない。

 詳しくないが、不均衡データに対してはたとえばFocal Lossなどが有効と聞いたことがある。

 違う指し手が同じ正解ラベルになったりするので、通常の不均衡データとはまた事情が異なりそうではあるが、試してみるのはありかもしれない。

Transformerで将棋の学習

 最近Transformer(ViT)モデルで教師あり学習をやっていたところ、損失値についてはCNNと近い程度の低さが出せるようになってきたので記事としてまとめておく。

 (※ 教師あり学習での損失値を比較しているだけなので、CNNより強いという主張をしているわけではない。特に推論時の速度は懸念材料であり、TRTorchではTransformerモデルのTensorRT変換が上手くいっていないため比較できていない。onnx経由で変換するにしてもCNNと同程度の速度が出るのかな? とちょっと怪しんでいるところはある)

前提知識

 Transformerとは? → 様々な人が解説記事を書いているのでそれらを参照のこと。たとえばこれ

 今回使うのは、Transformerを使う中でもVision Transformerに近いやりかたを採用(谷合さんが以前にやっていたのとは異なる)。

 Vision Transformerについても様々な人が解説記事を書いているのでそういうものを検索すれば良いと思う。たとえばこれ

使用モデル

 Vision Transformerに似たモデルを用いる。

 画像であれば入力サイズは3×H×Wであり、HやWが大きいことから適当サイズでのパッチ化が必要となるが、将棋の盤面は9×9であり、これが十分小さいためそのままの解像度で処理を行う。

 Miacisでは各マスの情報を42チャンネルで表現しているので、42×9×9が入力となる。まずこれを1層MLPの線形変換により各マス独立でチャンネル数を Cチャンネルへ変換する。 Cはハイパーパラメータである(256とか512とか)。 C \times 9 \times 9を、 Cチャンネル81系列の C \times 81とみなし、 L層のTransformerEncoderに入力する。Transformerはシェイプ不変の変換であるため、最終的に C \times 81の表現が得られる。これを C \times 9 \times 9と解釈し直し、CNNの場合と同じ構造のPolicyヘッド、Valueヘッドに入力する。

 Vision Transformerでは N \times Nのパッチ化の後に、クラストークンを追加し N \times N + 1系列として処理していくが、今回は比較のためにCNNとシェイプを統一したかったため、そのような処理は行わなかった。

 位置エンコーディングは81マスそれぞれについてランダム初期化した学習可能な Cチャンネルのパラメータを用意し、最初の1層MLPによる線形変換直後に、足し算によって与える。

ソースコード

学習の工夫

 3ヶ月ほど前にTransformerを試した際は、あまり上手くいかなかった。

 このときから今回までの変更点として

  • 学習ステップ数の増加(12万→60万)
  • ベース学習率の低下(0.025→0.01)
  • 学習率のWarm-up(最初の2万ステップで0から0.01まで線形に増加させる)
  • 学習率の線形減衰(最後の60万ステップで0になるように0.01から線形に減衰させる)

などを入れた。それぞれ明確な切除実験を行ったわけではないためどれが重要だったかは不明だが、ベース学習率の低下と、学習率のWarm-upは大きく寄与しているのではないかと思われる。

 学習率の制御などについてはScaling Vision TransformersというVision Transformerについていろいろ調べた論文や、以下のツイート

およびここで紹介されているPDFなどを参考にした。

実験

使用データ

 学習にはAobaZeroの棋譜000011500000〜000014300001を用いた。(データ取得用スクリプト)

 検証にはfloodgate2015年の棋譜から、どちらかの対局者のレートが3200以上となっている棋譜のみについて検証損失を計測した。

 学習データ、検証データ両方についてそれぞれ重複局面を削除した。削除の際には指し手や勝率などは同じ局面について統計を集め、平均化したものを教師情報とした。

CNNとの差異

 CNNは34万ステップ、Transformerは60万ステップ。CNNはGoogle Colabで回したものなので、24時間制限で60万ステップまで回りきらなかった。平等な条件でやり直したいところではあるが、計算資源が足りないので……。

 モデルサイズは学習時間が同じくらいになるよう調整して、TransformerではCNNの半分のブロック数にした。

 学習条件が異なる部分は主に以下の表でまとめられる。

項目 CNN Transformer
学習ステップ数 34万 60万
学習率減衰 15万ステップごとに1/10 最終ステップで0になるように線形減衰
ブロック数 20 10
チャンネル数 256 256

 Valueは両方とも51分割したカテゴリカル分布でValueを表現するモデルである。

検証損失

f:id:tokumini:20210904095923p:plainf:id:tokumini:20210904095926p:plain
左: Policy損失 右: Value損失

  • Policyの低下はCNNの方が速い
  • Valueの安定感はTransformerの方が良い
最終ステップでの損失値
モデル Policy損失 Value損失
CNN 1.940291 0.516135
Transformer 1.915562 0.516003

 学習量約2倍というハンデはあるが、一応両方の値でCNNを下回っている。

34万ステップ時点での学習時間
モデル 経過時間 GPU
CNN 20:42:20 V100(Google Colab)
Transformer 22:03:56 2080ti(自宅のPC)

 2080tiよりV100の方がわずかに学習が速いので、だいたい同じ程度だと思われる。

学習損失

f:id:tokumini:20210904100119p:plainf:id:tokumini:20210904100122p:plain
左: Policy損失 右: Value損失

 CNNのValue損失がギザつくのは以前からよく見られていた現象ではあった。これは、学習で使用しているAobaZeroの棋譜が1万棋譜ごとにまとめられていて、メモリの関係上、その単位で読み出して使用しているので、その間はほぼ同じ時期に生成されたデータを使うことになっているためだと思われる。

 TransformerだとValue損失でのギザつきが発生しておらず、またPolicy損失についても「学習損失と検証損失のギャップ」が小さい。単純に解釈すると、汎化しやすいような学習ができているのではないかと思われる。

 CNNは1万棋譜ごとに過学習しては別に塊に移って反省するということを繰り返しているように見える。CNNの改善を目指すならば(特にValueの)正則化を強めるのは選択肢として挙がりそう。 Scaling Vision Transformersの論文には、ネットワークのボディ部分とヘッド部分で重み減衰の係数を変えた方が良いという話があり、それはCNNでも有効かもしれない。

あとがき

 平等な学習実験とか実践で使用したときの推論速度とか詰めきれていない部分はたくさんあるが、Transformer(ViT)も有望そうではあるという程度の情報として公開しておく。

重み共有40ブロックモデルの学習

 ここのところeasy-to-hard論文の再現に執着している。

 重み共有をしたResNetで、「学習時のループ回数よりも検証時のループ回数を大きくしたときに、学習データにはないような難しい問題に対する正答率が上がる」ということを主張している論文である。重み共有ResNetとは、残差ブロック数個だけ生成し、それを複数回ループさせて適用するネットワークのことを指す。元論文では同じ2個を20回ループさせる、合計40ブロックで学習を行っていた。

 実験では2次元迷路を解く問題や、チェスの「次の一手」的な問題について学習・推論が行われている。

 個人的には厳密な再現というよりも、「学習時のループ回数よりも検証時のループ回数を大きくしたときに性能が上がる」という現象を得たいと思っている。別に簡単なデータで学習して難しいデータで検証したいというモチベーションはない。

 小さいネットワークでいくらか試していたが、再現する気配がなかったので、大きさが重要と見て40ブロックのモデルを学習させた。元論文では各ブロック512chだったが、流石に重いので手元では256chで行った。

 学習データはAobaZeroのもので、検証データはfloodgateのもの。難易度に大きく差があるとは思わないが、やや戦型などの傾向は違うと思われるので、多少は汎化性能が重要になるタスクだと思っている。

結果

 そもそも以前試した20ブロック(10ループ)よりも精度が出なかった。

f:id:tokumini:20210819211346p:plainf:id:tokumini:20210819211349p:plain
左: Policy損失 右: Value損失

 検証時にループ回数を変えてfloodgateの棋譜を与えてみたが、学習時の20より多くした方が良いという性質は得られなかった。微差ではあったが、むしろやや少なめの17ループあたりが一番良い結果であった。

f:id:tokumini:20210819211542p:plain

 他の実験として、今回はLibTorchで生成したパラメータで学習したという理由があり、検証時に中身を調べやすくなったので、いくらか気になっているところを調べてみた。

 まず、こういった重み共有モデルでは、ネットワーク内での推論が進んでいくにつれて表現が変化しなくなっていくということが報告されていたりする。

 手元でもそれを試してみたところ、同様の傾向であった。floodgateの適当な10局面をそれぞれ20ループまで推論を進めて、各局面のループi回目通過時の表現ベクトル(256×9×9)とi-1回目通過時の表現ベクトルについてコサイン類似度を計算した結果が以下になる。

f:id:tokumini:20210819211654p:plain

 局面によらず10ループもすぎれば類似度がほぼ1になり、つまりほぼ表現が変わらなくなっていることがわかる。

 これらは不動点だと見なすことができるだろうが、各局面で同じ(近い)不動点に来ているのか、それとも全然違うところへ行っているのかという疑問が生じたので、適当に選んだ2局面について各ループ回数での表現同士でコサイン類似度を計算した。結果は次のようになった。

f:id:tokumini:20210819211847p:plain

 縦横の2つの局面について、両方ループ回数20まで行った右下が一番類似しており、つまり近い不動点に来ているのだということがわかる。最初は類似度が低いので、出発点は違うところから、近いところへ収束していくような振る舞いだと思われる。

所感

 まぁパラメータは同一なのだから、不動点になりえるようなところはそこまで多くないのではないかと直感的には思う。つまりいろんな局面が収束していってしまうのは当たり前のようなことにも思えるが、局面の違いをきちんと認識するにはあまり嬉しくない性質なのではないか。

 ループが探索的に働くとすると表現が収束するというよりも、様々な局面を調べつつ記憶を更新していくという形になるのが望ましい気がする。どうすれば良いのだろうか。

PonderNet: Learning to Ponderを読んだ際のメモ

出典

Abst

 標準的なニューラルネットワークにおいて、計算量は入力のサイズに伴って大きくなるが、学習する問題の複雑さに対応して大きくなるわけではない。この限界を打ち破るために、PonderNetを提案する。このアルゴリズムは問題の複雑さに応じて計算量を適応させることを学習する。PonderNetは、学習時の予測精度、計算コスト、汎化という3点についてちょうど良い妥協点を達成するために、エンドツーエンドで計算ステップ数を学習する。複雑な合成問題において、PonderNetは既存の計算量を適応的に決定する手法に比べて大幅に性能を向上し、典型的なニューラルネットワークが失敗するような外挿テストに成功する。また、Pondernetは現実世界の質問応答データセットにおいて現在のSOTAと同様の性能をより少ない計算量で達成する。ニューラルネットワークの推論能力を検証するための複雑なタスクにおいてもSOTAと同等の性能を示す。

手法

 一般的な教師あり学習を考える。常に同じ入力が与えられるものとして、再帰的なネットワークについて、出力を一つ増やして停止確率を出すようにする。

  •  \hat{y} _ n, h _ {n + 1}, \lambda _ n = s(x, h _ n)
    •  \hat{y} _ n : ネットワークの出力
    •  h _ {n + 1} : 隠れ状態
    •  \lambda _ n : ネットワークの推論を停止する確率
    •  x : 入力

 ベルヌーイ確率変数 \Lambda _ nを定義し、継続( \Lambda _ n = 0)と停止( \Lambda _ n = 1)の2状態についてのマルコフ過程を考える。遷移確率を

 P(\Lambda _ n = 1 | \Lambda _ {n - 1} = 0) = \lambda _ n \; \forall 1 \le n \le N

とする。ステップnまでずっと停止せず、nで初めて停止状態に入る確率は

 p _ n = \lambda _ n \prod _ {j = 1} ^ {n - 1} (1 - \lambda _ j)

である。PonderNetの出力として、上記の確率で当該ステップの出力を選択する。

細かい部分について

 最大ステップ数 N \to \inftyであれば上記の説明で良いのだが、実際は Nが有限であるため、確率 p _ nの合計が1になるように修正する必要がある。修正方法は2案あり、

  • 合計が1になるように全体を正規化する
  • 1に足りない停止確率を最後のステップに割り当てる

 最大ステップ数 Nの決め方は

  • 検証時 : 計算時間等の制約に基づいて定数として決定する
  • 学習時 : 停止の最小累積確率を決める
    • つまり \sum _ {j = 1} ^ n p _ j \gt 1 - \epsilonとなったら終わり(実験では \epsilon = 0.05)

損失

 損失は再構成損失 L _ {Rec}正則化 L _ {Reg}から成る。

 L = L _ {Rec}  + \beta L_{Reg}

 L _ {Rec} = \sum _ {n = 1} ^ N p _ n \mathcal{L} (y, \hat{y} _ n)

 L _ {Reg} = KL(p _ n || p _ G(\lambda _ p))

  •  \mathcal{L}は自乗誤差なり交差エントロピーなり、タスクに応じた損失関数
  •  \lambda _ pは停止ポリシーを示す事前分布(幾何分布)を決定するハイパーパラメータ
    • 幾何分布とは? Wikipedia
    • ベルヌーイ試行を繰り返して初めて成功させるまでの試行回数 X の分布
    • 例えば、サイコロの1の目が出るまで繰り返し投げるとする。p = 1/6 の幾何分布に従うといい、それの台は {1, 2, 3, …} である。
  •  L _ {Reg}を導入する目的
    • ネットワークを事前分布の確率1 / \lambda _ pにバイアスする
    • 可能な全てのステップ数に0ではない確率を与えることを促進する
    • (所感 : ここはちょっとすぐにはピンとこなかった。この項が無い場合にはどういうことが起こるのだろうか?)

実験

パリティタスク

  • 提案手法はACTという既存手法に比べて性能が高く、また学習時と少し異なるような設定における外挿にも強かった。
  • PonderNetが学習に失敗したのは \lambda _ p = 0.9としたとき
    •  1 / 0.9が1に近く、つまり平均ステップ数が1になるよう正則化がかけられると失敗すると考えられる
  •  \lambda _ p = 0.1としたときは平均10ステップにせよという正則化がかけられることになるわけだが、学習すると3ステップ程度で良いという平均思考ステップ数に落ち着くようになった

 その他bAbIタスク、Paired associative inferenceについてもUniversal Transformerと同等、あるいはより良い性能を達成した。

所感

  • シンプルなやり方で順当に結果を出しているという印象で面白かった
  • 正則化の効力についてはすぐには理解しきれないところもあったが、これは実験を重ねることで肌感覚的にわかってきそうなものにも思える
  • 実験でRNNやUniversal Transformerをベースとしているように、重み共有というか、再帰的なネットワークを基調としていて、やっぱり自分としては今後そこが流行りになっていくんじゃないか(もう流行ってる?)という気持ちはある
    • そういう重み共有モデルにおいてループ回数を動的に決めたいというモチベーションはあり、そのための手法として有力そう