<基礎学習>10/16-18 cartpole問題を強化学習で攻略する5

以下の前回記事の続きです。
kurupical.hatenablog.com

cartpoleについては以下をご参照ください。
kurupical.hatenablog.com

やったこ

  • 割引率の変更(0.95→0.99)
    ※割引率とは、「将来報酬の期待値をどの程度評価するか」です。

結果
f:id:kurupical:20171018223951p:plain:w400

timestep(赤線)がゲームクリアである200に一瞬届きました。

「ゲームクリア水準(timestep>195)ならば学習を終了し、モデルを保存する」というロジックを入れ忘れていたため、ゲームクリア時の学習モデルが取得できず…。

上記の学習を再現させようと思ったのですが、できませんでした。
正しいモデルなら再現はできるはずなので、まだ学習モデルが不完全ですね。

  • デバッグ
    DQNが下す判断を見てみました。
    すると、選択肢が極端に片方に偏っていました。(ずっと右に動かし続ける、ずっと左に動かし続ける、など)
    数式レベルでいろいろ考えたのですが、おそらく原因は以下です。

    • 報酬の与え方
      もともとは失敗=-1だけ与えていました。
      正負両方の報酬を与えないと、初期値によって選択が極端に偏ってしまうような気がします。
      ということで、生存=+0.005&失敗=-1を与えるようにしました。
      DQNの重みの初期化は正規標準分布に従っているため、報酬を-1〜+1にclippingしています。
  • いい経験だけを残すようにする
    過去の経験からランダムに学習する仕組みになっていますが、良い経験を優先的に学習するような仕組みにしました。
    この方法については、以下のサイトを参考にしました。 qiita.com

ここまでやりましたが、グラフの結果よりいいものは得られず。。

雑記

機械学習を仕事にすること

怖い

システムは(雑な言い方をすると)設計書通りに作れば完成になります。一方、機械学習人工知能は「完成するかどうか」がそもそも保証されません。
(今回のcartpoleに関してはDQNでできた記事が沢山上がっているので、大丈夫だという保証がありますが)
これ、とても怖くないですか?
今は趣味でやっているからよいですが、請負とかになるとすごいプレッシャーがかかりそうです。

作業のやり方が悪い

ある程度プログラムが完成したらいろいろパラメータを触って調整してTry&Errorするのですが、どうもこれが効率が悪いみたいです。
cartpoleにここまで時間を取られるとは正直思っていなかったです。。
性格の問題も大きいと思いますが、自分は以下のような問題に直面しました。

  • 頭を使わなくなる
    とりあえずパラメータぐちゃぐちゃいじるかーとなる。
  • 堂々巡りになる
    「あれ?このパラメータ設定前もやったっけ?」どこまでテストしたか把握できなくなる。

疲れてくると考えずすぐ手を動かしてしまい、より迷宮入りするという悪循環。。
解決策として、「やろうとするTryをメモる→やる」という流れを徹底するということを試しに1日やってみました。
こんな感じ
f:id:kurupical:20171018231511p:plain
激しくめんどくさいのですが、思考を整理しながらできるのでいい感じです。

その他

  • 人工知能の資格が最近できたようで、取ろうか迷い中です。
    www.jdla.org
    問題見てるとGENERALの方はホントに触りだけって感じで、すこし勉強したら取れそうです。
  • AIのオンラインゼミサービス
    aidemy.net
    明日、これの話を聞こうと思ってます。しばらくは暇なので…。

<基礎学習>10/12-14 cartpole問題を強化学習で攻略する4

前回記事(以下)の続きです。
kurupical.hatenablog.com

cartpoleについては、以下の記事を参照ください。
kurupical.hatenablog.com

やったこ

TargetNetworkの実装

Q-Tableの更新について、これまでは1gameごとに行っていたのを1epochごとに行うようにしました。

モデルのsave/loadの実装

モデルのセーブ/ロードができるようにしました。

結果を見える化

グラフを出力するようにしました。

学習させてみた

「ゲームを1000回分学習させる→20回試行する」を1epochとし、それを1000epoch行いました。
結果。
f:id:kurupical:20171015221129p:plain

グラフの赤線が、ゲームの結果です。(高ければ高いほど良い)
好成績になるよう学習できたかと思いきや、また下手くそになっているのが見て取れます。
右端(900回目〜)でまたちょっとかしこくなっているのを見ると、学習時間が不足しているだけなんでしょうか。
loss(グラフの青線)が下がっているところを見ると、学習は進んでいると思うのですが…。

その他

ソースはGitHubに公開しています。 github.com

<基礎学習>10/11 強化学習topics(+雑記)

cartpole問題やっているのですが、いかんせん学習の待ち時間が長いのでその間に強化学習をいろいろ調べていました。

