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

44,395
views

Published on

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

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

Published in: Technology

0 Comments
81 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
44,395
On Slideshare
0
From Embeds
0
Number of Embeds
34
Actions
Shares
0
Downloads
366
Comments
0
Likes
81
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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