Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Deep learningの概要とドメインモデルの変遷

16,760 views

Published on

Deep Learningの概要、最近の成果と、フレームワーク実装者の視点で見たドメインモデルの変遷について。

Published in: Software
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Deep learningの概要とドメインモデルの変遷

  1. 1. Deep Learningの概要とドメインモデルの変遷 Taiga Nomi 2017/1/21 マルチパラダイムデザイン読書会 番外編 Embedded Computer Vision Software Engineer / The Author of tiny-dnn
  2. 2. Intro ● Deep Learningの概要 ○ 最近の成果(主に画像関連)と学習の仕組み、脳との関連 ● Deep Learningフレームワークのドメインモデルの変遷 について紹介します
  3. 3. Deep Learningの最近の成果 2012-2016
  4. 4. 2012: Deep Learningブームの幕開け ● 物体画像認識のコンペで、Deep Learningを用いたチームが圧勝 ○ エラー率を一気に10%近く改善(25.8->16.4%) ○ 画像認識コミュニティに衝撃走る “ImageNet Classification with Deep Convolutional Neural Networks ”, A. Krizhevsky, et. al.
  5. 5. 2012: Deep Learningブームの幕開け ● 化合物の活性予測コンペでDeep Learningベースの手法が勝利 ○ ドメイン知識を使わず、活性予測の素人が優勝 ● Youtubeの動画を元に、”猫に反応するニューロン”を獲得 ○ 画像からの特徴抽出の自動化…従来は人間のドメイン知識に基づいて設計 ○ 2000台のマシンで1週間かけて10億パラメータを学習 ○ 猫、人といった概念を教えずに(!)それらの概念を獲得 人の顔 (左)、猫の顔(右)によく反応するニューロンの可視化 Merck Competition Challenge http://blog.kaggle.com/2012/10/31/merck-competition-results-deep-nn-and-gpus-come-out-to-play/ “Building High-level Features Using Large Scale Unsupervised Learning ”, Q. V. Le, et. al.
  6. 6. 2013 - 2016 ● ルールを教えずにAtari 2600をプレイ(2013) ○ コンピュータが自分で試行錯誤しながら、様々なゲームのプレイ方法を学習 ○ ブロック崩しなどの単純なゲームでは人間以上のスコア “Playing Atari with Deep Reinforcement Learning”, V. Mnih, et. al.
  7. 7. 2013 - 2016 ● 物体画像認識タスクで人間のエラー率を超える(2015) ○ Human:5.1% Deep Learning: 4.94% (by Microsoft Research) ○ さらに2016/8には3.08%まで改善 (by Google) ● 画像拡大(超解像)で従来を大幅に超える精度を達成(2015) ○ パッチ型超解像と呼ばれていた技術を応用、汎用的なDeep Learningで実現 “Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification”, K. He, et. al. “Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning”, C. Szegedy, et. al. “Learning a Deep Convolutional Network for Image Super-Resolution”, C. Dong, et. al.
  8. 8. 2013 - 2016 ● 画風の変換(2015) ○ 画像から”画風”の特徴だけを抽出して別の画像に適用 ○ のちに動画にも適用: https://www.youtube.com/watch?v=Uxax5EKg0zA “A Neural Algorithm of Artistic Style”, L. A. Gatys He, et. al. “Artistic style transfer for videos”, M. Ruder, et. al.
  9. 9. 2013 - 2016 ● 会話レベルの音声認識で人間と同レベルの精度を達成(2016) ● 囲碁でトップ棋士に勝利(2016) ○ 2016/12には、オンライン囲碁で世界1位を含むトップ棋士相手に60勝0敗 ● 線画の自動着色(2016) “Achieving Human Parity in Conversational Speech Recognition”, W. Xiong, et. al. “Mastering the game of Go with deep neural networks and tree search”, D. Silver, et. al. Qiita: 初心者がchainerで線画着色してみた。わりとできた。http://qiita.com/taizan/items/cf77fd37ec3a0bef5d9d
  10. 10. 2013 - 2016 ● 多言語間の翻訳を単一のニューラルネットで実現(2016) ○ 日⇔英、韓⇔英を学習させると、日⇔韓の翻訳もできる(Zero-Shot Translation) ■ 内部で言語に非依存な中間表現を獲得していると思われる “Google’s Multilingual Neural Machine Translation System: Enabling Zero-Shot Translation”, M. Johnson, et. al. a, b: 3言語で74の文章を入力した際の内部表現 の可視化(文章ごとに色分け)。 c: 3言語で同じ意味の文章は、近い内部表現 に対応している
  11. 11. 2013 - 2016 ● 文章から高精度な画像を生成(2016) ○ 学習した画像の継ぎ接ぎではなく、ゼロから描画している(下段) “StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks”, H. ZHang, et. al.
  12. 12. demo ● 落書き認識 ○ https://quickdraw.withgoogle.com/ ● 画像キャプション生成 ○ https://www.captionbot.ai/ ● アニメ顔生成 ○ http://mattya.github.io/chainer-DCGAN/
  13. 13. Deep Learningの概要 歴史、機構、脳との関連
  14. 14. AI/機械学習/ニューラルネット/Deep Learning ● AI: 機械による知性 ● 機械学習:人間のような学習機能を、データから自動的に習得する技術 ○ ニューラルネットワーク、Deep Learningはその1カテゴリ AI 機械学習 ニューラルネットワーク Deep Learning
  15. 15. ニューラルネットワーク ● 脳神経系における情報伝達を模した数学モデル ○ 多数のニューロンが互いに接続 ○ ニューロン間の結合強度はそれぞれ異なる ○ この結合強度を調整(学習)することで問題解決能力を得る
  16. 16. 第1世代:単純パーセプトロン (1958~60s) ● 入力値の重み付き和を取る、最も単純なニューラルネットワーク ○ ある閾値を超えると出力が発火するようなニューロンモデル ○ 出力の発火によって、入力を2つに分類する 犬 猫
  17. 17. 単純パーセプトロンの学習 ● サンプルを1つずつ試行し、正しく分類されるよう少しずつ重みを修正 出力yと期待結果tの差を縮めるように 重みを更新
  18. 18. 単純パーセプトロンの限界 ● パーセプトロン:入力を平面で2つに分割していることに相当(線形分離) ○ 平面で分割できないようなデータは、パーセプトロンで学習できない ?
  19. 19. 第2世代:多層パーセプトロン (1980~90s) ● 単純パーセプトロンを複数重ねた構造 入力 出力隠れ層
  20. 20. 第2世代:多層パーセプトロン (1980~90s) ● 単純パーセプトロンを複数重ねた構造 入力データ 出力データ隠れ層 (活性化関数:閾値処理の一般 化)
  21. 21. 第2世代:多層パーセプトロン (1980~90s) ● 単純パーセプトロンを複数重ねた構造 入力データ 出力データ隠れ層
  22. 22. 第2世代:多層パーセプトロン (1980~90s) ● 単純パーセプトロンを複数重ねた構造 入力データ 出力データ隠れ層
  23. 23. 多層パーセプトロンの特徴 ● 非線形な問題を解くことができる ● 適切に学習すれば、有限個のニューロンで任意の連続関数を近似できる (universal approximation) Input Output Trainable Building Blocks - text - audio - image - video - ... - text - audio - image - video - ...
  24. 24. 多層パーセプトロンの学習 ● どうすれば目的の機能を果たす重みが得られるか? ○ 単純パーセプトロンのように、少しずつ解に近づけていきたい ■ ただし単純パーセプトロンと違い、隠れ層の重みは最終結果に間接的にしか寄与しない ○ 目標の出力と、実際の出力の誤差をなるべく小さくしたい ● 重みを変えたときの誤差の変化(勾配)が分かれば、進む方向が分かりそう 誤差J 重み
  25. 25. 勾配の算出 ● 微分の定義から算出 ○ 適当に小さなhを置いて以下を計算すれば良い ○ 重み1個に対して2回Jを計算する必要があり、現実的でない ■ Jの計算がO(n)なので、n個の重みを1ステップ更新するのに O(n^2)の計算量 ■ 冒頭の“猫ニューロン”…n~10^9 ● 1980sに勾配を効率良く求める方法が提案(再発見)された : 誤差逆伝播法
  26. 26. 誤差逆伝播法(1/5) ● すべての重みを適当な値(乱数など)で初期化 ● 学習用データをネットワークに与えて、まず答えを出させる ○ 最初はでたらめな値を出力する Dogs or Cats? Dog : 0.32 Cat : 0.34 resultinput
  27. 27. 誤差逆伝播法(2/5) ● 期待結果と出力から誤差を計算 Dogs or Cats? Dog : 0.32 Cat : 0.34 result desired Dog : 0.0 Cat : 1.0(+0.66) (-0.32) input
  28. 28. 誤差逆伝播法(3/5) ● 出力層の誤差を、入力層に遡って伝播させていく ○ 偏微分のChain Ruleを使うことで、効率的に誤差を計算できる ○ 下流のニューロンの誤差×そのニューロンとの結合度に比例し、上流も修正される Dogs or Cats? Dog : 0.32 Cat : 0.34 result desired Dog : 0.0 Cat : 1.0(+0.66) (-0.32) input
  29. 29. 誤差逆伝播法(3/5) ● 出力層の誤差を、入力層に遡って伝播させていく ○ 偏微分のChain Ruleを使うことで、効率的に誤差を計算できる ○ 下流のニューロンの誤差×そのニューロンとの結合度に比例し、上流も修正される ○ 組織のメタファ:部下のミスの大きさと、その部下への関与の大きさに応じて上司も怒 られていく Dogs or Cats? Dog : 0.32 Cat : 0.34 result desired Dog : 0.0 Cat : 1.0(+0.66) (-0.32) input
  30. 30. 誤差逆伝播法(4/5) ● 計算された誤差に応じて、重みを少しだけ修正 ● これを学習データ集合に対して繰り返し行う Dogs or Cats?
  31. 31. 誤差逆伝播法(5/5) ● 実際どう動くの? http://playground.tensorflow.org/
  32. 32. ニューラルネット冬の時代 ● 問題点:層を積み重ねても学習が上手くいかない ○ 誤差を伝播するにつれて、上流側で誤差が消失してしまう ○ 結果、上流はほとんど学習されず、下流だけが過学習する状態になる ■ 組織のメタファ:現場での局所最適化ばかりが進んでしまう ● 他の手法の流行もあり、ニューラルネットは下火に ○ ”ニューラルネットを論文タイトルに入れると採択確率が下がる”と言われる始末
  33. 33. 第3世代:Deep Learning (2006~) ● さらに多層(7層~)から構成されるニューラルネットワーク ● 基本的な構成要素は第2世代と同じ ○ 学習が上手く行きやすくなるテクニックの蓄積 ○ GPGPUを使った計算の効率化 ○ ビッグデータの活用 ● 研究での最初のブレークスルーは2006頃
  34. 34. Why Deep ? ● 直観的な理解:対象の階層的な構造をうまく取り込めるから ○ 画像認識…単純な特徴(エッジetc)と、それを組み合わせた複雑な特徴が使われる ■ 従来は、ドメイン知識に基づいて人が特徴抽出部を設計していた ■ Deep Learningによって、End-to-Endで学習ができるように ○ 特徴の自動抽出=表現学習(representation learning)を行っていると考えられる Input OutputDeep Learning Input Output Feature Extraction Perceptron etc.
  35. 35. Why Deep ? ● 理論的な研究…未解決の問題が多い ○ 1) 世の中の様々な問題がXというクラスに分類できるか ○ 2) XというクラスをDeep Learningが学習できるか ■ 2-1) Deepかつ現実的な規模のモデルが、対象を十分表現する能力を持つか ■ 2-2) Deepなモデルの学習が(局所最適に陥りそうだという直観に反して)なぜ上手くいくのか
  36. 36. Why Deep ? ● Linの仮説:世の中に以下の特徴がある ○ 低次性:多くの物理現象で相互作用の次数は2~4 ○ 局所性: 現象の影響範囲が局所的 ○ 対称性: 回転や移動に対する対称性が広くみられる ○ マルコフ性: 生成過程が直前の状態にのみ依存 ● これらを満たす場合、Deep Learningは現実的な パラメータ数で問題を解ける “Why does deep and cheap learning work so well?”, H. W. Lin and M. Tegmark
  37. 37. 畳み込みニューラルネット(CNN) ● 対称性、局所性を構造に取り込んだニューラルネットの亜種 ● 畳み込みとプーリングの組み合わせで特徴抽出したのち、多層パーセプトロン で分類 “Gradient-Based Learning Applied to Document Recognition”, Y. LeCun, et. al.
  38. 38. 畳み込みニューラルネット(CNN) ● 畳み込み=フィルタ処理 ○ 結合を近傍ニューロンに限定することで局所性を得る ○ 重みをニューロン間で共有することで対称性を得る ○ 画像処理でのフィルタ処理と等価 https://github.com/vdumoulin/conv_arithmetichttps://en.wikipedia.org/wiki/Kernel_(image_processing)
  39. 39. 畳み込みニューラルネット(CNN) ● プーリング=縮小処理 ○ 縮小の過程で並行移動、回転に対する一定の対称性を得る https://en.wikipedia.org/wiki/Convolutional_neural_network
  40. 40. CNNによって学習された特徴 “Convolutional Deep Belief Networks for Scalable Unsupervised Learning of Hierarchical Representations”, H. Lee, et. al. … ● 1回目の畳み込み…単純なエッジ検出(Gaborフィルタによく似た形) ● 2回目/3回目の畳み込み…特定のパーツ、顔全体etc
  41. 41. CNNと脳(大脳皮質の視覚野)との類似点 ● 脳も階層構造を持ち、下位は単純な特徴、上位は複雑な特徴を獲得 ○ V1野: 単純なエッジに反応するフィルタ(Gabor Filterで近似できる)が後天的に獲得 ○ IT野: 自動車に反応するニューロン、オペラハウスに反応するニューロン(!)etc http://kazoo04.hatenablog.com/entry/agi-ac-7 https://bsd.neuroinf.jp/wiki/受容野
  42. 42. Deep Learningは人間を超えるか? ● 汎用的な意味では(現状)No ○ 画像、音声、ビデオといった知覚的な入力(perceptual input)をターゲットにした、特定 のタスク群で非常にうまく機能している点が従来との差分 ○ ある種の表現学習が出来ていそうだという点も興味深い ○ ただし、特定のタスクで人間を上回る=汎用的な”知的思考”が出来る訳ではない ■ 電卓だって人間より高性能 ● 汎用AIの実現に向けた小さな前進ではあるかも
  43. 43. Deep Learningのドメインモデル フレームワークの進化とドメインモデルの深化
  44. 44. Deep Learningフレームワーク ● 研究だけでなく、フレームワークによる実装も大きく変化 ○ 研究と実装、お互いが影響を与えながら進化している ○ どっちがソリューションドメイン? →視点に依存 ● OSS上でニューラルネットモデルがどのような変遷を辿っているのかを紹介
  45. 45. 第1世代: 人工ニューロンモデル ● FANN(2003-)など : 人工ニューロンモデルの素直な実装 ○ ニューロン:活性化関数の種類と結合先、現在の値を保持する構造体 ○ レイヤ: ニューロンのリストで表現 ○ “積和演算とニューロンによる活性化からなるレイヤの連鎖” ○ 層の数、各層のニューロン数と活性化の種類が設計パラメータ Layer Network Neuron Neuron Weight Activation ※世代は本スライドで便宜的に付けたもの
  46. 46. Example / FANN const unsigned int num_input = 2; const unsigned int num_output = 1; const unsigned int num_layers = 3; const unsigned int num_neurons_hidden = 3; const float desired_error = (const float) 0.001; const unsigned int max_epochs = 500000; const unsigned int epochs_between_reports = 1000; struct fann *ann = fann_create_standard(num_layers, num_input, num_neurons_hidden, num_output); fann_train_on_file(ann, "xor.data", max_epochs, epochs_between_reports, desired_error);
  47. 47. 第2世代: レイヤによる抽象化 ● pybrain(2008-)など ○ ニューロンを明示的にモデル化せず、レイヤをブラックボックス化 ○ レイヤ:”値を伝播し(forward/backward), 活性化する(activation)”モジュール ○ ”活性化を持つ、誤差伝播可能なレイヤの連鎖” ○ 畳み込みやプーリングなどが実現できるようになった Layer Network conv pool conv Activation
  48. 48. 第2.5世代: 活性化関数の分離 ● Torch5(2006-)など ○ 活性化関数をひとつのレイヤとして扱うことで、レイヤをより汎用化 ○ レイヤ:”N次元ベクトル(テンソル)を入出力とする、微分可能な関数” ○ “微分可能なレイヤの連鎖” ○ 活性化にこだわらず、あらゆる計算を含められるようになった Layer Network conv pool conv sigmoid sigmoid
  49. 49. 第3世代: リストから有向グラフへ ● Torch7(2010-), tiny-dnn(2012-), Caffe(2013-), Keras(2015-)など ○ 偏微分のチェインルールは1対1接続でなくても成立 ○ “微分可能なレイヤの有向グラフ” ○ 多入力・多出力を含む、より柔軟な設計ができるようになった ■ 2017年現在では、分岐構造を持たないモデルの方が珍しい ※考え方自体は 1990sから存在 “Gradient-Based Learning Applied to Document Recognition”, Y. LeCun, et.
  50. 50. Example / Caffe DSLでモデル(グラフ)を定義layer { name : “conv1” type : “Convolution” convolution_param { num_output: 20 kernel_size: 5 } bottom: “data” top: “conv1” } layer { name : “pool1” type : “pooling” ... 入出力に接続するエッジ ノードの種別と詳細パラメータ
  51. 51. 第4世代: レイヤから演算子へ ● Theano(2011-), TensorFlow(2015-), Chainer(2015-), pytorch(2017-)など ○ グラフのノードの粒度を、レイヤではなく演算子(operator)の粒度に下げる ■ さらに柔軟な構造が定義できるように ○ “微分可能なオペレータの有向グラフ” mul plus sqr plus op ○ もはや、単なるニューラルネットワークの実装では無くなっている “TensorFlow™ is an open source software library for numerical computation using data flow graphs.” https://www.tensorflow.org/
  52. 52. Example / TensorFlow x_data = np.random.rand(100).astype(np.float32) y_data = x_data * 0.1 + 0.3 W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) b = tf.Variable(tf.zeros([1])) y = W * x_data + b # Minimize the mean squared errors. loss = tf.reduce_mean(tf.square(y - y_data)) optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss)
  53. 53. 命令型(imperative) vs 記号型(symbolic) ● 記号型:計算を即時に行わず、式自体を保持するモデル ○ TheanoやTensorFlowで採用 ○ 学習の実行時にモデルをフレームワーク側で”コンパイル”し、グラフ構造を解析する ○ “コンパイラ”での最適化が(頑張れば)できるため、高速・高効率 ■ 一時メモリの再利用、分散学習の効率化など A = Variable('A') B = Variable('B') C = B * A D = C + Constant(1) # compiles the function f = compile(D) d = f(A=np.ones(10), B=np.ones(10)*2) http://mxnet.io/architecture/program_model.html#symbolic-vs-imperative-programs ここで初めてグラフが実行される ここで計算対象のグラフが確定
  54. 54. 命令型(imperative) vs 記号型(symbolic) ● 命令型:呼び出した時点で計算が実行されるモデル ○ Chainerやpytorchで採用 ■ 実行時に演算グラフをバックエンドで記録しておき、後から自動微分で逆伝播する ○ 言語側の組み込み関数とMixしやすく、デバッグが容易 A = Variable(rand()) B = Variable(rand()) C = B * A D = C + Constant(1) D.backward() 裏で生成しておいたグラフから自動微分 この時点でCは計算されている
  55. 55. ドメインモデルの深化 ● 人工ニューロンモデルから、データフロー計算をサポートするDSLへ進化 Layer Neuron Op Neuron Weight Activation Tensor
  56. 56. ドメインモデルの深化 ● 研究側でも、より多彩な構造をもったNetworkが次々に提案されている ○ 層を飛び越えた接続、非決定的な動作、再帰、外部記憶の導入... “Deep Networks with Stochastic Depth”, H. Lee, et. al. “Densely Connected Convolutional Networks”, G. Huang, et. al. “Quasi-recurrent Neural Networks”, J. Brudbury, et. al. “DeepBach: a Steerable Model for Bach chorales generation”, G. Hadjeres and F. Pachet
  57. 57. ユビキタス言語 ● TensorFlowが普及することで柔軟なモデルが定義できるようになった一方、 APIが低レイヤすぎると感じることも… ○ TensorFlow上のAPIは、Deep Learningでのユビキタス言語と抽象度が異なる Words in Deep Learning World APIs in TensorFlow neuron - layer op network session forward-propagation compute train minimize
  58. 58. Wrapper Framework ● Theano/TensorFlow上に、Deep Learning用の使いやすいAPIを構築する高レ ベルフレームワークが多数出てきている ○ Keras(2015):Theano/TensorFlowをバックエンドにしたレイヤ粒度のAPI ○ tf-slim(2016): TensorFlow公式のWrapper ● かつては単一ライブラリで賄っていたものが、2つのドメインに分割 ○ 高度な最適化を伴う、数値計算グラフのドメイン ○ Deep Learningモデルのドメイン
  59. 59. まとめ ● Deep Learningは知覚系のタスクを中心に大きな成功を収めている ○ 理論的背景はまだ未知の部分が多い ● Deep Learningのドメインモデルも旧来から大きく変化 ○ 人工ニューロンから計算グラフへ ○ フレームワーク実装の深化、ドメイン分割
  60. 60. おまけ: tiny-dnn
  61. 61. tiny-dnn(2012-) ● C++での高レベルAPIを持ったdeep learningフレームワーク ● Header-only、かつ外部依存無しで手軽に使えることが最大の売り ○ 組み込み系含む、アプリケーションへの統合がやりやすい ○ 別フレームワーク(Caffe)で学習した結果をインポートできる ● Google Summer of Code 2016にOpenCVを経由して参加し、開発が活性化 ○ 2016/1-2017-1の間で、Github starが150 -> 2400まで伸びた ○ 個人レポジトリからOrganizationに移行。現在Core member4名+Reviewer2名 ● ドメインモデルは第3世代相当 ○ 実装をシンプルに留めるための意図的なデザイン
  62. 62. API比較 network<sequential> net; net << conv<>(28, 28, 5, 1, 32) << max_pool<relu>(24, 24, 2) << conv<>(12, 12, 5, 32, 64) << max_pool<relu>(8, 8, 64, 2) << fc<relu>(4*4*64, 1024) << dropout(1024, 0.5f) << fc<>(1024, 10); x = tf.Variable(tf.random_normal([-1, 28, 28, 1])) wc1 = tf.Variable(tf.random_normal([5, 5, 1, 32])) wc2 = tf.Variable(tf.random_normal([5, 5, 32, 64])) wd1 = tf.Variable(tf.random_normal([7*7*64, 1024])) wout = tf.Variable(tf.random_normal([1024, n_classes])) bc1 = tf.Variable(tf.random_normal([32])) bc2 = tf.Variable(tf.random_normal([64])) bd1 = tf.Variable(tf.random_normal([1024])) bout = tf.Variable(tf.random_normal([n_classes])) conv1 = conv2d(x, wc1, bc1) conv1 = maxpool2d(conv1, k=2) conv1 = tf.nn.relu(conv1) conv2 = conv2d(conv1, wc2, bc2) conv2 = maxpool2d(conv2, k=2) conv2 = tf.nn.relu(conv2) fc1 = tf.reshape(conv2, [-1, wd1.get_shape().as_list()[0]]) fc1 = tf.add(tf.matmul(fc1, wd1), bd1) fc1 = tf.nn.relu(fc1) fc1 = tf.nn.dropout(fc1, dropout) out = tf.add(tf.matmul(fc1, wout), bout) tiny-dnn (C++)TensorFlow (Python)

×