0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ラビットチャレンジ - 深層学習 Day3 Section2 LSTM

Last updated at Posted at 2020-11-23

0.概要

本記事は日本ディープラーニング協会認定の講座プログラムである「ラビット・チャレンジ」が提供している科目の1つである深層学習のレポートである。
記事タイトルに記載のとおり、Day3 Section2 LSTMについて以下にまとめる。

1.LSTM(Long Short Term Memory)

RNNでは時系列を過去に遡るほど勾配が消失する。
活性化関数や重み等の初期化の手法を変えることも抑制する方法の1つだが、ニューラルネットワークの構造を変えて解決したものがLSTM。

下記のサイトにあるような図で見ると流れが分かりやすい。

参考:https://sagantaf.hatenablog.com/entry/2019/06/04/225239#3-LSTM-Long-short-term-model

1.1.CEC

過去のデータを保存するための部分。

CEC単独では以下のような問題があるためゲート、覗き穴結合で解決する。

時間依存度に関係なく重みが一律(重み衝突)になってしまう問題
過去の情報をすべて持っているため、その情報がいらなくなってもずっと影響を及ぼしてしまう問題
CEC自身の値はゲートの制御に影響を与えないためCECの過去の情報を任意のタイミングで伝搬させたり忘却させたり出来ない問題。

1.2.入力ゲート

1つ前のユニットの入力をどの程度受け取るか(一律ではなく可変の重みとする)を調整する。

i=\sigma(W_{i}h_{t-1}+U_{i}x_{t})

1.3.出力ゲート

1つ前のユニットの入出力をどの程度受け取るか(一律ではなく可変の重みとする)を調整する。

o=\sigma(W_{o}h_{t-1}+U_{o}x_{t})

1.4.忘却ゲート

CECの中身をどの程度残すか(いらない情報を忘却する)を調整する。

f=\sigma(W_{f}h_{t-1}+U_{f}x_{t})

1.5.メモリセル

g=tanh(W_{g}h_{t-1}+U_{g}x_{t})
c_{t}=(c_{t-1}\otimes f)\oplus(g\otimes i)

1.6.出力

h_{t}=tanh(c_{t})\otimes o

1.7.覗き穴結合

CEC自身の値に重み行列を介して伝搬可能にした構造。

2.確認テスト

2.1.確認テスト1

シグモイド関数を微分した時、入力値が0の時に最大の値を取る。
その値はいくつか。

回答:
シグモイド関数の微分

f'(x)=(1-f(x))・f(x)

シグモイド関数の入力値$x$に0を代入すると

sigmoid(x)=\frac{1}{1+e^{-x}}=\frac{1}{2}=0.5

微分の式に当てはめると

f'(x)=(1-0.5)・0.5=0.25

2.2.確認テスト2

以下の文章をLSTMに入力し、空欄に当てはまる単語を予測したいとする。
文中の「とても」という言葉は空欄の予測においてなくなっても影響を及ぼさないと考えられる。
このような場合、どのゲートが作用すると考えられるか。

「映画おもしろかったね。ところで、とてもお腹が空いたから何か____。」

回答:忘却ゲート

3.演習チャレンジ

3.1.クリッピング

勾配のノルムが閾値を超えた場合、勾配のノルムを閾値をに正規化することで勾配爆発を防ぐ手法。

def gradient_clipping(grad, threshould):
  norm = np.linalg.norm(grad)
  rate = threshould / norm

  if rate < 1:
    return grad * rate
  return grad

3.2.LSTM

def lstm(x, prev_h, prev_c, W, U, b):
  # セルへの入力やゲートをまとめて計算し、分割
  lstm_in = _activation(x.dot(W.T)) + prev_h.dot(U.T) + b)
  a, i, f, o = np.hsplit(lstm_in, 4)

  # 値を変換、セルへの入力:(-1, 1)、ゲート:(0, 1)
  a = np.tanh(a)
  input_gate = _sigmoid(i)
  forget_gate = _sigmoid(f)
  output_gate = _sigmoid(o)

  # セルの状態を更新し、中間層の出力を計算
  c = input_gate * a + forget_gate * c
  h = output_gate * np.tanh(c)
  return c, h

X.ラビットチャレンジとは

ラビットチャレンジとは、日本ディープラーニング協会認定の講座プログラムの1つ。
E資格を受験するためにはこのラビットチャレンジ等、いずれかの講座プログラムを修了しなければならない。

ラビットチャレンジの特徴は「現場で潰しが効くディープラーニング講座」の通学講座録画ビデオを編集した教材を使用した自習スタイルであるという点。
サポートは他の講座より少なく、受け身ではなく自主的に学んでいく姿勢でなければ進められないが、その分、他の講座に比べると安価であり、手が出しやすい。
ある程度知識がある人、自力で頑張るぞというガッツのある人向けではないかと感じる。

bnr_jdla.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?