pythonとdeep learningで手書き文字認識

59
Python と Deep Learning とと ととととととと 2012/12/17 ととととととと mokemokechicken@twitter 1

Upload: -

Post on 25-May-2015

51.915 views

Category:

Technology


2 download

DESCRIPTION

この続きでTheanoの使い方について簡単に書きました:http://qiita.com/items/3fbf6af714c1f66f99e9

TRANSCRIPT

Page 1: Pythonとdeep learningで手書き文字認識

Python とDeep Learning て手書き文字認識

2012/12/17株式会社ゆめみ

mokemokechicken@twitter

1

Page 2: Pythonとdeep learningで手書き文字認識

はじめに

2

Page 3: Pythonとdeep learningで手書き文字認識

最近

ニューラルネットワーク

が熱い!

3

Page 4: Pythonとdeep learningで手書き文字認識

ニューラルネットの逆襲http://research.preferred.jp/2012/11/deep-learning/

4

Deep Learning!?

Page 5: Pythonとdeep learningで手書き文字認識

ある人はこう表現していた

http://www.slideshare.net/takmin/building-highlevelfeatures より5

黒船!?

Page 6: Pythonとdeep learningで手書き文字認識

なんか 凄そうだぞ!

Deep Learning !!

6

Page 7: Pythonとdeep learningで手書き文字認識

うーん、、、

ても難しいんじゃないか?

7

Page 8: Pythonとdeep learningで手書き文字認識

いや、意外とそうてもない!

8

Page 9: Pythonとdeep learningで手書き文字認識

今回は

実用的 かつ 身近になった

ニューラルネットワークのお話てす

9

Page 10: Pythonとdeep learningで手書き文字認識

目次• 機械学習の概要• ニューラルネットワーク (NN) について• Deep Learning 革命• Deep Learning の Python ライブラリ• 手書き文字認識への応用

10

Page 11: Pythonとdeep learningで手書き文字認識

機械学習の概要

11

Page 12: Pythonとdeep learningで手書き文字認識

機械学習と NN

• NN は機械学習の仕組みの一つ

• 機械学習には「教師あり / 教師なし」がある

12

Page 13: Pythonとdeep learningで手書き文字認識

教師あり学習と教師なし学習• 教師あり学習– 「問題→答え」を当てる形式– 入力と出力の関係を学習– 入力から出力を予測する

• 教師なし学習– 「答えがない」形式– 入力の特徴を抽出したり– データを分類したり

13

NN はこっち

Page 14: Pythonとdeep learningで手書き文字認識

機械学習が通常ロジックと異なる点

• 「入力→■→出力」 なら関数と同じじゃない?

• 普通のプログラムや関数と何が違うのか?

• 人間がルールを記述しない• 機械構造が同じても「学習」に使うデー

タて動作が変わる– 良いデータが集まると賢くなる(可能性があ

る) 14

Page 15: Pythonとdeep learningで手書き文字認識

入力→出力 の例1

15

単純すぎて機械学習の意味がない

入力 (X) 出力 (Y)

?数値

0123456789

01

仕様0〜4 ------------------------------ 05〜9 ------------------------------ 1

Page 16: Pythonとdeep learningで手書き文字認識

入力→出力 の例2

16

ちょっと悩むてしょ?てもまだ単純過ぎますね

入力 (X) 出力 (Y)

?0123456789

X=(x0,x1,x2,x3,..,x6) (xk={0,1})

x0x1 x2

x3x4 x5

x6

電卓数値7箇所の光っているかどうか なんの数字を表しているか

Page 17: Pythonとdeep learningで手書き文字認識

入力→出力 の例3

17

もう普通のロジックては書けないてすね・・・ても、 NN ならてきるんてす!(間違うこともあ

るけど)

入力 (X) 出力 (Y)

?0123456789X=(x0,x1,..,x783) (xk={0~1})

28x28Pixel の手書き数字画像 なんの数字を表しているか

28

28

Page 18: Pythonとdeep learningで手書き文字認識

機械学習って何をしているの?• 学習機械の内部パラメータを更新してい

18

仕様0〜4 ------------------------------ 05〜9 ------------------------------ 1

先ほどの例1

内部構造 Y=wX+c < 0 ? 0 : 1 とすると、 w と c がパラメータ

