PythonとDeep Learning 手書き文字認識     2012/12/17    株式会社ゆめみmokemokechicken@twitter                          1
はじめに       2
最近ニューラルネットワーク   が熱い!              3
ニューラルネットの逆襲http://research.preferred.jp/2012/11/deep-learning/Deep Learning!?                                             ...
ある人はこう表現していた                                                  黒船!?                                                        ...
なんか 凄そうだぞ!Deep Learning!!                  6
うーん、、、でも難しいんじゃないか?               7
いや、意外とそうでもない!                8
今回は 実用的 かつ 身近になったニューラルネットワークのお話      です                 9
目次•   機械学習の概要•   ニューラルネットワーク(NN)について•   Deep Learning革命•   Deep LearningのPythonライブラリ•   手書き文字認識への応用                       ...
機械学習の概要          11
機械学習とNN• NNは機械学習の仕組みの一つ• 機械学習には「教師あり/教師なし」があ  る                        12
教師あり学習と教師なし学習• 教師あり学習   NNはこっち – 「問題→答え」を当てる形式 – 入力と出力の関係を学習 – 入力から出力を予測する• 教師なし学習 – 「答えがない」形式 – 入力の特徴を抽出したり – データを分類したり  ...
機械学習が通常ロジックと異なる       点• 「入力→■→出力」 なら関数と同じじゃな  い?• 普通のプログラムや関数と何が違うの  か?• 人間がルールを記述しない• 機械構造が同じでも「学習」に使うデー  タで動作が変わる – 良いデ...
入力→出力 の例1入力(X)                                           出力(Y)数値 0 1                    ? 2                               ...
入力→出力 の例2              入力(X)                          出力(Y)電卓数値7箇所の光っているかどうか                       なんの数字を表しているか  x0       ...
入力→出力 の例3               入力(X)                       出力(Y)     28x28Pixelの手書き数字画像                 なんの数字を表しているか             ...
機械学習って何をしているの?• 学習機械の内部パラメータを更新してい  る       仕様 先ほどの例1   0〜4------------------------------ 0          5〜9-----------------...
どうやってパラメータ更新するの      か?• 機械学習の仕組みによって異なる• NNであれば 1. WやCを大小どちらに変化させると正解に近    づくか計算 2. ちょっとだけWやCを更新する 3. 繰り返し               ...
NN学習の流れ                               NN君                2.内部パラメータ更新           学習1.データを3つに分ける                         4.繰り...
なぜデータを分けるのか?• 学習データで高い評価が出ても「学習し  過ぎ」の可能性がある• 「過学習」と呼ばれる現象• 過学習というのは細部を見過ぎて、一般  性を失っている状態                       21
過学習• 例えば、男と女を見分けるのに – 「女性は名前が“明美”or“寛子”or“優子”or...であ   る」   と覚えてしまうようなもの• 未知の類似データを正しく分類できなくなる – “明子”はもうよくわからない• 機械学習で本当にや...
ニューラルネットワークについて                 23
ニューラルネットワーク概要• ニューロンの構造を模しているから  「ニューラルネットワーク」• 「ユニット」を入力→出力に繋いだ構造         入力(X)   出力(Y)  ユニット                         24
NNのユニット                                      ユニット              ユニットの出力=出力関数(x1*w1+x2*w2+..+xn*wn + C)                     ...
よく使う「出力関数」シグモイド関数 tanh 出力が「0〜1」とか「−1〜1」に収まる滑らかな曲線なのがポイント                                 26
数学的には  この構造はかなり表現力がある                らしい                 27※ちゃんと学習できるならね
DEEP LEARNING革命                  28
Deep Learning• Deep Learning は、高性能なNNを実現する  ための技術の総称みたいなもの        (だと思う)• NNや機械学習における課題を解決してい  る                          ...
従来のNNの問題点この層(レイヤー)の段数が多いほど「表現力は高い」   でも「学習」が難しかった                            30
なぜ学習が難しい?      内部パラメータ更新のために 出力→入力に向けて正解に近づくように調整するが・・・段数が多いと上手く情報が伝わらない信号が上手く伝わらない、イメージらしいノイズが多い伝言ゲームみたいな?               ...
じゃあ、準備しよう      適当なデータを入力して         教師なし学習です      変換・逆変換して元のデータになるように調整            変換F  1:X                   2:F(X)3:G(F(X...
教師が来る前に自習する感じ?                      変換F1    変換F2         1:X                                      2:F2(F1(X))3:G1(G2(F2(F1...
Auto-Encoder• Auto-Encoderの更なる工夫の例 – 少ないパラメータで元の入力を再現するように制   約をかける – わざと多少ノイズを入れてしまう• すると2段目のレイヤーが特徴を表すように  なる(!)• その後の教師...
機械学習全般の課題      基本的に、どういうデータ(特徴)を入力とするかで、精度が大きく変わるここが 重要           でも、どういう特徴を入力とすれば良いかは、           人間の勘と経験に依存することが多い       ...
特徴の抽出もやってしまおう!こんな入力              特徴抽出              こんな感じになる                                     なんかそれっぽい!        Restricte...
色々合わせ技でうまくやる!• 多段でも上手く学習• 特徴を抽出したりす  る• 他にも色々技がある• すると精度が劇的  UP!• 柔軟に組み合わせら  れるのもNNのメリッ  でも、どういう構造がベストかは、問題に依存する  トかも     ...
DEEP LEARNINGのPYTHONライブラリ                       38
Theano•          て発音するらしいです            http://www.clear-english.com/db/theano.html 調べ•   「てあーの」という説もあります               htt...
かっこいい Theanoの基本          >>> import theano.tensor as T          >>> import theanoxがベクトルとかでも>>> x = T.dscalar("x") ←Theanoの...
かっこいいTheanoの自動微分                                   y=(x-1)**2      >>> z = T.grad(y, x)       を x で微分する                   ...
TheanoとNN• NNの計算は、行列計算や勾配の計算が主• Theanoで簡潔に記述して高速に計算できる• Deep LearningをTheanoでどう実装するかが  Theanoのマニュアルにある(これ重要)• それを少し修正して今回使...
手書き文字認識への応用              43
手書き文字認識• オンライン文字認識 – ペンの動きがわかって   いる• オフライン文字認識 – 画像からのみ判断  今回は「数字(10文字)+ひらがな(71文字)」の識別に挑戦                             44
オンライン文字認識• ペンの動き(ストローク)をデータとし  て使う• 上手くストロークを入力データ化できれ  ば比較的簡単に良い精度の結果が得られ  る – ちなみにTomoeという有名なOpenSourceもあ   る• ポイントの一つはそ...
ストロークの変換今回行った方法 • ストロークを上下左右4方向の移動量で   表現                 x1                      こんなストロークなら               0.5            ...
ストロークの変換ストローク1                 8           6 7            5                 4            3  ストローク2     5,7は空中のストロークとして扱う  ...
入力データの形式• ストロークの1直線が     「ペン接触(4) + 空中移動(4)」  の8要素のベクトル• 今回50直線分まで認識対象とした• つまり、入力は400要素のベクトル                           48
NNユニット構成 • 出力ユニット数は81個(全文字の数) • 該当する文字のユニットの値が高くなる                                「0」ストローク                           「1」  ...
NNの構成と実験パターン• NNの構成 – SdA: Auto-Encoderを使うパターン – RBM: RBMを使うパターン• NNユニット数の構成 – 隠れ1層: 400-100-81, 400-1000-81 – 隠れ2層: 400-1...
オンライン版結果• 単純な構造(400-100-81)が良かった  – エラー1%程度  – 400-50-81 なども悪くなかった• RBMよりSdAの方が少し良かった• 400-1000-81, 400-100-100-81 はエラー多め ...
オフライン文字認識• ペンで書いた画像から文字を識別する• 入力データは大きさだけ枠に合わせた – しないとかなり結果が悪い                      52
入力データの形式今回行った方法 • 30x30ピクセルのGrayScale画像として   使った • つまり入力は900要素のベクトル   – それぞれの値は0〜1   – 0か1でも良かったけど                        ...
NNユニット構成• 出力ユニット数は81個(全文字の数)                            「0」画素                          「1」                            「ん」 ...
NNの構成と実験パターン• NNの構成(SdA,RBM)• NNユニット数の構成 – 隠れ1層: 400-100-81, 400-1000-81,400-3000-   81 – 隠れ2層: 400-100-100-81, – 隠れ3層: 40...
オフライン版結果• 900-100-100-100-81 や 900-100-100-81 が良い  – エラー率15%程度• 900-100-81, 900-1000-81, 900-3000-81などは  エラーが多い• SdAよりRBMの...
考察• 入力データによる違いはやはり大きい – オンライン版の方が精度が良かった  • 人間が上手く特徴量を抽出したと言える – オフライン版は、もう少し類似の変則的な   データを学習すれば変わるのかもしれない• データによって学習精度の良い...
全体まとめ• Deep Learning は今後も発展していくで  しょう• Theanoのようなライブラリで、NNの中身  がよくわからなくても実装できますよ• 何か面白いネタがあれば作りたいです                       ...
参考URL• 手書き文字認識デモ: 今回のデモが遊べます   – http://54.248.76.99:7777/• 「ニューラルネットの逆襲」: 概要がよくわかります   – http://research.preferred.jp/201...
Upcoming SlideShare
Loading in...5
×

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

57,220

Published on

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

Published in: Technology
0 Comments
120 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
57,220
On Slideshare
0
From Embeds
0
Number of Embeds
36
Actions
Shares
0
Downloads
463
Comments
0
Likes
120
Embeds 0
No embeds

No notes for slide

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

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

    Clipping is a handy way to collect important slides you want to go back to later.

×