SlideShare a Scribd company logo
レポート 深層学習 Day3
再帰型ニューラルネットワークの概念
RNN とは、時系列データに対応できるニューラルネットワークのことである。
時系列データとは時間を追って観測でき、
時間との統計的関係が認められるデータのこ
とであり、代表的なものとしてはある施設への日ごとの入場者数や、音声データ・テキ
ストデータである。
RNN の全体像としては下図のとおりであり、
中間層からの出力が出力層だけではなく、
次の時点の中間層への入力となっている。
過去の状態を次へ伝えることにより時系列デ
ータの予測が可能となっているが、
現在の出力を次の時点へ伝えるための再帰構造が必
要である。
数学的に記述すると以下の様になる。なお u は入力層から中間層へ、v は中間層から出
力層へ流れるデータの活性関数を通す前のデータを指している。
Z0 Z1
Y1
X1
Z2
Y2
X2
W(out) W(out)
W(in) W(in)
W W
次に、CNN と同じく誤差逆伝播法を使うが、時系列データであるため、出力層から入
力層へ伝えるだけではなく、未来から過去へも伝える必要がある点で CNN と大きく異
なる。
RNN で使用する誤差逆伝播法を BPTT と呼んでいる
(BackpropagationThrough
Time)
これまでと同じく誤差を各重みで微分するが、δまたはδout と定義される誤差を u ま
たは v の微分が出てくる。
また、δとδout や過去のδとの関係を漸化式であらわすことが出来る。
重みやバイアスについては、先ほどのδを求めれば、あとはそれを利用して求めていけ
ばよい。W(out)だけΣではないのは、W(out)についてはすでに過去分の調整が出力の
時点で行われているからである。
最後に誤差を入力値や重み・バイアスを用いて表すと下の式となる。
誤差には、同じ時点だけではなく過去の入力値も影響を与えていることが分かる。
確認テスト
 サイズ 5×5 の入力画像を、サイズ 3×3 のフィルタで畳み込んだ時の出力画像の
サイズを答えよ。なおストライドは 2、パディングは 1 とする。
答え=(サイズ+2*パディング-フィルタ)÷ストライド+1=3
 RNN のネットワークには大きくわけて 3 つの重みがある。1 つは入力から現在の
中間層を定義する際にかけられる重み、1 つは中間層から出力を定義する際にかけ
られる重みである。残り 1 つの重みについて説明せよ。
直前の中間層からの出力を次の中間層へ伝えるときの重み
 連鎖律の原理を使い、dz/dx を求めよ。z = t^2 t = x +y
dz/dx=dz/dt * dt/dx=2*t*1=2*(x+y)
 下図の y1 を x・s0・s1・win・w・wout を用いて数式で表せ。※バイアスは任意の