学習して、 w=2, c=-9 だとなんとなく良さげてしょ?

例えば

Y=2x-9

Page 19: Pythonとdeep learningで手書き文字認識

どうやってパラメータ更新するのか?

• 機械学習の仕組みによって異なる

• NN てあれば1. W や C を大小どちらに変化させると正解に

近づくか計算2. ちょっとだけ W や C を更新する3. 繰り返し

19

Page 20: Pythonとdeep learningで手書き文字認識

NN 学習の流れ

20

元データ 検証

学習

テスト

2.内部パラメータ更新

3.当たるようになった?4.繰り返す1.データを3つに分ける

5.最終テスト

エラー率3.23% てす

NN 君

Page 21: Pythonとdeep learningで手書き文字認識

なぜデータを分けるのか?• 学習データて高い評価が出ても「学習し

過ぎ」の可能性がある

• 「過学習」と呼ばれる現象

• 過学習というのは細部を見過ぎて、一般性を失っている状態

21

Page 22: Pythonとdeep learningで手書き文字認識

過学習• 例えば、男と女を見分けるのに– 「女性は名前が“明美” or“ 寛子” or“優子” or... てある」

と覚えてしまうようなもの

• 未知の類似データを正しく分類てきなくなる– “ 明子”はもうよくわからない

• 機械学習て本当にやりたいのは、画像の分類などのように「未知の類似のものを扱う」ことなのて、過学習は望ましくない

22

Page 23: Pythonとdeep learningで手書き文字認識

ニューラルネットワークについて

23

Page 24: Pythonとdeep learningで手書き文字認識

ニューラルネットワーク概要• ニューロンの構造を模しているから

「ニューラルネットワーク」

• 「ユニット」を入力→出力に繋いだ構造

24

ユニット

入力 (X) 出力 (Y)

Page 25: Pythonとdeep learningで手書き文字認識

NN のユニット

25http://thinkit.co.jp/article/30/2/ から画像は複製

ユニット

ユニットの出力=出力関数 (x1*w1+x2*w2+..+xn*wn + C)

Page 26: Pythonとdeep learningで手書き文字認識

よく使う「出力関数」

26

シグモイド関数

tanh

出力が「0〜1」とか「−1〜1」に収まる滑らかな曲線なのがポイント

Page 27: Pythonとdeep learningで手書き文字認識

この構造はかなり表現力がある

27

数学的には

らしい

※ちゃんと学習てきるならね

Page 28: Pythonとdeep learningで手書き文字認識

DEEP LEARNING革命

28

Page 29: Pythonとdeep learningで手書き文字認識

Deep Learning

• Deep Learning は、高性能な NN を実現するための技術の総称みたいなもの ( だと思う )

• NN や機械学習における課題を解決している

29

Page 30: Pythonとdeep learningで手書き文字認識

従来の NN の問題点

30

この層(レイヤー)の段数が多いほど「表現力は高い」

ても「学習」が難しかった

Page 31: Pythonとdeep learningで手書き文字認識

なぜ学習が難しい?

31

段数が多いと上手く情報が伝わらない

内部パラメータ更新のために出力→入力に向けて正解に近づくように調整するが・・・

信号が上手く伝わらない、イメージらしいノイズが多い伝言ゲームみたいな?

Page 32: Pythonとdeep learningで手書き文字認識

じゃあ、準備しよう

32

1: X2: F(X)

変換 F

3: G(F(X))

逆変換 G

適当なデータを入力して変換・逆変換して元のデータになるように調整

X=G(F(X))に近づくように調整する

教師なし学習てす

Page 33: Pythonとdeep learningで手書き文字認識

教師が来る前に自習する感じ?

33

1: X2: F2(F1(X))

変換 F2

3: G1(G2(F2(F1(X))))

逆変換 G2

それをレイヤー毎に順次行なっていく

変換 F1

逆変換 G1

調整済みは固定

こういうのを「 Auto-Encoder 」と呼ぶそうてす

Page 34: Pythonとdeep learningで手書き文字認識

Auto-Encoder

• Auto-Encoder の更なる工夫の例– 少ないパラメータて元の入力を再現するように制約

をかける– わざと多少ノイズを入れてしまう

