シンギュラリティ株式会社
第1章
ニューラルネットワークと深層学習
2017年9月 TensorFlow講義
2017/9/19C8Lab Copyright 2014 C8Lab Inc. All rights reserved
2 2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
 自己紹介
新村拓也
- 東京大学工学部精密工学専攻卒業
- シーエイトラボ株式会社 代表取締役
- シンギュラリティ株式会社 取締役CTO
- TFUG
3
普段やっていること
 データマイニング案件の受託開発
 データ整形〜実行環境におけるPDCAまで
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
要件定義及
びデータ項
目確認
設計
実験計画
データセット準備
モデ
ル
実
装
学習・評価&
チューニング
 論文調査
 手法選定
 データ選定
 インフラ設計
根幹に関わる部分なので慎重に
行う必要がある。
 データセット収集
 データセット作成
 データ前処理
 読込プログラム作成
経験上かなりの時間が
取られる
 学習
 評価
 パラメータ変更
 データ見直し
もっとも時間がかかる
フェーズ
4
普段やっていること
 データマイニング案件のコンサル
 そもそもいきなりやるには無理な課題も多い
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
ドラえもん作って ・・・・
できる部分とできない部分を明確化して
ロードマップを引いてお手伝いします 音声認識
文脈理解 感情判断
・・・
はい、ぼくドラえもん
意味理解
5
普段やってること
 データマイニングエンジニア育成研修
 基礎となる数学や統計
 機械学習の各種手法
 各手法の実装方法
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
短期間のものがほとんどですが、3ヶ月〜6ヶ月かけたフルコースのものも
ご相談ください
最近やっていませんが、
たまに無料でもやってます!
6
最近やっていること
 自社サービス開発
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
7
第1章の内容
ディープラーニングについて知る
 そもそもディープラーニングって何?
 Googleの猫って有名だけど具体的に何したの?
 どういうことに使えるの?
 ディープラーニングの凄いとこって?
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
教師なし学習なの?
8
機械学習とは?
 入力xを得て何らかの出力を生成するモデルがあるときに、このモデル
を構成するパラメータを正解との誤差によって自動的に学習していくシ
ステム
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
入力 モデル 出力 正解
誤差
パラメータを更新
例):各種物件情報
例):予測した家賃と実際の家賃の差
9
教師あり学習、教師なし学習
 教師あり学習
 入力データに関して、それとは独立した正解ラベル、値をもとに行う
学習
 教師なし学習
 入力データに関して、恣意的に関数を決めたり、入力値をそのまま
正解にするなどして独立した正解値を必要としない学習
 オートエンコーダー
 強化学習
 トピックモデル
 クラスタリング
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
ペンギン
駅からの距離:100m
築:1年
広さ:40平米
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
ニューラルネットワーク
形式ニューロンモデルを組み合わせて脳を模倣したネットワーク。
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
x1
x2
x3
入力 出力 y
w1
w2
w3
b
形式ニューロン ニューラルネットワーク
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
ニューラルネットワークの特徴
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
ノードの数に比例して
「パラメータが増える」
=複雑な表現
シンプルな式で複雑な表現力!!
複雑な状態記述
14
ニューラルネットワークの例
例)家賃の予測
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
正解と予測の誤
差20万円
誤差伝播で学習!
 学習する対象はすべての重みwとバイアスb
