こんにちは、ヒガシです。
このページでは、Tensorflow-Kerasにて構築したLSTMモデルの内部パラメータの持つ意味を実際のモデルを使いながら詳細解説していきます。
このページを読めば、LSTMの内部構造を詳細把握できるはずです。
それではさっそくやっていきましょう!
LSTMの重み、バイアスはどこに使われているのか
まずはそもそもLSTMの重み&バイアスがどこで使われているのか、というところから説明していきます。
まず以下がLSTMの模式図です。
自分の理解で書いたのでよく出回っている画像と少し表現が違いますが、書いていることは同じはずです。
今回着目したい重み&バイアスですが、上の画像でいうとW,Uが重み、bがバイアスです。
つまり、上の画像で言うとW, U, b, Wout, boutという5種類の内部パラメータを有しているということになります。
Keras-LSTMモデルの中身を見てみる
それではLSTMモデルの内部パラメータが何個あってどこで使われているのかがわかったところで、実際に学習済みのLSTMモデルの中身を見てみましょう。
model.get_weights()で変数modelの内部パラメータを確認できます。
以下がその結果です。
しっかりと5つのパラメータがそれぞれ出力されていますね。
なお今回のモデルは、入力Xの次元=3、隠れ層hの次元=5、出力層の次元=1でモデルを構築してます。
出てくるそれぞれのパラメータの大きは以下のようになっています。
先ほども説明した通り、今回のモデルは、入力Xの次元=3、隠れ層hの次元=5、出力層の次元=1です。
その数値が上記の重みの形にも表れていますね。
では、W, U, b が持つ20とはなんなのか?
次項ではこの数値について解説していきます。
LSTMの内部パラメータの形についての解説
それでは内部パラメータの形(大きさ)について説明していきます。
まず、入力の次元をxu, 隠れ層の次元をhu, 出力層の次元をyuとした場合、それぞれのパラメータは以下の大きさで出力されることになっています。
W_shape=(xu, hu×4)
U_shape=(hu, hu×4)
b_shape=(hu×4,)
Wout_shape=(hu, yu)
bout_shape=(yu,)
なに?この×4って。
おそらくこう思ったはずです。
この×4について解説します。
まずは最初に紹介したLSTMの内部構造をおさらいです。
上の画像のとおり、xt, ht-1および重み(W,U)、バイアス(b)を使ってit, ft, ot, cttという4つの中間パラメータを計算しています。
そうです。先ほどの×4というのはこのit, ft, ot, cttという4つのパラメータを計算するために存在しています。
具体的に説明すると以下の通りです。
詳細は割愛しますが、Uもbも基本的には同じ考え方で分割されます。
Wout, boutについては算出されたhtに使うだけなので説明は不要でしょう。
内部パラメータを使ってLSTMの計算を実施してみる
それではここまでに紹介した知識を使い、LSTM内部の行列計算を実際に実演してみましょう。
学習済みモデル:model
入力の次元:xdim=3
隠れ層の次元:hl_unit=5
ルックバック:look_back=4
入力データXtには(look_back, xdim)という次元でデータが格納されていることを前提に書いていきます。
#変数定義
xdim=3
hl_unit=5
look_back=4
#LSTM内部の重み、バイアスを取得
W,U,b,Wout,bout=model.get_weights()
Wi=W[:,0:hl_unit]
Wf=W[:,hl_unit:2*hl_unit]
Wc=W[:,2*hl_unit:3*hl_unit]
Wo=W[:,3*hl_unit:]
Ui=U[:,0:hl_unit]
Uf=U[:,hl_unit:2*hl_unit]
Uc=U[:,2*hl_unit:3*hl_unit]
Uo=U[:,3*hl_unit:]
bi=b[0:hl_unit]
bf=b[hl_unit:2*hl_unit]
bc=b[2*hl_unit:3*hl_unit]
bo=b[3*hl_unit:]
#シグモイド関数を定義
def sigmoid(x):
return(1.0/(1.0+np.exp(-x)))
#LSTMの内部計算
c=np.zeros(hl_unit)
h=np.zeros(hl_unit)
for i in range(look_back):
x=Xt[i]
it=sigmoid(np.dot(x,Wi)+np.dot(h,Ui)+bi)
ft=sigmoid(np.dot(x,Wf)+np.dot(h,Uf)+bf)
ctt=np.tanh(np.dot(x,Wc)+np.dot(h,Uc)+bc)
ot=sigmoid(np.dot(x,Wo)+np.dot(h,Uo)+bo)
c=ft*c+it*ctt
h=np.tanh(c)*ot
Yt=np.dot(h,Wout)+bout
これで入力Xtを入れたときの出力Ytを算出可能です。
詳細は前回記事にてご紹介していますのでこちらもあわせてご覧いただけると嬉しいです。
【AI】学習済みLSTMモデルの内部計算をnumpyのみで再現する方法
おわりに
というわけで今回はTensorflow-Kerasを使って構築したLSTMモデルの内部パラメータの持つ意味とそれを使った内部計算の実施方法をご紹介しました。
モデルの詳細理解にぜひご活用ください。
このように、私のブログでは様々なスキルを紹介しています。
今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。
確実にスキルアップできるはずです。
最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村
それではまた!
Follow @HigashiSalary
コメント