<メモ>ゼロから作るDeepLearningの章立て

本記事の目的

「DeepLearning初心者による初心者のための読書会」参加者に向けた記事です。
随時修正予定です。

本記事は、書籍「ゼロから作るDeepLearning」のアジェンダです。

書いてあること

  • 各章が終わると何ができるようになるか

※私自身は文系でDeepLearningの素人であるため、記載内容にあまり自信がありません。。間違い等あれば指摘いただけると幸いです。

更新履歴

  • 10/24 初版(「何ができるようになるか」を記載)

1章 Python入門

何ができるようになるか

  • DeepLearningを実装するために必要なPythonのライブラリが習得できます。

DeepLearningでは演算が大量に発生するため、数値計算を効率的に行うための拡張モジュールであるNumpyが必須です。

2章 パーセプトロン

何ができるようになるか

パーセプトロンニューラルネットワークの簡易版であるため、ここから勉強するとニューラルネットワークが理解しやすいです。

3章 ニューラルネットワーク

何ができるようになるか

4章 ニューラルネットワークの学習

何ができるようになるか

  • ニューラルネットワークの学習」により、(分類器*1)を実装できるようになります。その結果、手書き文字の分類ができるようになります。

この章まで終わると、自分で質の高いデータを集めさえすれば任意のデータを分類できます。
ただし、時間がすごくかかります。「数値微分」を用いてニューラルネットワークの演算するため、計算量が多くなるためです。
(より処理速度の早いニューラルネットワークの実装→5章で)
(より少ない回数で学習ができるニューラルネットワークの実装→6章で)

5章 誤差逆伝播

何ができるようになるか

4章では「数値微分」という考え方を用いてニューラルネットワークの学習を行っていましたが、5章は「誤差逆伝播法」という考え方に変わります。
誤差逆伝播法にはデメリットもありますが、処理速度の速さからこちらが主流だそうです。

6章 学習に関するテクニック

何ができるようになるか

7章 畳み込みニューラルネットワーク

  • 画像処理に特化した、より良いニューラルネットワークを実装することができます。
    (※私もちゃんと理解できていないです…)

8章 ディープラーニング