15
連鎖律と誤差逆伝播法
 予測と正解の誤差が小さい≒良いニューラルネットワーク
 本当は汎用性が高いものがいいネットワーク
 どのように重みとバイアスを変更すれば誤差が小さくなるのか?
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
誤差E
パラメータw, b
パラメータが1個、2個なら微分(偏微分)して、最小を取るパラメータを直接求
めることができる。
16
連鎖律と誤差逆伝播法
 しかし、現実問題ではパラメータが多すぎて不可能
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
誤差E
パラメータw, b
今ここ
パラメータを変化させることで少しでも誤差が小さくなるようにパラ
メータを変更する方法を模索
17
連鎖律と誤差逆伝播法
重みを少し変化させた時に誤差関数がどのくらい変化するかを考える
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
ΔE =
𝜕𝐸
𝜕𝑤
Δw
(誤差の変化量)=(wが変化した時どのくらい変化するか?)×(実際に変化したwの量)
パラメータは複数あるので
ΔE =
𝜕𝐸
𝜕𝑤1
Δ𝑤1 +
𝜕𝐸
𝜕𝑤2
Δ𝑤2 + ・・・= 𝑗
𝜕𝐸
𝜕𝑤 𝑗
∆𝑤𝑗
18
連鎖律と誤差逆伝播法
勾配の定義
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
𝛁𝑬 = (
𝝏𝑬
𝝏𝒘 𝟏
,
𝝏𝑬
𝝏𝒘 𝟐
,
𝝏𝑬
𝝏𝒘 𝟑
, ・・・・)
関数を、それを構成するパラメータでそれぞれ偏微分したものを並べた配列
ΔE =
𝜕𝐸
𝜕𝑤1
Δ𝑤1 +
𝜕𝐸
𝜕𝑤2
Δ𝑤2 + ・・・= 𝑗
𝜕𝐸
𝜕𝑤 𝑗
∆𝑤𝑗
= 𝛁𝑬∆𝒘
∆𝑤 =
∆𝑤1
∆𝑤2
∆𝑤3
すると、実際に動かすパラメータの変化量の配列 を用いて、
19
連鎖律と誤差逆伝播法
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
∆𝐸 = 𝛻𝐸∆𝑤 の中で、我々が決めることができるのは∆wだけ!!
∆Eが0以下の値になれば訓練するたびに誤差は減っていく。
とすればその条件を満たせる。
∆𝒘 = −𝜶 × (
𝝏𝑬
𝝏𝒘 𝟏
,
𝝏𝑬
𝝏𝒘 𝟐
,
𝝏𝑬
𝝏𝒘 𝟑
, ・・・・) 𝑇
𝑤 = 𝑤 − 𝛼𝛻𝐸更新するルールは α:学習率(0< α <= 1.0)
20
連鎖律と誤差逆伝播法
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
入力 出力,誤差・・・・・・
最終層程度なら重みで誤差
関数を簡単に微分できるそれ以外の層の重みで微分する際
には連鎖律の観点で簡単に計算で
きない
21
連鎖律と誤差逆伝播法
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
𝑦 = 𝑥2
+ 2𝑥 + 1 の時、𝑧 = 𝑦2
を𝑥で微分せよ。
𝑑𝑧
𝑑𝑥
=
𝑑𝑧
𝑑𝑦
×
𝑑𝑦
𝑑𝑥
(xが変化することによるzの変化量)
=(yが変化することによるxの変化量)×(xが変化することによるyの変化量)
NNでは各層の出力が、 次の層の入力になるために、
連鎖律を意識して勾配計算
を行う
22
連鎖律と誤差逆伝播法
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
入力z 出力a
𝑎 = 𝑓(𝑧)なので、
𝜕𝐸
𝜕𝑧
=
𝜕𝐸
𝜕𝑎
𝜕𝑎
𝜕𝑧
を出力層から順番
に計算していくことで、誤差関数の勾配を計算
可能。
誤差E
発火関数の微分
23
(広義)ディープラーニングとは?
多層のニューラルネットワーク(一応3層以上)で行われる機械学習。
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
入力 出力・・・・・・
多層
複雑である(パラメータ数が多い)ほど、汎用的なモデルを説明できる
どうして多層するの?
24
多層NNにした時の欠点
過学習が起こってしまい、汎用性が無い。
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
パラメータの初期値によって良い
モデルにたどり着けるかどうかは
決まってしまう。
解決策1:投入するデータを増やす。
解決策2:初期値をいい感じにする。
どちらも困難・・・
25
多層NNにした時の欠点
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
誤差伝播
高レイヤ:
フィードバックをしっかり
受けているが、訓練
データの影響が強く出
すぎている。
低レイヤ:
フィードバックが
分散しすぎて届
かない。
・・・・・・
勾配消失が起こってしまい、学習が上手くいかない(進まない)
解決策:関係ある結合(パラメータ)だけを残してその他の結合を切る
漠然としててどうしたらいいものか・・・
26
多層NNにした時の欠点
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
遅い!!!!!
一番どうしようもない・・・
27
2010年代から話題になっている
DLとは?
単なる多層NNの問題を解決した新世代の多層NNを用いた機械学習。
 教師なし学習による事前学習などを行い、適した初期パラメータを獲得
 例)オートエンコーダー
 層間の結合を制限し、誤差が伝播するようにする
 例)局所受容野、ドロップアウト
 GPUの出現による計算速度向上
 CUDAプログラミング
 データセットの充実化
 Image Net, Word Net
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
28
教師なしでの事前学習
初期パラメータをランダムで生成して教師あり学習
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
過学習が起きるかどうか運任せ(というかほぼ100%
過学習に陥る)。
似たようなデータは似たような特徴が出るように先にパラメータを調整しておいて
から、教師あり学習を行おう!
犬 猫
犬
猫
猫
犬
猫
猫猫
犬
犬
犬
29
例:オートエンコーダ
入力(信号)を可能な限り再現するようなニューラルネットワーク
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
エンコード デコード
生成されたパラメータから出
力された隠れ層は、入力情
報の特徴を表していると言え
る。
・圧縮しているだけなので、不要な
情報をそぎ落として、いいパラメー
タ(特徴)を表している。
・入力値が教師データとなるため、
「教師なし」で実現可能。
30
ディープオートエンコーダ
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
オートエンコーダの隠れ層(特徴)を、次
の層のオートエンコーダの入力とする
入力の特徴
特徴の特徴
特徴の特徴の特徴
教師なしで最初からいい感じの初期パラメータで学習を始められる!
=>過学習回避のためにそこまで多くの教師データを必要としない。
31
層間の結合制限
関係がありそうな部分だけを結合させて、伝播が分散するのを防ぐ。
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
従来のDNN
最近噂のDNN
赤の領域の情報と緑の領域の情報を両方とも
次の層の同じニューロンに伝える。
赤の領域は一部のニューロンに、緑の領域は
別のニューロンに伝える。
関係が薄い領域が結合されて、徒らに誤差伝
播を阻害。
関係が深い領域だけを結合するため、誤差伝
播の効率が上がり、勾配消失を回避。
32
局所受容野、共有重み
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
次の層のニューロンは、特定領域としか結びつかないようにする。
=>画像解析の場合は、空間的に特徴を捉えていくのでさらにGood!!
33
グーグルの猫
 Youtubeの画像1000万枚でとあるネットワークの事前学習を行った。
 そいつに顔の画像を突っ込んで一番反応する