文字で定義せよ。※また中間層の出力にシグモイド関数 g(x)を作用させよ。
y1=g(W(out)*f(W*z0+W(in)*x1+b)+c)
h(t-1)
h(t)
h(t)
Wh
Wx
x
b
dh(t)
dt
db
dWh
dh(t-1)
dWx
dx
参考図書
RNN の構造をより一層理解するために「ゼロから作るディープラーニング 2」を学習
し、RNN レイヤの一つの順伝播と逆伝播を図示した。
逆伝播の伝わり方は以下のようになる。
dt=(tanh(dh(t)))’=dh(t)*(1-dh(t)^2)
db=Σdt
dWh=dh(t-1)*dt
dh(t-1)=dWh*dt
dWx=dx*dt
dx=dWx*dt
×
×
+ +
tanh
実装
バイナリ加算を RNN で実装の演習を行った。
バイナリの下の位から順に 1 桁ずつ計算させ、
繰り上がりの数字を過去の中間層からの
入力値とするイメージでの実装である
(RNN の時系列をそのように置き換えて考える)
コードの解釈についてはコードの画像の横に添付した。
初期では全く正解していないが、一定の回数の学習を経ることにより、正解率はほぼ1
00%となった。
ウェイト
ウェイトを小さく(初期値を1→0.5)にすると、収束が遅く 10000 回の学習では収束
しなかった。
ウェイトを大きく(初期値を1→2)にすると、収束が早かった。
しかし大きくしすぎると(2→4)にすると、収束は早いものの正解率があまり高くなら
なかった。これは過学習を起しているのだと思われる。
学習率
学習率を下げる(0.1→0.01)と一定値に収束はするものの正解率があまり良くなかっ
た。これは局所解にはまってしまったものだと考えられる。
学習率を上げる(0.1→0.5)と収束は早く、早期に高い正解率へ収束した。
中間層
サイズを小さくしたところ(16→4)収束はしなかった。
逆にサイズを大きく(16→32)にしたところ、収束が早かった。
重みの初期化方法を Xavier に変更したところ、ややブレが少なく収束も早かった。
Relu に活性化関数を変更したところ、勾配爆発によって全く学習が進まなかった。
Tanh に変更したと悪露、Relu よりは多少ましに見えるが、全く収束はしなかった。
LSTM
LSTM とは RNN で課題であった時系列を遡ることに伴う勾配消失問題をクリアする
ために、構造を変えて解決した手法
※勾配消失問題が起こる理由は、
例えば活性化関数にシグモイド関数を使用すると微分
すると最大でも 0.25 になり、必ずさかのぼるごとに 0.25 を掛けるためどんどん勾配が
小さくなってしまうためである。
具体的な LSTM の構造は下図の通りである。特徴は CEC と呼ばれる部分。ここの重み
は1であるため、誤差は過去に向かって正しく伝播することになる。CEC はあくまで
過去の情報を保持するのみの役割であり、これだけだと学習が行われなくなるため、
入
力ゲート、忘却ゲート、出力ゲートを設けてそこで学習が行われることになる。
入力・出力ゲートに重みを設定することによって学習が可能となる。
また、忘却ゲートにより過去の情報をどの程度保持するかを調整することが出来る
(こ
れがないといつまでも過去の情報を保持することになってしまう)
確認問題
・シグモイド関数を微分した時、入力値が 0 の時に最大値をとる。その値として正し
いものを選択肢から選べ。
(2)0.25 微分すると exp(-x)/(1+exp(-x))^2 となるため
・以下の文章を LSTM に入力し空欄に当てはまる単語を予測したいとする。文中の
「とても」という言葉は空欄の予測においてなくなっても影響を及ぼさないと考えら
れる。このような場合、どのゲートが作用すると考えられるか。
「映画おもしろかったね。ところで、とてもお腹が空いたから何か____。
」
→忘却ゲート
参考書籍
LSTM の理解のために「ゼロから作るディープラーニング 2」の第 6 章の学習を行った
ので、そのまとめを記載する。
ざっくりとした LSTM のイメージを図示した。
過去の記憶セル c が過去の出力データを受け取って何らかの計算をした上で現在の記
憶セルとして、それに調整をかけることにより今回の出力としている。その調整が
LSTM の肝である。
何らかの計算
tanh
c(t-1)
h(t-1)
h(t)
c(t)
h(t)
x(t)
output ゲート
c(t)に対してどのように調整をかけて h(t)とするかが output ゲートの役割である。
output ゲートにより何割を出力に通すか o を前回の出力 h(t-1)と今回の入力 x(t)から
求める。調整の仕方は tanh(c(t))と o のアダマール積である。
o=σ(x(t)*Wx+h(t-1)*Wh+b)※σはシグモイド関数
forget ゲート
何らかの計算
tanh
c(t-1)
h(t-1)
h(t)
c(t)
h(t)
x(t)
×
o
σ
tanh
c(t-1)
h(t-1)
h(t)
c(t)
h(t)
x(t)
×
o
×
f
σ
σ
続いては c(t-1)の記憶から不要な記憶を忘れるための forget ゲートを追加する。
これは output ゲート同じく前回の出力 h(t-1)と今回の入力 x(t)から求める。
ちなみに下の式の W は、output ゲートの重み W とは別物である。
f=σ(x(t)*Wx+h(t-1)*Wh+b)※σはシグモイド関数
新しい記憶セル
このままでは忘れることしかできないため、
現在の入力をどの程度記憶しておくかのみ
を担当する部分を追加する。
今回は新しい情報を記憶セルに追加することから、
tanh を
用いる。これを c(t-1)と f の積に加算する。
g=tanh(x(t)*Wx+h(t-1)*Wh+b)
input ゲート
この input ゲートにより g の情報のうちどの情報が大事なのかを判断する。
i=σ(x(t)*Wx+h(t-1)*Wh+b)※σはシグモイド関数
tanh
c(t-1)
h(t-1)
h(t)
c(t)
h(t)
x(t)
×
o
×
f
+
g
σ
σ tanh
ここで重要なのは上図の赤線のところである。
記憶セルを現在から過去へつなぐ線を見ていくと、+のところでは勾配は 1、×のとこ
ろではアダマール積であり、要素ごとに forget ゲートが重要だと考えて残した要素に
ついては過去へ勾配を多く伝えるようになるため、
勾配消失が起きにくい仕組みとなっ
ている。
実装
「ゼロから作るディープラーニング 2」の第 6 章から実装演習を行った。
ptb と呼ばれる様々な英語の文章のサンプルを読み込んで LSTM である単語の次に来
る単語を予測するモデルを学習した。Perplexity というどの単語が来るかを確率の逆
数であらわした指標を用いている。最終的には 250 を切る値を示しており、これは
10000 語の中から 200 個未満まで次の単語を絞れていることを示している。しかし、
実用的には絶えないと考えられる。
tanh
c(t-1)
h(t-1)
h(t)
c(t)
h(t)
x(t)
×
o
×
f
+
g
i
σ
σ tanh σ
GRU
LSTM ではパラメーターが多く計算負荷が多きかったことから、パラメーターを削減
し精度を今まで以上にした GRU が考え出された。
構造は以下の通り。
LSTM の入力ゲート・忘却ゲート・出力ゲートの代わりに、リセットゲートと更新ゲー
トの二つに絞り、構造も単純化されている。
リセットゲートでは現在の情報と過去の情報からなる r を過去の情報に掛け合わせる
ことで、どの程度過去の情報を忘れさせるか制御している(忘却ゲートに似たもの)
。
そこから得られた情報(長期記憶)と、現在の情報を混合する割合 z(更新ゲートで求
める)で長期と現在の記憶を混ぜ合わせて出力とする構造となっている。
確認問題
・LSTM と CEC が抱える課題について、それぞれ簡潔に述べよ。
(3 分)
LSTM はパラメーターが多く、構造が複雑で計算負荷が高い。
CEC は重みが 1 で学習しないことが課題。
・LSTM と GRU の違いを簡潔に述べよ。
(5 分)
LSTM は CEC と周りに入力・出力・忘却ゲートを持っており、パラメーターが多く計
算量が多い。GRU はリセット・更新ゲートを持ち、LSTM と比べてパラメーターが少
なく計算量が少ない。
参考書籍
「ゼロから作るディープラーニング 2」より GRU について学習した。
GRU は LSTM のコンセプトはそのままにパラメーターを削減し計算時間を短縮した
ものである。
・リセットゲート
過去の出力をどれだけ無視するか。リセットゲートからの出力 r と入力 x から作られる
値は過去の出力は無視されている。
・z
過去の出力をどの程度反映させるか
・更新ゲート
LSTM の入力ゲートと忘却ゲートの二つを兼ね備えたもの。
(1-z)×h(t-1)でどの程
度過去を忘れるかをコントロールし、
z×h~でどの程度入力を反映させるかをコントロ
ールしている。
×
h(t-1)
h(t)
h(t)
x(t)
+
r
×
z
1-
×
h∼
tanh
σ σ
実装
GRU の順伝播のみを実装演習してみた。
構造としては、
各ゲートごとに使用する重みを 3 つ横に並べた形で初期化して GRU クラス
に受け渡すようなかたちで実装されている。
双方向 RNN
過去の情報だけではなく未来の情報を加味することで精度を向上させるモデルである。
具体的にはこれまでは過去から未来と順方向にした情報が伝播しなかったが、
そこに逆
伝播させる構造を追加することでより一層の精度の向上を目指すことができるように
なった。
実装
「ゼロから作るディープラーニング 2」より双方向 LSTM のサンプルコードを学習。
o1 が入力値の順方向、o2 が逆方向で学習(学習自体は LSTM)し、o2 を逆順に並び
替えた上で、o1 と o2 をくっつけて出力する構造になっている。
Seq2Seq
Seq2Seq とは Encoder-Decoder(入力データよりも中心部の次元を低くして入力と同
じサイズの出力を行うモデル)の一つであり、機械対話や機械翻訳などに使われてい
る。例えば、私は一本のペンを持っている。→I have a pen.と出力するような場面で使
用する。
EncoderRNN DecoderRNN
・HRED
Seq2seq の課題として一問一答しかできないことがあげられる。これを解決する一つ
の手法が HRED である。
HRED では過去の複数の発話を踏まえて次の会話を生成するような仕組みとなってお
り、前の文章の流れに沿って次の文章を生成するため、より人間らしさを表現でき
る。構造としては Seq2seq のエンコーダーとデコーダーの間にこれまでの会話を保存
するために層を追加したものとなっている。ただし、入力が同じであれば毎回同じ出
力しかできない、短い出力をしがちという問題点がある。
文脈
ユーザーがインプットしたテキストデータを
単語等のトークンに区切って渡す構造
① 文章を単語等のトークンごとに分割した上
で ID に分割する
② ID から分散表現ベクトルに変換
③ ベクトルを順番に RNN へ入力
④ 入力されたベクトルは h として出力され、
次の入力と合わさって次の h として出力さ
れることを繰り返し、最後に出力されたベ
クトルが入力した文章の意味をあらわすも
のとなる。
ユーザーがインプットしたテキストデータを
単語等のトークンに区切って渡す構造
① 文脈のベクトルから、各トークンの生成確
率を求め、確率の高いトークンを選んで出
力する
② 選んだトークンをこれまで出力された文
章に加えて入力値とする
③ 文字数の上限や最後の文字が出力される
まで繰り返す。
・VHRED
HRED に確率的なノイズを与えて学習させることで問題点を解決した手法である。
VAE の潜在変数の概念を追加したもの。
・オートエンコーダー
教師なし学習の一つで、入力データからエンコーダーで潜在変数 z に変換し、デコー
ダーで潜在変数 z から元の入力データを復元するものである。z の次元は入力データ
より小さくすることにより次元削減が行える。
・VAE
通常のオートエンコーダーの場合、どのように潜在変数 z にデータを押し込んでいる
かがよくわからない。VAE では確率分布 N(0,1)を仮定したものである。
確認テスト
・下記の選択肢から、seq2seq について説明しているものを選べ。
(1)時刻に関して順方向と逆方向の RNN を構成し、それら 2 つの中間層表現を特徴
量として利用するものである。
(2)RNN を用いた Encoder-Decoder モデルの一種であり、機械翻訳などのモデルに
使われる。
(3)構文木などの木構造に対して、隣接単語から表現ベクトル(フレーズ)を作ると
いう演算を再帰的に行い(重みは共通)
、文全体の表現ベクトルを得るニューラルネッ
トワークである。
(4)RNN の一種であり、単純な RNN において問題となる勾配消失問題を CEC とゲ
ートの概念を導入することで解決したものである。
→(2)
・seq2seq と HRED、HRED と VHRED の違いを簡潔に述べよ。
Seq2seq の一問一答しかできないことを解決するために HRED では過去の文章を複数
保存して過去の文章を踏まえて出力させるよう工夫したモデル。HRED が同じ入力値
に対しては同じ出力しかできず短い出力をしがちである点を、VAE による潜在変数の
概念を追加したことで多様性を持たせたものが VHRESD である。
・VAE に関する下記の説明文中の空欄に当てはまる言葉を答えよ。自己符号化器の潜
在変数に____を導入したもの。
→確率分布
実装
「ゼロから作るディープラーニング 2」より Seq2seq について学習した。
足し算を Seq2seq で学習するサンプルである。
構造としては、encoder と decoder クラスを別に作り、Seq2seq クラスで encoder と
decoder をつなげている。
インプットデータとして、足し算とその結果をインプットデータとして
渡して、足し算を学習するプログラムを実行した。
25 のエポックではそこまで高い正解率ではなかったが、学習が進むにつれ
正解に近づいてきていることが分かった。
足し算というロジックを与えずとも、計算という言葉とは関係ないもの
であっても、学習が可能なのだということを学んだ。
val acc 10.720%
| epoch 25 | iter 1 / 351 | time 0[s] | loss 0.73
| epoch 25 | iter 21 / 351 | time 0[s] | loss 0.75
| epoch 25 | iter 41 / 351 | time 1[s] | loss 0.80
| epoch 25 | iter 61 / 351 | time 2[s] | loss 0.78
| epoch 25 | iter 81 / 351 | time 2[s] | loss 0.78
| epoch 25 | iter 101 / 351 | time 3[s] | loss 0.78
| epoch 25 | iter 121 / 351 | time 3[s] | loss 0.78
| epoch 25 | iter 141 / 351 | time 4[s] | loss 0.79
| epoch 25 | iter 161 / 351 | time 5[s] | loss 0.76
| epoch 25 | iter 181 / 351 | time 5[s] | loss 0.76
| epoch 25 | iter 201 / 351 | time 6[s] | loss 0.77
| epoch 25 | iter 221 / 351 | time 7[s] | loss 0.79
| epoch 25 | iter 241 / 351 | time 8[s] | loss 0.81
| epoch 25 | iter 261 / 351 | time 8[s] | loss 0.79
| epoch 25 | iter 281 / 351 | time 9[s] | loss 0.80
| epoch 25 | iter 301 / 351 | time 10[s] | loss 0.80
| epoch 25 | iter 321 / 351 | time 10[s] | loss 0.76
| epoch 25 | iter 341 / 351 | time 11[s] | loss 0.77
Q 77+85
T 162
X 164
---
Q 975+164
T 1139
X 1129
---
Q 582+84
T 666
X 672
---
Q 8+155
T 163
O 163
---
Q 367+55
T 422
X 429
---
Q 600+257
T 857
X 859
---
Q 761+292
T 1053
X 1049
---
Q 830+597
T 1427
X 1441
---
Q 26+838
T 864
X 858
---
Q 143+93
T 236
X 239
---
val acc 9.560%
word2vec
RNN では固定長のデータしか対応できないため、言語のような可変長のデータを学習
させるために、学習データからボキャブラリーを作成し、これにより単語をベクトル
に変換した上で、学習させるモデルである。
工夫として one-hot ベクトルというのがあり、単語に ID を振って該当の ID に 1、そ
れ以外を 0 を立てることで、ある単語をベクトルで表現することが出来る。
単語数が多くなると膨大なデータとなるが、特定の単語だけを抜き出す工夫をいれる
ことで、現実的な計算量で済むようになった。
実装
「ゼロから作るディープラーニング 2」より word2vec について学習した。
入力データを onehot 表現にして、ある単語の前後の文字から、ある単語を予測するモ
デルの実装を行った。
SimpleCBOW クラスの構造としては、前後の単語から間の単語を予測するために、前
後の単語を onehot 表現にしたものを 2 つ入力データとして与える。それぞれに重みを
掛けた上でそれを足して 0.5 を乗じ、それにさらに重みを掛けたものを出力として、
正解データと比較する。
「You say goodbye and I say hello.」を入力データとして与えるプログラムが以下の画
像である。
回数が進むにつれて損失も小さくなり、順調に学習が進んでいる。
また、入力側の重みを各単語ごとに出力しているが、各単語 5 つなのは、hidden_size
が 5 として与えられており、重みの形状が 7×5 となっているからである。
Attention Mechanism
seq2seq には長い文章への対応が難しいという課題がある。
seq2seq の構造は、入力→encoder→decoder→出力であるが、encoder から decoder へ
データを受け渡しする際に、固定長のベクトルとなってしまう。これは、入力データ
の長さにかかわらずなので、長い文章も短い文章も同じ長さのベクトルに情報を詰め
込まなければならないため、長い文章になればなるほど失われる情報が増えることに
なる。その際に、必要な情報だけに注意を向けさせるメカニズムが Attention であ
る。
参考書籍
「ゼロから作るディープラーニング 2」
」より Attention について補足。
構造としてはこれまで encoder から出力された最後のデータが decoder に入力されて
きたが、それに加えて、encoder 中の一つ一つの LSTM からのすべての出力データを
利用し、それを decoder で受け取ることで、固定長の制約がなくなり、重要な情報を
選択できるようにしている。
実装
様々な日付を一定のフォーマットに変換することを Attenntion を入れた Seq2seq で学
習を行った。
# coding: utf-8
import sys
sys.path.append('..')
import numpy as np
import matplotlib.pyplot as plt
from dataset import sequence
from common.optimizer import Adam
from common.trainer import Trainer
from common.util import eval_seq2seq
from attention_seq2seq import AttentionSeq2seq
from seq2seq import Seq2seq
from peeky_seq2seq import PeekySeq2seq
# データの読み込み
(x_train, t_train), (x_test, t_test) = sequence.load_data('date.txt')
char_to_id, id_to_char = sequence.get_vocab()
# 入力文を反転
x_train, x_test = x_train[:, ::-1], x_test[:, ::-1]
# ハイパーパラメータの設定
vocab_size = len(char_to_id)
wordvec_size = 16
hidden_size = 256
batch_size = 128
max_epoch = 10
max_grad = 5.0
model = AttentionSeq2seq(vocab_size, wordvec_size, hidden_size)
# model = Seq2seq(vocab_size, wordvec_size, hidden_size)
# model = PeekySeq2seq(vocab_size, wordvec_size, hidden_size)
optimizer = Adam()
trainer = Trainer(model, optimizer)
acc_list = []
for epoch in range(max_epoch):
trainer.fit(x_train, t_train, max_epoch=1,
batch_size=batch_size, max_grad=max_grad)
correct_num = 0
for i in range(len(x_test)):
question, correct = x_test[[i]], t_test[[i]]
verbose = i < 10
correct_num += eval_seq2seq(model, question, correct,
id_to_char, verbose, is_reverse=True)
acc = float(correct_num) / len(x_test)
acc_list.append(acc)
print('val acc %.3f%%' % (acc * 100))
model.save_params()
# グラフの描画
x = np.arange(len(acc_list))
plt.plot(x, acc_list, marker='o')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.ylim(-0.05, 1.05)
plt.show()
epocch3 をサンプルで記載したが、この時点で損失がとても小さい値であり、すべて
正解となっているため、かなりの早い段階で学習が進んだものと考えられる。
---
val acc 90.620%
| epoch 3 | iter 1 / 351 | time 0[s] | loss 0.12
| epoch 3 | iter 21 / 351 | time 11[s] | loss 0.10
| epoch 3 | iter 41 / 351 | time 23[s] | loss 0.06
| epoch 3 | iter 61 / 351 | time 34[s] | loss 0.05
| epoch 3 | iter 81 / 351 | time 45[s] | loss 0.04
| epoch 3 | iter 101 / 351 | time 57[s] | loss 0.03
| epoch 3 | iter 121 / 351 | time 68[s] | loss 0.02
| epoch 3 | iter 141 / 351 | time 79[s] | loss 0.02
| epoch 3 | iter 161 / 351 | time 90[s] | loss 0.02
| epoch 3 | iter 181 / 351 | time 102[s] | loss 0.02
| epoch 3 | iter 201 / 351 | time 113[s] | loss 0.01
| epoch 3 | iter 221 / 351 | time 126[s] | loss 0.01
| epoch 3 | iter 241 / 351 | time 138[s] | loss 0.01
| epoch 3 | iter 261 / 351 | time 151[s] | loss 0.01
| epoch 3 | iter 281 / 351 | time 164[s] | loss 0.01
| epoch 3 | iter 301 / 351 | time 178[s] | loss 0.01
| epoch 3 | iter 321 / 351 | time 189[s] | loss 0.01
| epoch 3 | iter 341 / 351 | time 202[s] | loss 0.01
Q 10/15/94
T 1994-10-15
O 1994-10-15
---
Q thursday, november 13, 2008
T 2008-11-13
O 2008-11-13
---
Q Mar 25, 2003
T 2003-03-25
O 2003-03-25
---
Q Tuesday, November 22, 2016
T 2016-11-22
O 2016-11-22
---
Q Saturday, July 18, 1970
T 1970-07-18
O 1970-07-18
---
Q october 6, 1992
T 1992-10-06
O 1992-10-06
---
Q 8/23/08
T 2008-08-23
O 2008-08-23
---
Q 8/30/07
T 2007-08-30
O 2007-08-30
---
Q 10/28/13
T 2013-10-28
O 2013-10-28
---
Q sunday, november 6, 2016
T 2016-11-06
O 2016-11-06