• すると2段目のレイヤーが特徴を表すようになる(!)

• その後の教師付き学習てもよく学習てきるようになる(!)

34

Page 35: Pythonとdeep learningで手書き文字認識

機械学習全般の課題

35

基本的に、どういうデータ(特徴)を入力とするかて、精度が大きく変わる

ここが重要

ても、どういう特徴を入力とすれば良いかは、人間の勘と経験に依存することが多い

Page 36: Pythonとdeep learningで手書き文字認識

特徴の抽出もやってしまおう!

36

こんな入力 特徴抽出 こんな感じになる

なんかそれっぽい!

Restricted Boltzmann Machines (RBM) という仕組み

Page 37: Pythonとdeep learningで手書き文字認識

色々合わせ技てうまくやる!• 多段ても上手く学習• 特徴を抽出したりす

る• 他にも色々技がある

• すると精度が劇的UP !

• 柔軟に組み合わせられるのも NN のメリットかも 37ても、どういう構造がベストかは、問題に依存する

Page 38: Pythonとdeep learningで手書き文字認識

DEEP LEARNINGの PYTHONライブラリ

38

Page 39: Pythonとdeep learningで手書き文字認識

Theano

• て発音するらしいてす• 「てあーの」という説もあります• 発音がよくわかりませんw• Python のライブラリ• 数学表現を定義したり、高速計算が可能• 多次元配列ても綺麗に表記てきる• 数式計算を C言語に動的に変換して実行する• GPU(Graphic Processing Unit) に計算を行わせることもて

きる(数倍〜150倍くらい速い)

• http://deeplearning.net/software/theano/39

http://ejje.weblio.jp/content/Theano 調べ

http://www.clear-english.com/db/theano.html 調べ

Page 40: Pythonとdeep learningで手書き文字認識

かっこいい Theano の基本

40

>>> import theano.tensor as T>>> import theano>>> x = T.dscalar("x")>>> y = (x-1)**2>>> yElemwise{pow,no_inplace}.0>>> f = theano.function([x], y)>>> f(0)array(1.0)>>> f(1)array(0.0)

←Theano の変数 Object

←Theano の式表現

関数 f (x) =y=(x-1)**2

関数 f ( 0 ) =(0-1)**2=1

関数 f ( 1 ) =(1-1)**2=0

ここてコンパイルが走る!

x がベクトルとかても行列とかても OK

Page 41: Pythonとdeep learningで手書き文字認識

かっこいい Theano の自動微分

41

>>> z = T.grad(y, x)

>>> fz = theano.function([x],z)>>> fz(0)array(-2.0)

>>> fz(5)array(8.0)

y=(x-1)**2を x て微分する

↓z=y’=2(x-1)

fz (x) =z=2(x-1)

fz ( 0 ) =2(0-1) = -2

fz ( 5 ) =2(5-1) = 8

※「自動微分」は微分された式表現を求める技術※値の代入て求める「数値微分」とは異なる (wikipedia)

式を関数にする

Page 42: Pythonとdeep learningで手書き文字認識

Theano と NN

• NN の計算は、行列計算や勾配の計算が主

• Theano て簡潔に記述して高速に計算てきる

• Deep Learning を Theano てどう実装するかが Theanoのマニュアルにある(これ重要)

• それを少し修正して今回使った– 内部パラメータの Save と Load– Class のメソッド名や引数を統一

42

Page 43: Pythonとdeep learningで手書き文字認識

手書き文字認識への応用

43

Page 44: Pythonとdeep learningで手書き文字認識

手書き文字認識• オンライン文字認識– ペンの動きがわかって

いる

• オフライン文字認識– 画像からのみ判断

44

今回は「数字(10文字)+ひらがな(71文字)」の識別に挑戦

Page 45: Pythonとdeep learningで手書き文字認識

オンライン文字認識• ペンの動き(ストローク)をデータとし

て使う

• 上手くストロークを入力データ化てきれば比較的簡単に良い精度の結果が得られる– ちなみに Tomoe という有名な OpenSource も

ある

• ポイントの一つはそのストローク変換になる

45

Page 46: Pythonとdeep learningで手書き文字認識

ストロークの変換• ストロークを上下左右4方向の移動量て

表現

46

今回行った方法

x0

x1

x2

x3

