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.

【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」

1,595 views

Published on

Kerasで開発すると、複雑な数式によるモデル構築をせずとも、ディープラーニングによる時系列学習モデルが開発でき、 データ予測が実現できる、ということを、実際に動くコードで実感していただくセッションです。

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

【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」

  1. 1. AI入門 第3回 「数学が苦手でも作って使える Kerasディープラーニング」 ~時系列データの予測をサクっとこなす~ 2017/08/15 ver0.5作成 2017/09/25 ver0.9作成 2017/11/14 ver1.0(macOS対応)作成
  2. 2. 1 AI入門 第1回では、TensorFlowのチュートリアルを使った、 「ディープラーニングによる画像処理」にて、ディープラーニングが、 手元のPCで気軽に実行できることを体験していただきました 一方、業務における「利用・活用」の観点では、画像処理以上 に、閲覧データや購入データ、行動データ等の「時系列データ」に 対する分析・推論の方が、ポピュラーだと思います そこで今回は、「時系列データ」の予測に特化したモデルの構築 と、時系列の予測を実現する方法を解説していきます はじめに ~業務利用向けのディープラーニング~ tabby cat (トラ猫) tiger cat (トラ猫) beaker (ビーカー) Persian cat (ペルシャ猫)Egyptian cat (エジプト猫)
  3. 3. 2 本セッションの流れ 最初に、「ディープラーニング」の元となる「ニューラルネットワーク」 の要素について解説します その後、 「Kerasで開発すると、複雑な数式による モデル構築をせずとも、ディープラーニング による時系列学習モデルが開発でき、 データ予測が実現できる」 ということを、実際に動くコードで実感していただきます 「機械学習による時系列データ分析」が、高度な予備知識無し で気軽に開発できることを体感するセッションです
  4. 4. 3 1. はじめてのニューラルネットワーク 2. Kerasについて 3. kerasを使えるようにする 4. KerasでのML開発入門 5. 2層ニューラルネットワークでXOR 6. ディープラーニングで時系列分析 7. ロジックを組まない予測の世界へ 8. 付録:「学習」の中身 目次
  5. 5. 4 1.はじめてのニューラルネットワーク
  6. 6. 5 「ディープラーニング」は、「ディープニューラルネットワーク」にて学習 する手法なので、まずは「ニューラルネットワーク」から始めます ニューラルネットワークは、人の脳内神経細胞である「ニューロン」 の脳内ネットワークをコンピュータの「人工ニューロン」で模したもの であり、ニューロン間の情報伝達により、物事を認識したり、情報 処理する人間の脳に似た機能をエミュレーションします 1.はじめてのニューラルネットワーク 脳内ニューロンのネットワーク 入 力 信 号 出 力 信 号 ニューラルネットワーク 入 力 信 号 出 力 信 号
  7. 7. 6 1.はじめてのニューラルネットワーク ニューラルネットワーク内の単一のニューロンは、以下の通りです x1~xnの各入力の強弱により、出力yが有効な出力を行う ケースと、行わないケースが分かれますが、有効な出力を行った 場合に「ニューロンが活性化」したと表現します ニューラルネットワークとしての出力は、この単一ニューロンの組み 合わせによって決まります 入力x1 出力y 入力x2 入力xn … …
  8. 8. 7 1.はじめてのニューラルネットワーク 「ディープラーニング」とは、このニューラルネットワークを多層構造 に構成したもので学習・推論することを指します 「データが持つ特徴を、自動抽出」できる点(≒人手が不要) が、ディープラーニングの革新的なポイントです
  9. 9. 8 2.Kerasについて
  10. 10. 9 2.Kerasについて Kerasは、TensorFlowをコアとして動作するラッパーライブラリで、 本来、数学を用いて、ニューラルネットワークやディープラーニング を構築する必要があるところの大部分を代行してくれます Kerasを使わず、TensorFlowそのままでコーディングした場合、 「学習」部分を数式に相当するコードで書くこととなります※が、 Kerasを使った場合は、数式を一切使わずとも、「学習」部分が コーディングできるのが、最大の特徴です ※Kerasで省略される「学習」における数式については、末尾に付録として掲載しています https://keras.io/ja/
  11. 11. 10 3.Kerasを使えるようにする
  12. 12. 11 3.Kerasを使えるようにする Kerasを使い始めるのに、3種類の方法があります ① 各種OS用のpip (Pythonパッケージマネージャ) 経由で インストールする ② 【Windows、Mac】Anaconda (Python環境マネー ジャ) 経由でインストールする ③ DockerからTensorFlowイメージをインスト―ル(pull) する Dockerが最もお手軽ではありますが、今回は、グラフ表示する 都合から、Windows版を使って解説します
  13. 13. 12 3.Kerasを使えるようにする 「Anaconda」は、数学系、科学系、データ分析系のPython パッケージを、一括でインストールでき、かつ複数の環境も管理で きるアプリで、Kerasも簡単にインストールできます
  14. 14. 13 3.Kerasを使えるようにする Anacondaは、以下URLからダウンロードします (ここでは、Windwos版とmacOS版について説明します) https://www.anaconda.com/download/
  15. 15. 14 3.Kerasを使えるようにする 「Environments」クリック後、「Create」ボタンから、Python 環境を作成します 【macOSのみ】Pythonを「3.5」にしてください
  16. 16. 15 3.Kerasを使えるようにする Anacondaから、ターミナルを起動します このとき、誤って「root」から起動しないよう、ご注意ください
  17. 17. 16 3.Kerasを使えるようにする Kerasをpipでインストールします PythonコマンドでREPLが起動し、Kerasがエラー無くimport できれば、インストールは成功です exit()と打てば、Pythonを抜けて、ターミナルに戻ります もしエラーが出たときは、前ページをやり直してください # python >>> import keras Using TensorFlow backend. >>> >>> exit() # # pip install tensorflow # pip install keras
  18. 18. 17 4.KerasでのML開発入門
  19. 19. 18 4.KerasでのML開発入門 単層ニューラルネットワークによる学習・推論として、入力の0/1を 反転させるニューラルネットワークを作ってみましょう このニューラルネットワークへの入力と出力は、以下の表のような 関係となります この反転するニューラルネットワークをKerasで開発してみます NOT 入力 出力 入力 出力 0 1 1 0
  20. 20. 19 4.KerasでのML開発入門 以下を「not.py」というファイルで保存します (コード内容の解説は、実行後に行います) import numpy as np from keras.models import Sequential from keras.layers import Dense, Activation from keras.optimizers import SGD model = Sequential( [ Dense( input_dim = 1, units = 1 ), Activation( 'sigmoid' ) ] ) model.compile( loss = 'binary_crossentropy', optimizer = SGD( lr = 0.1 ) ) input = np.array( [ [ 0 ], [ 1 ] ] ) expected = np.array( [ [ 1 ], [ 0 ] ] ) model.fit( input, expected, epochs = 200, batch_size = 1 ) 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 )
  21. 21. 20 4.KerasでのML開発入門 以下コマンドで実行します 以下のような結果が返ってくれば、学習・推論は成功です 赤で囲んだところは、「1」となる確率を示しており、input=0だと 84.9%の確率で1、input=1だと9.8%の確率で1 (つまり、 90.1%の確率で0) と推論しています 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
  22. 22. 21 4.KerasでのML開発入門 コード内容について解説します Sequential()は、ニューラルネットワーク層のモデルを決めるため のメソッドで、「input_dim」で入力データを1次元として設定し、 「Activation」でニューロンの活性化判定に「シグモイド関数」※ を設定します ※「シグモイド関数」は、今のところ、「ニューロンの活性化判定に使える」程度の理解でOKです model.compile()は、モデルの学習時設定を行うメソッドで、 「loss」で設定する「損失関数」と、「optimizer」で設定する 「学習効率の最適化手法 (学習率)」で、学習効率を最適化 することができます (この2つの値の意味については、今のところ、「ほどほど適切に最適」とご認識いただくだけでOKです) model = Sequential( [ Dense( input_dim = 1, units = 1 ), Activation( 'sigmoid' ) ] ) model.compile( loss = 'binary_crossentropy', optimizer = SGD( lr = 0.1 ) )
  23. 23. 22 4.KerasでのML開発入門 (続き) 入力と期待値の値を定義します model.fit()で、構築したモデルに入力と期待値を渡し、学習を 行います 「epochs」で設定する「学習時の試行数」は200回とします 「batch_size」では、学習時の1回あたりのデータサイズ分割を 設定することで、メモリ不足対策や高速化ができますが、問題が 未だ大きく無いので、サイズ分割無の1で大丈夫です input = np.array( [ [ 0 ], [ 1 ] ] ) expected = np.array( [ [ 1 ], [ 0 ] ] ) model.fit( input, expected, epochs = 200, batch_size = 1 )
  24. 24. 23 4.KerasでのML開発入門 (続き) 学習したモデルに、改めて入力を入れ、推論 (≒予測) をさせた 結果を表示します これが期待値と一致していれば、うまく学習・推論できたということ になります 上記は、推論の認識確率 (前述した赤枠部分) の精度がどの 位だったかを表示します classes = model.predict_classes( input, batch_size = 1 ) print( '###### classes ######' ) print( classes ) prob = model.predict_proba( input, batch_size = 1 ) print( '###### classes ######' ) print( probably )
  25. 25. 24 4.KerasでのML開発入門 試行数を10回に減らすと、結果がどう変わるか確認します 200回時は、input=0が84.9%、input=1が90.1%なのが、 10回だと、input=0が50.5%、input=1が57.3%と、認識 率がだいぶ減りました 正解は、かろうじて出ているレベルですが、心もとないので、50回 以上には設定しておいた方が良いでしょう # python not.py Using TensorFlow backend. Epoch 1/10 2/2 [==============================] - 1s - loss: 0.7516 …(略)… ###### classes ###### [[1] [0]] ###### probably ###### [[ 0.50553364] [ 0.42703652]]
  26. 26. 25 4.KerasでのML開発入門 今度は、入力が2つの単層ニューラルネットワークの例として、OR 判定するニューラルネットワークを作ってみましょう このニューラルネットワークへの入力と出力は、以下の表のような 関係となります 入力1 出力 入力2 出力 0 0 1 1 0 1 1 1 入力1 0 0 1 1 OR 入力2
  27. 27. 26 4.KerasでのML開発入門 「not.py」を元に、下記赤枠を変更し、「or.py」で保存します (「input_dim」を2次元に変更し、xとyを書き換える) import numpy as np from keras.models import Sequential from keras.layers import Dense, Activation from keras.optimizers import SGD model = Sequential( [ Dense( input_dim = 2, units = 1 ), Activation( 'sigmoid' ) ] ) model.compile( loss = 'binary_crossentropy', optimizer = SGD( lr = 0.1 ) ) input = np.array( [ [ 0, 0 ], [ 0, 1 ], [ 1, 0 ], [ 1, 1 ] ] ) expected = np.array( [ [ 0 ], [ 1 ], [ 1 ], [ 1 ] ] ) model.fit( input, expected, epochs = 200, batch_size = 1 ) 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 )
  28. 28. 27 4.KerasでのML開発入門 以下コマンドで実行します 以下のような結果が返ってくれば、学習・推論は成功です 赤枠部分は、前述のnotと同じく、「1」となる確率で、期待通り にORが推論できていることが確認できます Epoch 1/200 4/4 [==============================] - 0s - loss: 0.4352 …(略)… Epoch 200/200 4/4 [==============================] - 0s - loss: 0.1011 ###### classes ###### [[0] [1] [1] [1]] ###### probably ###### [[ 0.20687966] [ 0.92517704] [ 0.91522515] [ 0.99804986]] # python or.py
  29. 29. 28 4.KerasでのML開発入門 ORは、試行数が10回だと、誤推論してしまいました やはり最低でも、50回程度は必須です …(略)… ###### classes ###### [[1] [1] [1] [1]] ###### probably ###### [[ 0.53244859] [ 0.86008555] [ 0.68383926] [ 0.92110789]]
  30. 30. 29 5.2層ニューラルネットワークでXOR
  31. 31. 30 5.2層ニューラルネットワークでXOR NOT、ORもしくはANDのような、単純なものは、単層ニューラル ネットワークで学習できますが、XORは、うまく学習が進みません (これは、試行数を増やしても改善しません) これは、XORが、入力層と出力層だけの単層では実現できない ためです※ ※専門用語で言うと、XORは「非線形」という、グラフ上で1本の線では表現できない対象のためです これに対し、NOT、OR等は、「線形」で、グラフ上で1本の線で表現できるため、単相で実現できます 詳細を知りたい場合は、末尾の「付録:『学習』の中身」をご確認ください …(略)… ###### classes ###### [[1] [1] [1] [1]] ###### probably ###### [[ 0.50147235] [ 0.50298554] [ 0.50041449] [ 0.50192779]]
  32. 32. 31 5.2層ニューラルネットワークでXOR XORを実現するためには、以下のような、2層のニューラルネット ワークを構成します このニューラルネットワークの入出力は、以下表の関係となります 出力yAND 入力x1 入力x2 NOTAND OR x2 y 0 0 1 1 0 1 1 0 x1 0 0 1 1
  33. 33. 32 5.2層ニューラルネットワークでXOR 「or.py」を元に、下記赤枠を変更し、「xor.py」で保存します (modelの記述とexpected、試行数を書き換え) import numpy as np from keras.models import Sequential from keras.layers import Dense, Activation from keras.optimizers import SGD model = Sequential() model.add( Dense( input_dim = 2, units = 2 ) ) model.add( Activation( 'sigmoid' ) ) model.add( Dense( units = 1 ) ) model.add( Activation( 'sigmoid' ) ) model.compile( loss = 'binary_crossentropy', optimizer = SGD( lr = 0.1 ) ) input = np.array( [ [ 0, 0 ], [ 0, 1 ], [ 1, 0 ], [ 1, 1 ] ] ) expected = np.array( [ [ 0 ], [ 1 ], [ 1 ], [ 0 ] ] ) model.fit( input, expected, epochs = 800, batch_size = 1 ) 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 )
  34. 34. 33 5.2層ニューラルネットワークでXOR 以下コマンドで実行します 以下のような結果が返ってくれば、学習・推論は成功です 赤枠部分が、期待通りのXORで推論できています Epoch 1/800 4/4 [==============================] - 0s - loss: 0.4352 Epoch 2/800 4/4 [==============================] - 0s - loss: 0.4204 …(略)… Epoch 800/800 4/4 [==============================] - 0s 0us/step - loss: 0.4299 ###### classes ###### [[0] [1] [1] [1]] 4/4 [==============================] - 0s 4ms/step ###### probably ###### [[ 0.09015014] [ 0.64111888] [ 0.74787629] [ 0.57065195]] # python or.py
  35. 35. 34 5.2層ニューラルネットワークでXOR Kerasでは、Sequential()に設定を追加するだけで、ニューラル ネットワークの層追加が行えます また、XORの内部構造 (AND、NOT、OR、ANDとその接続) を特に指定していなくても、XORを判定するロジックが自動生成 された点にも着目してください つまり、ニューラルネットワークの層を追加し、学習させれば、処理 を一切記述しなくても、ロジックが開発できる、ということです model = Sequential( [ Dense( input_dim = 2, units = 1 ), Activation( 'sigmoid' ) ] ) model = Sequential() model.add( Dense( input_dim = 2, units = 2 ) ) model.add( Activation( 'sigmoid' ) ) model.add( Dense( units = 1 ) ) model.add( Activation( 'sigmoid' ) )
  36. 36. 35 6.ディープラーニングで時系列分析
  37. 37. 36 6.ディープラーニングで時系列分析 ここまでの内容では、ニューラルネットワークの層を追加すれば、 複雑なロジックも自動生成できることが分かりました ただし、これは「1回の入力が1種類のデータ」という単発のケース に限られ、「1回の入力がn個の連続するデータ」である場合、 ニューラルネットワークの層の多さだけでは、対応できません そこで、時系列データに特化したモデルが必要となります
  38. 38. 37 6.ディープラーニングで時系列分析 RNN (Recurrent Neural Network) という、時系列に特化 したモデルは、「未来のデータ並びの予測」を実現します たとえば、単語の並びから、発言した人の感情が、どんな状態に なっているかを推測する、といった分析に向いています
  39. 39. 38 6.ディープラーニングで時系列分析 最初の時系列データは、カンタンな、ノイズ入りsin波にします import numpy as np from keras.models import Sequential from keras.layers import Dense, Activation from keras.layers.recurrent import LSTM from keras.optimizers import Adam from keras.callbacks import EarlyStopping import matplotlib.pyplot as plt def sin( x, T = 100 ): return np.sin( 2.0 * np.pi * x / T ) def noisy_sin( T = 100, ampl = 0.05 ): x = np.arange( 0, 2 * T + 1 ) noise = ampl * np.random.uniform( low = - 1.0, high = 1.0, size = len( x ) ) return sin( x ) + noise f = noisy_sin() plt.figure() plt.plot( range( 0, len( f ) ), f, color = "b", label = "sin" ) plt.legend() plt.show() predict_sin.py
  40. 40. 39 6.ディープラーニングで時系列分析 グラフ表示のためのライブラリをインストールします 【macOSのみ】matplotlibを動かすための設定ファイルを以下 コマンドで作成し、Anacondaからターミナルを起動し直します 以下で、ノイズ入りsin波をグラフ表示します # pip install matplotlib # python predict_sin.py # echo backend : TkAgg > ~/.matplotlib/matplotlibrc
  41. 41. 40 6.ディープラーニングで時系列分析 グラフを確認したら、グラフ表示はコメントアウトします … ''' plt.figure() plt.plot( range( 0, len( f ) ), f, color = "b", label = "sin" ) plt.legend() plt.show() ''' predict_sin.py
  42. 42. 41 6.ディープラーニングで時系列分析 (続き) RNN用にデータを分割し、モデルを構築します … def build_dataset( inputs, n_prev = 100 ): input = [] expected = [] maxlen = 25 for i in range( len( inputs ) - maxlen ): input.append( inputs[ i: i + maxlen ] ) expected.append( inputs[ i + maxlen ] ) re_input = np.array( input ).reshape( len( input ), maxlen, 1 ) re_expected = np.array( expected ).reshape( len( input ), 1 ) return re_input, re_expected x, y = build_dataset( f ) length_of_sequence = x.shape[ 1 ] in_out_neurons = 1 n_hidden = 300 model = Sequential() model.add( LSTM( n_hidden, batch_input_shape = ( None, length_of_sequence, in_out_neurons ), return_sequences = False ) ) model.add( Dense( in_out_neurons ) ) model.add( Activation( "linear" ) ) optimizer = Adam( lr = 0.001 ) model.compile( loss = "mean_squared_error", optimizer = optimizer ) … predict_sin.py
  43. 43. 42 6.ディープラーニングで時系列分析 (続き) 学習させ、未来データを予測し、グラフ表示します … model.fit( x, y, batch_size = 500, epochs = 80, validation_split = 0.1 ) future_test = x[ 175 ].T time_length = future_test.shape[ 1 ] future_result = np.empty( ( 0 ) ) for step2 in range( 400 ): test_data = np.reshape( future_test, ( 1, time_length, 1 ) ) batch_predict = model.predict( test_data ) future_test = np.delete( future_test, 0 ) future_test = np.append( future_test, batch_predict ) future_result = np.append( future_result, batch_predict ) predicted = model.predict( x ) plt.figure() plt.plot( range( 0, len( f ) ), f, color = "b", label = "sin" ) plt.plot( range( 25, len( predicted ) + 25 ), predicted, color = "r", label = "predict" ) plt.plot( range( 0 + len( f ), len( future_result ) + len( f ) ), future_result, color = "g", label = "future" ) plt.legend() plt.show() predict_sin.py
  44. 44. 43 6.ディープラーニングで時系列分析 予測した未来データは、緑のグラフで、元データ (青) のsin波を 再現しています なお、学習時データ (赤) を見ると、元データと比べ、若干振幅 が縮んで学習しているため、未来データも徐々に縮んでいます (ノイズがランダムに出ている影響)
  45. 45. 44 7.ロジックを組まない予測の世界へ
  46. 46. 45 7.ロジックを組まない予測の世界へ 今回は、論理演算やカンタンな時系列データの特徴を解析し、 予測を行うKerasアプリ開発についてご紹介しました Kerasによるディープラーニングが「そこまで難しく無いかも?」と 思っていただけたら、この入門としては大成功です 論理演算も、時系列データも、パターンが読み取れる単純な ものだったため、物足りないかも知れませんが、ロジック作成無で 予測できた点にパラダイムシフトを感じていただけたら幸いです より実践的な分析 (マーケティングデータ等) は、ここで学んだこと を応用し、この後のシリーズにて扱っていきます それでは、AI・MLプログラミングライフをエンジョイしてください!
  47. 47. 46 8.付録:「学習」の中身
  48. 48. 47 8.付録:「学習」の中身 小規模なニューラルネットワークで「学習」のプロセスを学びます 最小は、入力が1つ、出力が1つとなります たとえば、入力x (範囲は0~1) を、そのまま出力yとする場合、 以下表のような入出力の関係となり、学習する必要は無いです これを式で表すと、以下の通りです y = x x y 0 0 1 1 入力x 出力y
  49. 49. 48 8.付録:「学習」の中身 次は、入力の0/1を反転させるニューラルネットワークです 以下表のような入出力の関係となります この反転を実現する式は、以下のようになります これをニューラルネットワーク上に書くと、以下のようになります 入力x 出力y y = -x + 1 乗算-1 加算+1 NOT 入力x 出力y 入力x 出力y 0 1 1 0 NOT
  50. 50. 49 8.付録:「学習」の中身 ニューラルネットワーク上の「乗算」「加算」を知らない前提として、 「乗算」と「加算」を変数にした場合、以下の式となります 反転を実現するaとbを割り出すために、以下3つの変数を導入 します ① 「t」・・・期待する正解 ② 「da」・・・aを正解に近づける幅 ③ 「db」・・・bを正解に近づける幅 「tとyの差」でaとbを補正し、yが期待通りになるまで、つまり、 「aとbが正解を出せるようになる」まで、補正を繰り返します y = ax + b
  51. 51. 50 8.付録:「学習」の中身 「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 ⊕ ⊕
  52. 52. 51 8.付録:「学習」の中身 このようにして、以下の式が導出できます この補正アプローチを「誤り訂正学習法」と呼び、ニューラルネット ワークにおける「学習」と言えば、この手法のことを指します ニューラルネットワークに対する入力が、「1つ」から「2つ以上」に 増えても、ニューラルネットワーク層自体が増えても、この学習の 手法自体がやることは基本的に同じで、「乗算」と「加算」の組み 合わせの補正を期待値にマッチするまで繰り返すだけです y = ax + b = -x + 1
  53. 53. 52 ご清聴ありがとうございます

×