More Related Content

Similar to レポート深層学習Day3

Washingtondc b20161214 (2/3)
Washingtondc b20161214 (2/3)Washingtondc b20161214 (2/3)
Washingtondc b20161214 (2/3)
Toshiyuki Shimono
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
Satoshi Yamada
 
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
Satoshi Yamada
 
[Japan Tech summit 2017] APP 006
[Japan Tech summit 2017]  APP 006[Japan Tech summit 2017]  APP 006
[Japan Tech summit 2017] APP 006
Microsoft Tech Summit 2017
 
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++  MIX #10x64 のスカラー,SIMD 演算性能を測ってみた @ C++  MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
Muneyoshi Suzuki
 
TensorflowとKerasによる深層学習のプログラム実装実践講座
TensorflowとKerasによる深層学習のプログラム実装実践講座TensorflowとKerasによる深層学習のプログラム実装実践講座
TensorflowとKerasによる深層学習のプログラム実装実践講座
Ruo Ando
 
SQL Serverの関数を一覧でマスターしよう
SQL Serverの関数を一覧でマスターしようSQL Serverの関数を一覧でマスターしよう
SQL Serverの関数を一覧でマスターしよう
A AOKI
 
並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js
Yoshiiro Ueno
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニングKensuke Nagae
 
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
Google Cloud Platform - Japan
 

