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.
1
ハンズオンラボ
リカレント ニューラル ネットワーク入門
村上真奈
NVIDIA CUDA & Deep Learning Solution Architect
NVIDIA Corporation
AGENDA
ディープラーニングとは?
Torch7について
リカレントニューラルネットワーク入門ハンズオン
ディープラーニングとは
機械学習とディープラーニングの関係
機械学習
ニューラルネットワーク
ディープラーニング
5
様々な分野でディープラーニングを応用
インターネットとクラウド
画像分類
音声認識
言語翻訳
言語処理
感情分析
推薦
メディアとエンターテイメント
字幕
ビデオ検索
リアルタイム翻訳
機械の自動化
歩行者検出
白線のトラッキング
信号機の...
6
人工ニューロン
神経回路網をモデル化
スタンフォード大学cs231講義ノートより
神経回路網
w1 w2 w3
x1 x2 x3
y
y=F(w1x1+w2x2+w3x3)
F(x)=max(0,x)
人工ニューロン
人工ニューラルネットワーク
単純で訓練可能な数学ユニットの集合体
ニューラルネットワーク全体で複雑な機能を学習
入力層 出力層
隠れ層
十分なトレーニングデータを与えられた人工ニューラルネットワークは、入力データから判断を行う
複雑な近似を行う...
リカレントニューラルネットワーク(RNN)
• リカレントニューラルネットワークは、内部に閉路構造を持っており情報を一時的に保持しながらの
学習が可能。
• 音声認識や自然言語処理などに用いられる
時系列データを扱う為の再帰型ニューラルネットワ...
リカレントニューラルネットワーク(RNN)
リカレントニューラルネットワークの使用例
RNNを用いた機械翻訳
http://cs224d.stanford.edu/lectures/CS224d-Lecture8.pdfから引用
LSTM(long short-term memory)
リカレントニューラルネットワークの拡張モデル
• リカレントニューラルネットワークの、過去データの重みを発散・
消失してしまうという問題点を解決する為に考えられたモデル
• RNNの隠れ...
活性化関数
精度向上のためのテクニック
11
w1
w2
w3
x1
x2
x3
y=w1x1+w2x2+w3x3
人工ニューロン(パーセプトロン)
y F
z=F(y)
F: activation function
活性化関数
z 次の層
活性化関数
12
ReLU(Rectified Linear Unit)
sigmoid
tanh
非線型な活性化関数によって、複雑な問題にも
対応できるようになる。
入力データの正規化(Normalization)
性能向上のためのテクニック
13
データが偏っている
偏りの影響を
弱めるように変換
ドロップアウト
過学習回避のテクニック
14
z1
z2
z3
x1
x2
x3
y1
y2
y3
y4
y1
y4
隠れ層の一部ノードを
ランダムに無効化
Batch Normalization
学習の収束を早めるテクニック
15
x1
x2
x3
y1
y2
y3
y4
z1
z2
z3
bn1
bn2
bn3
bn4
隠れ層などへの入力を
ミニバッチ単位で正規化
https://arxiv.o...
16
ディープラーニング・フレームワーク
17
ディープラーニング・フレームワーク
Mocha.jl
ディープラーニング・フレームワーク
GPUで高速化されているディープラーニング・フレームワークが多数存在
https://developer.nvidia.com/deep-learn...
18
ディープラーニング・フレームワーク
Caffe Torch7 Theano TensorFlow Chainer
インターフェース C++/Python/Matlab Lua/C Python C/C++/Python Python
cu...
19
4/18/2
Torch7
20
Torch7
• Torch7はGPU対応の科学技術計算用フレームワーク
• メイン開発者はRonan Collobert氏(Facebook AI Research Lab)
• 主な特徴
• GPUによる高速かつ効率的な機能の提供
•...
21
Torch7
• torch (Torchのtensorなどの主要クラスを含む基本パッケージ)
• nn (ニューラルネットワーク計算用パッケージ)
• gnuplot (データのプロット・可視化用パッケージ)
• image (画像ファ...
22
Torch7
数値データを扱う為に、Tensorというクラスを提供している。
Tensorは以下のデータ型をサポート
• ByteTensor -- unsigned char型
• CharTensor -- signed char型
...
23
Torch7
--- 4x5x6x2 の4次元tensorの作成
z = torch.Tensor(4,5,6,2)
--- 6次元tensorに変換
s = torch.LongStorage(6)
s[1] = 4; s[2] = 5...
24
Torch7
nnはニューラルネットワーク計算用パッケージ、畳込み、リカレント、プーリングなど様々なタイプのレイ
ヤー定義やディープラーニングの学習および推論で必要なプリミティブを実装
nn(ニューラルネットワーク計算用パッケージ)
ml...
25
ハンズオンを開始しましょう
26
本ハンズオンの目的
• リカレントニューラルネットワークとCNNのような順伝播型ニューラルネットワークの違いについて理
解する事
• リカレントニューラルネットワークの学習の仕組みを理解する事
• リカレントニューラルネットワークで使われ...
27
本ハンズオンについて
今回のラボでは以下の課題を通して、リカレントニューラルネットワークについて学ぶ
• パート1: 二進数の加算
1. リカレントニューラルネットワークの学習の仕組みを理解する。
2. 実際に学習を行い、正解データ(正し...
QWIKLAB アカウントの作成
— https://nvlabs.qwiklab.com/ にアクセス
— ページ右上の [Language (言語)] から
日本語を選択
— ハンズオン用のアカウントを作成
— 各項目を入力
— [サービス...
ログインしたら画面が英語の場合
表示言語の日本語への切り替え
1. https://nvlabs.qwiklab.com/ へアクセス
2. 画面右上の [My Account] をクリック
3. [PROFILE INFO] の [LANGU...
Qwiklab のアクセス方法
https://nvlabs.qwiklab.com/にアクセスし、[DLI20170418-Japan-DLI]->[リカレントニューラル
ネットワーク入門]を選択
リカレント ニューラル ネットワーク入門
①...
Qwiklab のアクセス方法
「ラボを開始」を選択、インスタンスの起動を待し、“click here”をクリックする
リカレント ニューラル ネットワーク入門
①
32
Jupyter notebookの使い方
4/18/2017
タイマーカウントダウン
実行中は黒丸
それ以外は白丸
33
Jupyter notebookの使い方
4/18/2017
In []: と書いてあるセルは動的実行が出来ます
選択されていると緑の枠が
表示される
再生ボタンでセルの実行が出来る
(Shift-Enterでも良い)
34
パート1 二進数の加算
パート1:二進数の加算
二進数の加算をニューラルネットワークを用いる以下の2つのアプローチの違いを理
解する。
1. 一般的な順伝播型ネットワークを用いた加算アプローチ
2. リカレントニューラルネットワークを用いた加算アプローチ
リカレントニ...
パート1:二進数の加算
順伝播型ネットワークの出力が加算結果になるように学習を行う
順伝播型ネットワークを用いた二進数の加算
1 1 1 0
1 1 1 0 1
入力層
隠れ層
出力層
1 1 1 1
1 1 1 0+
1 1 1 0 1
1 ...
パート1:二進数の加算
順伝播型ネットワークの出力が加算結果になるように学習を行う
順伝播型ネットワークを用いた二進数の加算
1 1 0 0
1 1 0 1 1
入力層
隠れ層
出力層
1 1 1 1
1 1 0 0+
1 1 0 1 1
1 ...
パート1:二進数の加算
順伝播型ネットワークの問題点
1 1 1 0
1 1 1 0 1
入力層
隠れ層
出力層
1 1 1 1
1 1 1 0+
1 1 1 0 1
1 1 1 1
加算対象の二進数の桁を
あらかじめ決めておく必要がある
繰り...
パート1:二進数の加算
二進数の加算の仕組みについて
no carry
print 1
carry
print 1
carry
print 0
no carry
print 0
1
0
0
1
0
0
1
1
1
1
0
01
0
0
1
0
...
パート1:二進数の加算
1つ前の桁の加算が次の桁の加算に影響を与える
二進数の加算の仕組みについて
1
1 1 1 1
1 1 1 0+
0
1
1
1
1
1
1
繰り上がり桁
パート1:二進数の加算
リカレントニューラルネットワークによる二進数加算
入力層
隠れ層
出力層
1 0
1 1
1 1
1 1
1 1 1 1
1 1 1 0+
1 1 1 0 1
1
1
0
1
RNNを用いる事で繰り上がりを考慮して
加算...
パート1:二進数の加算
▪ 初期化処理
1. 10進数から2進数に変換する為のルックアップテーブルを生成
2. シグモイド関数(活性化関数の一種)を定義
3. リカレントニューラルネットワークの構造を定義
▪ 学習(二進数加算用モデルのトレーニ...
パート1:二進数の加算
▪ 初期化処理
1. 10進数から2進数に変換する為のルックアップテーブルを生成
2. シグモイド関数(活性化関数の一種)を定義
3. リカレントニューラルネットワークの構造を定義
▪ 学習(二進数加算用モデルのトレーニ...
パート1:二進数の加算
1. Jupyter notebook内の二進数加算、初期化部分から10進数を2進数に変
換している部分を探してみましょう
▪ 2進数に変換可能な最大の数(10進数)はいくつかコードを見て確認しましょう
▪ “print...
パート1:二進数の加算
初期化処理1/二進数変換用ルックアップテーブルの作成
int2binary = {}
binary_dim = 8
largest_number = pow(2,binary_dim)
binary = np.unpac...
パート1:二進数の加算
初期化処理2/シグモイド関数(活性化関数の一種)を定義
def sigmoid(x):
return 1/(1+np.exp(-x))
def sigmoid_output_to_derivative(output):
...
パート1:二進数の加算
初期化処理3/リカレントニューラルネットワークの構造定義
input_dim = 2
hidden_dim = 16
output_dim = 1
synapse_0 = 2*np.random.random((inpu...
パート1:二進数の加算
初期化処理3/リカレントニューラルネットワークの構造定義
for position in range(binary_dim):
X = np.array([[a[binary_dim - position - 1],b[...
パート1:二進数の加算
▪ 初期化処理
1. 10進数から2進数に変換する為のルックアップテーブルを生成
2. シグモイド関数(活性化関数の一種)を定義
3. リカレントニューラルネットワークの構造を定義
▪ 学習(二進数加算用モデルのトレーニ...
パート1:二進数の加算
学習/推論 Step.1
4つのRNNブロックに順伝播処理が
走る
Step2.
4つRNNブロックの出力層に推論結
果が出力される
Step3.
出力層と正解の誤差を計算
Step4.
誤差逆伝播を行い重みを更新する
パート1:二進数の加算
学習部のコード解説
for j in range(10000):
for position in range(binary_dim):
for position in range(binary_dim):
学習イタレーシ...
パート1:二進数の加算
学習部のコード解説
for j in range(10000):
for position in range(binary_dim):
for position in range(binary_dim):
2進数a ,b...
パート1:二進数の加算
学習部のコード解説
for j in range(10000):
for position in range(binary_dim):
for position in range(binary_dim):
順伝播の計算
パート1:二進数の加算
学習部のコード解説
for j in range(10000):
for position in range(binary_dim):
for position in range(binary_dim):
逆伝播の計算
パート1:二進数の加算
学習部のコード解説
for j in range(10000):
for position in range(binary_dim):
for position in range(binary_dim):
重みの更新
パート1:二進数の加算
1. コード内から順伝播を行っている部分、逆伝播を行っている部分(ロスの計算
を含む)、重みの更新を行っている部分がどこかを確認しましょう。
2. 学習部分のセルを実行し、a+bの結果をRNNに推論させてみましょう
▪ ...
パート2 テキスト生成
パート2:テキスト生成
▪ ウィリアム・シェークスピアの文章データを学習データとしてテキス
ト生成を行うニューラルネットワーク(RNN)の学習の方法につい
て学ぶ
▪ このパートからTorch7を使用する
▪ リカレントニューラルネットワークの...
パート2:テキスト生成
▪ torch-rnnとはTorch7の高速なRNNおよびLSTM用モジュール。言語モデリングなどに使用する事
が可能。
▪ CUDA利用可能オプションがあり、有効にすると、cuDNNなどのCUDAライブラリにより計算の...
パート2:テキスト生成
VanillaRNNモジュールを使った実装の例
--- 入力サイズD、隠れ層のサイズHのリカレントニューラルネットワークを初期化
rnn = nn.VanillaRNN(D, H)
--- 順伝播および逆伝播の計算を行う...
パート2:テキスト生成
▪ 初期化処理
1. Torch7のモジュールの必要モジュールのロード
2. 学習用データの作成
3. リカレントニューラルネットワークの構造を定義
4. 学習用パラメータの設定
▪ 学習(テキスト生成用モデルのトレーニ...
パート2:テキスト生成
▪ 初期化処理
1. Torch7のモジュールの必要モジュールのロード
2. 学習用データの作成
3. リカレントニューラルネットワークの構造を定義
4. 学習用パラメータの設定
▪ 学習(テキスト生成用モデルのトレーニ...
パート2:テキスト生成
初期化処理1/Torch7の必要モジュールのロード
package.path = '/home/ubuntu/notebook/torch-
rnn/?.lua;/home/ubuntu/notenook/torch-r...
パート2:テキスト生成
初期化処理2/学習用データの作成
opt = {} opt.input_h5 = 'torch-rnn/data/shakespeare.h5'
opt.input_json = 'torch-rnn/data/shak...
パート2:テキスト生成
初期化処理3/RNNの構造を定義
opt.model_type = 'rnn'
opt.wordvec_size = 64
opt.rnn_size = 128
opt.num_layers = 2
opt.dropou...
パート2:テキスト生成
1. テキスト生成の為のリカレントニューラルネットワークの初期化部分を探して、入
力層のサイズや隠れ層のサイズをいくつで初期化しているか確認してみましょう
▪ セルを実行し、定義したネットワークの構造がどうなっているか確...
パート2:テキスト生成
▪ 初期化処理
1. Torch7のモジュールの必要モジュールのロード
2. 学習用データの作成
3. リカレントニューラルネットワークの構造を定義
4. 学習用パラメータの設定
▪ 学習(テキスト生成用モデルのトレーニ...
パート2:テキスト生成
学習処理
for i = 1, num_iterations do
local epoch = math.floor(i / num_train) + 1
if i % num_train == 0 then
model...
パート2:テキスト生成
1. コードの中から、学習を行っている部分を探してみましょう。
▪ 学習に使っているSolverタイプを確認してみましょう。
▪ Learning Rateを変更している部分を確認してみましょう。
▪ 順伝播・逆伝播・重...
パート2:テキスト生成
5. opt.model_type = ‘lstm’に変更し、再学習を行い学習時間と推論結果に
どのような影響を与えるかを確認してみましょう。
6. opt.batch_norm = 1に変更し、batch normal...
THANK YOU!
ハンズオン セッション 3: リカレント ニューラル ネットワーク入門
Upcoming SlideShare
Loading in …5
×

ハンズオン セッション 3: リカレント ニューラル ネットワーク入門

6,371 views

Published on

このスライドは 2017 年 4 月 18 日(水)に東京ミッドタウンで開催された NVIDIA Deep Learning Institute Day #NVDLD のハンズオン セッション 3「リカレント ニューラル ネットワーク入門」にて村上真奈がプレゼンテーションを行ったスライドです。

Published in: Technology
  • Hello! Who wants to chat with me? Nu photos with me here http://bit.ly/helenswee
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

ハンズオン セッション 3: リカレント ニューラル ネットワーク入門

  1. 1. 1 ハンズオンラボ リカレント ニューラル ネットワーク入門 村上真奈 NVIDIA CUDA & Deep Learning Solution Architect NVIDIA Corporation
  2. 2. AGENDA ディープラーニングとは? Torch7について リカレントニューラルネットワーク入門ハンズオン
  3. 3. ディープラーニングとは
  4. 4. 機械学習とディープラーニングの関係 機械学習 ニューラルネットワーク ディープラーニング
  5. 5. 5 様々な分野でディープラーニングを応用 インターネットとクラウド 画像分類 音声認識 言語翻訳 言語処理 感情分析 推薦 メディアとエンターテイメント 字幕 ビデオ検索 リアルタイム翻訳 機械の自動化 歩行者検出 白線のトラッキング 信号機の認識 セキュリティと防衛 顔検出 ビデオ監視 衛星画像 医学と生物学 癌細胞の検出 糖尿病のランク付け 創薬
  6. 6. 6 人工ニューロン 神経回路網をモデル化 スタンフォード大学cs231講義ノートより 神経回路網 w1 w2 w3 x1 x2 x3 y y=F(w1x1+w2x2+w3x3) F(x)=max(0,x) 人工ニューロン
  7. 7. 人工ニューラルネットワーク 単純で訓練可能な数学ユニットの集合体 ニューラルネットワーク全体で複雑な機能を学習 入力層 出力層 隠れ層 十分なトレーニングデータを与えられた人工ニューラルネットワークは、入力データから判断を行う 複雑な近似を行う事が出来る。
  8. 8. リカレントニューラルネットワーク(RNN) • リカレントニューラルネットワークは、内部に閉路構造を持っており情報を一時的に保持しながらの 学習が可能。 • 音声認識や自然言語処理などに用いられる 時系列データを扱う為の再帰型ニューラルネットワーク
  9. 9. リカレントニューラルネットワーク(RNN) リカレントニューラルネットワークの使用例 RNNを用いた機械翻訳 http://cs224d.stanford.edu/lectures/CS224d-Lecture8.pdfから引用
  10. 10. LSTM(long short-term memory) リカレントニューラルネットワークの拡張モデル • リカレントニューラルネットワークの、過去データの重みを発散・ 消失してしまうという問題点を解決する為に考えられたモデル • RNNの隠れ層のユニットをLSTMブロックに置き換えたもの
  11. 11. 活性化関数 精度向上のためのテクニック 11 w1 w2 w3 x1 x2 x3 y=w1x1+w2x2+w3x3 人工ニューロン(パーセプトロン) y F z=F(y) F: activation function 活性化関数 z 次の層
  12. 12. 活性化関数 12 ReLU(Rectified Linear Unit) sigmoid tanh 非線型な活性化関数によって、複雑な問題にも 対応できるようになる。
  13. 13. 入力データの正規化(Normalization) 性能向上のためのテクニック 13 データが偏っている 偏りの影響を 弱めるように変換
  14. 14. ドロップアウト 過学習回避のテクニック 14 z1 z2 z3 x1 x2 x3 y1 y2 y3 y4 y1 y4 隠れ層の一部ノードを ランダムに無効化
  15. 15. Batch Normalization 学習の収束を早めるテクニック 15 x1 x2 x3 y1 y2 y3 y4 z1 z2 z3 bn1 bn2 bn3 bn4 隠れ層などへの入力を ミニバッチ単位で正規化 https://arxiv.org/pdf/1502.03167.pdf
  16. 16. 16 ディープラーニング・フレームワーク
  17. 17. 17 ディープラーニング・フレームワーク Mocha.jl ディープラーニング・フレームワーク GPUで高速化されているディープラーニング・フレームワークが多数存在 https://developer.nvidia.com/deep-learning-frameworks
  18. 18. 18 ディープラーニング・フレームワーク Caffe Torch7 Theano TensorFlow Chainer インターフェース C++/Python/Matlab Lua/C Python C/C++/Python Python cuDNN 5 5 5 5 5 ライセンス BSD-2 BSD BSD Apache 2.0 MIT マルチGPU (1ノード) ○ ○ ○ ○ モデルの柔軟性 △ ◎ ◎ ○ ◎ CNN ○ ○ ○ ○ ○ RNN ○ #2033 ○ ○ ○ ○ RBM × ○ ○ ○ ○ 備考 高速 Caffe Model Zoo 多数のアルゴリズムを サポート 自動微分 自動微分 TensorBoard Define by Run CuPy
  19. 19. 19 4/18/2 Torch7
  20. 20. 20 Torch7 • Torch7はGPU対応の科学技術計算用フレームワーク • メイン開発者はRonan Collobert氏(Facebook AI Research Lab) • 主な特徴 • GPUによる高速かつ効率的な機能の提供 • ニューラルネットワークを始めとする数々の機械学習および科学技術計算のアルゴリズムを提供 • テンソル(N次元配列)を手厚くサポート • スクリプト言語としてLuaを採用。Lua(LuaJIT)による高速なCへのインターフェースの提供 LUAJITの為の科学技術計算ライブラリ http://torch.ch/
  21. 21. 21 Torch7 • torch (Torchのtensorなどの主要クラスを含む基本パッケージ) • nn (ニューラルネットワーク計算用パッケージ) • gnuplot (データのプロット・可視化用パッケージ) • image (画像ファイル入出力操作、画像変換用パッケージ) • cutorch (Torch用CUDAバックエンドパッケージ) • cunn (TorchのCUDA版ニューラルネットワークパッケージ) • cudnn (NVIDIA cuDNN機能提供用パッケージ) Torch7の主要パッケージ http://torch.ch/
  22. 22. 22 Torch7 数値データを扱う為に、Tensorというクラスを提供している。 Tensorは以下のデータ型をサポート • ByteTensor -- unsigned char型 • CharTensor -- signed char型 • ShortTensor – short型 • IntTensor -- int型 • LongTensor -- long型 • FloatTensor -- float型 • DoubleTensor – double型 Tensor http://torch.ch/
  23. 23. 23 Torch7 --- 4x5x6x2 の4次元tensorの作成 z = torch.Tensor(4,5,6,2) --- 6次元tensorに変換 s = torch.LongStorage(6) s[1] = 4; s[2] = 5; s[3] = 6; s[4] = 2; s[5] = 7; s[6] = 3; x = torch.Tensor(s) --- 5次元tensorを生成(すべての要素を0で初期化) y = torch.Tensor(5):zero() 例: Tensorクラス
  24. 24. 24 Torch7 nnはニューラルネットワーク計算用パッケージ、畳込み、リカレント、プーリングなど様々なタイプのレイ ヤー定義やディープラーニングの学習および推論で必要なプリミティブを実装 nn(ニューラルネットワーク計算用パッケージ) mlp = nn.Sequential() -- 全結合モジュール (入力サイズ10, ユニットサイズ25) を追加 mlp:add(nn.Linear(10, 25)) -- 各隠れユニットに活性化関数Tanhを追加 mlp:add(nn.Tanh()) --全結合モジュール (入力サイズ10, ユニットサイズ25、出力サイズ1) を追加 mlp:add(nn.Linear(25, 1)) 入力層 隠れ層 活性化 出力
  25. 25. 25 ハンズオンを開始しましょう
  26. 26. 26 本ハンズオンの目的 • リカレントニューラルネットワークとCNNのような順伝播型ニューラルネットワークの違いについて理 解する事 • リカレントニューラルネットワークの学習の仕組みを理解する事 • リカレントニューラルネットワークで使われるパラメータなどの簡単な役割を理解する事 リカレントニューラルネットワーク入門
  27. 27. 27 本ハンズオンについて 今回のラボでは以下の課題を通して、リカレントニューラルネットワークについて学ぶ • パート1: 二進数の加算 1. リカレントニューラルネットワークの学習の仕組みを理解する。 2. 実際に学習を行い、正解データ(正しい加算結果)とリカレントニューラルネットワークを用いた推論の 結果を比較する。 • パート2: テキスト生成 3. Torch7を使い、ウィリアム・シェークスピアの作品をデータセットとしてテキスト生成を行うニューラルネッ トワークの学習を行う 4. 学習パラメータやニューラルネットワークの種類を変更し、生成される文章の品質や学習の速度がど う変わるかなどを検証する リカレントニューラルネットワーク入門
  28. 28. QWIKLAB アカウントの作成 — https://nvlabs.qwiklab.com/ にアクセス — ページ右上の [Language (言語)] から 日本語を選択 — ハンズオン用のアカウントを作成 — 各項目を入力 — [サービス規約に同意] をチェック — [新規アカウント作成してください] をクリック アカウント未作成の方はこちらを実行してください
  29. 29. ログインしたら画面が英語の場合 表示言語の日本語への切り替え 1. https://nvlabs.qwiklab.com/ へアクセス 2. 画面右上の [My Account] をクリック 3. [PROFILE INFO] の [LANGUAGE] を “Japanese” へ変更 4. [UPDATE USER] をクリックして設定を保存
  30. 30. Qwiklab のアクセス方法 https://nvlabs.qwiklab.com/にアクセスし、[DLI20170418-Japan-DLI]->[リカレントニューラル ネットワーク入門]を選択 リカレント ニューラル ネットワーク入門 ① ② ③
  31. 31. Qwiklab のアクセス方法 「ラボを開始」を選択、インスタンスの起動を待し、“click here”をクリックする リカレント ニューラル ネットワーク入門 ①
  32. 32. 32 Jupyter notebookの使い方 4/18/2017 タイマーカウントダウン 実行中は黒丸 それ以外は白丸
  33. 33. 33 Jupyter notebookの使い方 4/18/2017 In []: と書いてあるセルは動的実行が出来ます 選択されていると緑の枠が 表示される 再生ボタンでセルの実行が出来る (Shift-Enterでも良い)
  34. 34. 34 パート1 二進数の加算
  35. 35. パート1:二進数の加算 二進数の加算をニューラルネットワークを用いる以下の2つのアプローチの違いを理 解する。 1. 一般的な順伝播型ネットワークを用いた加算アプローチ 2. リカレントニューラルネットワークを用いた加算アプローチ リカレントニューラルネットワーク入門
  36. 36. パート1:二進数の加算 順伝播型ネットワークの出力が加算結果になるように学習を行う 順伝播型ネットワークを用いた二進数の加算 1 1 1 0 1 1 1 0 1 入力層 隠れ層 出力層 1 1 1 1 1 1 1 0+ 1 1 1 0 1 1 1 1 1
  37. 37. パート1:二進数の加算 順伝播型ネットワークの出力が加算結果になるように学習を行う 順伝播型ネットワークを用いた二進数の加算 1 1 0 0 1 1 0 1 1 入力層 隠れ層 出力層 1 1 1 1 1 1 0 0+ 1 1 0 1 1 1 1 1 1
  38. 38. パート1:二進数の加算 順伝播型ネットワークの問題点 1 1 1 0 1 1 1 0 1 入力層 隠れ層 出力層 1 1 1 1 1 1 1 0+ 1 1 1 0 1 1 1 1 1 加算対象の二進数の桁を あらかじめ決めておく必要がある 繰り上がりを考慮して加算を行 う事が難しい
  39. 39. パート1:二進数の加算 二進数の加算の仕組みについて no carry print 1 carry print 1 carry print 0 no carry print 0 1 0 0 1 0 0 1 1 1 1 0 01 0 0 1 0 0 0 0 1 1 1 1 0 1 1 0 0 1
  40. 40. パート1:二進数の加算 1つ前の桁の加算が次の桁の加算に影響を与える 二進数の加算の仕組みについて 1 1 1 1 1 1 1 1 0+ 0 1 1 1 1 1 1 繰り上がり桁
  41. 41. パート1:二進数の加算 リカレントニューラルネットワークによる二進数加算 入力層 隠れ層 出力層 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0+ 1 1 1 0 1 1 1 0 1 RNNを用いる事で繰り上がりを考慮して 加算結果の推論を行う
  42. 42. パート1:二進数の加算 ▪ 初期化処理 1. 10進数から2進数に変換する為のルックアップテーブルを生成 2. シグモイド関数(活性化関数の一種)を定義 3. リカレントニューラルネットワークの構造を定義 ▪ 学習(二進数加算用モデルのトレーニング) 1. 順伝播 2. 逆伝播 3. 重み更新 ▪ 推論処理 処理の流れ
  43. 43. パート1:二進数の加算 ▪ 初期化処理 1. 10進数から2進数に変換する為のルックアップテーブルを生成 2. シグモイド関数(活性化関数の一種)を定義 3. リカレントニューラルネットワークの構造を定義 ▪ 学習(二進数加算用モデルのトレーニング) 1. 順伝播 2. 逆伝播 3. 重み更新 ▪ 推論処理 処理の流れ
  44. 44. パート1:二進数の加算 1. Jupyter notebook内の二進数加算、初期化部分から10進数を2進数に変 換している部分を探してみましょう ▪ 2進数に変換可能な最大の数(10進数)はいくつかコードを見て確認しましょう ▪ “print ”The binary representation of 53 is : “ + str(int2binary[53])”を書 き換えて実行し、他の10進数に対しても正しく変換される事を確認しましょう 2. コードの中からリカレントニューラルネットワークの各桁を入力する構造を定義し ている部分を探してみましょう ▪ 入力層のサイズ、隠れ層のサイズ、出力層のサイズはいくつかを確認しましょう 3. 2進数加算(a+b=c)を行ってる部分がどこかをコードの中から探してみましょう ▪ a+b=cの計算を行っている部分のセルを実行して実行結果を確認しましょう チャレンジ(初期化処理パート)
  45. 45. パート1:二進数の加算 初期化処理1/二進数変換用ルックアップテーブルの作成 int2binary = {} binary_dim = 8 largest_number = pow(2,binary_dim) binary = np.unpackbits( np.array([range(largest_number)],dtype=np.uint8).T,axis=1) for i in range(largest_number): int2binary[i] = binary[i] print "The binary representation of 53 is : " + str(int2binary[53]) Unpackbitsで2^8までの10進数を 2進数に変換 10進数を2進数に変換する為の ルックアップテーブルを作成
  46. 46. パート1:二進数の加算 初期化処理2/シグモイド関数(活性化関数の一種)を定義 def sigmoid(x): return 1/(1+np.exp(-x)) def sigmoid_output_to_derivative(output): return output*(1-output) 活性化関数としてシグモイド関数を使用 シグモイド関数の微分を定義 (逆伝播時に必要)
  47. 47. パート1:二進数の加算 初期化処理3/リカレントニューラルネットワークの構造定義 input_dim = 2 hidden_dim = 16 output_dim = 1 synapse_0 = 2*np.random.random((input_dim,hidden_dim)) - 1 synapse_1 = 2*np.random.random((hidden_dim,output_dim)) - 1 synapse_h = 2*np.random.random((hidden_dim,hidden_dim)) - 1 synapse_0_update = np.zeros_like(synapse_0) synapse_1_update = np.zeros_like(synapse_1) synapse_h_update = np.zeros_like(synapse_h) 「入力層から隠れ層」 「隠れ層から出力層」 「隠れ層から隠れ層」 の接続の重みを初期化
  48. 48. パート1:二進数の加算 初期化処理3/リカレントニューラルネットワークの構造定義 for position in range(binary_dim): X = np.array([[a[binary_dim - position - 1],b[binary_dim - position - 1]]]) y = np.array([[c[binary_dim - position - 1]]]).T layer_1 = sigmoid(np.dot(X,synapse_0) + np.dot(layer_1_values[-1],synapse_h)) print layer_1 layer_2 = sigmoid(np.dot(layer_1,synapse_1)) d[binary_dim - position - 1] = np.round(layer_2[0][0]) ネットワークの構造定義 (先ほど初期化した重みを使用)
  49. 49. パート1:二進数の加算 ▪ 初期化処理 1. 10進数から2進数に変換する為のルックアップテーブルを生成 2. シグモイド関数(活性化関数の一種)を定義 3. リカレントニューラルネットワークの構造を定義 ▪ 学習(二進数加算用モデルのトレーニング) 1. 順伝播 2. 逆伝播 3. 重み更新 ▪ 推論処理 処理の流れ
  50. 50. パート1:二進数の加算 学習/推論 Step.1 4つのRNNブロックに順伝播処理が 走る Step2. 4つRNNブロックの出力層に推論結 果が出力される Step3. 出力層と正解の誤差を計算 Step4. 誤差逆伝播を行い重みを更新する
  51. 51. パート1:二進数の加算 学習部のコード解説 for j in range(10000): for position in range(binary_dim): for position in range(binary_dim): 学習イタレーションループ
  52. 52. パート1:二進数の加算 学習部のコード解説 for j in range(10000): for position in range(binary_dim): for position in range(binary_dim): 2進数a ,b, cの生成
  53. 53. パート1:二進数の加算 学習部のコード解説 for j in range(10000): for position in range(binary_dim): for position in range(binary_dim): 順伝播の計算
  54. 54. パート1:二進数の加算 学習部のコード解説 for j in range(10000): for position in range(binary_dim): for position in range(binary_dim): 逆伝播の計算
  55. 55. パート1:二進数の加算 学習部のコード解説 for j in range(10000): for position in range(binary_dim): for position in range(binary_dim): 重みの更新
  56. 56. パート1:二進数の加算 1. コード内から順伝播を行っている部分、逆伝播を行っている部分(ロスの計算 を含む)、重みの更新を行っている部分がどこかを確認しましょう。 2. 学習部分のセルを実行し、a+bの結果をRNNに推論させてみましょう ▪ 学習イタレーションが進むと、結果はどう変わりますか? 3. (optional) 初期化部で定義した隠れ層のユニットサイズを16より小さくした 場合、学習時の精度はどうなるか確認してみましょう。 ▪ 隠れ層のサイズを宣言している部分を書き換え、セルを再実行しモデルを更新し ます ▪ 再度学習を行い、結果を確認してみましょう。 チャレンジ(学習・推論パート)
  57. 57. パート2 テキスト生成
  58. 58. パート2:テキスト生成 ▪ ウィリアム・シェークスピアの文章データを学習データとしてテキス ト生成を行うニューラルネットワーク(RNN)の学習の方法につい て学ぶ ▪ このパートからTorch7を使用する ▪ リカレントニューラルネットワークの実装を簡単に行う為に Justin Johnson氏によって実装された、Torchのモジュール 「torch-rnn」の改良版を導入する https://github.com/ngimel/torch-rnn リカレントニューラルネットワーク入門
  59. 59. パート2:テキスト生成 ▪ torch-rnnとはTorch7の高速なRNNおよびLSTM用モジュール。言語モデリングなどに使用する事 が可能。 ▪ CUDA利用可能オプションがあり、有効にすると、cuDNNなどのCUDAライブラリにより計算の高速 化を行う事が可能 ▪ 今回はVanillaRNNモジュール(nn.Modelのサブクラス)を用いてリカレントニューラルネットワークのイ ンスタンスを作成する torch-rnn
  60. 60. パート2:テキスト生成 VanillaRNNモジュールを使った実装の例 --- 入力サイズD、隠れ層のサイズHのリカレントニューラルネットワークを初期化 rnn = nn.VanillaRNN(D, H) --- 順伝播および逆伝播の計算を行う h = rnn:forward({h0, x}) grad_h0, grad_x = unpack(rnn:backward({h0, x}, grad_h))
  61. 61. パート2:テキスト生成 ▪ 初期化処理 1. Torch7のモジュールの必要モジュールのロード 2. 学習用データの作成 3. リカレントニューラルネットワークの構造を定義 4. 学習用パラメータの設定 ▪ 学習(テキスト生成用モデルのトレーニング) 1. 順伝播/逆伝播 2. 重み更新 ▪ 推論処理 処理の流れ
  62. 62. パート2:テキスト生成 ▪ 初期化処理 1. Torch7のモジュールの必要モジュールのロード 2. 学習用データの作成 3. リカレントニューラルネットワークの構造を定義 4. 学習用パラメータの設定 ▪ 学習(テキスト生成用モデルのトレーニング) 1. 順伝播/逆伝播 2. 重み更新 ▪ 推論処理 処理の流れ
  63. 63. パート2:テキスト生成 初期化処理1/Torch7の必要モジュールのロード package.path = '/home/ubuntu/notebook/torch- rnn/?.lua;/home/ubuntu/notenook/torch-rnn/?/?.lua;' .. package.path require 'torch' require 'nn' require 'cunn' require 'cudnn' require 'util.DataLoader' require 'LanguageModel' utils = require 'util.utils' unpack = unpack or table.unpack cutorch.setDevice(1) dtype = 'torch.CudaTensor' ニューラルネットワーク計算用クラス Torch-rnnの言語処理用クラス CUDA ニューラルネットワーク計算用クラス
  64. 64. パート2:テキスト生成 初期化処理2/学習用データの作成 opt = {} opt.input_h5 = 'torch-rnn/data/shakespeare.h5' opt.input_json = 'torch-rnn/data/shakespeare.json' opt.batch_size = 50 opt.seq_length = 50 loader = DataLoader(opt) vocab = utils.read_json(opt.input_json) idx_to_token = {} for k, v in pairs(vocab.idx_to_token) do idx_to_token[tonumber(k)] = v end opt.idx_to_token = idx_to_token x, y = loader:nextBatch('train') 学習用テキストデータの読み込み(json) 英文字を数字へ変換する為の ルックアップテーブルの作成
  65. 65. パート2:テキスト生成 初期化処理3/RNNの構造を定義 opt.model_type = 'rnn' opt.wordvec_size = 64 opt.rnn_size = 128 opt.num_layers = 2 opt.dropout = 0 opt.batchnorm = 0 opt.cudnn = 1 model = nn.LanguageModel(opt):type(dtype) params, grad_params = model:getParameters() crit = nn.CrossEntropyCriterion():type(dtype) 学習パラメータおよび ネットワークの構造に関するパラメータの設定 LanguageModel内でテキスト生成用 RNNモデルを生成
  66. 66. パート2:テキスト生成 1. テキスト生成の為のリカレントニューラルネットワークの初期化部分を探して、入 力層のサイズや隠れ層のサイズをいくつで初期化しているか確認してみましょう ▪ セルを実行し、定義したネットワークの構造がどうなっているか確認しましょう ▪ 入力層のサイズなど、ネットワークの構造を変更してから、セルを再実行し、ネット ワークの構造がどのように変わったか確認してみましょう 2. 学習用のパラメータ”opt”が宣言されている部分を探し、どのような項目が含 まれているかを確認しましょう。 ▪ 特に“model_type”、”cudnn”にどのようなフラグが設定されているのか確認し ましょう チャレンジ(初期化処理パート)
  67. 67. パート2:テキスト生成 ▪ 初期化処理 1. Torch7のモジュールの必要モジュールのロード 2. 学習用データの作成 3. リカレントニューラルネットワークの構造を定義 4. 学習用パラメータの設定 ▪ 学習(テキスト生成用モデルのトレーニング) 1. 順伝播/逆伝播 2. 重み更新 ▪ 推論処理 処理の流れ
  68. 68. パート2:テキスト生成 学習処理 for i = 1, num_iterations do local epoch = math.floor(i / num_train) + 1 if i % num_train == 0 then model:resetStates() end if epoch % 5 == 0 then old_lr = optim_config.learning_rate optim_config = {learning_rate = old_lr * 0.5} end local _, loss = optim.adam(f, params, optim_config) local float_epoch = i / num_train end 学習イタレーションループ 順伝播・逆伝播
  69. 69. パート2:テキスト生成 1. コードの中から、学習を行っている部分を探してみましょう。 ▪ 学習に使っているSolverタイプを確認してみましょう。 ▪ Learning Rateを変更している部分を確認してみましょう。 ▪ 順伝播・逆伝播・重みの更新を行っている部分がどこであるかを確認してみま しょう 2. 学習用コードが書かれているセルをデフォルト値で実行し、学習を走らせた後、 推論結果を確認してみましょう。 3. 学習用パラメータ辞書’opt’内のレイヤーの数や層のサイズを変更して学習を 再実行して、結果がどう変わるか確認してみましょう。 4. opt.cudnn = 0 に変更して再学習を行い、学習時間を確認してみましょう。 チャレンジ(学習・推論処理パート)
  70. 70. パート2:テキスト生成 5. opt.model_type = ‘lstm’に変更し、再学習を行い学習時間と推論結果に どのような影響を与えるかを確認してみましょう。 6. opt.batch_norm = 1に変更し、batch normalizationを有効にしてから再 度学習を行い、推論結果がどのように変わるか確認してみましょう。 • opt.dropout = 0.2に変更する事でドロップアウトを有効化する事が出来ます。こ ちらも有効にして、推論結果がどのように変わるかを確認してみましょう。 チャレンジ(学習・推論処理パート)
  71. 71. THANK YOU!

×