深層学習とTensorFlow入門

282 views

Published on

初心者向けのTFおよび深層学習の入門資料です。
いろいろと以前作ってたものをまとめました

Published in: Data & Analytics
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
282
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

深層学習とTensorFlow入門

  1. 1. シーエイトラボ株式会社 第1章 ニューラルネットワークとディープラーニング 10月 TensorFlow講義 2016/10/21C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  2. 2. 2 2016/10/21 Singularity Copyright 2016 Singularity Inc. All rights reserved  自己紹介 新村拓也 - 東京大学工学部精密工学専攻卒業 - シーエイトラボ株式会社 代表取締役 - シンギュラリティ株式会社 取締役CTO - TensorFlow勉強会 - 機械学習のための数学塾 - RNN camp
  3. 3. 3 第1章の内容 ディープラーニングについて知る  そもそもディープラーニングって何?  Googleの猫って有名だけど具体的に何したの?  どういうことに使えるの?  ディープラーニングの凄いとこって? 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 教師なし学習なの?
  4. 4. 4 ニューラルネットワーク 形式ニューロンモデルを組み合わせて脳を模倣したネットワーク。 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved x1 x2 x3 入力 出力 y w1 w2 w3 b 形式ニューロン ニューラルネットワーク
  5. 5. 5 ニューラルネットワークの特徴 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved x1 x2 x3 入力 出力 y w1 w3 b w2 y = f ( 1w 1x + 2w 2x + 3w 3x +b )  インプットとアウトプットの形を決めれば繰り返し処理でなんとかなる  シンプルが故にいろんな分野の情報を詳しい知識がなくても記述可能 単純な構造 発火関数
  6. 6. 6 ニューラルネットワークの特徴 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved ノードの数に比例して 「パラメータが増える」 =複雑な表現 シンプルな式で複雑な表現力!! 複雑な状態記述
  7. 7. 7 ニューラルネットワークの例 例)家賃の予測 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 正解と予測の誤 差20万円 誤差伝播で学習!  学習する対象はすべての重みwとバイアスb
  8. 8. 8 教師あり学習、教師なし学習  教師あり学習  入力データに関して、それとは独立した正解ラベル、値をもとに行う 学習  教師なし学習  入力データに関して、恣意的に関数を決めたり、入力値をそのまま 正解にするなどして独立した正解値を必要としない学習  オートエンコーダー  クラスタリング  強化学習 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved ペンギン 駅からの距離:100m 築:1年 広さ:40平米 10万円
  9. 9. 9 連鎖率と誤差逆伝播法  予測と正解の誤差が小さい=良いニューラルネットワーク  どのように重みとバイアスを変更すれば誤差が小さくなるのか? 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 誤差E パラメータw, b パラメータが1個、2個なら微分(偏微分)して、最小を取るパラメータを直接求 めることができる。
  10. 10. 10 連鎖率と誤差逆伝播法  しかし、現実問題ではパラメータが多すぎて不可能 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 誤差E パラメータw, b 今ここ パラメータを変化させることで少しでも誤差が小さくなるようにパラ メータを変更する方法を模索
  11. 11. 11 連鎖率と誤差逆伝播法 重みを少し変化させた時に誤差関数がどのくらい変化するかを考える 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved ΔE = 𝜕𝐸 𝜕𝑤 Δw (誤差の変化量)=(wが変化した時どのくらい変化するか?)×(実際に変化したwの量) パラメータは複数あるので ΔE = 𝜕𝐸 𝜕𝑤1 Δ𝑤1 + 𝜕𝐸 𝜕𝑤2 Δ𝑤2 + ・・・= 𝑗 𝜕𝐸 𝜕𝑤 𝑗 ∆𝑤𝑗
  12. 12. 12 連鎖率と誤差逆伝播法 勾配の定義 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 𝛁𝑬 = ( 𝝏𝑬 𝝏𝒘 𝟏 , 𝝏𝑬 𝝏𝒘 𝟐 , 𝝏𝑬 𝝏𝒘 𝟑 , ・・・・) 関数を、それを構成するパラメータでそれぞれ偏微分したものを並べた配列 ΔE = 𝜕𝐸 𝜕𝑤1 Δ𝑤1 + 𝜕𝐸 𝜕𝑤2 Δ𝑤2 + ・・・= 𝑗 𝜕𝐸 𝜕𝑤 𝑗 ∆𝑤𝑗 = 𝛁𝑬∆𝒘 ∆𝑤 = ∆𝑤1 ∆𝑤2 ∆𝑤3 すると、実際に動かすパラメータの変化量の配列 を用いて、
  13. 13. 13 連鎖率と誤差逆伝播法 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved ∆𝐸 = 𝛻𝐸∆𝑤 の中で、我々が決めることができるのは∆wだけ!! ∆Eが0以下の値になれば訓練するたびに誤差は減っていく。 とすればその条件を満たせる。 ∆𝒘 = −𝜶 × ( 𝝏𝑬 𝝏𝒘 𝟏 , 𝝏𝑬 𝝏𝒘 𝟐 , 𝝏𝑬 𝝏𝒘 𝟑 , ・・・・) 𝑇 𝑤 = 𝑤 − 𝛼𝛻𝐸更新するルールは α:学習率(0< α <= 1.0)
  14. 14. 14 連鎖率と誤差逆伝播法 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 入力 出力,誤差・・・・・・ 最終層程度なら重みで誤差 関数を簡単に計算できる それ以外の層の重みで学習する際 には連鎖率を簡単に計算できない
  15. 15. 15 連鎖率と誤差逆伝播法 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 𝑦 = 𝑥2 + 2𝑥 + 1 の時、𝑧 = 𝑦2 を𝑥で微分せよ。 𝑑𝑧 𝑑𝑥 = 𝑑𝑧 𝑑𝑦 × 𝑑𝑦 𝑑𝑥 (xが変化することによるzの変化量) =(yが変化することによるxの変化量)×(xが変化することによるyの変化量) NNでは各層の出力が、 次の層の入力になるために、 連鎖率を意識して勾配計算 を行う
  16. 16. 16 連鎖率と誤差逆伝播法 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 入力z 出力a 𝑎 = 𝑓(𝑧)なので、 𝜕𝐸 𝜕𝑧 = 𝜕𝐸 𝜕𝑎 𝜕𝑎 𝜕𝑧 を出力層から順番 に計算していくことで、誤差関数の勾配を計算 可能。 誤差E 発火関数の微分
  17. 17. 17 (広義)ディープラーニングとは? 多層のニューラルネットワーク(一応3層以上)で行われる機械学習。 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 入力 出力・・・・・・ 多層 複雑である(パラメータ数が多い)ほど、汎用的なモデルを説明できる どうして多層するの?
  18. 18. 18 多層NNにした時の欠点 過学習が起こってしまい、汎用性が無い。 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved パラメータの初期値によって良い モデルにたどり着けるかどうかは 決まってしまう。 解決策1:投入するデータを増やす。 解決策2:初期値をいい感じにする。 どちらも困難・・・
  19. 19. 19 多層NNにした時の欠点 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 誤差伝播 高レイヤ: フィードバックをしっかり 受けているが、訓練 データの影響が強く出 すぎている。 低レイヤ: フィードバックが 分散しすぎて届 かない。 ・・・・・・ 勾配消失が起こってしまい、学習が上手くいかない(進まない) 解決策:関係ある結合(パラメータ)だけを残してその他の結合を切る 漠然としててどうしたらいいものか・・・
  20. 20. 20 多層NNにした時の欠点 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 遅い!!!!! 一番どうしようもない・・・
  21. 21. 21 最近話題になっているDLとは? 単なる多層NNの問題を解決した新世代の多層NNを用いた機械学習。  教師なし学習により事前学習を行い、適した初期パラメータを獲得  例)オートエンコーダー  層間の結合を制限し、誤差が伝播するようにする  例)局所受容野、ドロップアウト  GPUの出現による計算速度向上  CUDAプログラミング  データセットの充実化  Image Net, Word Net 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  22. 22. 22 教師なしでの事前学習 初期パラメータをランダムで生成して教師あり学習 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 過学習が起きるかどうか運任せ(というかほぼ100% 過学習に陥る)。 似たようなデータは似たような特徴が出るように先にパラメータを調整しておいて から、教師あり学習を行おう! 犬 猫 犬 猫 猫 犬 猫 猫猫 犬 犬 犬
  23. 23. 23 例:オートエンコーダ 入力(信号)を可能な限り再現するようなニューラルネットワーク 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved エンコード デコード 生成されたパラメータから出 力された隠れ層は、入力情 報の特徴を表していると言え る。 ・圧縮しているだけなので、不要な 情報をそぎ落として、いいパラメー タ(特徴)を表している。 ・入力値が教師データとなるため、 「教師なし」で実現可能。
  24. 24. 24 ディープオートエンコーダ 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved オートエンコーダの隠れ層(特徴)を、次 の層のオートエンコーダの入力とする 入力の特徴 特徴の特徴 特徴の特徴の特徴 教師なしで最初からいい感じの初期パラメータで学習を始められる! =>過学習回避のためにそこまで多くの教師データを必要としない。
  25. 25. 25 層間の結合制限 関係がありそうな部分だけを結合させて、伝播が分散するのを防ぐ。 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 従来のDNN 最近噂のDNN 赤の領域の情報と緑の領域の情報を両方とも 次の層の同じニューロンに伝える。 赤の領域は一部のニューロンに、緑の領域は 別のニューロンに伝える。 関係が薄い領域が結合されて、徒らに誤差伝 播を阻害。 関係が深い領域だけを結合するため、誤差伝 播の効率が上がり、勾配消失を回避。
  26. 26. 26 局所受容野、共有重み 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 次の層のニューロンは、特定領域としか結びつかないようにする。 =>画像解析の場合は、空間的に特徴を捉えていくのでさらにGood!!
  27. 27. 27 グーグルの猫  Youtubeの画像1000万枚でとあるネットワークの事前学習を行った。  そいつに顔の画像を突っ込んで一番反応する ニューロンが81.7%の精度で顔認識できた。  そいつが一番反応する 画像を作ってみたところ  猫ちゃんで同じような画像作ってみたら 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved コレ コレ
  28. 28. 28 グーグルの論文  教師なしで事前学習させたネットワークでも十分機能する  なにやら特定の分野に反応するニューロンが自動的に生成されている らしい(おばあちゃん細胞説の確認)  しかもさらに教師あり学習で学習させて、分類機を作ったところ、いまま でのものより相対比70%以上精度向上した! 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  29. 29. 29 DL適用分野:画像認識 Selective Search+畳み込みニューラルネットワーク(CNN) RCNN, FasterRCNNなど 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved DeepCNNを用いた歩行者検知
  30. 30. 30 DL適用分野: 音声認識 再帰型ニューラルネットワーク(RCNN) 双方向RNN(Bi-directional RNN) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Android端末のGoogle音声入力
  31. 31. 31 DL適用分野:言語解析 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Skip gramを用いた単語埋め込み(word embedding) EncoderDecoderモデルを用いた翻訳モデル 言語解析ライブラリ 「Word2Vec」 t’=2 ボブ t’=1 t’=0 は 私 t=0 t=1 t=2 I am Bob
  32. 32. 32 第1章のまとめ 巷で噂のディープラーニングって何? 単なる全結合、多層のNNの欠点を克服した凄いニューラルネットワークで 行う機械学習のこと。 教師なし学習って本当? あくまで初期パラメータをいい感じにする一つの手段。何か実現したければ 教師ありデータはいる。(強化学習は除く) どんな分野で使えるの? 工夫さえすればどんな分野でも。 どこが凄いの? パラメータが多くても過学習を回避して、汎用性が非常に高いモデルをな ぜか構築してしまうところ。 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  33. 33. シーエイトラボ株式会社 第2章 TensorFlow 入門 10月 TensorFlow講義 2016/10/21C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  34. 34. 34 TensorFlowとは?  Googleが2015年11月10日に公開したオープンソース  ディープラーニング以外にも線形代数を用いた機械学習などで利用で きる。(ロジスティック回帰など)  Tensor(テンソル)のFlow(流れ)を記述して実行する  現状C++/PythonでのAPIをサポート  現在バージョンは0.11 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  35. 35. 35 そもそもTensorって テンソル(英: tensor, 独: Tensor)とは、線形的な量または線形的な幾何概念 を一般化したもので、基底を選べば、多次元の配列として表現できるようなもの である。 しかし、テンソル自身は、特定の座標系によらないで定まる対象である。 出典:Wikipedia 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 多次元配列ということで 大丈夫です。
  36. 36. 36 Tensor 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  37. 37. 37 TensorFlowの導入(ソースか らbuild)  Ubuntu14.04を想定(16だとgccのバージョン問題で古いのを入れない といけない)  GPU導入時は割愛(ドライバとCUDA、最近だとPascalアーキテクチャ 関連ではまるのでほとんどその話になる上に長くなります)  sudo権限を持ったユーザでの操作を想定(env環境上での構築は各々 やってください)  Pythonは2.7系  ソースからインストールしないとフル機能が実装されないまま入ることが あります!!絶対にソースからビルドしましょう  コマンドをこれから書く順で実行していけば入ります。 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  38. 38. 38 apt周りのインストール  依存関係のあるものをインストールしていきます 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #apt-getのライブラリのインデックスを更新 sudo apt-get update #既存で入っているものを更新 sudo apt-get upgrade #aptパッケージで必要なものを取得 sudo apt-get install -y build-essential python-pip python-dev git python-numpy swig python-dev ipython pkg-config zip g++ zlib1g-dev unzip
  39. 39. 39 bazelの導入  Googleが開発したbuildツール「bazel」を導入します。これの問題があ るためにWindowsでそのままTFをインストールすることができません 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #bazelのインストール jdk8を入れる(apt-get周りの時にやってても大丈夫) sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-installer #bazelのインストーラ(バイナリ)をサーバに持ってくる wget https://github.com/bazelbuild/bazel/releases/download/0.2.1/bazel- 0.2.1-installer-linux-x86_64.sh #権限変更して実行 chmod +x bazel-0.2.1-installer-linux-x86_64.sh ./bazel-0.2.1-installer-linux-x86_64.sh --user #パスを通してあげる(.bashrcに記述) export PATH="$PATH:$HOME/bin"
  40. 40. 40 TensorFlowのインストール  Gitリポジトリからソースをcloneしてきてからbuild 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #git からtensorflowをcloneしてくる git clone https://github.com/tensorflow/tensorflow #いつもの(GPUサポートに関する質問はNoと答えてください) ./configure #pipパッケージ作成をターゲットにビルド bazel build -c opt //tensorflow/tools/pip_package:build_pip_package #pipパッケージ作成を実行(/tmp/tensorflow_pkg直下に作ります) bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg sudo pip install /tmp/tensorflow_pkg/(出来上がったTensorFlowのパッケージ)
  41. 41. 41 動作確認  Pythonでインポートしてみる 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved python >>>import tensorflow as tf #すぐに動作確認しようとして、現在いるtensorflowのソースコードのディレクト リでimport tensorflow as tfをするとエラー吐くので、それ以外のところで動作 確認すべし
  42. 42. 42 TensorFlowの特徴  計算グラフを用いたBuild & Run  実行環境のSessionで構築モデルを実行  計算グラフにおけるノードは各種オペレーション  計算グラフにおけるエッジはオペレーションの入出力となるTensor  (buildツールにBazel), データのシリアライズ、でシリアライズに ProtocolBuffurを採用することで大規模分散に特化 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved ?????
  43. 43. 43 計算グラフ  まずはDLではなく単なる足し算や掛け算をするプログラムを使って、計 算グラフや、TFで出てくる用語を説明 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  44. 44. 44 計算グラフ 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Variable val1 const1 val1 add 定数:3 変数:初期値0 加算の結果 a = tf.constant(3, name="const1") b = tf.Variable(0, name="val1") c = tf.add(a, b) Variableやconstantは、変数・定数を出力 するという演算を行うという認識で。
  45. 45. 45 計算グラフ 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Variable val1 const1 val1 add Input d = tf.assign(b, c) e = tf.placeholder(tf.int32, name="input") f = tf.mul(d,e) 変数に対する値の更新はassignを用いる assign placeholder 実行時の引数 mul 掛け算の結果
  46. 46. 46 計算グラフ 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Variable val1 const1 val1 add Input with tf.Session() as sess: sess.run(tf.initialize_all_variables()) 変数は初期化が必要 assign placeholder mul 掛け算の結果 init 構築したグラフをセッション上で動かす まずは初期化だけ実行
  47. 47. 47 計算グラフ 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Variable val1 const1 val1 add Input for i in range(3): print sess.run(f, feed_dict={e: 2}) assign placeholder mul 掛け算の結果 init mulの結果を3回実行 feed_dict: 2
  48. 48. 48 計算グラフ 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Variable val1 const1 val1 add Input for i in range(3): print sess.run(c) assign placeholder mul 掛け算の結果 init Addの部分だけ実行する際は、このグラフ でplaceholderは関係ないのでいらない。 assignも通らないので変数も更新されない
  49. 49. 49 TensorFlowでNN入門  MNISTの手書き数字認識のニューラルネットワークを実装 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved ・ ・ ・ ・ 各ピクセルの画素値 784画素 ・ ・ ・ ・ 入力層 出力層中間層 入力画像が0〜9 である確率 入力画像が2である確率
  50. 50. 50 今回作成するネットワーク  入力値が0〜255と大きいので、255で割って0〜1にする  中間層の数は64個  入力層〜中間層への発火関数はReLUを採用  中間層〜出力層の発火関数はsoftmax関数を採用  誤差関数には二乗誤差を採用 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved y=x 𝑦 = 𝑒 𝑥 𝑖 𝑗 𝑒 𝑥 𝑗 𝐸 = (𝑎 − 𝑦)2 softmax関数 二乗誤差関数
  51. 51. 51 入出力データ  入力データ  (ミニバッチサイズ,画素数)の2階テンソル(行列)  出力データ  (ミニバッチサイズ,数字の種類)の2回テンソル 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 0 ⋯ 0.1 ⋮ ⋱ ⋮ 0.2 ⋯ 1.0 1番目の画像の画素値 n番目の画像の画素値 1行が1つの画像の全 画素(784画素)を表す 0.1 ⋯ 0.1 ⋮ ⋱ ⋮ 0.2 ⋯ 0.3 1番目の画像がそれぞれ の数字である確率 n番目の画像がそれぞれ の数字である確率 0である確率 9である確率 1行が1つの画像がどの数字 であるか(10種類)の確率を 表す
  52. 52. 52 入出力データ  正解データ  出力データと同じ形  ただし、正解の数字の部分のみが1.0その他は0.0のワンホットベク トルを並べた行列 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 1.0 ⋯ 0.0 ⋮ ⋱ ⋮ 0.0 ⋯ 1.0 1番目の画像は0だと いう正解 n番目の画像は9だと いう正解
  53. 53. 53 誤差の計算  正解データと出力データを引き算して2乗、そのあと平均をとる 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 0.1 ⋯ 0.1 ⋮ ⋱ ⋮ 0.2 ⋯ 0.3 1.0 ⋯ 0.0 ⋮ ⋱ ⋮ 0.0 ⋯ 1.0 ー 出力データ 正解データ = −0.9 ⋯ 0.1 ⋮ ⋱ ⋮ 0.2 ⋯ −0.7 −0.9 ⋯ 0.1 ⋮ ⋱ ⋮ 0.2 ⋯ −0.7 のすべての要素を2乗 0.81 ⋯ 0.01 ⋮ ⋱ ⋮ 0.04 ⋯ 0.49 0.81 ⋯ 0.01 ⋮ ⋱ ⋮ 0.04 ⋯ 0.49 の全要素の平均を計算 誤差として扱う!!
  54. 54. 54 プログラム作成  importおよびデータセット準備 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #-*- coding:utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function import input_data import tensorflow as tf #mnistデータを格納したオブジェクトを呼び出す mnist = input_data.read_data_sets('data') python3系との互換性 mnistデータを呼び出す ための独自プログラム mnist.train.image・・・訓練用入力データの配列 mnist.train.labels・・・訓練用正解データの配列 mnist.train.next_batch(50) 訓練データ50個を取り出して、(入力データ,正解データ) のタプルで返却してくれる
  55. 55. 55 プログラム作成  モデル構築(入力層〜中間層) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #入力データを定義 x = tf.placeholder(tf.float32, [None, 784]) #入力層から中間層 w_1 = tf.Variable(tf.truncated_normal([784, 64], stddev=0.1), name="w1") b_1 = tf.Variable(tf.zeros([64]), name="b1”) h_1 = tf.nn.relu(tf.matmul(x, w_1) + b_1) 重みwとバイアスbは学習して更新する 変数なので、Variableで定義する。 初期値を与えて、初期化する 必要がある
  56. 56. 56 プログラム作成 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #784×64の行列を平均0、標準偏差0.1で初期化 tf.truncated_normal([784, 64], stddev=0.1) なぜこれで重みの定義になるのか? 0.03 ⋯ 0.2 ⋮ ⋱ ⋮ −0.4 ⋯ −0.1 𝑤1,1 ⋯ 𝑤1,64 ⋮ ⋱ ⋮ 𝑤784,1 ⋯ 𝑤784,64 入力層の784番目と中 間層の64番目をつな ぐ重み 0 ⋯ 0.1 ⋮ ⋱ ⋮ 0.2 ⋯ 1.0 = 1番目の画像を重みにかけた中間層への 入力
  57. 57. 57 プログラム作成  モデル構築(入力層〜中間層) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved b_1 = tf.Variable(tf.zeros([64]), name="b1”) h_1 = tf.nn.relu(tf.matmul(x, w_1) + b_1) tf.matmul(x, w_1) の結果は(バッチサイズ, 64)の2階テンソル 1階テンソルのb_1をそのまま足せるのはなぜ? Numpyにもある、ブロードキャスティン グ機能
  58. 58. 58 プログラム作成  モデル構築(中間層〜出力層) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #中間層から出力層 w_2 = tf.Variable(tf.truncated_normal([64, 10], stddev=0.1), name="w2") b_2 = tf.Variable(tf.zeros([10]), name="b2") out = tf.nn.softmax(tf.matmul(h_1, w_2) + b_2) 入力層〜中間層とほとんど同じ。 発火関数がsoftmax関数になっている。
  59. 59. 59 プログラム作成  モデル構築(誤差計算と訓練) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #誤差関数 loss = tf.reduce_mean(tf.square(y - out)) #訓練 train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss) reduce_mean, reduce_sumは平均や合計を取りながら次元を削減してくれる。 reduction_indicesを指定しなければ全ての要素や平均を取ってスカラーにする。 学習率 0.1 ⋯ 0.1 ⋮ ⋱ ⋮ 0.2 ⋯ 0.3 ( 𝑥0 … 𝑥 𝑚) 𝑦0 ⋮ 𝑦 𝑛 reduction_indices=0 reduction_indices=1 Optimizerのminimizeを実行すること で自動的に勾配を計算して値を更新 してくれる。 compute_gradients + apply_gradients
  60. 60. 60 プログラム作成  モデル構築(評価) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #評価 correct = tf.equal(tf.argmax(out,1), tf.argmax(y,1)) accuracy = tf.reduce_mean(tf.cast(correct, tf.float32)) 0.1 ⋯ 0.1 ⋮ ⋱ ⋮ 0.2 ⋯ 0.3 tf.argmaxは指定したランクの最大値の添字を返す 今回の場合は、行で比 較して最大値のの添字 の1階テンソルを返す
  61. 61. 61 プログラム作成  簡単に今回のモデルを計算グラフで表すと 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 順伝播実行 誤差計算 訓練 評価 入力データ 正解データ
  62. 62. 62 プログラム作成  実行(訓練) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved with tf.Session() as sess: #初期化 init =tf.initialize_all_variables() sess.run(init) #テストデータをロード test_images = mnist.test.images test_labels = mnist.test.labels for step in range(1000): train_images, train_labels = mnist.train.next_batch(50) sess.run(train_step, feed_dict={x:train_images ,y:train_labels}) Placeholderに値を与え て、訓練のオペレーショ ンを実行
  63. 63. 63 プログラム作成 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 順伝播実行 誤差計算 訓練 評価 入力データ 正解データ これを実行
  64. 64. 64 プログラム作成  実行(評価) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #10回に1回精度を検証 if step % 10 == 0: acc_val = sess.run(accuracy ,feed_dict={x:test_images, y:test_labels}) print('Step %d: accuracy = %.2f' % (step, acc_val)) 10ステップごとに誤差計算や訓練は行わず に精度だけをテストデータで計算 プログラムの実行は >>python mnist.py だいたい90%程度の精度
  65. 65. 65 プログラム作成  簡単に今回のモデルを計算グラフで表すと 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 順伝播実行 誤差計算 訓練 評価 入力データ 正解データ
  66. 66. 66 もう少し改良はできないか・・・  もっと多層にすればいいのではないか?  ディープニューラルネットワークに!!  そのまま画像ピクセルを入れているがもう少し画像を形として捉えられ ないか?  畳み込みニューラルネットワークを導入  誤差関数は本当に単純な二乗誤差でいいの?  クロスエントロピーの導入 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved それではやっていきましょう!
  67. 67. 67 畳み込みニューラルネットワーク 画像処理でいうフィルタ処理を用いてデータの特徴を抽出していくニューラ ルネットワーク 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 縦線を検知したりぼかしを入れることが可能 http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_con volution
  68. 68. 68 畳み込みニューラルネットワーク  一般的に様々な特徴を検知するフィルタは確率されているが、どんな フィルタを採用すればいいかはわからない・・・ 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 畳み込みニューラルネットワークが学習するのは、 このフィルタの値! ・画像を扱う際に空間情報を意識 ・余計な結合が切り離されているた めに多層にしても大丈夫! GOOD!!
  69. 69. 69 さらにざっくり説明 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 32×32の1チャンネル画像を、 28×28の6チャンネル画像に畳 み込み 32×32の1枚の画像を28×28の6枚の画像に変換したという認識で大丈夫!! 画像は複数のチャンネル(画像)を重ね合わせているものであると理解する。 midiのチャンネルのようなもの
  70. 70. 70 クロスエントロピー  分類問題では必ずと言っていいほど使われる  二乗誤差関数だと学習量が、大きく間違った際に発火関数の微分に比 例するため学習が遅くなる  それを避けて、出力が0,1 に近い値を出して間違った際に大きく学習さ せて学習を高速化するための誤差関数 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 𝐸 = − 𝑖 𝑎𝑖 log(𝑦𝑖 + 𝜖) 𝑎𝑖: 正解データ 𝑦𝑖: 出力データ 数学的には同時確率を見ている 実装の際には出力がほぼ0にな ると値が発散するので微少量を かける
  71. 71. 71 今回作成するプログラム  入力データ(28×28の1チャンネル)を5×5のフィルタで32チャンネルに 畳み込み  出てきた画像を2×2のフィルタでmaxプーリング  出てきた画像を5×5のフィルタで64チャンネルに畳み込み  出てきた画像を2×2のフィルタでmaxプーリング  出てきた画像を1024個のユニットの全結合層に変換  softmax関数で10ユニットの最終層出力  最終層以外の発火関数はReLU 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  72. 72. 72 プログラム作成  importおよびデータセット準備 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #-*- coding:utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function import input_data import tensorflow as tf #mnistデータを格納したオブジェクトを呼び出す mnist = input_data.read_data_sets('data') さっきと同じ
  73. 73. 73 プログラム作成  モデル構築(入力層〜畳み込み層1) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #入力データを定義 x = tf.placeholder(tf.float32, [None, 784]) #(バッチサイズ, 高さ, 横幅, チャンネル数)に変更 img = tf.reshape(x,[-1,28,28,1]) #畳み込み層1 f1 = tf.Variable(tf.truncated_normal([5,5,1,32], stddev=0.1)) conv1 = tf.nn.conv2d(img, f1, strides=[1,1,1,1], padding='SAME') 畳み込みに用いるフィルタをVariable で定義して、tf.nn.conv2dに渡す。 [高さ, 幅, 畳み込み前チャンネル数, 畳み込み後チャンネル数] ストライドはフィルタをどれほど動かす か?のパラメータ。入力画像と同様の形 式をとるため、「バッチ」・「チャンネル」の strides[0], strides[3]は必ず1
  74. 74. 74 プログラム作成  モデル構築(バイアス+プーリング層2) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved b1 = tf.Variable(tf.constant(0.1, shape=[32])) h_conv1 = tf.nn.relu(conv1+b1) #プーリング層1 h_pool1 = tf.nn.max_pool(h_conv1, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME') カーネルサイズが畳み込みとは異なり、 ストライドと同じ構成をとる。 バッチ方向、カーネル方向にプーリング することはないので、ksize[0], ksize[3] は必ず1
  75. 75. 75 プログラム作成  モデル構築(畳み込み層2〜プーリング層2) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #畳み込み層2 f2 = tf.Variable(tf.truncated_normal([5,5,32,64], stddev=0.1)) conv2 = tf.nn.conv2d(h_pool1, f2, strides=[1,1,1,1], padding='SAME') b2 = tf.Variable(tf.constant(0.1, shape=[64])) h_conv2 = tf.nn.relu(conv2+b2) #プーリング層2 h_pool2 = tf.nn.max_pool(h_conv2, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME') 先ほどと同じ要領で
  76. 76. 76 プログラム作成  モデル構築(全結合層) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #畳み込まれているものをフラットな形に変換 h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64]) #全結合層 w_fc1 = tf.Variable(tf.truncated_normal([7*7*64, 1024], stddev=0.1)) b_fc1 = tf.Variable(tf.constant(0.1, shape=[1024])) h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1) + b_fc1) プーリング層2を通過した後の画像は 7×7の64チャンネル画像になっている のでただのNNの中間層に変換。 ※手計算してもいいし、 shapeをとってきて掛け算し ても良い
  77. 77. 77 プログラム作成  モデル構築(出力層〜誤差関数) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #出力層 w_fc2 = tf.Variable(tf.truncated_normal([1024, 10], stddev=0.1)) b_fc2 = tf.Variable(tf.constant(0.1, shape=[10])) out = tf.nn.softmax(tf.matmul(h_fc1, w_fc2) + b_fc2) #正解データの型を定義 y = tf.placeholder(tf.float32, [None, 10]) #誤差関数(クロスエントロピー) loss = tf.reduce_mean(-tf.reduce_sum(y * tf.log(out), reduction_indices=[1])) クロスエントロピーを素で実装するとこうなる。
  78. 78. 78 プログラム作成  モデル構築(訓練〜評価) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #訓練 train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss) #評価 correct = tf.equal(tf.argmax(out,1), tf.argmax(y,1)) accuracy = tf.reduce_mean(tf.cast(correct, tf.float32)) 先ほどと同じ
  79. 79. 79 プログラム作成  実行  先ほどのmnistのプログラムと全く同じなので割愛  実行するとだいたい95%程度の精度  学習速度は圧倒的に遅い 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  80. 80. 80 第2章まとめ  TensorFlowはソースからビルドしよう  TensorFlowを用いて幾つかのニューラルネットワークの構築を行った  計算モデルの理解は3章におけるTensorBoardを見るのに役立ちます  多層パーセプトロンを改良してCNN、クロスエントロピーを導入した 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  81. 81. シーエイトラボ株式会社 第3章 TensorFlow の活用法 10月 TensorFlow講義 2016/10/21C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  82. 82. 82 TensorBoardについて 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  83. 83. 83 TensorBoardを用いた可視化  TensorBoardとは?  Webベースの構築モデル及び各種ログ可視化ツール  Events ・・・スカラ情報と時系列情報の相関  Images・・・画像データ  Graphs・・・データフロー及び負荷  Histograms・・・分布情報と時系列情報の相関  Audio・・・0.9から実装。音声情報 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved デバッグや結果の考察に利用 することにより機械学習のイテ レーションをサポートする非常に 強力なツール
  84. 84. 84 TensorBoardを使うには? 1. ログを取りたいところ全てに以下のような関数を仕込む 2. ログが多ければログのマージオペレーションを定義 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  85. 85. 85 TensorBoardを使うには? 3. SummaryWriterを呼び出して、対象のグラフ・ログ出力先を指定 ※宣言するとGraphsに対象のデータフローが描画される 4. ログ取得のオペレーションを実行・書き込み 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  86. 86. 86 TensorBoardを使うには? 6. 出来上がったログの上位のディレクトリをtensorboardコマンドで指定 7. ブラウザでポート6006番にアクセス 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved tensorboard –logdir ./logs/
  87. 87. 87 Events  スカラ情報と時系列情報を可視  誤差、学習率など  Step、Relative(相対時間)、Wall(絶対時間)ごとに見ることができる。  CSV、JSON形式でのダウンロードも可能 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  88. 88. 88 Images(画像データ出力)  注意点  画像でなければモデル構築時にエラー  (batch_size, width, height, channel)の4階テンソル  チャンネル数は1, 3, 4に対応  活用例  DataAugumentation時の画像確認  いちいち画像出力をしてlocalに落としてきてみる手間の削減  重みの可視化(グレースケール扱い)  畳み込み層のカーネルの可視化 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  89. 89. 89 Histograms(分布の可視化)  入力項目  数値のテンソルならなんでも可能  活用例  重みや出力の分布観測  重みも誤差も収束しているならうまくいっている、など 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 100% 93% 84% 69% 50% 色の濃さは分布の割合 をあらわす。
  90. 90. 90 Graphs(モデル可視化) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved ※ここは実際に動かしながら説明します
  91. 91. 91 Graphs(モデル可視化)  計算量やメモリ使用量、どのデバイスによる実行かも可視化可能 ※ここも動かしながら説明します・・・・ 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  92. 92. 92 Distributed TensorFlow それを支える共有重み 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  93. 93. 93 DistributedTensorFlowの 前に  TensorFlowの強みは大規模分散処理  (大規模)分散処理を行う際の注意点(一部私見が入ります)  何か深層学習で解決したい問題があるという場合でもGoogle、 MichroSoftなどが持っているデータのレベルでない限りオーバース ペックな手法  基本は1台のサーバにGPU数枚積むだけで十分  単純にGPUマシンを並列で並べても、逆に単体より遅いこともある (イーサネットの伝達スピードがボトルネック)  これを自分たちで解決できる手法を持っているところはスパコン作っ ているような企業 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved じゃあ何故そんな速さを求めるのか? グリッドサーチ
  94. 94. 94 データ並列処理  モデルパラレル  ニューラルネットワークのモデルそのものを並列化  分割されたそれぞれのモデルのパラメータはそれぞれのサーバが 保持 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved デバイス1 デバイス2
  95. 95. 95 データ並列処理  データパラレル  ミニバッチの数を並列化  最後にそれぞれの結果をマージ  SGDの特性上可能 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 𝑤𝑡+1 = 𝑤𝑡 − 𝛼 𝜕𝐸 𝜕𝑤 𝑤𝑡+1 = 𝑤𝑡 − 𝑚 × ( 𝛼 𝑚 𝜕𝐸 𝜕𝑤 ) 等価 この部分を各デバイスが分割 今回取り扱うのはこちら!
  96. 96. 96 今回行うこと 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved mastesrサーバ workerサーバ workerサーバ 順伝播、勾配計算を行う データ分割 返却された値の平均を計算 パラメータのアップデート 先ほどのMNIST手書き数字認識をデータパラレルで実行
  97. 97. 97 手順 1. TensorFlow grpc Serverをソースからビルド ※なぜかチュートリアルには書かれていない 2. 分散処理を行うサーバでTensorFlow grpc Server を起動 ※チュートリアルではCreate a tf.train.ClusterSpecを用いてクラスタ定 義を行い、tf.train.Serverを用いてサーバ起動を行っているが、今回は、 上記の方法で行う。 3. クライアントからプログラムを実行 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  98. 98. 98 クラスタ、job、task  クラスタはtaskの集合体  task・・・実際に実行する部分。例)この掛け算をGPU1で行う!  Jobは役割を定義しており、複数のtaskを持つことができる。Jobは 一つのサーバプロセスに紐ずく。  概念的にはcluster ∈ 𝑗𝑜𝑏 ∈ 𝑡𝑎𝑠𝑘という認識で大丈夫  Jobはあくまでサーバプロセスなので、一台のマシンにいくつも立て ることはできる  プログラム内でそれぞれのタスクをデバイス(CPU0, GPU0)に割り 振ることが可能 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 例)job:masterが計算の統括を行い、job:psはパラ メータサーバとしての役割を行う。
  99. 99. 99 サーバ構成 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved mastesrサーバ workerサーバ workerサーバ workerサーバはプロセスさえ動かしておけばTFのインストールは不要 10.132.0.2:2222 /job:master/task:0 10.132.0.4:2222 /job:worker2/task:0 10.132.0.3:2222 /job:worker1/task:0 ・パラメータ保持 ・パラメータ更新 ・クライアント サーバプロセスの起動、 TFのインストールが必要 順伝播 勾配計算
  100. 100. 100 本来ならば 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved mastesrサーバ workerサーバ workerサーバ ・パラメータの保持 ・パラメータの更新 モデルを構築してマスタ サーバに渡す 順伝播 勾配計算 パラメータサーバ client workerへの指示 クライアントとの橋渡し ログを取る、など
  101. 101. 101 データパラレルと重み共有  データパラレルの場合、masterが保持するグラフの重みを使い回す必 要がある  今までの書き方で普通に書いてしまうと、、、 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 一見これでいいように見えるが、これは server_numの数だけモデルを作ってしまい、同じ パラメータでの実行を行えない。
  102. 102. 102 variable_scopeの利用  第1章で使っていたname_scopeではなくvariable_scopeを用いるこ とで、変数ごとのスコープを取ることが可能  scope.reuse_variables()か、スコープ宣言時にresute=Trueにするこ とでモデル構築時に変数の使い回しが可能  その際用いるのはtf.Variable()ではなくtf.get_variable() 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  103. 103. 103 tf.get_variable  Reuseチェックを行い、同じvariable_scopeの重みがあればそれを再 利用する、なければ初期化  tf.Variableの場合は初期化に実際の値を入れていたが、 tf.get_variableの場合はinitializerを入れる 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  104. 104. 104 正直言うと  variable_sopeやget_variableを使わなくても重み共有は可能  dictionaryなどを利用して外部に値を保持  こ  ただしネットワークが大きくなったり複雑になるとリファクタリングなどが ものすごく大変 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  105. 105. 105 データパラレルの実装  順伝播、誤差関数、精度評価 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved ・前章の処理とほぼ同じ(処理ごとに関数にまとめてあります) ・訓練部分は分散実行しないので記載していません ・変更点はtf.get_variable()。初期化の引数に注意
  106. 106. 106 データパラレルの実装  masterにおけるパラメータサーバモデル構築 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Masterのjobでの実行を 明示 以降、このpsスコープで モデル構築を行うことで、 変数を共有 実行時に呼び出すよう にcollectionにadd
  107. 107. 107 データパラレルの実装 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved  workerプロセスでは順伝播を行い、それぞれのjobで行うように登録。 タスクがをそれぞれ別々 に行うように指示 Reuseを許可 この時点で値更新をす るのではなく、あくまで勾 配計算までにとどめてい る (gradient, variable)の tuppleを返却する。
  108. 108. 108 データパラレルの実装(重要)  Workerが計算した勾配をもとに共有されている重みをアップデート 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved いつも使うminimize(loss)は実はこのプログラムではでてこない Minimizeの中身は、compute_gradients+apply_gradients 移動平均計算をするときなどは分割して計算する(例:cifar10)
  109. 109. 109 avarage_gradientの中身(重 要)  各workerで勾配を受け取って、その平均を計算している部分 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved そのまま平均を取ろうと すると重みもバイアスも まとめて取ろうとしてしま うので注意!! 返却した後にapplyでき るように変数も入れてあ げる。
  110. 110. 110 訓練部分(重要) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved  セッションにはマスターサーバを指定。バッチを分割 モデル構築時にplaceholderも 複製しているので、それに合 わせてindexを指定。 全てのplaceholderを指定しな いと動かない。
  111. 111. 111 テスト部分  Collectionから取得しているので[0]を忘れるとprint時に型違いでエ ラーを吐くので注意 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 実際にサーバで動かしてみましょう!
  112. 112. 112 TensorFlowを用いた自然言語 の扱い(単語埋め込み) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  113. 113. 113 コンピュータ上での単語表現  従来手法  単語にIDを振る  ミコロフ革命以降  単語をベクトルして扱う!! 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 犬=1024, 猫=1025, こんにちは=543 …. 共起を計算して統計的に類似度などの解析はできるけど、相当数のデータは必要 だし、本当にそれでいいのか?
  114. 114. 114 単語埋め込み  Word2Vec  ニューラル言語モデルを用いた単語埋め込み  単語の意味獲得を行えるように 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Yoshua Bengio, Réjean Ducharme, Pascal Vincent, Christian Jauvin. A Neural Probabilistic Language Model. Journal of Machine Learning Research 3(2003):p1137– 1155 犬=(0.1, 0.5, 2.0, 0.4, 2.4) 猫=(0.1, 0.4, 1.5, 0.3, 2.4) 次に来る単語を予測するモデルを作る ことによって、 のように、各単語にベクトルを割り当てる。 王様 – 男性 + 女性 = 女王様 のようなベクトル演算が可能に
  115. 115. 115 単語埋め込み 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 0.1 ⋯ 0.1 ⋮ ⋱ ⋮ 0.2 ⋯ 0.3 ‘dog’を表すパラメータ dog human ‘human’を表すパラメータ単語ベクトルを集めた行列を用意してそれを辞書として利用 内積をとることで似ている単語を推定するなどが可能 単語のベクトルをニューラルネットワークの入力にも可能 どうやってその辞書を作るの?
  116. 116. 116 作り方(skip gram版)  単語に注目して、そこの周りにどんな単語があるか予測するNNを作る  重みは最初は適当な値で初期化 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 0.1 ⋯ 0.1 ⋮ ⋱ ⋮ 0.2 ⋯ 0.3 dog 単語ID1のドッグのベクトルを取得(これ が中間層の出力に) (0.1, 0.2,0.3・・・,0.1) dogのN次元埋め込みベクトル N×Vの重みを用意してあげてそれをか けて、それぞれの単語が次に来る確率を 出力 𝑦0 ⋮ 𝑦 𝑛 dogの出現確率 human humanの出現確率 学習された後の前半の 重みが単語の埋め込み 辞書になる
  117. 117. 117 負荷サンプリング  そのまま最終層のsoftmaxの計算をすると、単語数j分の𝑒 𝑥 𝑗 を計算しなければいけない  全部相手にせずに、分布にしたがって異なる単語を抜き出して、それら にが出現する確率が0かつ、正解データが出現確率確率が1になる確 率の積が大きい値になるようになるような誤差関数を定義 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 𝑦 = 𝑒 𝑥 𝑖 𝑗 𝑒 𝑥 𝑗 単語数が数十万になると凄まじい計算量になる 計算量を減らすsoftmax + cross entorypyのような もの
  118. 118. 118 負荷サンプリング 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 誤差関数 1. 最終層をシグモイド関数に変更 2. P(D=1)は最終層の出力のこと 3. P(D=0) = 1 - P(D=1) ややこしそうだけど、TFにはこれを1行でやってくれ る関数があります。
  119. 119. 119 プログラム  入力層〜中間層 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #入力データ正解データのph train_inputs = tf.placeholder(tf.int32, shape=[batch_size]) train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1]) #中間層 embeddings = tf.Variable(tf.random_uniform([vocab_size, embedding_size], - 1.0, 1.0)) embed = tf.nn.embedding_lookup(embeddings, train_inputs) 入力は単語IDの配列 それをenbeddings_lookupすることで内部的に計算して各単語ごと の組み込みベクトルを返してくれる
  120. 120. 120 プログラム  出力層〜誤差 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #出力層側の[単語サイズ, 組み込みサイズ]の重みとバイアスを定義 nce_weights = tf.Variable(tf.truncated_normal([vocab_size, embedding_size], stddev= 1.0/ math.sqrt(embedding_size))) nce_biases = tf.Variable(tf.zeros([vocab_size])) #誤差関数を定義 nce_loss = tf.nn.nce_loss(nce_weights, nce_biases, embed, train_labels, num_sampled, vocab_size) loss = tf.reduce_mean(nce_loss) 出力層側の重み、バイアス、中間層出力、正解データ、サンプリン グ数、総単語サイズを与えたら一気に計算してくれる。
  121. 121. 121 TensorFlowにおけるRNN入門 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  122. 122. 122 RNNとは(一応) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 入力1 入力2 入力3 中間1 中間2 中間3 出力1 出力2 出力3 中間層を時間方向に展開させることにより時系列 情報をニューラルネットワークで扱えるように。 入力-中間層の重み 中間-中間層の重み 共有重みを用いている
  123. 123. 123 こう見るとわかりやすい 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 入力値が時系列情報を持って どんどん中間層には入ってい く
  124. 124. 124 TensorFlowにおけるRNN実 装  インポートするべきパッケージ  tf.nn.rnn_cell・・・各時間の中間層における挙動を定義  tf.nn.rnnなど・・・入力とrnn_cellを受け取って、その出力を管理する  基本的なRNN構築手順  入力データ整形  cellを定義してラッピングなどをして各時間での挙動を定義  cellと入力データを元に、RNN全体で順伝播  出力を加工して出力層を作成  誤差計算、学習 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 今日の話は上記3つについて幾つかのパターンで
  125. 125. 125  cellを定義してラッピングなどをして各時間での挙動を定義  cellと入力データを元に、RNN全体で順伝播  出力を加工して出力層を作成 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  126. 126. 126 rnn_cell の役割 ニューラルネットワークでcellというと・・・ 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved x1 x2 x3 入力 出力 w1 w2 w3 b 入力を受け取って、一つの値を返す 一方TFにおけるrnn_cellは・・・ 入力 t 状態 t-1 状態 t 出力 t 入力と前の状態を受け取って、出力 と新しい状態を返す、ある一種の層 の役割を持つ。 単層やドロップアウト無しの場合出 力 tと状態 tは同じ ただしLSTMの場合は出力ゲートが あるため出力tと状態tは異なる。
  127. 127. 127 rnn_cellの役割  扱えるrnn_cell  BasicRNNCell・・・基本的なrnn_cell(これを基準に解説)  BasicLSTMCell・・・ピープホールやクリッピングのない基本的な LSTM用のcell  LSTMCell・・・いろんな機能が使えるLSTM用のcell  GRUCell・・・GRUが扱えるcell 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  128. 128. 128 rnn_cellの役割  定義したcellのラッピングが可能  MultiRNNCell・・・中間層を多層にできる。  DropoutWrapper・・・中間層にドロップアウト機能を追加  その他、後いくつか  例えば3層のLSTM、ドロップアウトの中間層を定義したければ 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  129. 129. 129  cellを定義してラッピングなどをして各時間での挙動を定義  cellと入力データを元に、RNN全体で順伝播  出力を加工して出力層を作成 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  130. 130. 130 tf.nn.rnnなどの役割  実際tf.nn.rnnの機能を使わなくてもcellと、for文、reuse_variablesを駆 使すれば可能(PTBのチュートリアルはそうなってる)  定義したcellを時間方向に展開して各時間でのrnnの出力を行う。  tf.nn.rnn・・・一般的なrnn実装。  tf.nn.dynamic_rnn・・・可変長RNN実装(これをメインで使う)  tf.nn. bidirectional_rnn等々  今回はseq2seqは扱いません 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved これらの関数は出力として、 (各時間の出力, 最後の時間の中間層)のタプルを返却
  131. 131. 131 rnnとdynamic_rnn  tf.nn.rnnとtf.nn.dynamic_rnnがある  rnn ・・・シーケンス長が固定  dynamic_rnn・・・シーケンス長が動的 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 入力1 入力2 入力3 中間1 中間2 中間3 出力1 出力2 出力3 ・・・・・・
  132. 132. 132 rnnとdynamic_rnn  それぞれのメリット・デメリット  tf.nn.rnnは固定長グラフ構築を行うためモデル構築が遅い。 dynamic_rnnは実行時に動的に実行する。代わりに実行が若干遅 い。  tf.nn.rnnは入力が(バッチサイズ, 入力サイズ)のtensorのリストで ないといけないためデータ構築が面倒。dynamic_rnnは(バッチサ イズ,シーケンス, データ長)のtensorで良いのでplaceholderで定義 しやすい。しかし、後述するがrnn出力を整形するフェーズになる際 にtf.nn.rnnの形の方が手間がかからないこともある! 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 個人的にはrnnにできてdynamic_rnnにできないことはないので dynamic_rnnを採用しています。
  133. 133. 133 tf.nn.dynamic_rnnの使い方 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved tf.nn.rnn_cellと入力データを引数にして各時間での出力、最終状態を返却 time_majorを用いたのtensor shapeの変更は後ほどの出力の整形でも効いてくる。
  134. 134. 134  cellを定義してラッピングなどをして各時間での挙動を定義  cellと入力データを元に、RNN全体で順伝播  出力を加工して出力層を作成 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  135. 135. 135 RNNのややこしいところ  普通のニューラルネットワークなら、、、、 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 出力を用いてすぐに誤差関数を定義可能
  136. 136. 136 RNNのややこしいところ  一方RNNは  (バッチサイズ, 時間, 中間層ユニット数)のtensorが tf.nn.dynamic_rnnにおける出力  この後出力層を定義するが、そのままoutputを使うことができない 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 適切にデータを整形する必要がある
  137. 137. 137 様々なRNNの形 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved http://karpathy.github.io/2015/05/21/rnn-effectiveness/ 今日はこれを実装
  138. 138. 138 many to one  必要なのは最終ステップの出力のみ  例:1行ずつ画像を読み込んで行って、その画像のクラス分類 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 入力1 入力2 入力3 中間1 中間2 中間2 出力3
  139. 139. 139 many to one実装  ポイントはtf.nn.dynamic_rnnの出力の最終時系列のデータだけを 引っ張ってくること 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Tensor操作になるのでちょっと手間
  140. 140. 140 ちなみに  tf.nn.rnn を使うと 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 時系列インデックスの配列で帰ってくるので普通に配列の最後にアクセスする だけ
  141. 141. 141 プログラム作成  インポートなど 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #-*- coding:utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function import input_data import tensorflow as tf #mnistデータを格納したオブジェクトを呼び出す mnist = input_data.read_data_sets('data')
  142. 142. 142 プログラム作成  モデル構築(入力データ整形) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #入力データ整形 num_seq = 28 num_input = 28 x = tf.placeholder(tf.float32, [None, 784]) input = tf.reshape(x, [-1, num_seq, num_input]) dynamic_rnnへの入力は[バッチサイズ, sequenceサイズ, 入力長] tf.reshapeで整形 ※num_seq* num_input=784にするように
  143. 143. 143 プログラム作成  モデル構築(rnn cell作成) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #ユニット数128個のLSTMセル cell = tf.nn.rnn_cell.BasicLSTMCell(num_units= 128) #三段に積む cell = tf.nn.rnn_cell.MultiRNNCell([cell]*3) 難しくないので色んなものを組み合わせて遊んでみてください
  144. 144. 144 プログラム作成  モデル構築(dynamic_rnn構築、最終時間のみのスライス) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #dynamic_rnn構築 outputs, states = tf.nn.dynamic_rnn(cell=cell, inputs=input, dtype=tf.float32, time_major=False) #シーケンス軸のランクを最初に来るように入れ替え #type_major=Trueにしていれば必要ない outputs = tf.transpose(outputs,[1, 0, 2]) #最後のシーケンスのデータのみスライス last_output = tf.gather(outputs, int(outputs.get_shape()[0]) -1) Last_outputは最終時間における[バッチサイズ, 出力長]となり、 いつものニューラルネットワークと同じ!!
  145. 145. 145 プログラム作成  モデル構築(出力層) 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #出力層 w = tf.Variable(tf.truncated_normal([128,10], stddev=0.1)) b = tf.Variable(tf.zeros([10])) out = tf.nn.softmax(tf.matmul(last_output, w ) + b) 以前書いたものと同じ。以降、lossや評価、実行も全て他のプログラムと同じ RNNなので計算時間もかかる上に、収束も遅い。
  146. 146. 146 第3章まとめ  TensorBoardを用いた学習状況の監視  計算グラフの可視化  無駄なログ取りをしないように注意  DistributedTensorFlowによる分散処理  データパラレルによる重み共有の重要性  TFにおける単語組み込み  単語扱いの基本と負荷サンプリングの実装  TFを用いたRNN入門  入出力のtensorの整形がほぼ全て  様々なパターンの実装を試した方がよい 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  147. 147. 147 お問い合わせ ご興味のある企業・団体・個人様は、以下までお問い合わせください。 シーエイトラボ株式会社 http://www.c8-lab.com 東京都港区赤坂 8-5-40 ペガサス青山 Tel 090-3320-2680 代表取締役社長/CEO 新村拓也 E-mail:tak@c8-lab.com 2016/10/21 C8Lab Copyright 2014 C8Lab Inc. All rights reserved C8Lab株式会社は東京大学発のベンチャー企業です。 東京大学人工物工学研究センターの太田順教授と C8Labの新村拓也氏が株式会社グローバルプレナーズと 共同研究した「SNSデータ分析によるオントロジーネット ワーク構築」の技術がCOMPYに応用されています。 「ソーシャル情報から抽出したユーザ行動目的に基づく推 薦システム」「同行者コンテキスト依存の文書抽出および トピック解析」「同行者依存のトピック発見モデル」など、 ユーザーの行動分析に関する研究で論文を多く発表して います。

×