X=(0.7,0.5, 0, 0)とする

0.7

0.5

こんなストロークなら

Page 47: Pythonとdeep learningで手書き文字認識

ストロークの変換

47

ストローク1

ストローク23 4

6 7 8

5,7は空中のストロークとして扱う

Page 48: Pythonとdeep learningで手書き文字認識

入力データの形式• ストロークの 1直線が

「ペン接触 (4) + 空中移動(4) 」 の8要素のベクトル

• 今回50直線分まて認識対象とした

• つまり、入力は400要素のベクトル

48

Page 49: Pythonとdeep learningで手書き文字認識

NNユニット構成• 出力ユニット数は81個(全文字の数 )• 該当する文字のユニットの値が高くなる

49

400個 81個この部分は可変「隠れ層」と呼ぶ

「0」

「1」

「ん」

ストローク

Page 50: Pythonとdeep learningで手書き文字認識

NN の構成と実験パターン• NN の構成– SdA: Auto-Encoder を使うパターン– RBM: RBM を使うパターン

• NNユニット数の構成– 隠れ1層: 400-100-81, 400-1000-81– 隠れ2層: 400-100-100-81,– 隠れ3層: 400-100-100-100-81

• 筆跡データは、主に私の筆跡のみ(結果的に)– なのて、比較的認識しやすいはずてす

50

Page 51: Pythonとdeep learningで手書き文字認識

オンライン版結果• 単純な構造 (400-100-81) が良かった– エラー1%程度– 400-50-81 なども悪くなかった

• RBM より SdA の方が少し良かった• 400-1000-81, 400-100-100-81 はエラー多め

51

Page 52: Pythonとdeep learningで手書き文字認識

オフライン文字認識• ペンて書いた画像から文字を識別する

• 入力データは大きさだけ枠に合わせた– しないとかなり結果が悪い

52

Page 53: Pythonとdeep learningで手書き文字認識

入力データの形式• 30 x 30ピクセルの GrayScale 画像とし

て使った

• つまり入力は900要素のベクトル– それぞれの値は0〜1– 0か1ても良かったけど

53

今回行った方法

Page 54: Pythonとdeep learningで手書き文字認識

NNユニット構成• 出力ユニット数は81個(全文字の数 )

54

900個 81個この部分は可変

「0」

「1」

「ん」

画素

Page 55: Pythonとdeep learningで手書き文字認識

NN の構成と実験パターン• NN の構成 (SdA,RBM)

• NNユニット数の構成–隠れ1層: 400-100-81, 400-1000-81,400-3000-

81–隠れ2層: 400-100-100-81,–隠れ3層: 400-100-100-100-81

• データもオンライン版と同じ55

Page 56: Pythonとdeep learningで手書き文字認識

オフライン版結果• 900-100-100-100-81 や 900-100-100-81 が良

い– エラー率15%程度

• 900-100-81, 900-1000-81, 900-3000-81 などはエラーが多い

• SdA より RBM の方が少し良い結果

56

Page 57: Pythonとdeep learningで手書き文字認識

考察• 入力データによる違いはやはり大きい–オンライン版の方が精度が良かった• 人間が上手く特徴量を抽出したと言える

–オフライン版は、もう少し類似の変則的なデータを学習すれば変わるのかもしれない

• データによって学習精度の良い構造が違う– いろいろ試すしかない(勘と経験)

57

Page 58: Pythonとdeep learningで手書き文字認識

全体まとめ• Deep Learning は今後も発展していくて

しょう

• Theano のようなライブラリて、 NN の中身がよくわからなくても実装てきますよ

• 何か面白いネタがあれば作りたいてす

58

Page 59: Pythonとdeep learningで手書き文字認識

参考 URL

• 手書き文字認識デモ: 今回のデモが遊べます– http://54.248.76.99:7777/

• 「ニューラルネットの逆襲」: 概要がよくわかります– http://research.preferred.jp/2012/11/deep-learning/

• Building High-level Features Using Large Scale Unsupervised Learning– http://www.slideshare.net/takmin/building-highlevelfeatures– すごさが伝わってきます

• Deep learning勉強会 20121214ochi– http://www.slideshare.net/alembert2000/deep-learning20121214ochi– Deep Learning の特徴とか。理論よりな話

59