ニューロンが81.7%の精度で顔認識できた。
 そいつが一番反応する
画像を作ってみたところ
 猫ちゃんで同じような画像作ってみたら
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
コレ
コレ
34
グーグルの論文
 教師なしで事前学習させたネットワークでも十分機能する
 なにやら特定の分野に反応するニューロンが自動的に生成されている
らしい(おばあちゃん細胞説の確認)
 しかもさらに教師あり学習で学習させて、分類機を作ったところ、いまま
でのものより相対比70%以上精度向上した!
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
35
DL適用分野:画像認識
Selective Search+畳み込みニューラルネットワーク(CNN)
RCNN, FasterRCNNなど
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
DeepCNNを用いた歩行者検知
36
DL適用分野: 音声認識
再帰型ニューラルネットワーク(RCNN)
双方向RNN(Bi-directional RNN)
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
Android端末のGoogle音声入力
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
第1章のまとめ
巷で噂のディープラーニングって何?
単なる全結合、多層のNNの欠点を克服した凄いニューラルネットワークで
行う機械学習のこと。
教師なし学習って本当?
あくまで初期パラメータをいい感じにする一つの手段。何か実現したければ
教師ありデータはいる。(強化学習は除く)
どんな分野で使えるの?
工夫さえすればどんな分野でも。
どこが凄いの?
パラメータが多くてもしっかり学習して、汎用性が非常に高いモデルをなぜ
か構築してしまうところ。
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
シンギュラリティ株式会社
第2章
TensorFlow 入門
10月 TensorFlow講義
2017/9/19C8Lab Copyright 2014 C8Lab Inc. All rights reserved
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
そもそもTensorって
テンソル(英: tensor, 独: Tensor)とは、線形的な量または線形的な幾何概念
を一般化したもので、基底を選べば、多次元の配列として表現できるようなもの
である。 しかし、テンソル自身は、特定の座標系によらないで定まる対象である。
出典:Wikipedia
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
多次元配列ということで
大丈夫です。
42
Tensor
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
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
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
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
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
動作確認
 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
