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入門 第3回
「数学が苦手でも作って使える
Kerasディープラーニング」
~時系列データの予測をサクっとこなす~
2017/08/15 ver0.5作成
2017/09/25 ver0.9作成
1
AI入門 第1回では、TensorFlowのチュートリアルを使った、
「ディープラーニングによる画像処理」にて、ディープラーニングが、
手元のPCで気軽に実行できることを体験していただきました
一方、業務における「利用・活用」の観点では、画...
2
本セッションの流れ
最初に、「ディープラーニング」の元となる「ニューラルネットワーク」
の要素について解説します
その後、
「Kerasで開発すると、複雑な数式による
モデル構築をせずとも、ディープラーニング
による時系列学習モデルが開発で...
3
1. はじめてのニューラルネットワーク
2. Kerasについて
3. kerasを使えるようにする
4. KerasでのML開発入門
5. 2層ニューラルネットワークでXOR
6. ディープラーニングで時系列分析
7. ロジックを組まない...
4
1.はじめてのニューラルネットワーク
5
「ディープラーニング」は、「ディープニューラルネットワーク」にて学習
する手法なので、まずは「ニューラルネットワーク」から始めます
ニューラルネットワークは、人の脳内神経細胞である「ニューロン」
の脳内ネットワークをコンピュータの「人工ニュ...
6
1.はじめてのニューラルネットワーク
ニューラルネットワーク内の単一のニューロンは、以下の通りです
x1~xnの各入力の強弱により、出力yが有効な出力を行う
ケースと、行わないケースが分かれますが、有効な出力を行った
場合に「ニューロンが活...
7
1.はじめてのニューラルネットワーク
「ディープラーニング」とは、このニューラルネットワークを多層構造
に構成したもので学習・推論することを指します
「データが持つ特徴を、自動抽出」できる点(≒人手が不要)
が、ディープラーニングの革新的な...
8
2.Kerasについて
9
2.Kerasについて
Kerasは、TensorFlowをコアとして動作するラッパーライブラリで、
本来、数学を用いて、ニューラルネットワークやディープラーニング
を構築する必要があるところの大部分を代行してくれます
Kerasを使わず、...
10
3.Kerasを使えるようにする
11
3.Kerasを使えるようにする
Kerasを使い始めるのに、3種類の方法があります
① 各種OS用のpip (Pythonパッケージマネージャ) 経由で
インストールする
② 【Windows、Mac】Anaconda (Python環...
12
3.Kerasを使えるようにする
「Anaconda」は、数学系、科学系、データ分析系のPython
パッケージを、一括でインストールでき、かつ複数の環境も管理で
きるアプリで、Kerasも簡単にインストールできます
13
3.Kerasを使えるようにする
ターミナルを起動します
14
3.Kerasを使えるようにする
Kerasをpipでインストールします
PythonコマンドでREPLが起動し、Kerasがエラー無くimport
できれば、インストールは成功です
exit()と打てば、Pythonを抜けて、ターミナル...
15
4.KerasでのML開発入門
16
4.KerasでのML開発入門
単一ニューロンによる学習・推論として、入力の0/1を反転させる
ニューロンを作ってみましょう
このニューロンへの入力と出力は、以下表のような関係となります
この反転を実現するニューロンをKerasで開発して...
17
4.KerasでのML開発入門
以下を「not.py」というファイルで保存します
(コード内容の解説は、実行後に行います)
import numpy as np
from keras.models import Sequential
fr...
18
4.KerasでのML開発入門
以下コマンドで実行します
以下のような結果が返ってくれば、学習・推論は成功です
赤で囲んだところは、「y=1」となる確率を示しており、x=0時は、
84.9%の確率でy=1と認識、x=1時は9.8%の確率で...
19
4.KerasでのML開発入門
コード内容について解説します
Sequential()は、ニューラルネットワーク層のモデルを決めるため
のメソッドで、「input_dim」で入力データを1次元として設定し、
「Activation」でニュ...
20
4.KerasでのML開発入門
(続き)
入力xと出力yの値を定義します
(このyは、学習時および推論時の両方における期待値になる)
model.fit()で、構築したモデルに入力xと出力yを渡し、学習
を行います
「epochs」で設定...
21
4.KerasでのML開発入門
(続き)
学習結果を使って、推論 (≒予測) した結果を表示します
これが出力yと一致していれば、うまく学習・推論できたということ
になります
推論によって、出力yの認識確率 (前述した赤枠部分) がどの
...
22
4.KerasでのML開発入門
試行数を10回に減らすと、結果がどう変わるか確認します
200回時は、x=0が84.9%、x=1が90.1%でしたが、10回は、
x=0が50.5%、x=1が57.3%と、認識率がだいぶ減りました
正解は、...
23
4.KerasでのML開発入門
今度は、入力が2つの単一ニューロンの例として、OR判定する
ニューロンを作ってみましょう
このニューロンへの入力と出力は、以下表のような関係となります
入力x1
出力y
x2 y
0 0
1 1
0 1
1...
24
4.KerasでのML開発入門
「not.py」を元に、下記赤枠を変更し、「or.py」で保存します
(「input_dim」を2次元に変更し、xとyを書き換える)
import numpy as np
from keras.models...
25
4.KerasでのML開発入門
以下コマンドで実行します
以下のような結果が返ってくれば、学習・推論は成功です
赤枠部分は、前述のnotと同じく、「y=1」となる確率で、期待
通りのORで推論できていることが確認できます
Epoch 1/...
26
4.KerasでのML開発入門
ORは、試行数が10回だと、誤推論してしまいました
やはり50回程度は欲しいところです
…(略)…
[[1]
[1]
[1]
[1]]
[[ 0.53244859]
[ 0.86008555]
[ 0.68...
27
5.2層ニューラルネットワークでXOR
28
5.2層ニューラルネットワークでXOR
NOT、ORもしくはANDのような、単純なものは、単層ニューラル
ネットワークで学習できますが、XORは、うまく学習が進みません
(これは、試行数を増やしても改善しません)
これは、XORが、入力層...
29
5.2層ニューラルネットワークでXOR
XORを実現するためには、以下のような、2層のニューラルネット
ワークを構成します
このニューラルネットワークの入出力は、以下表の関係となります
出力yAND
入力x1
入力x2
NOTAND
OR...
30
5.2層ニューラルネットワークでXOR
「or.py」を元に、下記赤枠を変更し、「xor.py」で保存します
(modelの構成・記述を変更し、yと試行数を書き換え)
import numpy as np
from keras.model...
31
5.2層ニューラルネットワークでXOR
以下コマンドで実行します
以下のような結果が返ってくれば、学習・推論は成功です
赤枠部分が、期待通りのXORで推論できています
Epoch 1/800
4/4 [==================...
32
5.2層ニューラルネットワークでXOR
Kerasでは、Sequential()に設定を追加するだけで、ニューラル
ネットワークの層追加が行えます
また、XORの内部構造 (AND、NOT、OR、ANDとその接続)
を特に指定していなくて...
33
6.ディープラーニングで時系列分析
34
6.ディープラーニングで時系列分析
ここまでの内容では、ニューラルネットワークの層を追加すれば、
複雑なロジックも自動生成できることが分かりました
ただし、これは「1回の入力が1種類のデータ」という単発のケース
に限られ、「1回の入力がn...
35
6.ディープラーニングで時系列分析
RNN (Recurrent Neural Network) という、時系列に特化
したモデルは、「未来のデータ並びの予測」を実現します
たとえば、単語の並びから、発言した人の感情が、どんな状態に
なっ...
36
6.ディープラーニングで時系列分析
最初の時系列データは、カンタンな、ノイズ入りsin波にします
以下でノイズ入りsin波をグラフ表示します
import numpy as np
from keras.models import Sequ...
37
6.ディープラーニングで時系列分析
グラフを確認したら、一度グラフ表示はコメントアウトします
…
'''
plt.figure()
plt.plot( range( 0, len( f ) ), f, color = "b", label...
38
6.ディープラーニングで時系列分析
(続き) RNN用にデータを分割し、モデルを構築します
…
def make_dataset( datas, n_prev = 100 ):
data = []
target = []
maxlen =...
39
6.ディープラーニングで時系列分析
(続き) 学習させ、未来データを予測し、グラフ表示します
…
model.fit( x, y,
batch_size = 300,
epochs = 100,
validation_split = 0....
40
6.ディープラーニングで時系列分析
予測した未来データは、緑のグラフで、元データ (青) のsin波を
再現しています
なお、学習時データ (赤) を見ると、元データと比べ、若干振幅
が縮んで学習しているため、未来データも徐々に縮んでいま...
41
7.ロジックを組まない予測の世界へ
42
7.ロジックを組まない予測の世界へ
今回は、論理演算やカンタンな時系列データの特徴を解析し、
予測を行うKerasアプリ開発についてご紹介しました
Kerasによるディープラーニングが「そこまで難しく無いかも?」と
思っていただけたら、こ...
43
8.付録:「学習」の中身
44
8.付録:「学習」の中身
小規模なニューラルネットワークで「学習」のプロセスを学びます
最小は、ニューロン1つ、入力が1つ、出力が1つとなります
たとえば、入力x (範囲は0~1) を、そのまま出力yとする場合、
以下表のような入出力の関...
45
8.付録:「学習」の中身
次は、入力の0/1を反転させるニューロンを想定します
以下表のような入出力の関係となります
この反転を実現する式は、以下のようになります
これをニューロン上に表現すると、以下のようになります
入力x 出力y
y ...
46
8.付録:「学習」の中身
このニューロン上の「乗算」および「加算」を知らない前提として、
「乗算」と「加算」を変数にした場合、以下の式となります
反転を実現するaとbを割り出すために、以下3つの変数を導入
します
① 「t」・・・期待する...
47
8.付録:「学習」の中身
「tとyの差」でaとbを補正する式は、以下の通りです
※この式の意味は、今のところ、理解できなくてもOKです
この式で補正される、aとbは、以下の通りの式となります
補正の過程は、以下の通りで、「t - y」が0...
48
8.付録:「学習」の中身
このようにして、以下の式が導出できます
この補正アプローチを「誤り訂正学習法」と呼び、ニューラルネット
ワークにおける「学習」と言えば、この手法のことを指します
ニューロンに対する入力が「1つ」から「2つ以上」に...
49
ご清聴ありがとうございます
Upcoming SlideShare
Loading in …5
×

AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります

※本スライドは、macOS未対応で、一部コードや説明に誤植もあるため、以下スライドの方をご覧ください
https://www.slideshare.net/piacere_ex/macosai3keras-82043095

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

  • Login to see the comments

AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります

  1. 1. AI入門 第3回 「数学が苦手でも作って使える Kerasディープラーニング」 ~時系列データの予測をサクっとこなす~ 2017/08/15 ver0.5作成 2017/09/25 ver0.9作成
  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を使えるようにする ターミナルを起動します
  15. 15. 14 3.Kerasを使えるようにする Kerasをpipでインストールします PythonコマンドでREPLが起動し、Kerasがエラー無くimport できれば、インストールは成功です exit()と打てば、Pythonを抜けて、ターミナルに戻ります もしエラーが出たときは、前ページをやり直してください # python >>> import keras Using TensorFlow backend. >>> >>> exit() # # pip install keras
  16. 16. 15 4.KerasでのML開発入門
  17. 17. 16 4.KerasでのML開発入門 単一ニューロンによる学習・推論として、入力の0/1を反転させる ニューロンを作ってみましょう このニューロンへの入力と出力は、以下表のような関係となります この反転を実現するニューロンをKerasで開発してみます NOT 入力x 出力y 入力x 出力y 0 1 1 0
  18. 18. 17 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 np.random.seed( 0 ) model = Sequential( [ Dense( input_dim = 1, units = 1 ), Activation( 'sigmoid' ) ] ) model.compile( loss = 'binary_crossentropy', optimizer = SGD( lr = 0.1 ) ) x = np.array( [ [ 1 ], [ 0 ] ] ) y = np.array( [ [ 0 ], [ 1 ] ] ) model.fit( x, y, epochs = 200, batch_size = 1 ) print() classes = model.predict_classes( x, batch_size = 1 ) print() print( y == classes ) probably = model.predict_proba( x, batch_size = 1 ) print() print( probably )
  19. 19. 18 4.KerasでのML開発入門 以下コマンドで実行します 以下のような結果が返ってくれば、学習・推論は成功です 赤で囲んだところは、「y=1」となる確率を示しており、x=0時は、 84.9%の確率でy=1と認識、x=1時は9.8%の確率でy=1 (つまり、90.1%の確率でy=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 [[1] [0]] [[ 0.84955114] [ 0.09877715]] # python not.py
  20. 20. 19 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 ) )
  21. 21. 20 4.KerasでのML開発入門 (続き) 入力xと出力yの値を定義します (このyは、学習時および推論時の両方における期待値になる) model.fit()で、構築したモデルに入力xと出力yを渡し、学習 を行います 「epochs」で設定する「学習時の試行数」は200回とします 「batch_size」では、学習時の1回あたりのデータサイズ分割を 設定することで、メモリ不足対策ができますが、問題が未だ大きく 無いので、サイズ分割無の1で問題ありません x = np.array( [ [ 1 ], [ 0 ] ] ) y = np.array( [ [ 0 ], [ 1 ] ] ) model.fit( x, y, epochs = 200, batch_size = 1 )
  22. 22. 21 4.KerasでのML開発入門 (続き) 学習結果を使って、推論 (≒予測) した結果を表示します これが出力yと一致していれば、うまく学習・推論できたということ になります 推論によって、出力yの認識確率 (前述した赤枠部分) がどの 程度だったかを表示します classes = model.predict_classes( x, batch_size = 1 ) print( classes ) prob = model.predict_proba( x, batch_size = 1 ) print( probably )
  23. 23. 22 4.KerasでのML開発入門 試行数を10回に減らすと、結果がどう変わるか確認します 200回時は、x=0が84.9%、x=1が90.1%でしたが、10回は、 x=0が50.5%、x=1が57.3%と、認識率がだいぶ減りました 正解は、かろうじて出ているレベルですが、心もとないので、50回 以上には設定しておいた方が良いでしょう # python not.py Using TensorFlow backend. Epoch 1/10 2/2 [==============================] - 1s - loss: 0.7516 …(略)… [[1] [0]] [[ 0.50553364] [ 0.42703652]]
  24. 24. 23 4.KerasでのML開発入門 今度は、入力が2つの単一ニューロンの例として、OR判定する ニューロンを作ってみましょう このニューロンへの入力と出力は、以下表のような関係となります 入力x1 出力y x2 y 0 0 1 1 0 1 1 1 x1 0 0 1 1 OR 入力x2
  25. 25. 24 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 np.random.seed( 0 ) model = Sequential( [ Dense( input_dim = 2, units = 1 ), Activation( 'sigmoid' ) ] ) model.compile( loss = 'binary_crossentropy', optimizer = SGD( lr = 0.1 ) ) x = np.array( [ [ 0, 0 ], [ 0, 1 ], [ 1, 0 ], [ 1, 1 ] ] ) y = np.array( [ [ 0 ], [ 1 ], [ 1 ], [ 1 ] ] ) model.fit( x, y, epochs = 200, batch_size = 1 ) print() classes = model.predict_classes( x, batch_size = 1 ) print() print( classes ) probably = model.predict_proba( x, batch_size = 1 ) print() print( probably )
  26. 26. 25 4.KerasでのML開発入門 以下コマンドで実行します 以下のような結果が返ってくれば、学習・推論は成功です 赤枠部分は、前述のnotと同じく、「y=1」となる確率で、期待 通りのORで推論できていることが確認できます Epoch 1/200 4/4 [==============================] - 0s - loss: 0.4352 Epoch 2/200 4/4 [==============================] - 0s - loss: 0.4204 …(略)… Epoch 200/200 4/4 [==============================] - 0s - loss: 0.1011 [[0] [1] [1] [1]] [[ 0.20687966] [ 0.92517704] [ 0.91522515] [ 0.99804986]] # python or.py
  27. 27. 26 4.KerasでのML開発入門 ORは、試行数が10回だと、誤推論してしまいました やはり50回程度は欲しいところです …(略)… [[1] [1] [1] [1]] [[ 0.53244859] [ 0.86008555] [ 0.68383926] [ 0.92110789]] …(略)… [[0] [1] [1] [1]] [[ 0.43489879] [ 0.88802224] [ 0.81537187] [ 0.97849828]]
  28. 28. 27 5.2層ニューラルネットワークでXOR
  29. 29. 28 5.2層ニューラルネットワークでXOR NOT、ORもしくはANDのような、単純なものは、単層ニューラル ネットワークで学習できますが、XORは、うまく学習が進みません (これは、試行数を増やしても改善しません) これは、XORが、入力層と出力層だけの単層では実現できない ためです※ ※専門用語で言うと、XORは「非線形」という、グラフ上で1本の線では表現できない対象のためです これに対し、NOT、OR等は、「線形」で、グラフ上で1本の線で表現できるため、単一ニューロンで実現できます 詳細を知りたい場合は、末尾の「付録:『学習』の中身」をご確認ください …(略)… [[1] [1] [1] [1]] [[ 0.50147235] [ 0.50298554] [ 0.50041449] [ 0.50192779]]
  30. 30. 29 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
  31. 31. 30 5.2層ニューラルネットワークでXOR 「or.py」を元に、下記赤枠を変更し、「xor.py」で保存します (modelの構成・記述を変更し、yと試行数を書き換え) import numpy as np from keras.models import Sequential from keras.layers import Dense, Activation from keras.optimizers import SGD np.random.seed( 0 ) 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 ) ) x = np.array( [ [ 0, 0 ], [ 0, 1 ], [ 1, 0 ], [ 1, 1 ] ] ) y = np.array( [ [ 0 ], [ 1 ], [ 1 ], [ 0 ] ] ) model.fit( x, y, epochs = 800, batch_size = 1 ) print() classes = model.predict_classes( x, batch_size = 1 ) print() print( classes ) probably = model.predict_proba( x, batch_size = 1 ) print() print( probably )
  32. 32. 31 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 - loss: 0.1647 1/4 [======>.......................] - ETA: 0s [[0] [1] [1] [0]] 1/4 [======>.......................] - ETA: 0s [[ 0.15734699] [ 0.86145842] [ 0.82824492] [ 0.12677301]] # python or.py
  33. 33. 32 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' ) )
  34. 34. 33 6.ディープラーニングで時系列分析
  35. 35. 34 6.ディープラーニングで時系列分析 ここまでの内容では、ニューラルネットワークの層を追加すれば、 複雑なロジックも自動生成できることが分かりました ただし、これは「1回の入力が1種類のデータ」という単発のケース に限られ、「1回の入力がn個の連続するデータ」である場合、 ニューラルネットワークの層の多さだけでは、対応できません そこで、時系列データに特化したモデルが必要となります
  36. 36. 35 6.ディープラーニングで時系列分析 RNN (Recurrent Neural Network) という、時系列に特化 したモデルは、「未来のデータ並びの予測」を実現します たとえば、単語の並びから、発言した人の感情が、どんな状態に なっているかを推測する、といった分析に向いています
  37. 37. 36 6.ディープラーニングで時系列分析 最初の時系列データは、カンタンな、ノイズ入りsin波にします 以下でノイズ入り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 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 = "row" ) plt.legend() plt.show() # pip install matplotlib # python predict_sin.py predict_sin.py
  38. 38. 37 6.ディープラーニングで時系列分析 グラフを確認したら、一度グラフ表示はコメントアウトします … ''' plt.figure() plt.plot( range( 0, len( f ) ), f, color = "b", label = "row" ) plt.legend() plt.show() ''' predict_sin.py
  39. 39. 38 6.ディープラーニングで時系列分析 (続き) RNN用にデータを分割し、モデルを構築します … def make_dataset( datas, n_prev = 100 ): data = [] target = [] maxlen = 25 for i in range( len( datas ) - maxlen ): data.append( datas[ i: i + maxlen ] ) target.append( datas[ i + maxlen ] ) re_data = np.array( data ).reshape( len( data ), maxlen, 1 ) re_target = np.array( target ).reshape( len( data ), 1 ) return re_data, re_target g, h = make_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 ) early_stopping = EarlyStopping( monitor = 'val_loss', mode = 'min', patience = 20 ) … predict_sin.py
  40. 40. 39 6.ディープラーニングで時系列分析 (続き) 学習させ、未来データを予測し、グラフ表示します … model.fit( x, y, batch_size = 300, epochs = 100, validation_split = 0.1, callbacks = [ early_stopping ] ) future_test = g[ 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
  41. 41. 40 6.ディープラーニングで時系列分析 予測した未来データは、緑のグラフで、元データ (青) のsin波を 再現しています なお、学習時データ (赤) を見ると、元データと比べ、若干振幅 が縮んで学習しているため、未来データも徐々に縮んでいます (ノイズがランダムに出ている影響)
  42. 42. 41 7.ロジックを組まない予測の世界へ
  43. 43. 42 7.ロジックを組まない予測の世界へ 今回は、論理演算やカンタンな時系列データの特徴を解析し、 予測を行うKerasアプリ開発についてご紹介しました Kerasによるディープラーニングが「そこまで難しく無いかも?」と 思っていただけたら、この入門としては大成功です 論理演算も、時系列データも、パターンが読み取れる単純な ものだったため、物足りないかも知れませんが、ロジック作成無で 予測できた点にパラダイムシフトを感じていただけたら幸いです マーケティングデータ等のより実践的な分析は、ここで学んだこと を応用し、この後のシリーズにて扱っていきます それでは、AI・MLプログラミングライフをエンジョイしてください!
  44. 44. 43 8.付録:「学習」の中身
  45. 45. 44 8.付録:「学習」の中身 小規模なニューラルネットワークで「学習」のプロセスを学びます 最小は、ニューロン1つ、入力が1つ、出力が1つとなります たとえば、入力x (範囲は0~1) を、そのまま出力yとする場合、 以下表のような入出力の関係となり、学習する必要は無いです これを式で表すと、以下の通りです y = x x y 0 0 1 1 入力x 出力y
  46. 46. 45 8.付録:「学習」の中身 次は、入力の0/1を反転させるニューロンを想定します 以下表のような入出力の関係となります この反転を実現する式は、以下のようになります これをニューロン上に表現すると、以下のようになります 入力x 出力y y = -x + 1 乗算-1 加算+1 NOT 入力x 出力y 入力x 出力y 0 1 1 0 NOT
  47. 47. 46 8.付録:「学習」の中身 このニューロン上の「乗算」および「加算」を知らない前提として、 「乗算」と「加算」を変数にした場合、以下の式となります 反転を実現するaとbを割り出すために、以下3つの変数を導入 します ① 「t」・・・期待する正解 ② 「da」・・・aを正解に近づける幅 ③ 「db」・・・bを正解に近づける幅 「tとyの差」でaとbを補正し、yが期待通りになるまで、つまり、 「aとbが正解を出せるようになる」まで、補正を繰り返します y = ax + b
  48. 48. 47 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 ⊕ ⊕
  49. 49. 48 8.付録:「学習」の中身 このようにして、以下の式が導出できます この補正アプローチを「誤り訂正学習法」と呼び、ニューラルネット ワークにおける「学習」と言えば、この手法のことを指します ニューロンに対する入力が「1つ」から「2つ以上」に増えても、 層内のニューロンの数が増えても、層自体が増えても、この学習 の手法自体は、基本的にやることは同じで、「乗算」と「加算」の 組み合わせの補正を期待値にマッチするまで繰り返すだけです y = ax + b = -x + 1
  50. 50. 49 ご清聴ありがとうございます

×