Upload
-
View
51.915
Download
2
Embed Size (px)
DESCRIPTION
この続きでTheanoの使い方について簡単に書きました:http://qiita.com/items/3fbf6af714c1f66f99e9
Citation preview
Python とDeep Learning て手書き文字認識
2012/12/17株式会社ゆめみ
mokemokechicken@twitter
1
はじめに
2
最近
ニューラルネットワーク
が熱い!
3
ニューラルネットの逆襲http://research.preferred.jp/2012/11/deep-learning/
4
Deep Learning!?
ある人はこう表現していた
http://www.slideshare.net/takmin/building-highlevelfeatures より5
黒船!?
なんか 凄そうだぞ!
Deep Learning !!
6
うーん、、、
ても難しいんじゃないか?
7
いや、意外とそうてもない!
8
今回は
実用的 かつ 身近になった
ニューラルネットワークのお話てす
9
目次• 機械学習の概要• ニューラルネットワーク (NN) について• Deep Learning 革命• Deep Learning の Python ライブラリ• 手書き文字認識への応用
10
機械学習の概要
11
機械学習と NN
• NN は機械学習の仕組みの一つ
• 機械学習には「教師あり / 教師なし」がある
12
教師あり学習と教師なし学習• 教師あり学習– 「問題→答え」を当てる形式– 入力と出力の関係を学習– 入力から出力を予測する
• 教師なし学習– 「答えがない」形式– 入力の特徴を抽出したり– データを分類したり
13
NN はこっち
機械学習が通常ロジックと異なる点
• 「入力→■→出力」 なら関数と同じじゃない?
• 普通のプログラムや関数と何が違うのか?
• 人間がルールを記述しない• 機械構造が同じても「学習」に使うデー
タて動作が変わる– 良いデータが集まると賢くなる(可能性があ
る) 14
入力→出力 の例1
15
単純すぎて機械学習の意味がない
入力 (X) 出力 (Y)
?数値
0123456789
01
仕様0〜4 ------------------------------ 05〜9 ------------------------------ 1
入力→出力 の例2
16
ちょっと悩むてしょ?てもまだ単純過ぎますね
入力 (X) 出力 (Y)
?0123456789
X=(x0,x1,x2,x3,..,x6) (xk={0,1})
x0x1 x2
x3x4 x5
x6
電卓数値7箇所の光っているかどうか なんの数字を表しているか
入力→出力 の例3
17
もう普通のロジックては書けないてすね・・・ても、 NN ならてきるんてす!(間違うこともあ
るけど)
入力 (X) 出力 (Y)
?0123456789X=(x0,x1,..,x783) (xk={0~1})
28x28Pixel の手書き数字画像 なんの数字を表しているか
28
28
機械学習って何をしているの?• 学習機械の内部パラメータを更新してい
る
18
仕様0〜4 ------------------------------ 05〜9 ------------------------------ 1
先ほどの例1
内部構造 Y=wX+c < 0 ? 0 : 1 とすると、 w と c がパラメータ
学習して、 w=2, c=-9 だとなんとなく良さげてしょ?
例えば
Y=2x-9
どうやってパラメータ更新するのか?
• 機械学習の仕組みによって異なる
• NN てあれば1. W や C を大小どちらに変化させると正解に
近づくか計算2. ちょっとだけ W や C を更新する3. 繰り返し
19
NN 学習の流れ
20
元データ 検証
学習
テスト
2.内部パラメータ更新
3.当たるようになった?4.繰り返す1.データを3つに分ける
5.最終テスト
エラー率3.23% てす
NN 君
なぜデータを分けるのか?• 学習データて高い評価が出ても「学習し
過ぎ」の可能性がある
• 「過学習」と呼ばれる現象
• 過学習というのは細部を見過ぎて、一般性を失っている状態
21
過学習• 例えば、男と女を見分けるのに– 「女性は名前が“明美” or“ 寛子” or“優子” or... てある」
と覚えてしまうようなもの
• 未知の類似データを正しく分類てきなくなる– “ 明子”はもうよくわからない
• 機械学習て本当にやりたいのは、画像の分類などのように「未知の類似のものを扱う」ことなのて、過学習は望ましくない
22
ニューラルネットワークについて
23
ニューラルネットワーク概要• ニューロンの構造を模しているから
「ニューラルネットワーク」
• 「ユニット」を入力→出力に繋いだ構造
24
ユニット
入力 (X) 出力 (Y)
NN のユニット
25http://thinkit.co.jp/article/30/2/ から画像は複製
ユニット
ユニットの出力=出力関数 (x1*w1+x2*w2+..+xn*wn + C)
よく使う「出力関数」
26
シグモイド関数
tanh
出力が「0〜1」とか「−1〜1」に収まる滑らかな曲線なのがポイント
この構造はかなり表現力がある
27
数学的には
らしい
※ちゃんと学習てきるならね
DEEP LEARNING革命
28
Deep Learning
• Deep Learning は、高性能な NN を実現するための技術の総称みたいなもの ( だと思う )
• NN や機械学習における課題を解決している
29
従来の NN の問題点
30
この層(レイヤー)の段数が多いほど「表現力は高い」
ても「学習」が難しかった
なぜ学習が難しい?
31
段数が多いと上手く情報が伝わらない
内部パラメータ更新のために出力→入力に向けて正解に近づくように調整するが・・・
信号が上手く伝わらない、イメージらしいノイズが多い伝言ゲームみたいな?
じゃあ、準備しよう
32
1: X2: F(X)
変換 F
3: G(F(X))
逆変換 G
適当なデータを入力して変換・逆変換して元のデータになるように調整
X=G(F(X))に近づくように調整する
教師なし学習てす
教師が来る前に自習する感じ?
33
1: X2: F2(F1(X))
変換 F2
3: G1(G2(F2(F1(X))))
逆変換 G2
それをレイヤー毎に順次行なっていく
変換 F1
逆変換 G1
調整済みは固定
こういうのを「 Auto-Encoder 」と呼ぶそうてす
Auto-Encoder
• Auto-Encoder の更なる工夫の例– 少ないパラメータて元の入力を再現するように制約
をかける– わざと多少ノイズを入れてしまう
• すると2段目のレイヤーが特徴を表すようになる(!)
• その後の教師付き学習てもよく学習てきるようになる(!)
34
機械学習全般の課題
35
基本的に、どういうデータ(特徴)を入力とするかて、精度が大きく変わる
ここが重要
ても、どういう特徴を入力とすれば良いかは、人間の勘と経験に依存することが多い
特徴の抽出もやってしまおう!
36
こんな入力 特徴抽出 こんな感じになる
なんかそれっぽい!
Restricted Boltzmann Machines (RBM) という仕組み
色々合わせ技てうまくやる!• 多段ても上手く学習• 特徴を抽出したりす
る• 他にも色々技がある
• すると精度が劇的UP !
• 柔軟に組み合わせられるのも NN のメリットかも 37ても、どういう構造がベストかは、問題に依存する
DEEP LEARNINGの PYTHONライブラリ
38
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 調べ
かっこいい 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
かっこいい 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)
式を関数にする
Theano と NN
• NN の計算は、行列計算や勾配の計算が主
• Theano て簡潔に記述して高速に計算てきる
• Deep Learning を Theano てどう実装するかが Theanoのマニュアルにある(これ重要)
• それを少し修正して今回使った– 内部パラメータの Save と Load– Class のメソッド名や引数を統一
42
手書き文字認識への応用
43
手書き文字認識• オンライン文字認識– ペンの動きがわかって
いる
• オフライン文字認識– 画像からのみ判断
44
今回は「数字(10文字)+ひらがな(71文字)」の識別に挑戦
オンライン文字認識• ペンの動き(ストローク)をデータとし
て使う
• 上手くストロークを入力データ化てきれば比較的簡単に良い精度の結果が得られる– ちなみに Tomoe という有名な OpenSource も
ある
• ポイントの一つはそのストローク変換になる
45
ストロークの変換• ストロークを上下左右4方向の移動量て
表現
46
今回行った方法
x0
x1
x2
x3
X=(0.7,0.5, 0, 0)とする
0.7
0.5
こんなストロークなら
ストロークの変換
47
ストローク1
ストローク23 4
5
6 7 8
5,7は空中のストロークとして扱う
入力データの形式• ストロークの 1直線が
「ペン接触 (4) + 空中移動(4) 」 の8要素のベクトル
• 今回50直線分まて認識対象とした
• つまり、入力は400要素のベクトル
48
NNユニット構成• 出力ユニット数は81個(全文字の数 )• 該当する文字のユニットの値が高くなる
49
400個 81個この部分は可変「隠れ層」と呼ぶ
「0」
「1」
「ん」
ストローク
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
オンライン版結果• 単純な構造 (400-100-81) が良かった– エラー1%程度– 400-50-81 なども悪くなかった
• RBM より SdA の方が少し良かった• 400-1000-81, 400-100-100-81 はエラー多め
51
オフライン文字認識• ペンて書いた画像から文字を識別する
• 入力データは大きさだけ枠に合わせた– しないとかなり結果が悪い
52
入力データの形式• 30 x 30ピクセルの GrayScale 画像とし
て使った
• つまり入力は900要素のベクトル– それぞれの値は0〜1– 0か1ても良かったけど
53
今回行った方法
NNユニット構成• 出力ユニット数は81個(全文字の数 )
54
900個 81個この部分は可変
「0」
「1」
「ん」
画素
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
オフライン版結果• 900-100-100-100-81 や 900-100-100-81 が良
い– エラー率15%程度
• 900-100-81, 900-1000-81, 900-3000-81 などはエラーが多い
• SdA より RBM の方が少し良い結果
56
考察• 入力データによる違いはやはり大きい–オンライン版の方が精度が良かった• 人間が上手く特徴量を抽出したと言える
–オフライン版は、もう少し類似の変則的なデータを学習すれば変わるのかもしれない
• データによって学習精度の良い構造が違う– いろいろ試すしかない(勘と経験)
57
全体まとめ• Deep Learning は今後も発展していくて
しょう
• Theano のようなライブラリて、 NN の中身がよくわからなくても実装てきますよ
• 何か面白いネタがあれば作りたいてす
58
参考 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