SlideShare a Scribd company logo
Pythonと
Deep Learning
 手書き文字認識
     2012/12/17
    株式会社ゆめみ
mokemokechicken@twitter

                          1
はじめに


       2
最近

ニューラルネットワーク

   が熱い!


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




Deep Learning!?
                                                      4
ある人はこう表現していた


                                                  黒船!?




                                                                 5
http://www.slideshare.net/takmin/building-highlevelfeatures より
なんか 凄そうだぞ!

Deep Learning!!



                  6
うーん、、、

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



               7
いや、意外とそうでもない!




                8
今回は

 実用的 かつ 身近になった

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


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




                                10
機械学習の概要


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




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



                        12
教師あり学習と教師なし学習
• 教師あり学習   NNはこっち

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

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

                    13
機械学習が通常ロジックと異なる
       点
• 「入力→■→出力」 なら関数と同じじゃな
  い?
• 普通のプログラムや関数と何が違うの
  か?

• 人間がルールを記述しない
• 機械構造が同じでも「学習」に使うデー
  タで動作が変わる
 – 良いデータが集まると賢くなる(可能性があ
                        14
   る)
入力→出力 の例1
入力(X)                                           出力(Y)

数値
 0
 1


                    ?
 2
                                                 0
 3
                                                 1
 4
 5
 6
 7
                     仕様
 8
         0〜4------------------------------ 0
 9
         5〜9------------------------------ 1



        単純すぎて機械学習の意味がない
                                                        15
入力→出力 の例2
              入力(X)                          出力(Y)
電卓数値7箇所の光っているかどうか                       なんの数字を表しているか
  x0                                         0
x1 x2                                        1


                                   ?
  x3                                         2
x4 x5                                        3
  x6                                         4
                                             5
                                             6
                                             7
                                             8
                                             9
X=(x0,x1,x2,x3,..,x6) (xk={0,1})


                               ちょっと悩むでしょ?
                               でもまだ単純過ぎますね
                                                     16
入力→出力 の例3
               入力(X)                       出力(Y)
     28x28Pixelの手書き数字画像                 なんの数字を表しているか
                                             0
28
                                             1


                                    ?
       28                                    2
                                             3
                                             4
                                             5
                                             6
                                             7
                                             8
     X=(x0,x1,..,x783) (xk={0~1})
                                             9



              もう普通のロジックでは書けないですね・・・
             でも、NNならできるんです!(間違うこともある               17
機械学習って何をしているの?
• 学習機械の内部パラメータを更新してい
  る       仕様
 先ほどの例1   0〜4------------------------------ 0
          5〜9------------------------------ 1



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


                                            Y=2x-9

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

                                                     18
どうやってパラメータ更新するの
      か?
• 機械学習の仕組みによって異なる

• NNであれば
 1. WやCを大小どちらに変化させると正解に近
    づくか計算
 2. ちょっとだけWやCを更新する
 3. 繰り返し


                           19
NN学習の流れ
                               NN君

                2.内部パラメータ更新

           学習

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


                                     エラー率
                                     3.23%です
                 5.最終テスト
          テスト


                                        20
なぜデータを分けるのか?
• 学習データで高い評価が出ても「学習し
  過ぎ」の可能性がある

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

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


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

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

• 機械学習で本当にやりたいのは、画像の分類
  などのように「未知の類似のものを扱う」こ
  となので、過学習は望ましくない
                                    22
ニューラルネットワークについ
て

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

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




  ユニット



                         24
NNのユニット


                                      ユニット




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




                                                       25
http://thinkit.co.jp/article/30/2/ から画像は複製
よく使う「出力関数」
シグモイド関数




 tanh




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

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




                 27
※ちゃんと学習できるならね
DEEP LEARNING革命


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




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




                                 29
従来のNNの問題点

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




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

                            30
なぜ学習が難しい?
      内部パラメータ更新のために
 出力→入力に向けて正解に近づくように調整するが・・・




段数が多いと上手く情報が伝わらない
信号が上手く伝わらない、イメージらしい
ノイズが多い伝言ゲームみたいな?
                              31
じゃあ、準備しよう
      適当なデータを入力して         教師なし学習です
      変換・逆変換して元のデータになるように調整

            変換F
  1:X
                   2:F(X)
3:G(F(X))
            逆変換G
       X=G(F(X))
   に近づくように調整する




                               32
教師が来る前に自習する感じ?
                      変換F1    変換F2
         1:X
                                      2:F2(F1(X))
3:G1(G2(F2(F1(X))))
                      逆変換G1   逆変換G2


     調整済みは固定




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

               こういうのを「Auto-Encoder」と呼ぶそうです
                                                    33
Auto-Encoder
• Auto-Encoderの更なる工夫の例
 – 少ないパラメータで元の入力を再現するように制
   約をかける
 – わざと多少ノイズを入れてしまう

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

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

                         34
機械学習全般の課題
      基本的に、どういうデータ(特徴)を入力とするかで、精度が大きく変わる




ここが
 重要




           でも、どういう特徴を入力とすれば良いかは、
           人間の勘と経験に依存することが多い
                                      35
特徴の抽出もやってしまおう!

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




                                     なんかそれっぽい!



        Restricted Boltzmann Machines (RBM)
                    という仕組み                       36
色々合わせ技でうまくやる!
• 多段でも上手く学習
• 特徴を抽出したりす
  る
• 他にも色々技がある

• すると精度が劇的
  UP!

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

                       38
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
かっこいい Theanoの基本
          >>> import theano.tensor as T
          >>> import theano
xがベクトルとかでも>>> 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
かっこいい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
TheanoとNN
• NNの計算は、行列計算や勾配の計算が主

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

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

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

                                  42
手書き文字認識への応用


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


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




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

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

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


• ポイントの一つはそのストローク変換に
                                 45
ストロークの変換
今回行った方法

 • ストロークを上下左右4方向の移動量で
   表現
                 x1
                      こんなストロークなら

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




                 x3




                                                       46
ストロークの変換


ストローク1

                 8
           6 7


            5



                 4
            3
  ストローク2

     5,7は空中のストロークとして扱う
                         47
入力データの形式
• ストロークの1直線が
     「ペン接触(4) + 空中移動(4)」
  の8要素のベクトル

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

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


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

                                「0」


ストローク                           「1」




                                「ん」

        400個   この部分は可変    81個
               「隠れ層」と呼ぶ
                                      49
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
入力データの形式
今回行った方法

 • 30x30ピクセルのGrayScale画像として
   使った

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




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


                            「0」


画素                          「1」




                            「ん」

     900個   この部分は可変   81個

                                  54
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

More Related Content

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