Similar to レポート深層学習Day3 (11)

Washingtondc b20161214 (2/3)
Washingtondc b20161214 (2/3)Washingtondc b20161214 (2/3)
Washingtondc b20161214 (2/3)
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
 
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
 
[Japan Tech summit 2017] APP 006
[Japan Tech summit 2017]  APP 006[Japan Tech summit 2017]  APP 006
[Japan Tech summit 2017] APP 006
 
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++  MIX #10x64 のスカラー,SIMD 演算性能を測ってみた @ C++  MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
 
TensorflowとKerasによる深層学習のプログラム実装実践講座
TensorflowとKerasによる深層学習のプログラム実装実践講座TensorflowとKerasによる深層学習のプログラム実装実践講座
TensorflowとKerasによる深層学習のプログラム実装実践講座
 
SQL Serverの関数を一覧でマスターしよう
SQL Serverの関数を一覧でマスターしようSQL Serverの関数を一覧でマスターしよう
SQL Serverの関数を一覧でマスターしよう
 
並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニング
 
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
 
Tokyor23 doradora09
Tokyor23 doradora09Tokyor23 doradora09
Tokyor23 doradora09
 

Recently uploaded

株式会社メンバーズ「脱炭素アクション100」2023年度実施レポート(2024.6.6)
株式会社メンバーズ「脱炭素アクション100」2023年度実施レポート(2024.6.6)株式会社メンバーズ「脱炭素アクション100」2023年度実施レポート(2024.6.6)
株式会社メンバーズ「脱炭素アクション100」2023年度実施レポート(2024.6.6)
Members_corp
 
smartcamp_RECRUIT_deck 2024060606 dddddd
smartcamp_RECRUIT_deck 2024060606 ddddddsmartcamp_RECRUIT_deck 2024060606 dddddd
smartcamp_RECRUIT_deck 2024060606 dddddd
design777859
 
【slideshare】オンライン二次健診サービス_20240607.pptx.pdf
【slideshare】オンライン二次健診サービス_20240607.pptx.pdf【slideshare】オンライン二次健診サービス_20240607.pptx.pdf
【slideshare】オンライン二次健診サービス_20240607.pptx.pdf
chiakiota2
 
20240606_Service Design Exercise_Visual Report_vol.1.pdf
20240606_Service Design Exercise_Visual Report_vol.1.pdf20240606_Service Design Exercise_Visual Report_vol.1.pdf
20240606_Service Design Exercise_Visual Report_vol.1.pdf
jun_suto
 
intra-mart Accel series 2024 Spring updates
intra-mart Accel series 2024 Spring updatesintra-mart Accel series 2024 Spring updates
intra-mart Accel series 2024 Spring updates
NTTDATA INTRAMART
 
研究エンパワープラットフォームを提供するLabBaseから理系採用成功に向けたご提案
研究エンパワープラットフォームを提供するLabBaseから理系採用成功に向けたご提案研究エンパワープラットフォームを提供するLabBaseから理系採用成功に向けたご提案
研究エンパワープラットフォームを提供するLabBaseから理系採用成功に向けたご提案
ssuser4eac57
 
MMOLHolging株式会社|BtoC、D2C事業グロース支援・インターナルブランディング、採用ブランディング、社員エンゲージメント向上DX
MMOLHolging株式会社|BtoC、D2C事業グロース支援・インターナルブランディング、採用ブランディング、社員エンゲージメント向上DXMMOLHolging株式会社|BtoC、D2C事業グロース支援・インターナルブランディング、採用ブランディング、社員エンゲージメント向上DX
MMOLHolging株式会社|BtoC、D2C事業グロース支援・インターナルブランディング、採用ブランディング、社員エンゲージメント向上DX
sakanotakashi
 
CFO組織の働き方を変える 経理業務変革プラットフォーム 「BlackLine」のご紹介
CFO組織の働き方を変える 経理業務変革プラットフォーム 「BlackLine」のご紹介CFO組織の働き方を変える 経理業務変革プラットフォーム 「BlackLine」のご紹介
CFO組織の働き方を変える 経理業務変革プラットフォーム 「BlackLine」のご紹介
taisukekuwano4
 
KGIとKPIについて(営業の目標設定とKPIの商談プロセス) About KGI and KPI
KGIとKPIについて(営業の目標設定とKPIの商談プロセス) About KGI and KPIKGIとKPIについて(営業の目標設定とKPIの商談プロセス) About KGI and KPI
KGIとKPIについて(営業の目標設定とKPIの商談プロセス) About KGI and KPI
Tsuyoshi Horigome
 