世に出ているスライド読んでみた

深層強化学習の動向

speakerdeck.com

面白かったところ

  • 強化学習をブーストさせる考え方
    • 学習に有用な経験を優先して学習する(Prioritized Experience Replay)
    • 並列分散アーキテクチャ(ゲームをさせるのと学習させるのを並行する)

上記の考え方は自分のプログラムに組み入れたいと思いました。

  • 多機能で様々な局面に対応させるための考え方
    • 難しいタスクを1から学習するのは難しい
      →他のタスクで得た知識を利用する
    • ランダム遷移の限界(難しいゲームはそもそもクリアできない→報酬を得るデータが得られない) DQNの基本は、ゲームをランダム操作でやらせてたまたまうまく行ったものをベースに学習していきます。
      ゲームが難しすぎる場合はランダム操作でやってもクリアできない(=学習できるベースがない)ことになります。
      →この対策として、これまでしたことのない操作をした場合に追加報酬を与えます。

強化学習が発達科学的な(?)アプローチをとっていて面白いなと思いました。
特に後者の考え方は、「好奇心」に相当するアルゴリズムを強化学習に採用していることになります。

赤ちゃんがなぜ言葉を覚えたりブランコに乗ることができるようになったりするのか。
その理由の一つとして「好奇心」があるというふうに言われています。

強化学習に限らずAI全般、考え方を人間の脳や発達に寄せていっているところがあって面白いです。

雑記

読書会

主催の第2回(正確には第3回)の読書会が定員オーバーになっています。
1回目に参加いただいた方の出席率も多いみたいで嬉しいです。
osaka-prg-school.connpass.com
とても楽しみです!

GMOエンジニアトークいってきました

jisedai.connpass.com
ちょうど、深層強化学習を用いた株取引のトピックがあったので聞いてきました。
講演を聞いて、あと講演後に直接講演者に質問しにいって結構いいヒントが得られました。

僕が不勉強なだけですが、「マーケットインパクト」という言葉がめっちゃ印象に残りました。

マーケットインパクト = |(終値始値)| / 出来高

価格だけを用いた分析では駄目で、マーケットインパクトを使うとうまくいきましたということでした。

<基礎学習>10/8-10/10 cartpole問題を強化学習で攻略する3

前回の記事に引き続き、cartpole問題に取り組んでいます。

kurupical.hatenablog.com

前回からおよそ4時間費やしています。
(最近、「時間家計簿」をつけるようにしています。
ちょっとバタバタしたり怠惰したりして、あまりできませんでした。
時間家計簿を見ると、自分が全然開発に時間使えていないことにげんなりしました…。)

試行錯誤したこ

  • チューニングポイント

    • 時間割引率 gamma
      0.9だとダメ。0.95でうまく行った。
    • Optimizer
      何も考えずAdamを使っていたのですが、DQNにはDQNのOptimizerがあるみたいです。以下サイトを参考に、RMSPropを使っています。
      qiita.com
  • cartpoleの仕様理解不足によるバグ
    ゲーム終了はポールが倒れた時のみと思い「ゲーム終了」なら報酬=-1としていました。実際は、200フレームを経過した場合もゲーム終了となります。この場合も報酬=-1としていました。

結果

学習を進めることで、150フレームまでいけた!※10回試行の平均
(ランダムに動かすと20なので、ちゃんとゲームできているみたい)

課題

  • 学習が不安定
    成長したと思ったら全然できなくなったり…。上記の場合も、平均フレーム=150まで成長したと思いきや次で平均フレーム=50しかできなくなったり…
    強化学習とはそういうものなのでしょうか?

<基礎学習>10/7 cartpole問題を強化学習で攻略する2 (+雑記)

強化学習を進めました。

(前回の記事:プログラムの骨組みができた)
kurupical.hatenablog.com

今日やったこ

以下を行いました。

  • プログラムの凡ミスを修正
    • 1000データあるなかの1つのデータのみを繰り返し学習させていたという痛恨の凡ミス。
  • 重みの初期化が下手だった。(平均=0、標準偏差=0.01) → (平均=0、標準偏差=1)
  • 学習率0.001→0.01

そして、(100回分を学習→10回試行)を繰り返してみました。

f:id:kurupical:20171007225112p:plain:w400

最初の100〜1000回くらいはそれなりにやってくれるようになりました。
(調子のいい時は、最初の100回の学習後の10回試行で平均80くらいになります。)
その後はずっと下手くそに戻ります。

プログラムのバグか、学習アルゴリズムが悪いっぽいので引き続き少し見てみようと思います。

雑記

フリーランス

自分は企業就職しか考えていなかったのですが、ふとしたきっかけからフリーランスという選択肢が生まれました。
今複数オファーいただいています。
フリーランスがよくわからないので、「フリーランスで生きるとは」的な本を読み漁っています。おすすめあったら教えてください。

