狠狠撸

狠狠撸Share a Scribd company logo
ソニーのNeural Network Console大勉強会 #2
ソニーネットワークコミュニケーションズ株式会社 / ソニー株式会社
シニアマシンラーニングリサーチャー
小林 由幸
Neural Network Consoleではじめる
Recurrent Neural Networks
2
自己紹介
小林 由幸
1999年にソニーに入社、2003年より機械学習
技術の研究開発を始め、音楽解析技術「12音
解析」のコアアルゴリズム、認識技術の自動
生成技術「ELT」などを開発。近年は
「Neural Network Console」を中心にディー
プラーニング関連の技術?ソフトウェア開発
を進める一方、機械学習普及促進や新しいア
プリケーションの発掘にも注力。
@frievea
3
Neural Network Console
商用クオリティのDeep Learning応用技術(画像認識機等)開発のための統合開発環境
コーディングレスで効率の良いDeep Learningの研究開発を実現
クラウド版(オープンβ期間中)Windows版(無償)
dl.sony.com
インストールするだけ、もしくはサインアップするだけで本格的なDeep Learning開発が可能
成果物はオープンソースのNeural Network Librariesを用いて製品、サービス等への組み込みが可能
4
目次
? Recurrent Neural Networks概要
? Neural Network ConsoleでRNNを扱う方法
? RNNサンプルプロジェクト解説
? 学習したRNNを自分のアプリケーション上で実行する方法
? 数式なしで理解するLSTM
? 蚕&补尘辫;础とまとめ
5
Recurrent Neural Networks(RNN)とは?
Feed Forward Neural Networks
(FFNN)
Recurrent Neural Networks (RNN)
出力側から入力側へのフィードバックを持つニューラルネットワーク
NN NN Recurrent
入力
出力
入力
出力
6
Recurrent Neural Networks(RNN)とは?
Feed Forward Neural Networks
(FFNN)
Recurrent Neural Networks (RNN)
T
入力
出力
一問一答
出力は現在の
入力のみから
決まる
S
S
O
O
N
N Y
t-3 t-2 t-1 t 系列
出力の推定に過去のデータも利用することで、より知的な処理が実現できる
出力の推定には
現在の入力に加
え、過去の入力
データの処理結
果も利用
S→O→Nと
来たから
次はYでは?
Recurrent
7
様々なRNNの使い方
Many to One
時系列の入力データから単一の出力を得る
応用例:時系列データの認識等
One to Many
単一のデータから時系列出力を得る
応用例:画像へのキャプショニング
4匹の猫
Many to Many (1)
時系列の入力データの各時刻に対応する
出力を得る
応用例:時系列データの時刻ごとの認識、
時系列予測
Many to Many (2)
時系列の入力データから特徴を抽出し、そこから新たな時系列出力を得る
応用例:機械翻訳、対話
Here we go
さあ 行くぞ
1枚の画像 単語時系列
(複数の単語)
8
事例:Visual Question Answering
画像と、画像に対する質問の2つの入力を元に、質問に対する答えを推定する問題
入力1:
画像
入力2:
質問文
Cloudy
What is the weather like?
CNN LSTM(RNN)
NN
出力:質問に対する答え
質問文の解釈にRNNを利用
9
VQA Challenge
紹介ページ:
Visual Question Answeringのコンペティション
論文:「Multimodal Compact Bilinear Pooling for Visual
Question Answering and Visual Grounding」
Akira Fukui, Dong Huk Park, Daylen Yang, Anna Rohrbach,
Trevor Darrell, Marcus Rohrbach
https://arxiv.org/abs/1606.01847
http://demo.berkeleyvision.org/
2016年の優勝チームはUC Berkeley&SONY
DEMO
10
高い応用可能性を持つRNN
構成と入出力次第で様々な機能を実現することができる
…入力 出力
実現する機能 入力 出力
映像認識 映像(画像系列) カテゴリ
株価の予測 株価(時系列信号) 1時刻先の株価(時系列信号)
音声認識 音声(スペクトル等の系列) 文字列(単語系列)
機械翻訳 英単語列(単語系列) 日単語列(単語系列)
人工無能(チャット) 入力発話(単語系列) 期待応答の単語列(単語系列)
センサ異常検知 センサ信号(時系列信号) 異常度(時系列信号)
ロボット制御 センサ(時系列信号) アクチュエーター(時系列信号)
…
実現する機能
記憶
RNNはチューリング完全
=コンピュータに実現できることは
何でも実現できるポテンシャルを
秘めている
Neural Network ConsoleでRNNを扱う方法
12
Neural Network ConsoleでRNNを扱うには?
このような時系列方向に展開されたネットワークを
手で書くこともできます。が…
t-3 t-2 t-1 t
t-3 t-2 t-1 t
各時刻の
入力データ
各時刻の
ラベル
※2つのAffineレイヤーは、全ての時刻で共通の
ParameterScopeを使用するようにして、
各時刻で係数を共有する
RecurrentInput/OutputとDelay
レイヤーで簡潔に記述できます
簡単!
全時刻をまとめた入力データ
全時刻をまとめたラベル
13
Neural Network ConsoleでRNNを扱うには? - ネットワーク構成
処理をfor文の要領でRecurrentレイヤーで囲む。Delayレイヤーで次の時刻に情報を引き継ぐ
全時刻をまとめた入力データ
全時刻をまとめたラベル
各時刻における処理を
RecurrentInput~
RecurrentOutputで囲む
1つ前の時刻の情報を
フィードバックする箇所に
Delayを挿入する
RecurrentInput/Outputの
Axisプロパティには
系列の軸のIndexを設定
←各時刻のクラスラベル
14
Neural Network ConsoleでRNNを扱うには? - データセット
S O N
CSVデータセットのヘッダに、__(ダブルアンダースコア)+indexを付加することで
系列データを表現できます
x__0 x__1 x__2 x__3 y__0 y__1 y__2 y__3
18 14 13 24
0 1 2 3
…
A B C D
例えば各画像のサイズが1,28,28の場合、4つのデータが
スタックされてxのサイズは4,1,28,28となる
yのサイズは4となる
その他、CSVデータにIndexを付加した場合、データのサイズは系列数,行数,列数になる
15
Neural Network ConsoleのRNNサンプルプロジェクト
elman_netサンプルプロジェクト:最もシンプルなRecurrent Neural Networks
手書き数字画像の高さ方向を時系列データとみなし、
1ラインずつRNNに入力
時系列
(28時刻)
1時刻分のデータ=28次元
(横1ライン=28 pixel)
28 pixel
28 pixel
Sliceレイヤーで最後の1時刻分の
RNN出力を取り出し
logistic_regiressionサンプルプロジェクト
同様に、9かどうかを判別する学習
16
そのほかのRNNサンプルプロジェクト(1/2)
bidirectional_elman_net
elman_net双方向化したもの
elman_net_with_attention
attentionを加えたelman_net
long_short_term_memory(LSTM)
現在最もポピューラーなRNNアーキテクヤ
(後ほど解説)
編集を加えることで、柔軟にオリジナルのRNN構造を試すことができる
17
そのほかのRNNサンプルプロジェクト(2/2)
gated_recurrent_unit(GRU)
LSTMよりシンプルながら
LSTMに匹敵する性能を実現
stacked_GRU
GRUを縦に2つつなげた構造
LSTM_auto_encoder
LSTMで圧縮した画像を、再度復元する
Many to Manyのサンプル
18
(参考)RNNを扱う時によく使うNNCのレイヤー
レイヤー名 機能 使い道
Concatenate 複数のテンソルを結合して1つにする 1時刻前から引き継いだデータと、現
在時刻のデータを結合するためなどに
使用
Reshape テンソルの要素数はそのままに、形状
だけを変更する
複数のデータをConcatenateする際、
複数のデータの形状を合わせるためな
どに使用
Transpose テンソルの次元の順序を入れ替える 系列軸の順序の入れ替えなどに使用
Slice テンソルの一部を取り出す RecurrentOutputから最後の1時刻の
データを抽出する場合などに使用
Unpooling テンソルのサイズを、データをコピー
することで大きくする
1時刻分のデータを複数時刻分コピー
して伸長する場合に使用
Flip データの順序を反転する Bidirectional RNN(双方向RNN)の際、
データの順序を反転させるために使用
19
学習したRNNを自分のアプリケーション上で実行する方法
RNNを用いた認識処理は、同じネットワークの計算を
繰り返し行うもの
t-3 t-2 t-1 t
t-3 t-2 t-1 t
各時刻の
入力データ
各時刻の
ラベル
赤枠で示すネットワークの処理を、
時間ごとに繰り返し行う
つまり推論時には、1時刻分のみ処理する
ネットワークがあればよい
1時刻前から
引き継ぐデータ
現在時刻の
入力データ
現在時刻の
出力
次の時刻に
受け渡すデータ
1時刻前から引き継ぐデータを受け取り、
次の時刻に引き継ぐデータを出力する
ネットワーク
20
学習済RNNを編集し、1時刻分のみ処理するネットワークを作成
1. 学習結果を「Open in EDIT Tab
with Weight」を用いて開く
2. EDITタブで1時刻分のネットワークに
編集
? RecurrentInput/Outputの削除
? Inputレイヤーの入力サイズを1時刻分
のデータサイズに変更
? DelayレイヤーをInputレイヤーと
Identityレイヤー(出力用に使用)で
置き換え
3. CONFIGタブでMax Epochを0に設
定して学習実行
※Windows版Version 1.10では学習実行ボタンの右
クリックメニューから「Create Training Result」選
択でも作成可能
作成した1時刻分のみ処理するネット
ワークを元に(学習処理を伴わず)学
習結果が作成される
elman_netサンプルでの編集例
21
この後の推論実行方法は、FFNNの場合と同じ
? Neural Network Libraries Pythonコードからの実行 おすすめ
? Neural Network LibrariesのCLI(Python利用)からの実行 簡単
? Neural Network Libraries C++からの実行 コンパクトに製品搭載する際に
? https://github.com/sony/nnabla/tree/master/examples/cpp/mnist_runtime
python "(path of Neural Network Console)/libs/nnabla/python/src/nnabla/utils/cli/cli.py" forward
-c Network definition file included in the training result folder (net.nntxt)
-p Parameter file included in the training result folder (parameters.h5)
-d Dataset CSV file of input data
-o Inference result output folder
1. Neural Network Console上で推論に用いるネットワークを右クリックして、Export、Python Code
(NNabla)を選択
2. 学習結果のparamters.h5を、load_parametersコマンドで読み込み
import nnabla as nn
nn.load_parameters('./parameters.h5')
3. 2によりパラメータが読み込まれた状態で、1でExportされたネットワークを実行(forward)
数式なしで理解するLSTM
( Long short term memory )
23
? 1層のAffineのみによる演算
? 単一の出力のみを次の時刻に引き継ぐ
LSTM(Long short term memory)とは
長期の記憶の保存と学習の安定性に優れたRNNの構成
Elman-net LSTM
? 1層のAffineと、3つのGateによる演算
? 各時刻の出力Hに加え、各時刻における状態
C(Cell state)を次の時刻に引き継ぐ
24
Elman-netからLSTMへ(1/5)
Elman-net
Neural Network Consoleのネットワーク表示を見ながら
Elman-netとLSTMの差分を追っていきます。
25
Elman-netからLSTMへ(2/5)
過去の出力を足し続けながら保持する
Cell Stateを追加
?遠い過去の記憶の消失を防ぐ効果
26
Elman-netからLSTMへ(3/5)
入力データを選択的に取り込むInput Gateを追加
Sigmoidの出力が1.0 :入力をそのまま取り込む
Sigmoidの出力が0.0 :入力は破棄される
?Cell Stateが入力によらず毎回書き換えられるのを防ぎ
さらに長期の記憶を保持しやすく
0
0.2
0.4
0.6
0.8
1
-6 -1 4
Output
Input
Sigmoid
27
Elman-netからLSTMへ(4/5)
各時刻の出力をコントロールする
Output Gateを追加
28
Elman-netからLSTMへ(5/5)
記憶を選択的に忘却する
Forget Gateを追加
複数の工夫がLSTMの高い記憶力と学習の安定性を支えている。RNNを扱うならまずはLSTMから
蚕&补尘辫;础とまとめ
30
Q. テキストの入出力方法は?
A. 事前にテキストの単語Index系列もしくはベクトル系列への変換が必要です
ベクトル系列形式のテキスト
?各単語が固定長次元のベクトルで表現される
?各単語の固定長ベクトルはWord2vec等で学習
単語Index系列
?0から始まる単語のIndexを文頭から順に並べるのみ
まずはテキストを単語に分割し、Index化する
?例えば3千個の頻出単語を選択し、その他は1つの
単語にまとめるなどする
?上記3001単語に0~3000のIndexを振る
文末
↓
↑
文頭
文末
↓
↑
文頭
←1単語分の
ベクトル
31
Q. 最近系列データもCNNを使ったほうが性能が良いと聞くのですが
A. 適材適所です
? 画像系の研究で培われた様々なテクニックを用いることができるCNNを用いたほうが性能が出るケースが増え
ています
? 一方、アプリケーションによってはRNNを用いたほうがメモリ量、演算量、レイテンシを小さくできるなどの
メリットが生きるケースがあり、ケースバイケースでより適した構造を選択する必要があります
Convolutional Neural Networksを用いた場合 Recurrent Neural Networks を用いた場合
全時刻分のデータをまとめて入力
CNNの出力として、
全時刻分のラベルをまとめて予測
1時刻分ずつデータを入力
1時刻分ずつラベルを予測
32
まとめ
? RNNは出力側から入力側へのフィードバックを持つニューラルネットワーク
? RNNにはOne to Many、Many to One、Many to Manyといった構成がある
? 構成と入出力次第で様々な機能を実現することができる
? 最初に使ってみるRNNの構成としてはLSTMがおすすめ
? Neural Network Consoleでは、RecurrentInput/OutputレイヤーとDelayレイ
ヤーを用いて柔軟にRNNを扱うことができる
? 学習したRNNは、1時刻分を処理するネットワークを切り出してデプロイ
Neural Network Consoleで快適なRNNライフを
twiter @NNC_NNL_jpn
SONYはソニー株式会社の登録商標または商標です。
各ソニー製品の商品名?サービス名はソニー株式会社またはグループ各社の登録商標または商標です。その他の製品および会社名は、各社の商号、登録商標または商標です。

More Related Content

2018/02/27 Recurrent Neural Networks starting with Neural Network Console

Editor's Notes

  1. 过去の记忆によって振る舞いが変わる、より知的な処理を実现できるネットワーク构成