TensorFlowの特徴
 計算グラフを用いたBuild & Run
 実行環境のSessionで構築モデルを実行
 計算グラフにおけるノードは各種オペレーション
 計算グラフにおけるエッジはオペレーションの入出力となるTensor
 (buildツールにBazel), データのシリアライズ、でシリアライズに
ProtocolBuffurを採用することで大規模分散に特化
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
?????
49
計算グラフ
 まずはDLではなく単なる足し算や掛け算をするプログラムを使って、計
算グラフや、TFで出てくる用語を説明
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
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
計算グラフ
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
計算グラフ
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
計算グラフ
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
計算グラフ
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
計算グラフ
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
計算グラフまとめ
 計算グラフ構築の際は値のフローを定義しているだけで実行されない
 実行されるのはSession上で実行した時のみ
 計算グラフのどの部分を実行するかを指定して実行する
 指定部分を計算するのに必要な部分は全て実行され、関係ない部分は
されない
 変数は初期化が必要
 実行時に引数を渡したい時はPlaceholderで渡す
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
57
TensorFlowでNN入門
 MNISTの手書き数字認識のニューラルネットワークを実装
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
・
・
・
・
各ピクセルの画素値
784画素 ・
・
・
・
入力層 出力層中間層
入力画像が0〜9
である確率
入力画像が2である確率
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
ミニバッチについて
 NNの学習は
 順伝播させた結果の誤差を計算
 誤差を重みで偏微分(勾配を計算)
 計算した勾配を用いて重みをアップデート
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
毎回のこの操作、全訓練データを
用いて行っても良いのだろうか?
60
ミニバッチについて
 全データを用いて学習を行うと
 とてつもない計算時間がかかる
 そもそもメモリに乗らない
 以下のように局所解におちいると詰む
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
誤差E
パラメータw, b
右に行っても左に行っても次
のステップで戻って来てしまう
61
ミニバッチについて
 そこで毎ステップ、訓練に用いるデータはランダムにとってくる
 計算速度も向上
 毎回勾配を計算する関数が変わるので局所解に陥りにくい
 データの中からランダムにサンプリングしているために、寄り道しな
がらも着実に真の解に近づいていく
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
Stocastic Gradient Descent (SGD)
確率的勾配降下方
毎ステップごとに用いられる訓練データ群をミニバッチ
そのサイズをバッチサイズと呼ぶ。
バッチサイズはハイパーパラメータ。
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
入出力データ
 正解データ
 出力データと同じ形
 ただし、正解の数字の部分のみが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
誤差の計算
 正解データと出力データを引き算して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
プログラム作成
 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
プログラム作成
 モデル構築(入力層〜中間層)
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
プログラム作成
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
プログラム作成
 モデル構築(入力層〜中間層)
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
プログラム作成
 モデル構築(中間層〜出力層)
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
プログラム作成
 モデル構築(誤差計算と訓練)
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
プログラム作成
 モデル構築(評価)
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
プログラム作成
 簡単に今回のモデルを計算グラフで表すと
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
順伝播実行
誤差計算
訓練
評価
入力データ
正解データ
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
プログラム作成
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
順伝播実行
誤差計算
訓練
評価
入力データ
正解データ
これを実行
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
プログラム作成
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
順伝播実行
誤差計算
訓練
評価
入力データ
正解データ
77
もう少し改良はできないか・・・
 もっと多層にすればいいのではないか?
 ディープニューラルネットワークに!!
 そのまま画像ピクセルを入れているがもう少し画像を形として捉えられ