*1:入力データをグループ分けする。
(例)

  • 手書き文字の画像を入力データとし、その画像に書いてある数字が「0〜9」であるかを出力する。
  • 画像を入力データとし、その画像が「犬か猫か」を出力する。
  • 音声を入力データとし、その音声が「英語か日本語か」を出力する。
  • 過去30日分の株価を入力データとし、翌日の株価が「上がるか下がるか」を出力する。

  • <基礎学習>10/22 【完成】cartpole問題を強化学習で攻略する7 (+雑記)

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

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

    1.やったこ

    Q-Tableの更新のされかたをデバッグしながら、Q-Tableが-1〜1の間に収まらなくなったらバグとみなしていろいろなパラメータをチューニングしていました。

    デバッグをするうちに1行明らかなバグを発見したので修正しました。

    そして動かしてみました。

    f:id:kurupical:20171022220614p:plain:w500 f:id:kurupical:20171022220623p:plain:w500 f:id:kurupical:20171022220619p:plain:w500

    3回やって3回とも、1000epoch以内に学習が完了(timestep>195)しました!
    (グラフが見づらいですが、右上のところで赤線が195を超えています)

    唐突なゲームクリアに唖然としました。
    クリア後も動かし続けると…
    f:id:kurupical:20171022221731p:plain:w500
    Q-Tableの値が発散(-1〜1の間にならない)し、再びアホになります。
    Q-Tableの出力値を制限することでうまくいくのかもしれません。
    (出力層の活性化関数にSigmoid関数を使うとか)

    僕の半分くらいの時間で学習が完了したという記事もあります(以下)が、もうこれでゲームクリアでいいでしょう。
    www.mochitam.com

    長い戦いでした。

    2.感想

    多分、途中で発見した2個のバグが学習できない原因のほとんどだったと思います。
    ですが、そのバグにたどり着くまでにかなり余計な回り道をしてしまいました。
    その余計な回り道が、結果的にかなり勉強になったのでよかったです。

    3.今後やりたいこと

    せっかくあと1ヶ月ニートなので…

    3-1.このチャレンジのまとめ

    1本の記事でまとめたいです。
    「DeepLearning/TensorFlowを知っている人が、DQNソースコードを書けるまで」 というテーマでsかね。

    3-2.AIや機械学習に関する知識

    AIや機械学習に関して、浅く深く知識をつけていきたいです。 ジャンルで言えば

    • 画像認識
    • 時系列分析
    • 強化学習

    はやりましたが

    は全然やっていないので、勉強したいです。

    あとは、機械学習といえばコレ!らしい本

    を読破したいです。(これはかなり厳しそうですが)

    3-3.AIや機械学習に必要な前提知識

    周辺知識が足りない気がしています。

    ココらへんの勉強もしてみたいです。
    特に統計学

    全部はできないので、優先順位をつけてやっていきたいですね。

    4.雑記

    4-1.GitHubソース公開

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

    4-2.誤差逆伝播vs遺伝アルゴリズム

    遺伝アルゴリズムについて、以下スライドで勉強しました。

    www.slideshare.net

    読んで思ったのが、DeepLearningの重み付け調整に、誤差逆伝播の代わりに遺伝アルゴリズム使ったらどうなるんだろう?ということです。
    だれか試してみてください。笑

    4-3.AlphaGoやばい

    ainow.ai

    AlphaGoは「プロ棋士の定石をベースにしてそこから強くしていく」のですが、AlphaGo Zeroは「自分対自分の対戦を繰り返すことで強くしていく」らしいです。
    AlphaGo Zeroはたった72時間学習しただけで、AlphaGoを超えたそうです。

    すごすぎます!
    ゲームにおける強化学習は、もはや人間の知見すら不要ということですね…。

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

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

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

    考察

    Q-Tableをデバッグ→チューニング

    報酬を-1〜1にClippingしているのに、Q-Table(報酬の期待値)が-1〜1の間になっていません。
    誤差逆伝播しながらQ-Tableが修正されていくのかもしれませんが、最初の値が大きいのはよくなさそうです。
    TD誤差の式にargmax(Q(s',a'))が入っているので、Q-Tableの初期値がおかしいと誤差逆伝播も正しく動かない気がすします。

    ということで、ニューラルネットワークの重みの初期化をいろいろ試してみました。

    正規分布

    stddev=1.0(標準正規分布)だと、Q-Table(output)の初期値が大きくなる(-100〜100)。
    ので、stddevをチューニングした。

    # initial = tf.truncated_normal(shape, mean=0.0, stddev=1.0)
    initial = tf.truncated_normal(shape, mean=0.0, stddev=0.1)
    

    一様分布

    initial = tf.random_uniform(shape, minval=-1, maxval=1)
    

    重み付けを-1〜1にして4層のニューラルネットワークを組んでいるのに、何故か出力の絶対値が1を超えてしまうのが不思議。-1〜1の間のランダムな数字を掛け算して、1超えるってありえないですよね?
    biasはゼロで初期化してるので、余計な数字が足されていることもないはずです。

    Huber損失を導入

    学習の収束が早くなるみたいで。
    Huber損失 - Wikipedia

    結果

    学習の結果、ゲームクリアできました。
    しかし、同じ条件でもう一度学習させてみたがゲームクリアには至らず。
    重み付けの値がたまたま良かったためにゲームクリアに至っただけみたいでした。

    まぐれじゃなく、毎回ゲームクリアできるようになるまで、頑張ってみたいです。

    雑記:強化学習は人間味があって面白い

    強化学習で使われる「ε-greedy法」って、人間の「好奇心」モデルそのものだなあと思います。
    「εーgreedy法」とは、簡単に言うとAIがゲームを学習するときの方針決定のやり方です。

    ざっくり説明すると… AIがゲームを学習するとき、最初は何もわからないのでランダム動く確率(ε)は100%です。(ε=1.0)
    AIはランダムに動いていくなかで、最適な手段がわかってきます。AIは、学習の経過によりランダムに動く確率を減らして、すでに学習した最適な行動(greedy)を取るように調整をします。(例 : ε=1.0 - 0.0001 * 試行回数)
    最適な手段を取りつつも、そこが局所的な最適解である恐れがあるのでランダムに動いて更に良い解がないかを探っていきます。

    強化学習はこんな感じでAIがゲームを攻略していきます。

    これって人間の好奇心と似てませんか?

    例1)職場の近くのランチを探すとき
    最初は何が美味しいかわからないのでランダムな店に入ります(ε=1.0)が、ある程度わかってくると決まった店にしか行かなくなります(ε=0.0)。

    例2)赤ちゃんが大人になるまで
    最初はランダムに動きながら(レゴを食べたりするし、コンセントに針金を突っ込んだりする (ε=1.0)、大人になるまでには解を見つけて(それが最適解なのか局所的な解なのかは不明ですが)いつのまにか自分の脳内ネットワークで編み出した解に従ってのみ行動するようになります(ε=0.0)。

    僕のεは今いくつなんだろうな〜なんて思いながら過ごしています。
    今日はわざとεを上げて、店に入っても普段食べたことのないものを食べるようにしてみました。
    オムライスはケチャップじゃなくてミートソースを、コーヒーじゃなくて紅茶を選びました。
    オムライスは美味しかったのですが紅茶は失敗に終わりました。(やっぱり口にあわない)
    こうやって苦い経験やいい経験をしながら自分のなか最適解を見つけるとともにεが下がっていくんですね。

    とまあこんな感じで、強化学習はすごく人間味があって面白い分野だなと思います。
    こじつけが入ってるところもあると思いますが笑。

    雑記が長くなってしまいました。

    <基礎学習>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しかできなくなったり…
      強化学習とはそういうものなのでしょうか?