Googleアナリティクス入れてみた

アクセス数が少し増えてきました(といっても1日10〜20くらい)。
どこから来ていただいているのか気になるので、Googleアナリティクスを入れてみました。

ニート一週間やってみて

  • 毎日好きなことを好きなリズムで勉強しまくれてすごい楽しいです。
    一方で将来がすげー心配です。
  • 貯金+投資の勉強しててよかった。
    「やりたいことができた時のためにお金を作っておく」って、いつやりたいことができるんだろう?なんて思っていましたが…

<基礎学習>10/5-6 cartpole問題を強化学習で攻略する(+雑記)

以前書いた記事の続き
kurupical.hatenablog.com
前回は、cartpoleのゲームをテスト的に動かしてみました。

前回に続いて、cartpoleのゲームを強化学習(DQN)で攻略することを目標にプログラムを作ってみました。

ソース構成の考察

ソース構成は以下です。

  • agent.py
    ゲームの操作を行う。
  • dqn.py
    DQNのネットワーク構造を定義。
  • organizer.py
    ゲーム(今回はcartpole)の進行役。
  • run.py
    学習/推論を行うプログラム。
    1000回学習→10回プレイ、を繰り返しさせています

プログラム作成

全体的に意識したこ

  • コメント多めに 自分でも何やってるかわからなくなる時があるので…。

思想

  • 探索と活用の割合(agent.pyのpolicyメソッド)
    今わかる良い方法を採用するのか、それとも更に良い方法を探すのかのバランス。
    →ε-greedy法 + Annealingを採用。 εの確率でランダムに行動(探索)し、1-εの確率で今わかっている良い方法を採用(活用)します。
    Annealingとは、試行回数に比例してεを低減させていくことです。

動かしてみた

前回の実績より
棒を立てられたフレーム数

  • ランダムに動かす:平均20フレーム
  • 棒の傾きと逆方向に動かす:平均36フレーム
  • 私が作成した強化学習プログラム:平均9フレーム

→ランダムに動かすよりヘボい性能…。どっかバグってますね。。
しばらくこいつと戯れることになりそうです。

その他

ソースコード

ソースコードは以下で公開しています。
github.com

雑記

NHKの番組

NHKがAIの番組をやっていたのですが結構おもろいです。ぜひご覧ください。
www.nhk.or.jp

第1回で気になったところ

  • 技術的要素
    • 敵対的ネットワーク(GAN)
      聞いたことはあったのですがまだ触れてないです。概要だけでも勉強しておきたいです。
  • 人工知能的要素
    • 人はなぜ人たりうるのか?
      好奇心、三大欲求、種の存続に動機付けされている?ロボットにはそれがない?
    • 言葉の意味理解に身体は必要か?
      • 小説家は自分が体験していないこと(殺人とか)も想像して書ける

とあるエンジニアさんのはなし

体重計に乗るのがめんどくさい→ベッドを体重計にしてやれ!って言ってたエンジニアの人がいた。
しかも実際にベッドにマイコンとか設置しちゃったとか。
エンジニアの鏡ですね。
「3回同じことやったら自動化ですよ」って言ってたのがすごい印象に残りました。

<その他>10/4 小ネタ(読書会/AIが演奏会)

読書会やりました

10/4 19:00-22:00に、ゼロから作るDeepLearningの読書会をやりました。
参加者6人でした。
第3章4節まで進みました。

以下、質問について回答いたします。

  • 活性化関数にReLUとかSigmoidとか出てきたけど結局何を使えばいいの?
    www.procrasist.com
    qiita.com

    結論からいうと、LeakyReLU、PReLUが強いみたいです。
    ReLUがいい理由について、2個めのサイトの「スパース性がある」という表現がいいですね!

    ReLUは、f(x)<0ならば0に押し込めるのに対して、LeakyLeRUはf(x)<0ならばf(x)に定数a(0<a<1)を乗算するみたいです。

    数式でいうと

    • ReLUは max(0, f(x))です。
    • LeakyReLUは、max(f(x)*a, f(x))です。※a:定数。任意の値を設定

    Sigmoid関数には勾配消失問題があります。(ゼロから作るDeepLearning P.180を参照。)

今、強化学習(DQN)の活性化関数で何を使うかを考察していて勉強していたので、調べたことを書いてみました。

AI関連でびっくりしたニュース

AIが演奏会!?

ニュース記事
style.nikkei.com

公式サイト DCEXPO2017 – コンテンツ技術をテーマとした国際イベント

人間がひとつの楽器を演奏すると、それを聞いたAIが即興でアンサンブルするみたいです。
この話を聞いてめっちゃ感動しました。行ってみたいけど、東京か…。