【公開用】株式会社VISIONARY JAPAN_エンジニアチーム 採用資料(ver2.1)
【公開用】株式会社VISIONARY JAPAN_エンジニアチーム 採用資料(ver2.1)【公開用】株式会社VISIONARY JAPAN_エンジニアチーム 採用資料(ver2.1)
【公開用】株式会社VISIONARY JAPAN_エンジニアチーム 採用資料(ver2.1)
recruit9
 
株式会社ROMS採用候補者用説明資料。候補者の方向け事業概要・沿革・カルチャーをご紹介
株式会社ROMS採用候補者用説明資料。候補者の方向け事業概要・沿革・カルチャーをご紹介株式会社ROMS採用候補者用説明資料。候補者の方向け事業概要・沿革・カルチャーをご紹介
株式会社ROMS採用候補者用説明資料。候補者の方向け事業概要・沿革・カルチャーをご紹介
ssuserdc1268
 
Service-introduction-materials-misorae-leadership
Service-introduction-materials-misorae-leadershipService-introduction-materials-misorae-leadership
Service-introduction-materials-misorae-leadership
Yasuyoshi Minehisa
 
株式会社ジンザイベース/特定技能外国人紹介に関する提案資料/2024ver///
株式会社ジンザイベース/特定技能外国人紹介に関する提案資料/2024ver///株式会社ジンザイベース/特定技能外国人紹介に関する提案資料/2024ver///
株式会社ジンザイベース/特定技能外国人紹介に関する提案資料/2024ver///
DAISUKE NAKAMURA
 
LabBase就職ご紹介資料_240605サービス概要説明資料240605.pdf
LabBase就職ご紹介資料_240605サービス概要説明資料240605.pdfLabBase就職ご紹介資料_240605サービス概要説明資料240605.pdf
LabBase就職ご紹介資料_240605サービス概要説明資料240605.pdf
ssuser8de8212
 
Temp agency_Value Core Consulting Co., Ltd.
Temp agency_Value Core Consulting Co., Ltd.Temp agency_Value Core Consulting Co., Ltd.
Temp agency_Value Core Consulting Co., Ltd.
dyasa
 
kintone Café 山口 Vol.8 kintone×UiPath.pdf
kintone Café 山口 Vol.8 kintone×UiPath.pdfkintone Café 山口 Vol.8 kintone×UiPath.pdf
kintone Café 山口 Vol.8 kintone×UiPath.pdf
takashihashimoto14
 

Recently uploaded (16)

株式会社メンバーズ「脱炭素アクション100」2023年度実施レポート(2024.6.6)
株式会社メンバーズ「脱炭素アクション100」2023年度実施レポート(2024.6.6)株式会社メンバーズ「脱炭素アクション100」2023年度実施レポート(2024.6.6)
株式会社メンバーズ「脱炭素アクション100」2023年度実施レポート(2024.6.6)
 
smartcamp_RECRUIT_deck 2024060606 dddddd
smartcamp_RECRUIT_deck 2024060606 ddddddsmartcamp_RECRUIT_deck 2024060606 dddddd
smartcamp_RECRUIT_deck 2024060606 dddddd
 
【slideshare】オンライン二次健診サービス_20240607.pptx.pdf
【slideshare】オンライン二次健診サービス_20240607.pptx.pdf【slideshare】オンライン二次健診サービス_20240607.pptx.pdf
【slideshare】オンライン二次健診サービス_20240607.pptx.pdf
 
20240606_Service Design Exercise_Visual Report_vol.1.pdf
20240606_Service Design Exercise_Visual Report_vol.1.pdf20240606_Service Design Exercise_Visual Report_vol.1.pdf
20240606_Service Design Exercise_Visual Report_vol.1.pdf
 
intra-mart Accel series 2024 Spring updates
intra-mart Accel series 2024 Spring updatesintra-mart Accel series 2024 Spring updates
intra-mart Accel series 2024 Spring updates
 
研究エンパワープラットフォームを提供するLabBaseから理系採用成功に向けたご提案
研究エンパワープラットフォームを提供するLabBaseから理系採用成功に向けたご提案研究エンパワープラットフォームを提供するLabBaseから理系採用成功に向けたご提案
研究エンパワープラットフォームを提供するLabBaseから理系採用成功に向けたご提案
 
MMOLHolging株式会社|BtoC、D2C事業グロース支援・インターナルブランディング、採用ブランディング、社員エンゲージメント向上DX
MMOLHolging株式会社|BtoC、D2C事業グロース支援・インターナルブランディング、採用ブランディング、社員エンゲージメント向上DXMMOLHolging株式会社|BtoC、D2C事業グロース支援・インターナルブランディング、採用ブランディング、社員エンゲージメント向上DX
MMOLHolging株式会社|BtoC、D2C事業グロース支援・インターナルブランディング、採用ブランディング、社員エンゲージメント向上DX
 
CFO組織の働き方を変える 経理業務変革プラットフォーム 「BlackLine」のご紹介
CFO組織の働き方を変える 経理業務変革プラットフォーム 「BlackLine」のご紹介CFO組織の働き方を変える 経理業務変革プラットフォーム 「BlackLine」のご紹介
CFO組織の働き方を変える 経理業務変革プラットフォーム 「BlackLine」のご紹介
 
KGIとKPIについて(営業の目標設定とKPIの商談プロセス) About KGI and KPI
KGIとKPIについて(営業の目標設定とKPIの商談プロセス) About KGI and KPIKGIとKPIについて(営業の目標設定とKPIの商談プロセス) About KGI and KPI
KGIとKPIについて(営業の目標設定とKPIの商談プロセス) About KGI and KPI
 
【公開用】株式会社VISIONARY JAPAN_エンジニアチーム 採用資料(ver2.1)
【公開用】株式会社VISIONARY JAPAN_エンジニアチーム 採用資料(ver2.1)【公開用】株式会社VISIONARY JAPAN_エンジニアチーム 採用資料(ver2.1)
【公開用】株式会社VISIONARY JAPAN_エンジニアチーム 採用資料(ver2.1)
 
株式会社ROMS採用候補者用説明資料。候補者の方向け事業概要・沿革・カルチャーをご紹介
株式会社ROMS採用候補者用説明資料。候補者の方向け事業概要・沿革・カルチャーをご紹介株式会社ROMS採用候補者用説明資料。候補者の方向け事業概要・沿革・カルチャーをご紹介
株式会社ROMS採用候補者用説明資料。候補者の方向け事業概要・沿革・カルチャーをご紹介
 
Service-introduction-materials-misorae-leadership
Service-introduction-materials-misorae-leadershipService-introduction-materials-misorae-leadership
Service-introduction-materials-misorae-leadership
 
株式会社ジンザイベース/特定技能外国人紹介に関する提案資料/2024ver///
株式会社ジンザイベース/特定技能外国人紹介に関する提案資料/2024ver///株式会社ジンザイベース/特定技能外国人紹介に関する提案資料/2024ver///
株式会社ジンザイベース/特定技能外国人紹介に関する提案資料/2024ver///
 
LabBase就職ご紹介資料_240605サービス概要説明資料240605.pdf
LabBase就職ご紹介資料_240605サービス概要説明資料240605.pdfLabBase就職ご紹介資料_240605サービス概要説明資料240605.pdf
LabBase就職ご紹介資料_240605サービス概要説明資料240605.pdf
 
Temp agency_Value Core Consulting Co., Ltd.
Temp agency_Value Core Consulting Co., Ltd.Temp agency_Value Core Consulting Co., Ltd.
Temp agency_Value Core Consulting Co., Ltd.
 
kintone Café 山口 Vol.8 kintone×UiPath.pdf
kintone Café 山口 Vol.8 kintone×UiPath.pdfkintone Café 山口 Vol.8 kintone×UiPath.pdf
kintone Café 山口 Vol.8 kintone×UiPath.pdf
 

