【AI】Keras-LSTMモデルの内部パラメータの意味を詳細解説!

こんにちは、ヒガシです。

 

このページでは、Tensorflow-Kerasにて構築したLSTMモデルの内部パラメータの持つ意味を実際のモデルを使いながら詳細解説していきます。

 

このページを読めば、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の内部構造をおさらいです。

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モデルの内部パラメータの持つ意味とそれを使った内部計算の実施方法をご紹介しました。

 

モデルの詳細理解にぜひご活用ください。

 

このように、私のブログでは様々なスキルを紹介しています。

過去記事一覧

 

今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。

確実にスキルアップできるはずです。

 

最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村 IT技術ブログへ
にほんブログ村

それではまた!

コメント

タイトルとURLをコピーしました