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.

深層学習とTensorFlow入門

29,412 views

Published on

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

Published in: Data & Analytics
  • Be the first to comment

深層学習とTensorFlow入門

  1. 1. シンギュラリティ株式会社 第1章 ニューラルネットワークと深層学習 2017年9月 TensorFlow講義 2017/9/19C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  2. 2. 2 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved  自己紹介 新村拓也 - 東京大学工学部精密工学専攻卒業 - シーエイトラボ株式会社 代表取締役 - シンギュラリティ株式会社 取締役CTO - TFUG
  3. 3. 3 普段やっていること  データマイニング案件の受託開発  データ整形〜実行環境におけるPDCAまで 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved 要件定義及 びデータ項 目確認 設計 実験計画 データセット準備 モデ ル 実 装 学習・評価& チューニング  論文調査  手法選定  データ選定  インフラ設計 根幹に関わる部分なので慎重に 行う必要がある。  データセット収集  データセット作成  データ前処理  読込プログラム作成 経験上かなりの時間が 取られる  学習  評価  パラメータ変更  データ見直し もっとも時間がかかる フェーズ
  4. 4. 4 普段やっていること  データマイニング案件のコンサル  そもそもいきなりやるには無理な課題も多い 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved ドラえもん作って ・・・・ できる部分とできない部分を明確化して ロードマップを引いてお手伝いします 音声認識 文脈理解 感情判断 ・・・ はい、ぼくドラえもん 意味理解
  5. 5. 5 普段やってること  データマイニングエンジニア育成研修  基礎となる数学や統計  機械学習の各種手法  各手法の実装方法 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved 短期間のものがほとんどですが、3ヶ月〜6ヶ月かけたフルコースのものも ご相談ください 最近やっていませんが、 たまに無料でもやってます!
  6. 6. 6 最近やっていること  自社サービス開発 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved
  7. 7. 7 第1章の内容 ディープラーニングについて知る  そもそもディープラーニングって何?  Googleの猫って有名だけど具体的に何したの?  どういうことに使えるの?  ディープラーニングの凄いとこって? 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 教師なし学習なの?
  8. 8. 8 機械学習とは?  入力xを得て何らかの出力を生成するモデルがあるときに、このモデル を構成するパラメータを正解との誤差によって自動的に学習していくシ ステム 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 入力 モデル 出力 正解 誤差 パラメータを更新 例):各種物件情報 例):予測した家賃と実際の家賃の差
  9. 9. 9 教師あり学習、教師なし学習  教師あり学習  入力データに関して、それとは独立した正解ラベル、値をもとに行う 学習  教師なし学習  入力データに関して、恣意的に関数を決めたり、入力値をそのまま 正解にするなどして独立した正解値を必要としない学習  オートエンコーダー  強化学習  トピックモデル  クラスタリング 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved ペンギン 駅からの距離:100m 築:1年 広さ:40平米 10万円
  10. 10. 10 機械学習のモデル  機械学習のモデルといっても様々なものがある  決定木法  線形回帰、ロジスティック回帰  SVM  ニューラルネットワーク  K-means,階層型クラスタリング, MeanShift  pLSI, NMF, LDA  Lasso回帰、Ridge回帰、Elastic Net  ベイジアンネットワーク 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 「教師あり、教師なし」「分類、回帰」「2値分類、多値分類」などやりたいことに 応じて適切な手法を選択することが大切。 今日はこれに特化します
  11. 11. 11 ニューラルネットワーク 形式ニューロンモデルを組み合わせて脳を模倣したネットワーク。 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved x1 x2 x3 入力 出力 y w1 w2 w3 b 形式ニューロン ニューラルネットワーク
  12. 12. 12 ニューラルネットワークの特徴 2017/9/19 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 )  インプットとアウトプットの形を決めれば繰り返し処理でなんとかなる  シンプルが故にいろんな分野の情報を詳しい知識がなくても記述可能 単純な構造 発火関数
  13. 13. 13 ニューラルネットワークの特徴 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved ノードの数に比例して 「パラメータが増える」 =複雑な表現 シンプルな式で複雑な表現力!! 複雑な状態記述
  14. 14. 14 ニューラルネットワークの例 例)家賃の予測 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 正解と予測の誤 差20万円 誤差伝播で学習!  学習する対象はすべての重みwとバイアスb
  15. 15. 15 連鎖律と誤差逆伝播法  予測と正解の誤差が小さい≒良いニューラルネットワーク  本当は汎用性が高いものがいいネットワーク  どのように重みとバイアスを変更すれば誤差が小さくなるのか? 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 誤差E パラメータw, b パラメータが1個、2個なら微分(偏微分)して、最小を取るパラメータを直接求 めることができる。
  16. 16. 16 連鎖律と誤差逆伝播法  しかし、現実問題ではパラメータが多すぎて不可能 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 誤差E パラメータw, b 今ここ パラメータを変化させることで少しでも誤差が小さくなるようにパラ メータを変更する方法を模索
  17. 17. 17 連鎖律と誤差逆伝播法 重みを少し変化させた時に誤差関数がどのくらい変化するかを考える 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved ΔE = 𝜕𝐸 𝜕𝑤 Δw (誤差の変化量)=(wが変化した時どのくらい変化するか?)×(実際に変化したwの量) パラメータは複数あるので ΔE = 𝜕𝐸 𝜕𝑤1 Δ𝑤1 + 𝜕𝐸 𝜕𝑤2 Δ𝑤2 + ・・・= 𝑗 𝜕𝐸 𝜕𝑤 𝑗 ∆𝑤𝑗
  18. 18. 18 連鎖律と誤差逆伝播法 勾配の定義 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 𝛁𝑬 = ( 𝝏𝑬 𝝏𝒘 𝟏 , 𝝏𝑬 𝝏𝒘 𝟐 , 𝝏𝑬 𝝏𝒘 𝟑 , ・・・・) 関数を、それを構成するパラメータでそれぞれ偏微分したものを並べた配列 ΔE = 𝜕𝐸 𝜕𝑤1 Δ𝑤1 + 𝜕𝐸 𝜕𝑤2 Δ𝑤2 + ・・・= 𝑗 𝜕𝐸 𝜕𝑤 𝑗 ∆𝑤𝑗 = 𝛁𝑬∆𝒘 ∆𝑤 = ∆𝑤1 ∆𝑤2 ∆𝑤3 すると、実際に動かすパラメータの変化量の配列 を用いて、
  19. 19. 19 連鎖律と誤差逆伝播法 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved ∆𝐸 = 𝛻𝐸∆𝑤 の中で、我々が決めることができるのは∆wだけ!! ∆Eが0以下の値になれば訓練するたびに誤差は減っていく。 とすればその条件を満たせる。 ∆𝒘 = −𝜶 × ( 𝝏𝑬 𝝏𝒘 𝟏 , 𝝏𝑬 𝝏𝒘 𝟐 , 𝝏𝑬 𝝏𝒘 𝟑 , ・・・・) 𝑇 𝑤 = 𝑤 − 𝛼𝛻𝐸更新するルールは α:学習率(0< α <= 1.0)
  20. 20. 20 連鎖律と誤差逆伝播法 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 入力 出力,誤差・・・・・・ 最終層程度なら重みで誤差 関数を簡単に微分できるそれ以外の層の重みで微分する際 には連鎖律の観点で簡単に計算で きない
  21. 21. 21 連鎖律と誤差逆伝播法 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 𝑦 = 𝑥2 + 2𝑥 + 1 の時、𝑧 = 𝑦2 を𝑥で微分せよ。 𝑑𝑧 𝑑𝑥 = 𝑑𝑧 𝑑𝑦 × 𝑑𝑦 𝑑𝑥 (xが変化することによるzの変化量) =(yが変化することによるxの変化量)×(xが変化することによるyの変化量) NNでは各層の出力が、 次の層の入力になるために、 連鎖律を意識して勾配計算 を行う
  22. 22. 22 連鎖律と誤差逆伝播法 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 入力z 出力a 𝑎 = 𝑓(𝑧)なので、 𝜕𝐸 𝜕𝑧 = 𝜕𝐸 𝜕𝑎 𝜕𝑎 𝜕𝑧 を出力層から順番 に計算していくことで、誤差関数の勾配を計算 可能。 誤差E 発火関数の微分
  23. 23. 23 (広義)ディープラーニングとは? 多層のニューラルネットワーク(一応3層以上)で行われる機械学習。 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 入力 出力・・・・・・ 多層 複雑である(パラメータ数が多い)ほど、汎用的なモデルを説明できる どうして多層するの?
  24. 24. 24 多層NNにした時の欠点 過学習が起こってしまい、汎用性が無い。 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved パラメータの初期値によって良い モデルにたどり着けるかどうかは 決まってしまう。 解決策1:投入するデータを増やす。 解決策2:初期値をいい感じにする。 どちらも困難・・・
  25. 25. 25 多層NNにした時の欠点 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 誤差伝播 高レイヤ: フィードバックをしっかり 受けているが、訓練 データの影響が強く出 すぎている。 低レイヤ: フィードバックが 分散しすぎて届 かない。 ・・・・・・ 勾配消失が起こってしまい、学習が上手くいかない(進まない) 解決策:関係ある結合(パラメータ)だけを残してその他の結合を切る 漠然としててどうしたらいいものか・・・
  26. 26. 26 多層NNにした時の欠点 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 遅い!!!!! 一番どうしようもない・・・
  27. 27. 27 2010年代から話題になっている DLとは? 単なる多層NNの問題を解決した新世代の多層NNを用いた機械学習。  教師なし学習による事前学習などを行い、適した初期パラメータを獲得  例)オートエンコーダー  層間の結合を制限し、誤差が伝播するようにする  例)局所受容野、ドロップアウト  GPUの出現による計算速度向上  CUDAプログラミング  データセットの充実化  Image Net, Word Net 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  28. 28. 28 教師なしでの事前学習 初期パラメータをランダムで生成して教師あり学習 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 過学習が起きるかどうか運任せ(というかほぼ100% 過学習に陥る)。 似たようなデータは似たような特徴が出るように先にパラメータを調整しておいて から、教師あり学習を行おう! 犬 猫 犬 猫 猫 犬 猫 猫猫 犬 犬 犬
  29. 29. 29 例:オートエンコーダ 入力(信号)を可能な限り再現するようなニューラルネットワーク 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved エンコード デコード 生成されたパラメータから出 力された隠れ層は、入力情 報の特徴を表していると言え る。 ・圧縮しているだけなので、不要な 情報をそぎ落として、いいパラメー タ(特徴)を表している。 ・入力値が教師データとなるため、 「教師なし」で実現可能。
  30. 30. 30 ディープオートエンコーダ 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved オートエンコーダの隠れ層(特徴)を、次 の層のオートエンコーダの入力とする 入力の特徴 特徴の特徴 特徴の特徴の特徴 教師なしで最初からいい感じの初期パラメータで学習を始められる! =>過学習回避のためにそこまで多くの教師データを必要としない。
  31. 31. 31 層間の結合制限 関係がありそうな部分だけを結合させて、伝播が分散するのを防ぐ。 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 従来のDNN 最近噂のDNN 赤の領域の情報と緑の領域の情報を両方とも 次の層の同じニューロンに伝える。 赤の領域は一部のニューロンに、緑の領域は 別のニューロンに伝える。 関係が薄い領域が結合されて、徒らに誤差伝 播を阻害。 関係が深い領域だけを結合するため、誤差伝 播の効率が上がり、勾配消失を回避。
  32. 32. 32 局所受容野、共有重み 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 次の層のニューロンは、特定領域としか結びつかないようにする。 =>画像解析の場合は、空間的に特徴を捉えていくのでさらにGood!!
  33. 33. 33 グーグルの猫  Youtubeの画像1000万枚でとあるネットワークの事前学習を行った。  そいつに顔の画像を突っ込んで一番反応する ニューロンが81.7%の精度で顔認識できた。  そいつが一番反応する 画像を作ってみたところ  猫ちゃんで同じような画像作ってみたら 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved コレ コレ
  34. 34. 34 グーグルの論文  教師なしで事前学習させたネットワークでも十分機能する  なにやら特定の分野に反応するニューロンが自動的に生成されている らしい(おばあちゃん細胞説の確認)  しかもさらに教師あり学習で学習させて、分類機を作ったところ、いまま でのものより相対比70%以上精度向上した! 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  35. 35. 35 DL適用分野:画像認識 Selective Search+畳み込みニューラルネットワーク(CNN) RCNN, FasterRCNNなど 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved DeepCNNを用いた歩行者検知
  36. 36. 36 DL適用分野: 音声認識 再帰型ニューラルネットワーク(RCNN) 双方向RNN(Bi-directional RNN) 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Android端末のGoogle音声入力
  37. 37. 37 DL適用分野:言語解析 2017/9/19 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
  38. 38. 38 第1章のまとめ 巷で噂のディープラーニングって何? 単なる全結合、多層のNNの欠点を克服した凄いニューラルネットワークで 行う機械学習のこと。 教師なし学習って本当? あくまで初期パラメータをいい感じにする一つの手段。何か実現したければ 教師ありデータはいる。(強化学習は除く) どんな分野で使えるの? 工夫さえすればどんな分野でも。 どこが凄いの? パラメータが多くてもしっかり学習して、汎用性が非常に高いモデルをなぜ か構築してしまうところ。 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  39. 39. シンギュラリティ株式会社 第2章 TensorFlow 入門 10月 TensorFlow講義 2017/9/19C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  40. 40. 40 TensorFlowとは?  Googleが2015年11月10日に公開したオープンソース  ディープラーニング以外にも線形代数を用いた機械学習などで利用で きる。(ロジスティック回帰など)  Tensor(テンソル)のFlow(流れ)を記述して実行する  2017年9月現在、C++/Python/Java/GoでのAPIをサポート  2017年9月現在バージョンは1.3 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  41. 41. 41 そもそもTensorって テンソル(英: tensor, 独: Tensor)とは、線形的な量または線形的な幾何概念 を一般化したもので、基底を選べば、多次元の配列として表現できるようなもの である。 しかし、テンソル自身は、特定の座標系によらないで定まる対象である。 出典:Wikipedia 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 多次元配列ということで 大丈夫です。
  42. 42. 42 Tensor 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  43. 43. 43 TensorFlowの導入(ソースか らbuild)  Ubuntu14.04を想定(16だとgccのバージョン問題で古いのを入れない といけない)  GPU導入時は割愛(ドライバとCUDA、最近だとPascalアーキテクチャ 関連ではまるのでほとんどその話になる上に長くなります)  sudo権限を持ったユーザでの操作を想定(env環境上での構築は各々 やってください)  Pythonは3.6系  コマンドをこれから書く順で実行していけば入ります。 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  44. 44. 44 apt周りのインストール  依存関係のあるものをインストールしていきます 2017/9/19 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
  45. 45. 45 bazelの導入  Googleが開発したbuildツール「bazel」を導入します。 2017/9/19 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"
  46. 46. 46 TensorFlowのインストール  Gitリポジトリからソースをcloneしてきてからbuild 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #git からtensorflowをcloneしてくる git clone https://github.com/tensorflow/tensorflow #versionを指定したいときは必要なブランチをcheckout Git checkout (バージョン) #いつもの(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のパッケージ)
  47. 47. 47 動作確認  Pythonでインポートしてみる 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved python >>>import tensorflow as tf #すぐに動作確認しようとして、現在いるtensorflowのソースコードのディレクト リでimport tensorflow as tfをするとエラー吐くので、それ以外のところで動作 確認すべし 色々書きましたが、とりあえず試したい・練習したいとのことなら pip install tensorflow でも大丈夫です。
  48. 48. 48 TensorFlowの特徴  計算グラフを用いたBuild & Run  実行環境のSessionで構築モデルを実行  計算グラフにおけるノードは各種オペレーション  計算グラフにおけるエッジはオペレーションの入出力となるTensor  (buildツールにBazel), データのシリアライズ、でシリアライズに ProtocolBuffurを採用することで大規模分散に特化 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved ?????
  49. 49. 49 計算グラフ  まずはDLではなく単なる足し算や掛け算をするプログラムを使って、計 算グラフや、TFで出てくる用語を説明 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  50. 50. 50 計算グラフ 2017/9/19 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") add = tf.add(a, b) Variableやconstantは、変数・定数を出力 するという演算を行うという認識。
  51. 51. 51 計算グラフ 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Variable val1 const1 val1 add Input assign = tf.assign(b, add) c = tf.placeholder(tf.int32, name="input") mul = tf.multiply(assign, c) 変数に対する値の更新はassignを用いる assign placeholder 実行時の引数 mul 掛け算の結果
  52. 52. 52 計算グラフ 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Variable val1 const1 val1 add Input Init = tf. global_variables_initializer () 変数は初期化が必要 assign placeholder mul 掛け算の結果 init 構築したグラフをセッション上で動かす 初期化オペレーション
  53. 53. 53 計算グラフ 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Variable val1 const1 val1 add Input with tf.Session() as sess: sess.run(init) assign placeholder mul 掛け算の結果 init 構築したグラフをセッション上で動かす まずは初期化だけ実行
  54. 54. 54 計算グラフ 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Variable val1 const1 val1 add Input for i in range(3): print(sess.run(mul, feed_dict={c: 3})) assign placeholder mul 掛け算の結果 init mulの結果を3回実行 feed_dict: 2
  55. 55. 55 計算グラフ 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Variable val1 const1 val1 add Input for i in range(3): print(sess.run(add)) assign placeholder mul 掛け算の結果 init Addの部分だけ実行する際は、このグラフ でplaceholderは関係ないのでいらない。 assignも通らないので変数も更新されない
  56. 56. 56 計算グラフまとめ  計算グラフ構築の際は値のフローを定義しているだけで実行されない  実行されるのはSession上で実行した時のみ  計算グラフのどの部分を実行するかを指定して実行する  指定部分を計算するのに必要な部分は全て実行され、関係ない部分は されない  変数は初期化が必要  実行時に引数を渡したい時はPlaceholderで渡す 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  57. 57. 57 TensorFlowでNN入門  MNISTの手書き数字認識のニューラルネットワークを実装 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved ・ ・ ・ ・ 各ピクセルの画素値 784画素 ・ ・ ・ ・ 入力層 出力層中間層 入力画像が0〜9 である確率 入力画像が2である確率
  58. 58. 58 今回作成するネットワーク  入力値が0〜255と大きいので、255で割って0〜1にする  中間層の数は64個  入力層〜中間層への発火関数はReLUを採用  中間層〜出力層の発火関数はsoftmax関数を採用  誤差関数には二乗誤差を採用 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved y=x 𝑦 = 𝑒 𝑥 𝑖 𝑗 𝑒 𝑥 𝑗 𝐸 = (𝑎 − 𝑦)2 softmax関数 二乗誤差関数
  59. 59. 59 ミニバッチについて  NNの学習は  順伝播させた結果の誤差を計算  誤差を重みで偏微分(勾配を計算)  計算した勾配を用いて重みをアップデート 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 毎回のこの操作、全訓練データを 用いて行っても良いのだろうか?
  60. 60. 60 ミニバッチについて  全データを用いて学習を行うと  とてつもない計算時間がかかる  そもそもメモリに乗らない  以下のように局所解におちいると詰む 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 誤差E パラメータw, b 右に行っても左に行っても次 のステップで戻って来てしまう
  61. 61. 61 ミニバッチについて  そこで毎ステップ、訓練に用いるデータはランダムにとってくる  計算速度も向上  毎回勾配を計算する関数が変わるので局所解に陥りにくい  データの中からランダムにサンプリングしているために、寄り道しな がらも着実に真の解に近づいていく 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Stocastic Gradient Descent (SGD) 確率的勾配降下方 毎ステップごとに用いられる訓練データ群をミニバッチ そのサイズをバッチサイズと呼ぶ。 バッチサイズはハイパーパラメータ。
  62. 62. 62 入出力データ  入力データ  (ミニバッチサイズ,画素数)の2階テンソル(行列)  出力データ  (ミニバッチサイズ,数字の種類)の2回テンソル 2017/9/19 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種類)の確率を 表す
  63. 63. 63 入出力データ  正解データ  出力データと同じ形  ただし、正解の数字の部分のみが1.0その他は0.0のワンホットベク トルを並べた行列 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 1.0 ⋯ 0.0 ⋮ ⋱ ⋮ 0.0 ⋯ 1.0 1番目の画像は0だと いう正解 n番目の画像は9だと いう正解
  64. 64. 64 誤差の計算  正解データと出力データを引き算して2乗、そのあと平均をとる 2017/9/19 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 の全要素の平均を計算 誤差として扱う!!
  65. 65. 65 プログラム作成  importおよびデータセット準備 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #-*- coding:utf-8 -*- from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf #mnistデータを格納したオブジェクトを呼び出す mnist = input_data.read_data_sets('data/’, one_hot=True) mnistデータを呼び出す 関数 mnist.train.image・・・訓練用入力データの配列 mnist.train.labels・・・訓練用正解データの配列 mnist.train.next_batch(50) 訓練データ50個を取り出して、(入力データ,正解データ) のタプルで返却してくれる
  66. 66. 66 プログラム作成  モデル構築(入力層〜中間層) 2017/9/19 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で定義する。 初期値を与えて、初期化する 必要がある
  67. 67. 67 プログラム作成 2017/9/19 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番目の画像を重みにかけた中間層への 入力
  68. 68. 68 プログラム作成  モデル構築(入力層〜中間層) 2017/9/19 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にもある、ブロードキャスティン グ機能
  69. 69. 69 プログラム作成  モデル構築(中間層〜出力層) 2017/9/19 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関数になっている。
  70. 70. 70 プログラム作成  モデル構築(誤差計算と訓練) 2017/9/19 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は平均や合計を取りながら次元を削減してくれる。 axisを指定しなければ全ての要素や平均を取ってスカラーにする。 学習率 0.1 ⋯ 0.1 ⋮ ⋱ ⋮ 0.2 ⋯ 0.3 ( 𝑥0 … 𝑥 𝑚) 𝑦0 ⋮ 𝑦 𝑛 axis=0 axis=1 Optimizerのminimizeを実行すること で自動的に勾配を計算して値を更新 してくれる。 compute_gradients + apply_gradients
  71. 71. 71 プログラム作成  モデル構築(評価) 2017/9/19 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階テンソルを返す
  72. 72. 72 プログラム作成  簡単に今回のモデルを計算グラフで表すと 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 順伝播実行 誤差計算 訓練 評価 入力データ 正解データ
  73. 73. 73 プログラム作成  実行(訓練) 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved with tf.Session() as sess: #初期化 init =tf.global_variables_initializer() sess.run(init) #テストデータをロード test_images = mnist.test.images test_labels = mnist.test.labels for i in range(1000): step = i+1 train_images, train_labels = mnist.train.next_batch(50) sess.run(train_step, feed_dict={x:train_images ,y:train_labels}) Placeholderに値を与え て、訓練のオペレーショ ンを実行 実行数=stepと数を合わ せるため
  74. 74. 74 プログラム作成 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 順伝播実行 誤差計算 訓練 評価 入力データ 正解データ これを実行
  75. 75. 75 プログラム作成  実行(評価) 2017/9/19 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%程度の精度
  76. 76. 76 プログラム作成 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 順伝播実行 誤差計算 訓練 評価 入力データ 正解データ
  77. 77. 77 もう少し改良はできないか・・・  もっと多層にすればいいのではないか?  ディープニューラルネットワークに!!  そのまま画像ピクセルを入れているがもう少し画像を形として捉えられ ないか?  畳み込みニューラルネットワークを導入  誤差関数は本当に単純な二乗誤差でいいの?  クロスエントロピーの導入 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved それではやっていきましょう!
  78. 78. 78 畳み込みニューラルネットワーク 画像処理でいうフィルタ処理を用いてデータの特徴を抽出していくニューラ ルネットワーク 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 縦線を検知したりぼかしを入れることが可能 http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_con volution
  79. 79. 79 畳み込みニューラルネットワーク  一般的に様々な特徴を検知するフィルタは確率されているが、どんな フィルタを採用すればいいかはわからない・・・ 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 畳み込みニューラルネットワークが学習するのは、 このフィルタの値! ・画像を扱う際に空間情報を意識 ・余計な結合が切り離されているた めに多層にしても大丈夫! GOOD!!
  80. 80. 80 さらにざっくり説明 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 32×32の1チャンネル画像を、 28×28の6チャンネル画像に畳 み込み 32×32の1枚の画像を28×28の6枚の画像に変換したという認識で大丈夫!! 画像は複数のチャンネル(画像)を重ね合わせているものであると理解する。 midiのチャンネルのようなもの
  81. 81. 81 クロスエントロピー  分類問題では必ずと言っていいほど使われる  二乗誤差関数だと学習量が、大きく間違った際に発火関数の微分に比 例するため学習が遅くなる  それを避けて、出力が0,1 に近い値を出して間違った際に大きく学習さ せて学習を高速化するための誤差関数 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 𝐸 = − 𝑖 𝑎𝑖 log(𝑦𝑖 + 𝜖) 𝑎𝑖: 正解データ 𝑦𝑖: 出力データ 数学的には同時確率を見ている 実装の際には出力がほぼ0にな ると値が発散するので微少量を かける
  82. 82. 82 今回作成するプログラム  入力データ(28×28の1チャンネル)を5×5のフィルタで32チャンネルに 畳み込み  出てきた画像を2×2のフィルタでmaxプーリング  出てきた画像を5×5のフィルタで64チャンネルに畳み込み  出てきた画像を2×2のフィルタでmaxプーリング  出てきた画像を1024個のユニットの全結合層に変換  softmax関数で10ユニットの最終層出力  最終層以外の発火関数はReLU 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  83. 83. 83 プログラム作成  importおよびデータセット準備 2017/9/19 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 from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf #mnistデータを格納したオブジェクトを呼び出す mnist = input_data.read_data_sets('data') さっきと同じ
  84. 84. 84 プログラム作成  モデル構築(入力層〜畳み込み層1) 2017/9/19 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
  85. 85. 85 プログラム作成  モデル構築(バイアス+プーリング層2) 2017/9/19 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
  86. 86. 86 プログラム作成  モデル構築(畳み込み層2〜プーリング層2) 2017/9/19 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') 先ほどと同じ要領で
  87. 87. 87 プログラム作成  モデル構築(全結合層) 2017/9/19 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をとってきて掛け算し ても良い
  88. 88. 88 プログラム作成  モデル構築(出力層〜誤差関数) 2017/9/19 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])) クロスエントロピーを素で実装するとこうなる。
  89. 89. 89 プログラム作成  モデル構築(訓練〜評価) 2017/9/19 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)) 先ほどと同じ
  90. 90. 90 プログラム作成  実行  先ほどのmnistのプログラムと全く同じなので割愛  実行するとだいたい95%程度の精度  学習速度は圧倒的に遅い 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  91. 91. 91 第2章まとめ  TensorFlowはソースからビルドしよう  TensorFlowを用いて幾つかのニューラルネットワークの構築を行った  計算モデルの理解は3章におけるTensorBoardを見るのに役立ちます  多層パーセプトロンを改良してCNN、クロスエントロピーを導入した 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  92. 92. シンギュラリティ株式会社 第3章 TensorFlow の活用法 10月 TensorFlow講義 2017/9/19C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  93. 93. 93 TensorBoardにおけるモデル保存 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  94. 94. 94 TFのモデルの保存方法  TensorFlowから読み込めるCheckpointファイル  基本的な方法はこちら  実行環境にPython/TensorFlowがインストールされている場合に用 いる  ProtocolBuffers形式でのエクスポート  学習したモデルをiOSやAndroidで動かす際に用いる  Pythonで学習したモデルを他の端末で実行するとき 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved ProtocolBuffers Googleが開発したシリアライズフォーマット。JSONやXMLのようなもの。 今回はTFがインストールされていることを前提として Checkpointを用いたモデル保存を説明します。
  95. 95. 95 今回やること  おなじみMNISTを用いた手書き文字認識  学習の過程で一定ステップごとにモデルを保存  訓練が終わって、再び学習した時に今まで学習を行ったステップから再 開できるように 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved 学習(1000ステップ) モデル出力 読込 再学習(1000-2000ステップ) 出力 モデル2
  96. 96. 96 割愛 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved
  97. 97. 97 モデルを保存するには 1. tf.train.Saverオブジェクトを生成 2. 保存したいステップの時にsave 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved saver = tf.train.Saver() with tf.Session() as sess: sess.run(init) for i in range(1000): #step数とイテレーション数を合わせる step = i + 1 (訓練・割愛) if step % 100 == 0: saver.save(sess, ‘models/my_model’, global_step = step) models直下にmy_modelという名前で 名前の後に何step目のモデルかを付与
  98. 98. 98 何が起こるか?  models直下になんかいっぱい出てきます 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved
  99. 99. 99 ファイルの説明  checkpoint  1ファイルのみ生成  今このディレクトリにどのファイルがあって、最新がどのファイルかを 記載している  エディタで開ける 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved model_checkpoint_path: "my_model-1000” all_model_checkpoint_paths: "my_model-600” all_model_checkpoint_paths: "my_model-700” all_model_checkpoint_paths: "my_model-800” all_model_checkpoint_paths: "my_model-900” all_model_checkpoint_paths: "my_model-1000" 最新のモデル 全てのモデル
  100. 100. 100 ファイルの説明  拡張子metaファイル  例: my_model-1000.meta  構築したモデルの構造を記述したファイル  重みなどのは保持しない  モデル構築をプログラム内で記述する限りは何ステップ目であろう が普通は変更されることはない(ファイル出力するだけ無駄) 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved saver.save(sess, ‘models/my_model’, global_step = step, write_meta_graph=False) こうしておけば生成されなくなる
  101. 101. 101 ファイルの説明  拡張子dataファイル  実際の重みの値が入ったバイナリ  拡張子indexファイル  どのファイルがどのstepのものかを一意に特定するためのバイナリ 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved これらはsaveメソッドを呼んだ数だけ 生成される 100-1000ステップまで10件ずつ出 来上がるはずなのにどうして600- 1000の5件しかないのだろう?
  102. 102. 102 tf.train.Saver()について  無限に増えてディスクを圧縮しないように何世代までは保存するかを制 御してくれている  max_to_keepを0かNoneにすると全て生成される(オススメはしない)  他にも何時間分だけ生成のようなことも可能 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved saver = tf.train.Saver(max_to_keep=3) #3世代までに制限
  103. 103. 103 tf.train.Saver()について  第一引数に何も入れていないと、それまでに出てきたgraph内の全て の変数を保存するという意味になる  一部だけを保存したい(特定の層だけ保存など)は 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved saver = tf.train.Saver( {'v1': v1, 'v2': v2} )
  104. 104. 104 保存したモデルを読み込むには 1. checkpointファイルがあるかどうかを確認 2. モデル読み込み 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved with tf.Session() as sess: ckpt_state = tf.train.get_checkpoint_state('models/’) if ckpt_state: #読み込み処理 last_model = ckpt_state.model_checkpoint_path saver.restore(sess, last_model) else: #初期化 sess.run(init)
  105. 105. 105 補足 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved model_checkpoint_path: "my_model-1000” all_model_checkpoint_paths: "my_model-800” all_model_checkpoint_paths: "my_model-900” all_model_checkpoint_paths: "my_model-1000" last_model = ckpt_state.model_checkpoint_path saver.restore(sess, last_model) これのこと 残り三つはProtocolBuffers の定義上は配列 model = ckpt_state. all_model_checkpoint_paths[0] saver.restore(sess, model) こうすれば上記だと800ステップ目のファイルを読み込める ※tensorflow/tensorflow/python/training/checkpoint_state.protoをご覧ください
  106. 106. 106 ステップ数の制御  1回訓練が終わってしまうと今何ステップ目かわからない  checkpointのファイルをopenして文字処理してステップ数取得!  現在のステップ数も変数として保存してしまう 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved 美しくない global_step = tf.Variable(0, name='global_step', trainable=False) train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss, global_step=global_step) minimizeメソッドにメソッドのglobal_step引数に変数を入れておく とminimizeメソッドを呼ぶ時にincrementしてくれる!
  107. 107. 107 おまけ  TFのモデル構築を同一ファイル内でやらない場合はmetaファイルが入 ります  実行用のプログラム自体はシンプルにしたい時など 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved with tf.Session() as sess: saver = tf.train.import_meta_graph(’models/my_model-1000.meta') last_model = ckpt_state.model_checkpoint_path saver.restore(sess, last_model) その前でグラフが定義されていないのでこれを先に入れないとエラーになる
  108. 108. 108 実行デモ 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  109. 109. 109 まとめ  tf.train.Saver()メソッドでグラフ内の全変数を保存対象に  max_to_keepで世代は制御  saveメソッドでモデルを保存  write_meta_graph=Falseをお忘れなく  ckptファイルの中身を指定してrstoreメソッドで値をロード  ckpt自体がないときは初期化するようにするとよい  ステップ数保持のためにminimizeメソッドのglobal_step引数を利用 する 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved
  110. 110. 110 TensorBoardについて 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  111. 111. 111 TensorBoard  TensorBoardとは?  Webベースの構築モデル及び各種ログ可視化ツール  Scalars ・・・スカラ情報と時系列情報の関係  Images・・・画像データ  Audio・・・音声データ  Graphs・・・データフロー、使用デバイス、計算量などの可視化  Distributions・・・確率分布情報と時系列情報の関係  Histograms・・・度数分布情報と時系列情報の関係  Embeddings・・・データを空間に組み込んで可視化  Text・・・r1.1から追加。テキスト情報 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved デバッグや結果の考察に利用 することにより機械学習のイテ レーションをサポートする非常に 強力なツール
  112. 112. 112 TensorBoardの使うには? 1. 必要なところにログを取得するオペレーションを定義 2. 定義したらこれらのオペレーションをマージすることも可能 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved loss_summary = tf.summary.scalar(‘loss’, loss) # Scalars img_summary = tf.summary.image(‘input_data’, images, 10) # Images w_histogram = tf.summary.histogram('w', w) # Histograms, Distributions # 全てのログをマージするオペレーション summary_op = tf.summary.merge_all() # 一部のログをマージするオペレーション summary_op = tf.summary.merge([loss_summary, img_summary]) ※出力結果などを得るのと同様、ログもSession内で実行しないとログを取ってくれない
  113. 113. 113 TensorBoardを使うには? 3. Writerを呼び出して対象のグラフと出力先を指定 4. ログ取得のオペレーションを実行してその結果をWriterで書き込み 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved summary_writer = tf.summary.FileWriter( ‘logs’, sess.graph) ※宣言するとGraphsに対象のデータフローが描画される # ログ取得を実行 summary = sess.run(summary_op, feed_dict={x:hoge, y:fuga}) # 取得した結果をwriterで書き込み summary_writer.add_summary(summary, step)
  114. 114. 114 TensorBoardを使うには? 6. 出来上がったログの上位のディレクトリをtensorboardコマンドで指定 7. ブラウザでポート6006番にアクセス 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved tensorboard –logdir ./logs/
  115. 115. 115 Events  スカラ情報と時系列情報を可視  誤差、学習率など  Step、Relative(相対時間)、Wall(絶対時間)ごとに見ることができる。  CSV、JSON形式でのダウンロードも可能 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  116. 116. 116 Images(画像データ出力)  注意点  画像でなければモデル構築時にエラー  (batch_size, width, height, channel)の4階テンソル  チャンネル数は1, 3, 4に対応  活用例  DataAugumentation時の画像確認  いちいち画像出力をしてlocalに落としてきてみる手間の削減  重みの可視化(グレースケール扱い)  畳み込み層のカーネルの可視化 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  117. 117. 117 Distributions  入力項目  数値のテンソルならなんでも可能  活用例  重みや出力の分布観測  重みも誤差も収束しているならうまくいっている、など 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 100% 93% 84% 69% 50% 色の濃さは分布の割合 をあらわす。
  118. 118. 118 Histogramus  Distributionsが確率分布を可視化するのに対してHistogramsは度 数分布を可視化  Distributionsを別の観点から見たもの 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved
  119. 119. 119 Graphs(モデル可視化) 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 定義したグラフの中身を可視化
  120. 120. 120 Graphs(モデル可視化)  計算量やメモリ使用量、どのデバイスによる実行かも可視化可能 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  121. 121. 121 Embeddings  高次元データを、PCAとt-SENを用いて3次元空間に組み込み  中間層の値などを組み込んで分類がうまくいっているかを確認 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved ※ログの取り方が他のものとはかなり違う
  122. 122. 122 Text  TensorFlow1.1から追加  文章情報を保持  各ステップで生成した文章などを確認できる 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved
  123. 123. 123 これからやること  先ほどのプログラムを改良してTensorBoardのログを取れるようにす る  Scalars, Images, Graphs, Distributions, Histogramsを動かしなが ら説明  テストデータを用いいて学習済み中間層の値を組み込み  Embeddingを動かしながら説明  おまけでText用のサンプルプログラムを用いてTextを説明 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved
  124. 124. 124 前準備  定数なども増えてくるのでtf.app.flagsを用いて一元管理 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved import tensorflow as tf FLAGS = tf.app.flags.FLAGS tf.app.flags.DEFINE_string('data_dir', 'data/', "data set directory.") tf.app.flags.DEFINE_float(‘learning_rate’, 0.5, “learning rate.”)’ ・ ・ ・ def main(argv): # 行う処理 if __name__ == '__main__': tf.app.run() こう書くことでargparseなどを用いる必要がなくなる
  125. 125. 125 入力画像のログを取る  画像ではなくバイナリできているので、パーサーがうまく動いているか不 安な時など  第一引数は保存する際のname, 第二引数が画像のTensor  tf.summary.imageの第三引数は最大で何枚保存するかを指定 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved #データセット作成 mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True) x = tf.placeholder(tf.float32, [None, 784], name='input') #入力画像を確認 images = tf.reshape(x,[-1,28,28,1]) tf.summary.image("input_data", images, 10) 入力画像は3階テンソルでないといけないのでreshapeする。
  126. 126. 126 name_spaceの活用  そのまま書くと、オペレーションが多すぎてGraphsが訳のわからないこ とになるので、処理単位でname_spaceを切ってあげる  オペレーションにも変数にもnameを振るとあとあと楽  h_1はこの場合「inference/hidden/feature:0」という名前で保存され る 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved #推論 with tf.name_scope('inference'): with tf.name_scope('hidden'): w_1 = tf.Variable(tf.truncated_normal([784, 64], stddev=0.1), name='w') b_1 = tf.Variable(tf.zeros([64]), name='b') h_1 = tf.nn.relu(tf.matmul(x, w_1) + b_1, name='feature')
  127. 127. 127 分布やスカラーの誤差を取る  tf.summary.histogramを定義するとDistributions, Histograms両 方の画面が活用できる  Tensorのshapeはなんでも良い  Scalarについてはその名の通りスカラー(0階テンソルを入れる必要が ある) 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved #誤差 with tf.name_scope('loss'): each_loss = tf.reduce_mean(tf.square(y-out), axis=[1]) loss = tf.reduce_mean(each_loss) tf.summary.histogram('each_loss', each_loss) tf.summary.scalar("loss", loss) 単なる平均誤差時だけでなく、分布を取ると最大誤差や最小誤差 もTensorBoardで確認できる
  128. 128. 128 ログのマージ  本来今まで仕込んだログを、sess.run([log1,log2,・・・])しないといけな いのだが面倒  下記のようにすると、sess.run(summary_op)で全てのログが取得可 能  とりたいログを全てグラフ上で定義した後に宣言する必要がある  一部だけマージしたければ以下のように 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved #ログのマージ summary_op = tf.summary.merge_all() #ログのマージ summary_op = tf.summary.merge([log1, log2, log3])
  129. 129. 129 Writerの定義  ログ出力先、対象のグラフを引数に与える  複数のwriterを定義(出力先を分離)すればパラメータが異なる場合や 訓練、テストを分けてログ出力可能 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved #writerの宣言 summary_writer = tf.summary.FileWriter(FLAGS.log_dir, sess.graph)
  130. 130. 130 一定ステップごとにログ保存  頻繁にとりすぎるとIOがボトルネックになり、学習フェーズがいくら早くて もプログラムの実行が終わらないので注意 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved # 一定ステップごとにログを吐く if step % 10 == 0: run_opt = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) run_meta = tf.RunMetadata() #ログ取得を実行 summary_str = sess.run(summary_op, feed_dict={x:test_images, y:test_labels}, options=run_opt, run_metadata=run_meta) #結果をログファイルに出力 summary_writer.add_summary(summary_str, step) summary_writer.add_run_metadata(run_meta, 'step%d'%step)
  131. 131. 131 TensorBoardデモ 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  132. 132. 132 Embeddingsを用いるには  注意して欲しいのが、embeddingはTensorBoardのログファイルを見 ないで、前章で説明したチェックポイントファイル(.dataファイル)を見て いる  ログファイルはないけど何やら重み、バイアスを組み込もうとしている  見ているのはtf.Variable()の情報 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved tensorboard –logdir ./models/
  133. 133. 133 Embeddingsを用いるには 1. 組み込みたい値をtf.Variableの形で定義 2. チェックポイント形式で保存してあげる([バッチサイズ,要素数]の2階テ ンソル) 3. 各ベクトルとラベルの組み合わせを用意してあげる 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved 現状のプログラムだと中間層の値をVariableとして保存していないので 一手間必要 どの画像がどのラベルなのかは順番の変わらないTestデータを用いれば 簡単に作れそう
  134. 134. 134 学習済みのデータからロード 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved with tf.Session() as sess: state = tf.train.get_checkpoint_state(FLAGS.model_dir) #構築済みのmetaデータをロードしてくる。 #グラフを定義していないのでdefaultグラフにロードされる meta_path = FLAGS.model_dir + FLAGS.meta_file saver = tf.train.import_meta_graph(meta_path) #最新の値でモデルをロード saver.restore(sess, state.model_checkpoint_path) 前章ではあまり話さなかった.metaファイルを用いてロードすると楽
  135. 135. 135 必要な値にアクセス  特に定義していないとデフォルトのグラフにロードされる  ネームスペースに注意して必要な情報にアクセス 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved #デフォルトグラフにアクセス graph = tf.get_default_graph() #グラフから必要な要素を取得してくる x = graph.get_tensor_by_name('input:0') feature = graph.get_tensor_by_name('inference/hidden/feature:0') test_images = mnist.test.images #feature_valにテストデータを入力した時の実際の値が入る feature_val = sess.run(feature, feed_dict={x: test_images}) name_spaceに注意して値をロード
  136. 136. 136 値を初期化して保存  ロードしたモデルはmodels/だが、今度保存するのはlogs/にするので 注意 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved #初期値をfeature_valの値にしてあげて初期化して保存 embed_val = tf.Variable(feature_val, trainable=False, name='embedded') sess.run(tf.variables_initializer([embed_val])) #保存 saver2 = tf.train.Saver([embed_val]) saver2.save(sess, FLAGS.log_dir+'feature') 初期値に実際の値を入れて初期化すると必要な変数が手に入る この場合Saverは変える必要がある
  137. 137. 137 残タスク 1. 組み込みたい値をtf.Variableの形で定義 2. チェックポイント形式で保存してあげる([バッチサイズ,要素数]の2階テ ンソル) 3. 各ベクトルとラベルの組み合わせを用意してあげる 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved
  138. 138. 138 メタデータとのひもづけ  ややこしそうがやっていることは  下記のファイルを作ること 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved Index Label 0 7 1 2 2 1 3 0 4 4 5 1 meta.tsv embeddings { tensor_name: "embedded:0" metadata_path: "meta.tsv" } projector_config.pbtxt 何番目のベクトルが〇〇の画像だよ 組み込んだベクトルの名前とその対 応ファイルがどこにあるか?
  139. 139. 139 projector_config.pbtxt  おまじないが多いが、要するにtensor_nameとmetadata_pathを設定 しているだけ 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved #メタデータと対象のVariable の紐付けを行う summary_writer = tf.summary.FileWriter(FLAGS.log_dir) config = projector.ProjectorConfig() embedding = config.embeddings.add() #Variableの名前を登録 embedding.tensor_name = embed_val.name #メタデータファイル名(TensorBoard起動ディレクトリからの相対パス) embedding.metadata_path = "meta.tsv” #登録 projector.visualize_embeddings(summary_writer, config)
  140. 140. 140 meta.tsv  ただのファイル整形 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved
  141. 141. 141 TensorBoardデモ 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  142. 142. 142 Text  name_scopeやステップ数を分けて文章を表示する用のもの  まだ、できたばかりであまりあっても個人的にはありがたくない  文章生成などの結果確認を可視化できる 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved
  143. 143. 143 Textの使い方  Text型のTensorを使うことはあまりないが、普通のテンソルと変わらな い  一応別のname_scopeでもとってみる 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved text_list = ['text0','text1','text2','text3','text4','text5'] # tf.constantを使ってもいい test_string = tf.convert_to_tensor('Test String.') outer_summary = tf.summary.text('out',test_string) with tf.name_scope('scope_test') as scope: text_ph = tf.placeholder(tf.string,name='input') inner_summary = tf.summary.text('in', text_ph) summary_op = tf.summary.merge_all() あとは割愛
  144. 144. 144 TensorBoardデモ 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  145. 145. 145 まとめ  基本はログ取得・マージ・書き込み  name_scopeをうまく活用してより見やすい形にする  Embeddingsは特殊なので注意  様々な機能があるので用途に応じて柔軟に使い分ける  Webベースなので結果をみるだけならTensorFlowの実行環境はいら ないのがいいところ 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved
  146. 146. 146 TensorFlowにおけるRNN入門 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  147. 147. 147 RNNとは(一応) 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved 入力1 入力2 入力3 中間1 中間2 中間3 出力1 出力2 出力3 中間層を時間方向に展開させることにより時系列 情報をニューラルネットワークで扱えるように。 入力-中間層の重み 中間-中間層の重み 共有重みを用いている
  148. 148. 148 TensorFlowにおけるRNN実 装  インポートするべきパッケージ  tf.nn.rnn_cell・・・各時間の中間層における挙動を定義  tf.nn.static_rnnなど・・・入力とrnn_cellを受け取って、その出力を管 理する  基本的なRNN構築手順  入力データ整形  cellを定義してラッピングなどをして各時間での挙動を定義  cellと入力データを元に、RNN全体で順伝播  出力を加工して出力層を作成  誤差計算、学習 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved
  149. 149. 149  cellを定義してラッピングなどをして各時間での挙動を定義  cellと入力データを元に、RNN全体で順伝播  出力を加工して出力層を作成 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved
  150. 150. 150 rnn_cell の役割 ニューラルネットワークでcellというと・・・ 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved x1 x2 x3 入力 出力 w1 w2 w3 b 入力を受け取って、一つの値を返す 一方TFにおけるrnn_cellは・・・ 入力 t 状態 t-1 状態 t 出力 t 入力と前の状態を受け取って、出力 と新しい状態を返す、ある一種の層 の役割を持つ。 単層やドロップアウト無しの場合出 力 tと状態 tは同じ ただしLSTMの場合は出力ゲートが あるため出力tと状態tは異なる。
  151. 151. 151 rnn_cellの役割  扱えるrnn_cell  BasicRNNCell・・・基本的なrnn_cell(これを基準に解説)  BasicLSTMCell・・・ピープホールやクリッピングのない基本的な LSTM用のcell  LSTMCell・・・いろんな機能が使えるLSTM用のcell  GRUCell・・・GRUが扱えるcell  tf.contrib.rnnの中にはかなりたくさんある 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved
  152. 152. 152 rnn_cellの役割  定義したcellのラッピングが可能  MultiRNNCell・・・中間層を多層にできる。  DropoutWrapper・・・中間層にドロップアウト機能を追加  その他、後いくつか  例えば3層のLSTM、ドロップアウトの中間層を定義したければ 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 1.2から多層化だけはこれではダメになりました
  153. 153. 153  cellを定義してラッピングなどをして各時間での挙動を定義  cellと入力データを元に、RNN全体で順伝播  出力を加工して出力層を作成 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  154. 154. 154 tf.nn.static_rnnなどの役割  実際tf.nn.rnnの機能を使わなくてもcellと、for文、reuse_variablesを駆 使すれば可能(PTBのチュートリアルはそうなってる)  定義したcellを時間方向に展開して各時間でのrnnの出力を行う。  tf.nn.static_rnn・・・固定長のRNN実装。  tf.nn.dynamic_rnn・・・可変長RNN実装  tf.nn. bidirectional_dynamic_rnn・・・双方向RNN実装  tf.nn.raw_rnn・・・完全にdynamicな制御ができるrnn。まだテスト中。 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved これらの関数は出力として、 (各時間の出力, 最後の時間の中間層)のタプルを返却 ※raw_rnnは除く
  155. 155. 155 static_rnnとdynamic_rnn  tf.nn.static_rnnとtf.nn.dynamic_rnnがある  rnn ・・・シーケンス長が固定  dynamic_rnn・・・シーケンス長が動的 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 入力1 入力2 入力3 中間1 中間2 中間3 出力1 出力2 出力3 ・・・・・・
  156. 156. 156 static_rnnとdynamic_rnn  それぞれのメリット・デメリット  tf.nn.rnnは固定長グラフ構築を行うためモデル構築が遅い。  現状のraw_rnn がテスト中なので、現状もっとも簡単に feed_previousを意識したSeq2Seqを一番簡単に組めるのは static_rnn(個人的な感想)  tf.nn.rnnは入力が(バッチサイズ, 入力サイズ)のTensorのリストで である一方、dynamic_rnnは(バッチサイズ,シーケンス, データ長) のTensor。データによってデータセットを組みやすかったり組みにく かったり 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 計算効率などの問題上、dynamic_rnnを公式では推奨している
  157. 157. 157 tf.nn.dynamic_rnnの使い方 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved tf.nn.rnn_cellと入力データを引数にして各時間での出力、最終状態を返却 time_majorを用いたのtensor shapeの変更は後ほどの出力の整形でも効いてくる。
  158. 158. 158  cellを定義してラッピングなどをして各時間での挙動を定義  cellと入力データを元に、RNN全体で順伝播  出力を加工して出力層を作成 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  159. 159. 159 RNNのややこしいところ  普通のニューラルネットワークなら、、、、 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 出力を用いてすぐに誤差関数を定義可能
  160. 160. 160 RNNのややこしいところ  一方RNNは  (バッチサイズ, 時間, 中間層ユニット数)のtensorが tf.nn.dynamic_rnnにおける出力  この後出力層を定義するが、そのままoutputを使うことができない 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 適切にデータを整形する必要がある
  161. 161. 161 様々なRNNの形 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved http://karpathy.github.io/2015/05/21/rnn-effectiveness/ 今日はこれを実装
  162. 162. 162 many to one  必要なのは最終ステップの出力のみ  例:1行ずつ画像を読み込んで行って、その画像のクラス分類 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 入力1 入力2 入力3 中間1 中間2 中間2 出力3
  163. 163. 163 many to one実装  ポイントはtf.nn.dynamic_rnnの出力の最終時系列のデータだけを 引っ張ってくること 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved Tensor操作になるのでちょっと手間
  164. 164. 164 ちなみに  tf.static_rnn を使うと 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 時系列インデックスの配列で帰ってくるので普通に配列の最後にアクセスする だけ
  165. 165. 165 プログラム作成  インポートなど 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #-*- coding:utf-8 -*- from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf #mnistデータを格納したオブジェクトを呼び出す mnist = input_data.read_data_sets("data/", one_hot=True)
  166. 166. 166 プログラム作成  モデル構築(入力データ整形) 2017/9/19 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にするように
  167. 167. 167 プログラム作成  モデル構築(rnn cell作成) 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved #ユニット数128個のLSTMセル #三段に積む stacked_cells = [] for i in range(3): stacked_cells.append(tf.nn.rnn_cell.LSTMCell(num_units=128)) cell = tf.nn.rnn_cell.MultiRNNCell(cells=stacked_cells)
  168. 168. 168 プログラム作成  モデル構築(dynamic_rnn構築、最終時間のみのスライス) 2017/9/19 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は最終時間における[バッチサイズ, 出力長]となり、 いつものニューラルネットワークと同じ!!
  169. 169. 169 プログラム作成  モデル構築(出力層) 2017/9/19 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なので計算時間もかかる上に、収束も遅い。
  170. 170. 170 TensorFlowを用いた自然言語 の扱い(単語埋め込み) 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved
  171. 171. 171 コンピュータ上での単語表現  従来手法  単語にIDを振る  ミコロフ革命以降  単語をベクトルして扱う!! 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 犬=1024, 猫=1025, こんにちは=543 …. 共起を計算して統計的に類似度などの解析はできるけど、相当数のデータは必要 だし、本当にそれでいいのか?
  172. 172. 172 単語埋め込み  Word2Vec  ニューラル言語モデルを用いた単語埋め込み  単語の意味獲得を行えるように 2017/9/19 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) 次に来る単語を予測するモデルを作る ことによって、 のように、各単語にベクトルを割り当てる。 王様 – 男性 + 女性 = 女王様 のようなベクトル演算が可能に
  173. 173. 173 単語埋め込み 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 0.1 ⋯ 0.1 ⋮ ⋱ ⋮ 0.2 ⋯ 0.3 ‘dog’を表すパラメータ dog human ‘human’を表すパラメータ単語ベクトルを集めた行列を用意してそれを辞書として利用 内積をとることで似ている単語を推定するなどが可能 単語のベクトルをニューラルネットワークの入力にも可能 どうやってその辞書を作るの?
  174. 174. 174 作り方(skip gram版)  単語に注目して、そこの周りにどんな単語があるか予測するNNを作る  重みは最初は適当な値で初期化 2017/9/19 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の出現確率 学習された後の前半の 重みが単語の埋め込み 辞書になる
  175. 175. 175 負荷サンプリング  そのまま最終層のsoftmaxの計算をすると、単語数j分の𝑒 𝑥 𝑗 を計算しなければいけない  全部相手にせずに、分布にしたがって異なる単語を抜き出して、それら にが出現する確率が0かつ、正解データが出現確率確率が1になる確 率の積が大きい値になるようになるような誤差関数を定義 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 𝑦 = 𝑒 𝑥 𝑖 𝑗 𝑒 𝑥 𝑗 単語数が数十万になると凄まじい計算量になる 計算量を減らすsoftmax + cross entorypyのような もの
  176. 176. 176 負荷サンプリング 2017/9/19 C8Lab Copyright 2014 C8Lab Inc. All rights reserved 誤差関数 1. 最終層をシグモイド関数に変更 2. P(D=1)は最終層の出力のこと 3. P(D=0) = 1 - P(D=1) ややこしそうだけど、TFにはこれを1行でやってくれ る関数があります。
  177. 177. 177 プログラム  入力層〜中間層 2017/9/19 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することで内部的に計算して各単語ごと の組み込みベクトルを返してくれる
  178. 178. 178 プログラム  出力層〜誤差 2017/9/19 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) 出力層側の重み、バイアス、中間層出力、正解データ、サンプリン グ数、総単語サイズを与えたら一気に計算してくれる。
  179. 179. 179 お問い合わせ ご興味のある企業・団体・個人様は、以下までお問い合わせください。 シンギュラリティ株式会社 http://snglrty.net 東京都港区浜松町 2-7-15 三電舎ビル6F Tel 03-5425-2545 取締役/CTO 新村拓也 E-mail:info@snglrty.net 2017/9/19 Singularity Copyright 2016 Singularity Inc. All rights reserved

×