レポート深層学習Day3

  • 1. レポート 深層学習 Day3 再帰型ニューラルネットワークの概念 RNN とは、時系列データに対応できるニューラルネットワークのことである。 時系列データとは時間を追って観測でき、 時間との統計的関係が認められるデータのこ とであり、代表的なものとしてはある施設への日ごとの入場者数や、音声データ・テキ ストデータである。 RNN の全体像としては下図のとおりであり、 中間層からの出力が出力層だけではなく、 次の時点の中間層への入力となっている。 過去の状態を次へ伝えることにより時系列デ ータの予測が可能となっているが、 現在の出力を次の時点へ伝えるための再帰構造が必 要である。 数学的に記述すると以下の様になる。なお u は入力層から中間層へ、v は中間層から出 力層へ流れるデータの活性関数を通す前のデータを指している。 Z0 Z1 Y1 X1 Z2 Y2 X2 W(out) W(out) W(in) W(in) W W
  • 2. 次に、CNN と同じく誤差逆伝播法を使うが、時系列データであるため、出力層から入 力層へ伝えるだけではなく、未来から過去へも伝える必要がある点で CNN と大きく異 なる。 RNN で使用する誤差逆伝播法を BPTT と呼んでいる (BackpropagationThrough Time) これまでと同じく誤差を各重みで微分するが、δまたはδout と定義される誤差を u ま たは v の微分が出てくる。 また、δとδout や過去のδとの関係を漸化式であらわすことが出来る。
  • 4. 確認テスト  サイズ 5×5 の入力画像を、サイズ 3×3 のフィルタで畳み込んだ時の出力画像の サイズを答えよ。なおストライドは 2、パディングは 1 とする。 答え=(サイズ+2*パディング-フィルタ)÷ストライド+1=3  RNN のネットワークには大きくわけて 3 つの重みがある。1 つは入力から現在の 中間層を定義する際にかけられる重み、1 つは中間層から出力を定義する際にかけ られる重みである。残り 1 つの重みについて説明せよ。 直前の中間層からの出力を次の中間層へ伝えるときの重み  連鎖律の原理を使い、dz/dx を求めよ。z = t^2 t = x +y dz/dx=dz/dt * dt/dx=2*t*1=2*(x+y)  下図の y1 を x・s0・s1・win・w・wout を用いて数式で表せ。※バイアスは任意の 文字で定義せよ。※また中間層の出力にシグモイド関数 g(x)を作用させよ。 y1=g(W(out)*f(W*z0+W(in)*x1+b)+c)
  • 5. h(t-1) h(t) h(t) Wh Wx x b dh(t) dt db dWh dh(t-1) dWx dx 参考図書 RNN の構造をより一層理解するために「ゼロから作るディープラーニング 2」を学習 し、RNN レイヤの一つの順伝播と逆伝播を図示した。 逆伝播の伝わり方は以下のようになる。 dt=(tanh(dh(t)))’=dh(t)*(1-dh(t)^2) db=Σdt dWh=dh(t-1)*dt dh(t-1)=dWh*dt dWx=dx*dt dx=dWx*dt × × + + tanh
  • 7. バイナリ加算を RNN で実装の演習を行った。 バイナリの下の位から順に 1 桁ずつ計算させ、 繰り上がりの数字を過去の中間層からの 入力値とするイメージでの実装である (RNN の時系列をそのように置き換えて考える) コードの解釈についてはコードの画像の横に添付した。
  • 11. 逆にサイズを大きく(16→32)にしたところ、収束が早かった。 重みの初期化方法を Xavier に変更したところ、ややブレが少なく収束も早かった。 Relu に活性化関数を変更したところ、勾配爆発によって全く学習が進まなかった。 Tanh に変更したと悪露、Relu よりは多少ましに見えるが、全く収束はしなかった。
  • 12. LSTM LSTM とは RNN で課題であった時系列を遡ることに伴う勾配消失問題をクリアする ために、構造を変えて解決した手法 ※勾配消失問題が起こる理由は、 例えば活性化関数にシグモイド関数を使用すると微分 すると最大でも 0.25 になり、必ずさかのぼるごとに 0.25 を掛けるためどんどん勾配が 小さくなってしまうためである。 具体的な LSTM の構造は下図の通りである。特徴は CEC と呼ばれる部分。ここの重み は1であるため、誤差は過去に向かって正しく伝播することになる。CEC はあくまで 過去の情報を保持するのみの役割であり、これだけだと学習が行われなくなるため、 入 力ゲート、忘却ゲート、出力ゲートを設けてそこで学習が行われることになる。 入力・出力ゲートに重みを設定することによって学習が可能となる。 また、忘却ゲートにより過去の情報をどの程度保持するかを調整することが出来る (こ れがないといつまでも過去の情報を保持することになってしまう)
  • 13. 確認問題 ・シグモイド関数を微分した時、入力値が 0 の時に最大値をとる。その値として正し いものを選択肢から選べ。 (2)0.25 微分すると exp(-x)/(1+exp(-x))^2 となるため ・以下の文章を LSTM に入力し空欄に当てはまる単語を予測したいとする。文中の 「とても」という言葉は空欄の予測においてなくなっても影響を及ぼさないと考えら れる。このような場合、どのゲートが作用すると考えられるか。 「映画おもしろかったね。ところで、とてもお腹が空いたから何か____。 」 →忘却ゲート 参考書籍 LSTM の理解のために「ゼロから作るディープラーニング 2」の第 6 章の学習を行った ので、そのまとめを記載する。 ざっくりとした LSTM のイメージを図示した。 過去の記憶セル c が過去の出力データを受け取って何らかの計算をした上で現在の記 憶セルとして、それに調整をかけることにより今回の出力としている。その調整が LSTM の肝である。 何らかの計算 tanh c(t-1) h(t-1) h(t) c(t) h(t) x(t)
  • 14. output ゲート c(t)に対してどのように調整をかけて h(t)とするかが output ゲートの役割である。 output ゲートにより何割を出力に通すか o を前回の出力 h(t-1)と今回の入力 x(t)から 求める。調整の仕方は tanh(c(t))と o のアダマール積である。 o=σ(x(t)*Wx+h(t-1)*Wh+b)※σはシグモイド関数 forget ゲート 何らかの計算 tanh c(t-1) h(t-1) h(t) c(t) h(t) x(t) × o σ tanh c(t-1) h(t-1) h(t) c(t) h(t) x(t) × o × f σ σ
  • 15. 続いては c(t-1)の記憶から不要な記憶を忘れるための forget ゲートを追加する。 これは output ゲート同じく前回の出力 h(t-1)と今回の入力 x(t)から求める。 ちなみに下の式の W は、output ゲートの重み W とは別物である。 f=σ(x(t)*Wx+h(t-1)*Wh+b)※σはシグモイド関数 新しい記憶セル このままでは忘れることしかできないため、 現在の入力をどの程度記憶しておくかのみ を担当する部分を追加する。 今回は新しい情報を記憶セルに追加することから、 tanh を 用いる。これを c(t-1)と f の積に加算する。 g=tanh(x(t)*Wx+h(t-1)*Wh+b) input ゲート この input ゲートにより g の情報のうちどの情報が大事なのかを判断する。 i=σ(x(t)*Wx+h(t-1)*Wh+b)※σはシグモイド関数 tanh c(t-1) h(t-1) h(t) c(t) h(t) x(t) × o × f + g σ σ tanh
  • 16. ここで重要なのは上図の赤線のところである。 記憶セルを現在から過去へつなぐ線を見ていくと、+のところでは勾配は 1、×のとこ ろではアダマール積であり、要素ごとに forget ゲートが重要だと考えて残した要素に ついては過去へ勾配を多く伝えるようになるため、 勾配消失が起きにくい仕組みとなっ ている。 実装 「ゼロから作るディープラーニング 2」の第 6 章から実装演習を行った。 ptb と呼ばれる様々な英語の文章のサンプルを読み込んで LSTM である単語の次に来 る単語を予測するモデルを学習した。Perplexity というどの単語が来るかを確率の逆 数であらわした指標を用いている。最終的には 250 を切る値を示しており、これは 10000 語の中から 200 個未満まで次の単語を絞れていることを示している。しかし、 実用的には絶えないと考えられる。 tanh c(t-1) h(t-1) h(t) c(t) h(t) x(t) × o × f + g i σ σ tanh σ
  • 17.
  • 18. GRU LSTM ではパラメーターが多く計算負荷が多きかったことから、パラメーターを削減 し精度を今まで以上にした GRU が考え出された。 構造は以下の通り。 LSTM の入力ゲート・忘却ゲート・出力ゲートの代わりに、リセットゲートと更新ゲー トの二つに絞り、構造も単純化されている。 リセットゲートでは現在の情報と過去の情報からなる r を過去の情報に掛け合わせる ことで、どの程度過去の情報を忘れさせるか制御している(忘却ゲートに似たもの) 。 そこから得られた情報(長期記憶)と、現在の情報を混合する割合 z(更新ゲートで求 める)で長期と現在の記憶を混ぜ合わせて出力とする構造となっている。 確認問題 ・LSTM と CEC が抱える課題について、それぞれ簡潔に述べよ。 (3 分) LSTM はパラメーターが多く、構造が複雑で計算負荷が高い。 CEC は重みが 1 で学習しないことが課題。 ・LSTM と GRU の違いを簡潔に述べよ。 (5 分) LSTM は CEC と周りに入力・出力・忘却ゲートを持っており、パラメーターが多く計 算量が多い。GRU はリセット・更新ゲートを持ち、LSTM と比べてパラメーターが少 なく計算量が少ない。
  • 19. 参考書籍 「ゼロから作るディープラーニング 2」より GRU について学習した。 GRU は LSTM のコンセプトはそのままにパラメーターを削減し計算時間を短縮した ものである。 ・リセットゲート 過去の出力をどれだけ無視するか。リセットゲートからの出力 r と入力 x から作られる 値は過去の出力は無視されている。 ・z 過去の出力をどの程度反映させるか ・更新ゲート LSTM の入力ゲートと忘却ゲートの二つを兼ね備えたもの。 (1-z)×h(t-1)でどの程 度過去を忘れるかをコントロールし、 z×h~でどの程度入力を反映させるかをコントロ ールしている。 × h(t-1) h(t) h(t) x(t) + r × z 1- × h∼ tanh σ σ
  • 20. 実装 GRU の順伝播のみを実装演習してみた。 構造としては、 各ゲートごとに使用する重みを 3 つ横に並べた形で初期化して GRU クラス に受け渡すようなかたちで実装されている。
  • 22. Seq2Seq Seq2Seq とは Encoder-Decoder(入力データよりも中心部の次元を低くして入力と同 じサイズの出力を行うモデル)の一つであり、機械対話や機械翻訳などに使われてい る。例えば、私は一本のペンを持っている。→I have a pen.と出力するような場面で使 用する。 EncoderRNN DecoderRNN ・HRED Seq2seq の課題として一問一答しかできないことがあげられる。これを解決する一つ の手法が HRED である。 HRED では過去の複数の発話を踏まえて次の会話を生成するような仕組みとなってお り、前の文章の流れに沿って次の文章を生成するため、より人間らしさを表現でき る。構造としては Seq2seq のエンコーダーとデコーダーの間にこれまでの会話を保存 するために層を追加したものとなっている。ただし、入力が同じであれば毎回同じ出 力しかできない、短い出力をしがちという問題点がある。 文脈 ユーザーがインプットしたテキストデータを 単語等のトークンに区切って渡す構造 ① 文章を単語等のトークンごとに分割した上 で ID に分割する ② ID から分散表現ベクトルに変換 ③ ベクトルを順番に RNN へ入力 ④ 入力されたベクトルは h として出力され、 次の入力と合わさって次の h として出力さ れることを繰り返し、最後に出力されたベ クトルが入力した文章の意味をあらわすも のとなる。 ユーザーがインプットしたテキストデータを 単語等のトークンに区切って渡す構造 ① 文脈のベクトルから、各トークンの生成確 率を求め、確率の高いトークンを選んで出 力する ② 選んだトークンをこれまで出力された文 章に加えて入力値とする ③ 文字数の上限や最後の文字が出力される まで繰り返す。
  • 23. ・VHRED HRED に確率的なノイズを与えて学習させることで問題点を解決した手法である。 VAE の潜在変数の概念を追加したもの。 ・オートエンコーダー 教師なし学習の一つで、入力データからエンコーダーで潜在変数 z に変換し、デコー ダーで潜在変数 z から元の入力データを復元するものである。z の次元は入力データ より小さくすることにより次元削減が行える。 ・VAE 通常のオートエンコーダーの場合、どのように潜在変数 z にデータを押し込んでいる かがよくわからない。VAE では確率分布 N(0,1)を仮定したものである。
  • 24. 確認テスト ・下記の選択肢から、seq2seq について説明しているものを選べ。 (1)時刻に関して順方向と逆方向の RNN を構成し、それら 2 つの中間層表現を特徴 量として利用するものである。 (2)RNN を用いた Encoder-Decoder モデルの一種であり、機械翻訳などのモデルに 使われる。 (3)構文木などの木構造に対して、隣接単語から表現ベクトル(フレーズ)を作ると いう演算を再帰的に行い(重みは共通) 、文全体の表現ベクトルを得るニューラルネッ トワークである。 (4)RNN の一種であり、単純な RNN において問題となる勾配消失問題を CEC とゲ ートの概念を導入することで解決したものである。 →(2) ・seq2seq と HRED、HRED と VHRED の違いを簡潔に述べよ。 Seq2seq の一問一答しかできないことを解決するために HRED では過去の文章を複数 保存して過去の文章を踏まえて出力させるよう工夫したモデル。HRED が同じ入力値 に対しては同じ出力しかできず短い出力をしがちである点を、VAE による潜在変数の 概念を追加したことで多様性を持たせたものが VHRESD である。 ・VAE に関する下記の説明文中の空欄に当てはまる言葉を答えよ。自己符号化器の潜 在変数に____を導入したもの。 →確率分布
  • 25. 実装 「ゼロから作るディープラーニング 2」より Seq2seq について学習した。 足し算を Seq2seq で学習するサンプルである。 構造としては、encoder と decoder クラスを別に作り、Seq2seq クラスで encoder と decoder をつなげている。 インプットデータとして、足し算とその結果をインプットデータとして 渡して、足し算を学習するプログラムを実行した。 25 のエポックではそこまで高い正解率ではなかったが、学習が進むにつれ 正解に近づいてきていることが分かった。 足し算というロジックを与えずとも、計算という言葉とは関係ないもの であっても、学習が可能なのだということを学んだ。
  • 26.
  • 27. val acc 10.720% | epoch 25 | iter 1 / 351 | time 0[s] | loss 0.73 | epoch 25 | iter 21 / 351 | time 0[s] | loss 0.75 | epoch 25 | iter 41 / 351 | time 1[s] | loss 0.80 | epoch 25 | iter 61 / 351 | time 2[s] | loss 0.78 | epoch 25 | iter 81 / 351 | time 2[s] | loss 0.78 | epoch 25 | iter 101 / 351 | time 3[s] | loss 0.78 | epoch 25 | iter 121 / 351 | time 3[s] | loss 0.78 | epoch 25 | iter 141 / 351 | time 4[s] | loss 0.79 | epoch 25 | iter 161 / 351 | time 5[s] | loss 0.76 | epoch 25 | iter 181 / 351 | time 5[s] | loss 0.76 | epoch 25 | iter 201 / 351 | time 6[s] | loss 0.77 | epoch 25 | iter 221 / 351 | time 7[s] | loss 0.79 | epoch 25 | iter 241 / 351 | time 8[s] | loss 0.81 | epoch 25 | iter 261 / 351 | time 8[s] | loss 0.79 | epoch 25 | iter 281 / 351 | time 9[s] | loss 0.80 | epoch 25 | iter 301 / 351 | time 10[s] | loss 0.80 | epoch 25 | iter 321 / 351 | time 10[s] | loss 0.76 | epoch 25 | iter 341 / 351 | time 11[s] | loss 0.77 Q 77+85 T 162 X 164 --- Q 975+164 T 1139 X 1129 --- Q 582+84 T 666 X 672 --- Q 8+155 T 163 O 163 ---
  • 28. Q 367+55 T 422 X 429 --- Q 600+257 T 857 X 859 --- Q 761+292 T 1053 X 1049 --- Q 830+597 T 1427 X 1441 --- Q 26+838 T 864 X 858 --- Q 143+93 T 236 X 239 --- val acc 9.560%
  • 29. word2vec RNN では固定長のデータしか対応できないため、言語のような可変長のデータを学習 させるために、学習データからボキャブラリーを作成し、これにより単語をベクトル に変換した上で、学習させるモデルである。 工夫として one-hot ベクトルというのがあり、単語に ID を振って該当の ID に 1、そ れ以外を 0 を立てることで、ある単語をベクトルで表現することが出来る。 単語数が多くなると膨大なデータとなるが、特定の単語だけを抜き出す工夫をいれる ことで、現実的な計算量で済むようになった。 実装 「ゼロから作るディープラーニング 2」より word2vec について学習した。 入力データを onehot 表現にして、ある単語の前後の文字から、ある単語を予測するモ デルの実装を行った。
  • 30. SimpleCBOW クラスの構造としては、前後の単語から間の単語を予測するために、前 後の単語を onehot 表現にしたものを 2 つ入力データとして与える。それぞれに重みを 掛けた上でそれを足して 0.5 を乗じ、それにさらに重みを掛けたものを出力として、 正解データと比較する。 「You say goodbye and I say hello.」を入力データとして与えるプログラムが以下の画 像である。 回数が進むにつれて損失も小さくなり、順調に学習が進んでいる。 また、入力側の重みを各単語ごとに出力しているが、各単語 5 つなのは、hidden_size が 5 として与えられており、重みの形状が 7×5 となっているからである。
  • 31.
  • 32. Attention Mechanism seq2seq には長い文章への対応が難しいという課題がある。 seq2seq の構造は、入力→encoder→decoder→出力であるが、encoder から decoder へ データを受け渡しする際に、固定長のベクトルとなってしまう。これは、入力データ の長さにかかわらずなので、長い文章も短い文章も同じ長さのベクトルに情報を詰め 込まなければならないため、長い文章になればなるほど失われる情報が増えることに なる。その際に、必要な情報だけに注意を向けさせるメカニズムが Attention であ る。 参考書籍 「ゼロから作るディープラーニング 2」 」より Attention について補足。 構造としてはこれまで encoder から出力された最後のデータが decoder に入力されて きたが、それに加えて、encoder 中の一つ一つの LSTM からのすべての出力データを 利用し、それを decoder で受け取ることで、固定長の制約がなくなり、重要な情報を 選択できるようにしている。 実装 様々な日付を一定のフォーマットに変換することを Attenntion を入れた Seq2seq で学 習を行った。
  • 33. # coding: utf-8 import sys sys.path.append('..') import numpy as np import matplotlib.pyplot as plt from dataset import sequence from common.optimizer import Adam from common.trainer import Trainer from common.util import eval_seq2seq from attention_seq2seq import AttentionSeq2seq from seq2seq import Seq2seq from peeky_seq2seq import PeekySeq2seq # データの読み込み (x_train, t_train), (x_test, t_test) = sequence.load_data('date.txt') char_to_id, id_to_char = sequence.get_vocab() # 入力文を反転 x_train, x_test = x_train[:, ::-1], x_test[:, ::-1] # ハイパーパラメータの設定 vocab_size = len(char_to_id) wordvec_size = 16 hidden_size = 256 batch_size = 128 max_epoch = 10 max_grad = 5.0 model = AttentionSeq2seq(vocab_size, wordvec_size, hidden_size) # model = Seq2seq(vocab_size, wordvec_size, hidden_size) # model = PeekySeq2seq(vocab_size, wordvec_size, hidden_size) optimizer = Adam() trainer = Trainer(model, optimizer)
  • 34. acc_list = [] for epoch in range(max_epoch): trainer.fit(x_train, t_train, max_epoch=1, batch_size=batch_size, max_grad=max_grad) correct_num = 0 for i in range(len(x_test)): question, correct = x_test[[i]], t_test[[i]] verbose = i < 10 correct_num += eval_seq2seq(model, question, correct, id_to_char, verbose, is_reverse=True) acc = float(correct_num) / len(x_test) acc_list.append(acc) print('val acc %.3f%%' % (acc * 100)) model.save_params() # グラフの描画 x = np.arange(len(acc_list)) plt.plot(x, acc_list, marker='o') plt.xlabel('epochs') plt.ylabel('accuracy') plt.ylim(-0.05, 1.05) plt.show() epocch3 をサンプルで記載したが、この時点で損失がとても小さい値であり、すべて 正解となっているため、かなりの早い段階で学習が進んだものと考えられる。 --- val acc 90.620% | epoch 3 | iter 1 / 351 | time 0[s] | loss 0.12 | epoch 3 | iter 21 / 351 | time 11[s] | loss 0.10
  • 35. | epoch 3 | iter 41 / 351 | time 23[s] | loss 0.06 | epoch 3 | iter 61 / 351 | time 34[s] | loss 0.05 | epoch 3 | iter 81 / 351 | time 45[s] | loss 0.04 | epoch 3 | iter 101 / 351 | time 57[s] | loss 0.03 | epoch 3 | iter 121 / 351 | time 68[s] | loss 0.02 | epoch 3 | iter 141 / 351 | time 79[s] | loss 0.02 | epoch 3 | iter 161 / 351 | time 90[s] | loss 0.02 | epoch 3 | iter 181 / 351 | time 102[s] | loss 0.02 | epoch 3 | iter 201 / 351 | time 113[s] | loss 0.01 | epoch 3 | iter 221 / 351 | time 126[s] | loss 0.01 | epoch 3 | iter 241 / 351 | time 138[s] | loss 0.01 | epoch 3 | iter 261 / 351 | time 151[s] | loss 0.01 | epoch 3 | iter 281 / 351 | time 164[s] | loss 0.01 | epoch 3 | iter 301 / 351 | time 178[s] | loss 0.01 | epoch 3 | iter 321 / 351 | time 189[s] | loss 0.01 | epoch 3 | iter 341 / 351 | time 202[s] | loss 0.01 Q 10/15/94 T 1994-10-15 O 1994-10-15 --- Q thursday, november 13, 2008 T 2008-11-13 O 2008-11-13 --- Q Mar 25, 2003 T 2003-03-25 O 2003-03-25 --- Q Tuesday, November 22, 2016 T 2016-11-22 O 2016-11-22 --- Q Saturday, July 18, 1970 T 1970-07-18 O 1970-07-18 ---
  • 36. Q october 6, 1992 T 1992-10-06 O 1992-10-06 --- Q 8/23/08 T 2008-08-23 O 2008-08-23 --- Q 8/30/07 T 2007-08-30 O 2007-08-30 --- Q 10/28/13 T 2013-10-28 O 2013-10-28 --- Q sunday, november 6, 2016 T 2016-11-06 O 2016-11-06