Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

AI入門「第4回:ディープラーニングの中身を覗いて、育ちを観察する」

1,218 views

Published on

Kerasで実行した学習過程を、TensorFlowに付属のTensorBoardで見ると、内部動作や処理の繫がりが可視化され、SGDやSigmoidといった、AI・MLのアルゴリズムを動くコードとセットでステップバイステップで理解しやすい、ということを実感いただくセッションです

Published in: Data & Analytics
  • Be the first to comment

AI入門「第4回:ディープラーニングの中身を覗いて、育ちを観察する」

  1. 1. AI入門 第4回 「ディープラーニングの中身を 覗いて、育ちを観察する」 ~TensorBoardで初めて学ぶ、AI・MLの数学・アルゴリズム~ 2018/01/25 ver0.5作成
  2. 2. 1 AI入門 第1回は、「TensorFlowによる画像処理」にて、手元 のPCで気軽にディープラーニングできることを体験しました AI入門 第2回は、「Mahoutでレコメンドエンジン」にて、AWS のSparkでのデータ処理後、Mahoutを呼ぶ例をご紹介しました ここまでのAI入門 振り返り tabby cat (トラ猫) tiger cat (トラ猫) beaker (ビーカー) Persian cat (ペルシャ猫)Egyptian cat (エジプト猫)
  3. 3. 2 AI入門 第3回は、「Kerasによる時系列データ分析・推論」にて、 やはり手元のPCで気軽にデータの未来予測を体験しました 第3回の内容をベースに、KerasでのAI・MLプログラミング入門 も行い、実際に動くAI・MLをお手元に持つところまで行きました ここまでのAI入門 振り返り
  4. 4. 3 機械学習・ディープラーニングを扱っているにも関わらず、 「数式や複雑なアルゴリズムの説明が一切、出てこなかった」 ということです 現在、ほとんどの機械学習・ディープラーニングの学習コンテンツ や書籍は、必ず数式やアルゴリズムによる説明をしており、難しい 内容が羅列される、難解な分野だという雰囲気を醸しています その閉塞感をブレイクするために、本AI入門シリーズでは、数式 を使わなくとも、AI・MLに触れ、理解・活用していくことができると いうコンセプトで進めてきました では数式やアルゴリズムへの理解は、不要なのでしょうか? ここまでの共通点は?
  5. 5. 4 入門として、「まず動かしてみる」をクリアする前に、数式やアルゴ リズムを覚えるのは、非常に非効率かつ目的を見失いがちなため、 本AI入門シリーズでも非推奨としてきました しかし、シリーズを通して、 ①大雑把な概念を理解し、 ②実際に動くコードが手に入り、 ③「AI・MLへの過度な期待や幻想」がブレイクされた …という状況の今、AI・MLを更に深堀りするか否か、に結論が 出たのでは無いかと思われます (ということで良いですか?w) その上で、お集りいただき、前進するのであれば、ようやく数式や アルゴリズムの理解をする土台が整った、ということです そんなことはありません
  6. 6. 5 エンジニアの多くが、数式そのものに馴染みが薄い方も多く、また AI・MLで扱うアルゴリズムは、一般的なアルゴリズムというよりも、 統計系のアルゴリズムが多く、統計やマーケティングに携わる方で 無い限り、触る機会もありません そのため、数式・アルゴリズムを単品で見ていくのは、骨が折れる プロセスになりがちなため、実際の動作を確認しながら覚えていく、 といった工夫が必要です 動作の確認を容易にするには「動作の視覚化」が最も有効です 今回扱う「TensorBoard」は、ディープラーニングの動作過程を 視覚化するツールであり、これとセットで数式・アルゴリズムを理解 していけば、教材や書籍をただ読むより効率的と考えます とはいえ、数式とアルゴリズムだけでの理解は厳しい
  7. 7. 6 AI・ML開発の注意点 【最重要】 AI・ML開発でのプログラミング習得は、通常のプログラミングとは 異なるポイントがあるため、以下3点を意識して徹底してください ※これらポイントは、経験の多い、デキるエンジニアほど罠にハマり やすく、逸脱時は、AI・ML開発の習得が、かなり非効率となり、 最悪、全く習得できないまま脱落する可能性もあります ■AI・MLプログラミング習得の3つの最重要ポイント ① 「何故これで動くのか?」「この処理やパラメータの意味は?」 という”詳細”に疑問を抱かず、全体像をザックリ押さえること ② Kerasの各種ブラックボックスを最初から開けないこと ③ 良いサンプルを幾つか体験する前から、近道を探さないこと
  8. 8. 7 AI・ML開発の注意点 【最重要】 ①「何故これで動くのか?」「この処理やパラメータの意味は?」と いう”詳細”に疑問を抱かず、全体像をザックリ押さえること 疑問解決には、以下トリプルスキルが必要で、相当困難です ①偏微分・・・学習時の「誤り訂正法」のベースはこれ。誤差逆伝搬もこれ ②集合・・・クラス分類やクラスタリング、自己組織化マップ(SOM)等のデータをグルーピングする手法 ③確率/統計・・・尤度関数や誤差関数/損失関数、勾配降下法といった「学習時の最適化問題」の解決のための関数群 ④数学述語・・・線形・非線形。SGDは線形、SVRは非線形。NOT/ORのニューラルネット学習は線形、XORのニューラルネット学習は非線形 ⑤アルゴリズムとして適用される関数群・・・活性化関数群(ロジスティック回帰、ソフトマックス関数など)、学習関数群(モメンタム、Adagrad、Adamなど) ⑥ベクトル/テンソル・・・プログラミングで言うところのn次元配列とその演算群 ⑦上記中に出てくる基礎数学・・・指数、log、底など。プログラミングで言えば、変数や算術関数に相当。数式をスラスラ読んで苦にならないレベル a) 数学スキル ①問題解決可能なニューラルネットワーク層数 ②ディープラーニングモデルとその亜種 ③勾配消失問題 ④過学習、アーリーストッピング ⑤ドロップアウト ⑥学習結果評価手法 ⑦学習前データ前処理/バッチノーマライゼーション b) 機械学習固有スキル ①Python一般 ②Numpy ③Keras、TensorFlow ④matplotlib他 c) Pythonプログラミングスキル
  9. 9. 8 AI・ML開発の注意点 【最重要】 ②Kerasの各種ブラックボックスを最初から開けないこと Keras、もしくはそのベースとなっているTensorFlow、もしくは Numpyの関数群は、高度な処理群がカプセル化されている (一部は、前述した数学的知識もカプセル化されている) ため、 Pythonに慣れた人であっても、読み解くのに難儀なレベルであり、 Pythonを普段使いしていない方であれば、読み解くことは、ほぼ 不可能と思います ここを、他言語の他ライブラリ/フレームワークと似たようなノリで、 「言語の勉強のついで」程度で読み解こうと思ったら大間違いで、 「Linuxカーネルをハックする」位のノリだと、捉えていただければ、 中々手を出す方もいないのでは無いかと思います
  10. 10. 9 AI・ML開発の注意点 【最重要】 ③良いサンプルを幾つか体験する前から、近道を探さないこと AI・MLプログラミングは、通常のプログラミング言語に慣れている 方にとっても、全く異なるプログラミングパラダイムになります ですので、いつもの慣れ親しんだプログラミングのノリで最短ルート を探し始めると、とんでもない遠回りをすることになるでしょう たとえば、前述の”詳細”に疑問を抱くことや、ブラックボックス解明 することは、優秀なエンジニア/プログラマであればあるほど、思考 習慣として、身についていると思いますが、全く異なるパラダイムの ため、役に立つどころか、むしろ習得の足枷になり兼ねません まっさらな頭で、詳細では無く、全体を掴むことに集中しましょう
  11. 11. 10 事前確認②:AI・ML開発の注意点 【最重要】
  12. 12. 11 AI・ML開発の注意点 【最重要】 具体的な思考/行動基準としては、以下のような感じです ① 疑問点が湧いても、イチイチ引っかからず、前に進み続ける →「こんなもんなんだ」程度に認識すればいい →本当に調べなければならないものなら、また出会う →逆に、イチイチ引っかかると、大事な学びの機会を失う 「知らないことをイチから学んでいるんだから、分からないこと だらけなのは仕方無いし、自分の考え方を広げる機会を 自分の”常識”に邪魔させない」という 素直さ が大事 ② 今は理解できなくても、焦らず気にせず、淡々とやり続ける そのうち理解できるようになる自分自身を信じましょう これを受け取れる方は、何を学んでも上達が速いでしょう(^_^)
  13. 13. 12 混乱することは学びの一部 楽しんで!!
  14. 14. 13 そして今度こそ本当に
  15. 15. 14 本編
  16. 16. 15 1. TensorBoardについて 2. Kerasについて 3. TensorBoardを使えるようにする 4. notの中で起こっていることを見る 5. 今度はあなたの手元で 目次
  17. 17. 16 1.TensorBoardについて
  18. 18. 17 1.TensorBoardについて TensorBoardは、TensorFlow/Kerasの内部動作や学習 過程/結果を可視化するツールで、TensorFlowのパッケージ に含まれています さまざまなグラフやメトリクス、モジュール配置とその間のやり取りが 見え、アルゴリズムも表示されるため、数式とアルゴリズムの側面 をビジュアルに理解しやすくなります https://www.tensorflow.org/get_started/summaries_and_tensorboard
  19. 19. 18 2.Kerasについて
  20. 20. 19 2.Kerasについて Kerasは、TensorFlowをコアとして動作するラッパーライブラリで、 本来、数学を用いて、ニューラルネットワークやディープラーニング を構築する必要があるところの大部分を代行してくれます Kerasを使わず、TensorFlowそのままでコーディングした場合、 「学習」部分を数式に相当するコードで書くこととなります※が、 Kerasを使った場合は、数式を一切使わずとも、「学習」部分が コーディングできるのが、最大の特徴です https://keras.io/ja/
  21. 21. 20 3.TensorBoardを使えるようにする
  22. 22. 21 3.TensorBoardを使えるようにする TensorBoardを使い始めるのに、3種類の方法があります ① 各種OS用のpip (Pythonパッケージマネージャ) 経由で インストールする ② 【Windows、macOS】Anaconda(Python環境構築 マネージャ) 経由でインストールする ③ DockerからTensorFlowイメージをインスト―ル(pull) する Dockerが最もお手軽ではありますが、Dockerに不慣れな方が 立ち止まらないよう、Windows/macOSを使って解説します
  23. 23. 22 3.TensorBoardを使えるようにする 「Anaconda」は、数学系、科学系、データ分析系のPython パッケージを、一括でインストールでき、かつ複数の環境も管理で きるアプリで、TensorBoardも簡単にインストールできます
  24. 24. 23 3.TensorBoardを使えるようにする ターミナルを起動します
  25. 25. 24 3.TensorBoardを使えるようにする Kerasをpipでインストールします PythonコマンドでREPLが起動し、Kerasがエラー無くimport できれば、インストールは成功です exit()と打てば、Pythonを抜けて、ターミナルに戻ります もしエラーが出たときは、前ページをやり直してください # python >>> import keras Using TensorFlow backend. >>> >>> exit() # # pip install tensorflow # pip install keras
  26. 26. 25 3.TensorBoardを使えるようにする TensorBoardを起動するためには、事前に学習した結果のログ が必要なため、第3回の「not.py」にログ出力を仕込みます import numpy as np from keras.models import Sequential from keras.layers import Dense, Activation from keras.optimizers import SGD import keras.callbacks model = Sequential( [ Dense( input_dim = 1, units = 1 ), Activation( 'sigmoid' ) ] ) model.compile( loss = 'binary_crossentropy', optimizer = SGD( lr = 0.1 ) ) tensorboard = keras.callbacks.TensorBoard( log_dir = './log', histogram_freq = 1 ) callback_tensorboard = [ tensorboard ] input = np.array( [ [ 0 ], [ 1 ] ] ) expected = np.array( [ [ 1 ], [ 0 ] ] ) model.fit( input, expected, epochs = 200, batch_size = 1, callbacks = callback_tensorboard, validation_data = ( input, expected ) ) print() classes = model.predict_classes( input, batch_size = 1 ) print( '###### classes ######' ) print( classes ) probably = model.predict_proba( input, batch_size = 1 ) print( '###### probably ######' ) print( probably )
  27. 27. 26 3.TensorBoardを使えるようにする 以下コマンドで実行します 以下のような結果が返ってきます logフォルダ配下に、「events.out.tfevents.~」で始まるログ ファイルが作成されていれば、ログ出力成功です Using TensorFlow backend. Epoch 1/200 2/2 [==============================] - 4s - loss: 0.7516 Epoch 2/200 2/2 [==============================] - 0s - loss: 0.7363 …(略)… Epoch 200/200 2/2 [==============================] - 0s - loss: 0.1349 ###### classes ###### [[1] [0]] ###### probably ###### [[ 0.84955114] [ 0.09877715]] # python not.py
  28. 28. 27 3.TensorBoardを使えるようにする 以下コマンドでTensorBoardを起動すると、「6006」ポートで 待ち受けをするサーバが起動されます 上記、赤枠で囲ったURLをブラウザで見まると、以下のページが 表示され、これでTensorBoardの起動成功です # tensorboard --logdir=./log W0126 16:29:37.342810 Reloader tf_logging.py:86] Found more than one graph event per run, or there was a metagraph containing a graph_def, as well as one or more graph events. Overwriting the graph with the newest event. TensorBoard 0.4.0 at http://Z-0000-000189-01:6006 (Press CTRL+C to quit)
  29. 29. 28 4.notの中で起こっていることを見る
  30. 30. 29 4.notの中で起こっていることを見る 最も、分かりやすい「GRAPHS」から見ていきます このグラフは、下から上に、処理が進んでいることを示します
  31. 31. 30 4.notの中で起こっていることを見る 「dense_1」をダブルクリックすると、model配下が展開され、 「activation」内の「Sigmoid」が呼ばれていることが分かります model = Sequential( [ Dense( input_dim = 1, units = 1 ), Activation( 'sigmoid' ) ] ) コードで言えば、下記に該当 しています
  32. 32. 31 4.notの中で起こっていることを見る 「Sigmoid」は「シグモイド関数」を意味しており、その理解まで 辿り着く事前知識として、「学習」のプロセスを見ていきます たとえば、入力x (範囲は0~1) を、そのまま出力yとする場合、 以下表のような入出力の関係となり、学習する必要は無いです これを式で表すと、以下の通りです y = x x y 0 0 1 1 入力x 出力y
  33. 33. 32 4.notの中で起こっていることを見る 次は、入力の0/1を反転させる、notの動きです 以下表のような入出力の関係となります この反転を実現する式は、以下のようになります これをニューラルネットワーク上に書くと、以下のようになります 入力x 出力y y = -x + 1 乗算-1 加算+1 NOT 入力x 出力y 入力x 出力y 0 1 1 0 NOT
  34. 34. 33 4.notの中で起こっていることを見る もし、これら「乗算」「加算」を知らない前提として、それぞれ変数 にした場合、以下の式となります notを実現する「a」と「b」を割り出すために、以下3つの変数を 導入します ① 「t」・・・期待する正解 ② 「da」・・・aを正解に近づける幅 ③ 「db」・・・bを正解に近づける幅 「tとyの差」でaとbを補正し、yが期待通りになるまで、つまり、 「aとbが正解を出せるようになる」まで、補正を繰り返します (上記のような、項目を分解した幅を「偏微分」と呼びます) y = ax + b
  35. 35. 34 4.notの中で起こっていることを見る 「tとyの差」でaとbを補正する式は、以下の通りです ※この式の意味は、今のところ、理解できなくてもOKです この式で補正される、aとbは、以下の通りの式となります 補正の過程は、以下の通りで、「t - y」が0となったら完了です da = ( t - y ) x db = ( t - y ) x t 0 1 1 0 試行数 1 2 0 1 1 0 3 4 0 15 a b 0 0 0 1 -1 0 -1 1 -1 1 y t - y 0 1 1 -1 0 1 0 0 1 0 da db 0 1 -1 -1 0 1 0 0 0 0 a = a + da b = b + db ⊕ ⊕
  36. 36. 35 4.notの中で起こっていることを見る このようにして、以下の式が導出できます この補正アプローチを「誤り訂正学習法」と呼び、ニューラルネット ワークにおける「学習」と言えば、この手法のことを指します ニューラルネットワークに対する入力が、「1つ」から「2つ以上」に 増えても、ニューラルネットワーク層自体が増えても、この学習の 手法自体がやることは基本的に同じで、「乗算」と「加算」の組み 合わせの補正を期待値にマッチするまで繰り返すだけです y = ax + b = -x + 1
  37. 37. 36 4.notの中で起こっていることを見る 誤り訂正の結果を、2次元で表すと、以下のようになります 真ん中を突っ切る線より上にある点が「1」、下にある点が「0」と 分類されるイメージで、これを「クラス分け」と言います 「1」 「0」
  38. 38. 37 4.notの中で起こっていることを見る コードの結果出力にも、「class」という単語が使われています 出てくる結果も、「0」か「1」を区別するものが出てきます … input = np.array( [ [ 0 ], [ 1 ] ] ) expected = np.array( [ [ 1 ], [ 0 ] ] ) model.fit( input, expected, epochs = 200, batch_size = 1, callbacks = callback_tensorboard, validation_data = ( input, expected ) ) print() classes = model.predict_classes( input, batch_size = 1 ) print( '###### classes ######' ) print( classes ) … ###### classes ###### [[1] [0]]
  39. 39. 38 4.notの中で起こっていることを見る 学習した結果は、この線で分類できたとして、未来にやってくる 「未知のデータ」が、この線で、確実に分類できるかどうかは不明 です (下記、赤枠の「1」のようなもの) = 「1」 「1」 「0」
  40. 40. 39 4.notの中で起こっていることを見る そこで、この線でピッタリ「0」「1」を分けず、線から幅を持たせて、 曖昧に判定 (実際は確率として扱う) させることで、未知データ 適切に判定できるようにするのが、「シグモイド関数」です = 「0」 「1」 「0」
  41. 41. 40 4.notの中で起こっていることを見る なお、この線からの距離は、クラス分けの間違いの原因となるため、 「損失」と呼びます 「学習」とは、この損失を限りなく小さくしていく処理で、そのために、 損失度合を評価する必要があり、それを計算する関数を指して、 「損失関数」と呼びます 「1」 「0」
  42. 42. 41 4.notの中で起こっていることを見る 「損失関数」は、損失を限りなく小さくする、つまり、関数における 「最小値」を求める、という「最適解問題」ということになります
  43. 43. 42 4.notの中で起こっていることを見る 「最適解問題」では、複数の最小値候補が挙がることがあるため、 以下の図のように、本来、期待される最適解で無い、「局所的 な最適解」にトラップされるケースがあります ※この近付く幅も「偏微分」で、この幅が大きいと学習は速い一方、正解に 近付きにくくなり、小さいと精度高いが、学習は遅くなります
  44. 44. 43 4.notの中で起こっていることを見る この「局所的な最適解」へのトラップを解消するアルゴリズムが、 AI・MLでは、多数出てきます その1つが「SGD (Gradient Descent)」です model.compile( loss = 'binary_crossentropy', optimizer = SGD( lr = 0.1 ) )
  45. 45. 44 4.notの中で起こっていることを見る SGDの他にも、以下のような、最適解を探索するアルゴリズムが ありますが、それぞれ一長一短あり、選定し直すポイントとしては、 「学習の回数をどれだけ増やしても、パラメータをいじっても、損 失関数が小さくならないとき」は、別のものを試してみる、と良い でしょう  Adagrad  RMSProp  Adam などなど
  46. 46. 45 【余談】量子コンピュータでの最適解問題の解決 量子コンピュータの大きな方式の違いとして、「量子ゲート方式」 と「量子イジングマシン方式」の2種類あり、 「量子イジングマシン 方式」 の実装の1つである「量子アニーリング」では、以下の図の ような、最適解を「同時に複数」、一気に探索開始します
  47. 47. 46 【余談】量子コンピュータでの最適解問題の解決 各々の探索がトラップされた場合、「量子トンネル効果」により、 より低い位置へと勾配自体を通り抜け (量子テレポーテーション と言います) し、探索を継続し、最適解を求めます
  48. 48. 47 5.今度はあなたの手元で
  49. 49. 48 5.今度はあなたの手元で TensorBoardとコードを見ながら、AI・MLにおけるアルゴリズム を読んでいくための基礎は、これで手に入りました アルゴリズムを学ぶには、以下のサイト/書籍がオススメです
  50. 50. 49 5.今度はあなたの手元で お気付きかもしれませんが、本セッションでは、アルゴリズムの解説 は行っていますが、数式はやはり、ほとんど出てきていません (笑) つまり、「数式無でも内部動作は理解できる」と捉えられます こうした冷静な目で、巷に出回る書籍やサイトを眺めてみると、 「学ぶべき本質は何か?」が大事、ということが見えてきます p.s.ちなみに、福岡にいて、「数式をガッツリ学びたい」という方は、 「福岡 理学部」か「重力プログラミング」なら抵抗感少な目(^_^)
  51. 51. 50 ご清聴ありがとうございます

×