ないか?
 畳み込みニューラルネットワークを導入
 誤差関数は本当に単純な二乗誤差でいいの?
 クロスエントロピーの導入
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
それではやっていきましょう!
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
畳み込みニューラルネットワーク
 一般的に様々な特徴を検知するフィルタは確率されているが、どんな
フィルタを採用すればいいかはわからない・・・
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
畳み込みニューラルネットワークが学習するのは、
このフィルタの値!
・画像を扱う際に空間情報を意識
・余計な結合が切り離されているた
めに多層にしても大丈夫!
GOOD!!
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
クロスエントロピー
 分類問題では必ずと言っていいほど使われる
 二乗誤差関数だと学習量が、大きく間違った際に発火関数の微分に比
例するため学習が遅くなる
 それを避けて、出力が0,1 に近い値を出して間違った際に大きく学習さ
せて学習を高速化するための誤差関数
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
𝐸 = −
𝑖
𝑎𝑖 log(𝑦𝑖 + 𝜖)
𝑎𝑖: 正解データ
𝑦𝑖: 出力データ
数学的には同時確率を見ている
実装の際には出力がほぼ0にな
ると値が発散するので微少量を
かける
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
プログラム作成
 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
プログラム作成
 モデル構築(入力層〜畳み込み層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
プログラム作成
 モデル構築(バイアス+プーリング層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
プログラム作成
 モデル構築(畳み込み層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
プログラム作成
 モデル構築(全結合層)
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
プログラム作成
 モデル構築(出力層〜誤差関数)
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
プログラム作成
 モデル構築(訓練〜評価)
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
プログラム作成
 実行
 先ほどのmnistのプログラムと全く同じなので割愛
 実行するとだいたい95%程度の精度
 学習速度は圧倒的に遅い
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
91
第2章まとめ
 TensorFlowはソースからビルドしよう
 TensorFlowを用いて幾つかのニューラルネットワークの構築を行った
 計算モデルの理解は3章におけるTensorBoardを見るのに役立ちます
 多層パーセプトロンを改良してCNN、クロスエントロピーを導入した
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
シンギュラリティ株式会社
第3章
TensorFlow の活用法
10月 TensorFlow講義
2017/9/19C8Lab Copyright 2014 C8Lab Inc. All rights reserved
93
TensorBoardにおけるモデル保存
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
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
今回やること
 おなじみMNISTを用いた手書き文字認識
 学習の過程で一定ステップごとにモデルを保存
 訓練が終わって、再び学習した時に今まで学習を行ったステップから再
開できるように
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
学習(1000ステップ)
モデル出力 読込
再学習(1000-2000ステップ)
出力 モデル2
96
割愛
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
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
何が起こるか?
 models直下になんかいっぱい出てきます
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
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
ファイルの説明
 拡張子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
ファイルの説明
 拡張子dataファイル
 実際の重みの値が入ったバイナリ
 拡張子indexファイル
 どのファイルがどのstepのものかを一意に特定するためのバイナリ
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
これらはsaveメソッドを呼んだ数だけ
生成される 100-1000ステップまで10件ずつ出
来上がるはずなのにどうして600-
1000の5件しかないのだろう?
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
tf.train.Saver()について
 第一引数に何も入れていないと、それまでに出てきたgraph内の全て
の変数を保存するという意味になる
 一部だけを保存したい(特定の層だけ保存など)は
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
saver = tf.train.Saver( {'v1': v1, 'v2': v2} )
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
補足
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
ステップ数の制御
 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
おまけ
 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
実行デモ
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
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
TensorBoardについて
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
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
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
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
TensorBoardを使うには?
6. 出来上がったログの上位のディレクトリをtensorboardコマンドで指定
7. ブラウザでポート6006番にアクセス
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
tensorboard –logdir ./logs/
115
Events
 スカラ情報と時系列情報を可視
 誤差、学習率など
 Step、Relative(相対時間)、Wall(絶対時間)ごとに見ることができる。
 CSV、JSON形式でのダウンロードも可能
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
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
Distributions
 入力項目
 数値のテンソルならなんでも可能
 活用例
 重みや出力の分布観測
 重みも誤差も収束しているならうまくいっている、など
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
100%
93%
84%
69%
50%
色の濃さは分布の割合
をあらわす。
118
Histogramus
 Distributionsが確率分布を可視化するのに対してHistogramsは度
数分布を可視化
 Distributionsを別の観点から見たもの
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
119
Graphs(モデル可視化)
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
定義したグラフの中身を可視化
120
Graphs(モデル可視化)
 計算量やメモリ使用量、どのデバイスによる実行かも可視化可能
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
121
Embeddings
 高次元データを、PCAとt-SENを用いて3次元空間に組み込み
 中間層の値などを組み込んで分類がうまくいっているかを確認
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
※ログの取り方が他のものとはかなり違う
122
Text
 TensorFlow1.1から追加
 文章情報を保持
 各ステップで生成した文章などを確認できる
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
123
これからやること
 先ほどのプログラムを改良してTensorBoardのログを取れるようにす
る
 Scalars, Images, Graphs, Distributions, Histogramsを動かしなが
ら説明
 テストデータを用いいて学習済み中間層の値を組み込み
 Embeddingを動かしながら説明
 おまけでText用のサンプルプログラムを用いてTextを説明
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
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
入力画像のログを取る
 画像ではなくバイナリできているので、パーサーがうまく動いているか不
安な時など
 第一引数は保存する際の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
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
分布やスカラーの誤差を取る
 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
ログのマージ
 本来今まで仕込んだログを、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
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
一定ステップごとにログ保存
 頻繁にとりすぎると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
TensorBoardデモ
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
132
Embeddingsを用いるには
 注意して欲しいのが、embeddingはTensorBoardのログファイルを見
ないで、前章で説明したチェックポイントファイル(.dataファイル)を見て
いる
 ログファイルはないけど何やら重み、バイアスを組み込もうとしている
 見ているのはtf.Variable()の情報
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
tensorboard –logdir ./models/
133
Embeddingsを用いるには
1. 組み込みたい値をtf.Variableの形で定義
2. チェックポイント形式で保存してあげる([バッチサイズ,要素数]の2階テ
ンソル)
3. 各ベクトルとラベルの組み合わせを用意してあげる
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
現状のプログラムだと中間層の値をVariableとして保存していないので
一手間必要
どの画像がどのラベルなのかは順番の変わらないTestデータを用いれば
簡単に作れそう
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
必要な値にアクセス
 特に定義していないとデフォルトのグラフにロードされる
 ネームスペースに注意して必要な情報にアクセス
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
値を初期化して保存
 ロードしたモデルは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
残タスク
1. 組み込みたい値をtf.Variableの形で定義
2. チェックポイント形式で保存してあげる([バッチサイズ,要素数]の2階テ
ンソル)
3. 各ベクトルとラベルの組み合わせを用意してあげる
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
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
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
meta.tsv
 ただのファイル整形
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
141
TensorBoardデモ
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
142
Text
 name_scopeやステップ数を分けて文章を表示する用のもの
 まだ、できたばかりであまりあっても個人的にはありがたくない
 文章生成などの結果確認を可視化できる
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
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
TensorBoardデモ
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
145
まとめ
 基本はログ取得・マージ・書き込み
 name_scopeをうまく活用してより見やすい形にする
 Embeddingsは特殊なので注意
 様々な機能があるので用途に応じて柔軟に使い分ける
 Webベースなので結果をみるだけならTensorFlowの実行環境はいら
ないのがいいところ
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
146
TensorFlowにおけるRNN入門
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
147
RNNとは(一応)
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
入力1 入力2 入力3
中間1 中間2 中間3
出力1 出力2 出力3
中間層を時間方向に展開させることにより時系列
情報をニューラルネットワークで扱えるように。
入力-中間層の重み
中間-中間層の重み
共有重みを用いている
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
 cellを定義してラッピングなどをして各時間での挙動を定義
 cellと入力データを元に、RNN全体で順伝播
 出力を加工して出力層を作成
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
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
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
rnn_cellの役割
 定義したcellのラッピングが可能
 MultiRNNCell・・・中間層を多層にできる。
 DropoutWrapper・・・中間層にドロップアウト機能を追加
 その他、後いくつか
 例えば3層のLSTM、ドロップアウトの中間層を定義したければ
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
1.2から多層化だけはこれではダメになりました
153
 cellを定義してラッピングなどをして各時間での挙動を定義
 cellと入力データを元に、RNN全体で順伝播
 出力を加工して出力層を作成
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
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
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
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
tf.nn.dynamic_rnnの使い方
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
tf.nn.rnn_cellと入力データを引数にして各時間での出力、最終状態を返却
time_majorを用いたのtensor shapeの変更は後ほどの出力の整形でも効いてくる。
158
 cellを定義してラッピングなどをして各時間での挙動を定義
 cellと入力データを元に、RNN全体で順伝播
 出力を加工して出力層を作成
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
159
RNNのややこしいところ
 普通のニューラルネットワークなら、、、、
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
出力を用いてすぐに誤差関数を定義可能
160
RNNのややこしいところ
 一方RNNは
 (バッチサイズ, 時間, 中間層ユニット数)のtensorが
tf.nn.dynamic_rnnにおける出力
 この後出力層を定義するが、そのままoutputを使うことができない
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
適切にデータを整形する必要がある
161
様々なRNNの形
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
http://karpathy.github.io/2015/05/21/rnn-effectiveness/
今日はこれを実装
162
many to one
 必要なのは最終ステップの出力のみ
 例:1行ずつ画像を読み込んで行って、その画像のクラス分類
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
入力1 入力2 入力3
中間1 中間2 中間2
出力3
163
many to one実装
 ポイントはtf.nn.dynamic_rnnの出力の最終時系列のデータだけを
引っ張ってくること
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
Tensor操作になるのでちょっと手間
164
ちなみに
 tf.static_rnn を使うと
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
時系列インデックスの配列で帰ってくるので普通に配列の最後にアクセスする
だけ
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
プログラム作成
 モデル構築(入力データ整形)
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
プログラム作成
 モデル構築(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
プログラム作成
 モデル構築(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
プログラム作成
 モデル構築(出力層)
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
TensorFlowを用いた自然言語
の扱い(単語埋め込み)
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
171
コンピュータ上での単語表現
 従来手法
 単語にIDを振る
 ミコロフ革命以降
 単語をベクトルして扱う!!
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
犬=1024, 猫=1025, こんにちは=543 ….
共起を計算して統計的に類似度などの解析はできるけど、相当数のデータは必要
だし、本当にそれでいいのか?
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
単語埋め込み
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
0.1 ⋯ 0.1
⋮ ⋱ ⋮
0.2 ⋯ 0.3
‘dog’を表すパラメータ
dog
human
‘human’を表すパラメータ単語ベクトルを集めた行列を用意してそれを辞書として利用
内積をとることで似ている単語を推定するなどが可能
単語のベクトルをニューラルネットワークの入力にも可能
どうやってその辞書を作るの?
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
負荷サンプリング
 そのまま最終層のsoftmaxの計算をすると、単語数j分の𝑒 𝑥 𝑗
を計算しなければいけない
 全部相手にせずに、分布にしたがって異なる単語を抜き出して、それら
にが出現する確率が0かつ、正解データが出現確率確率が1になる確
率の積が大きい値になるようになるような誤差関数を定義
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
𝑦 =
𝑒 𝑥 𝑖
𝑗 𝑒 𝑥 𝑗
単語数が数十万になると凄まじい計算量になる
計算量を減らすsoftmax + cross entorypyのような
もの
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
プログラム
 入力層〜中間層
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
プログラム
 出力層〜誤差
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
お問い合わせ
ご興味のある企業・団体・個人様は、以下までお問い合わせください。
シンギュラリティ株式会社
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

深層学習とTensorFlow入門