長短期記憶

machine-learning

長短期記憶 (long short-term memory) のまとめ。にわか知識なのであっているか怪しい。手計算したので、とくに勾配のあたりが。

構成

$\vec{x}$ を入力、$\vec{h}$ を内部状態、$\vec{z}$ を出力とする。

\begin{aligned}
\vec{y}_{t}                 &= \tanh (W \vec{x}_{t} + \vec{b}) \\
\vec{g}_{t}^\textrm{in}     &= \sigma(W^\textrm{in}     \vec{x}_{t} + U^\textrm{in}     \vec{h}_{t-1} + \vec{b}^\textrm{in}) \\
\vec{g}_{t}^\textrm{out}    &= \sigma(W^\textrm{out}    \vec{x}_{t} + U^\textrm{out}    \vec{h}_{t-1} + \vec{b}^\textrm{out}) \\
\vec{g}_{t}^\textrm{forget} &= \sigma(W^\textrm{forget} \vec{x}_{t} + U^\textrm{forget} \vec{h}_{t-1} + \vec{b}^\textrm{forget}) \\
\vec{h}_{t} &= \vec{y}_{t}   \circ \vec{g}_{t}^\textrm{in}
             + \vec{h}_{t-1} \circ \vec{g}_{t}^\textrm{forget} \\
\vec{z}_{t} &= \vec{h}_{t} \circ \vec{g}_{t}^\textrm{out}
\end{aligned}

$\sigma(\cdot)$ はシグモイド関数、$W$ と $\vec{b}$ は重み行列とバイアスベクトル、$W^\textrm{in}$・$U^\textrm{in}$・$\vec{b}^\textrm{in}$ は入力ゲートの重み行列とバイアスベクトル、$W^\textrm{out}$・$U^\textrm{out}$・$\vec{b}^\textrm{out}$ は出力ゲートの重み行列とバイアスベクトル、$W^\textrm{forget}$・$U^\textrm{forget}$・$\vec{b}^\textrm{forget}$ は忘却ゲートの重み行列とバイアスベクトルである。また $\circ$ はベクトル要素ごとの積をあらわす演算子である。

誤差

誤差は二乗誤差で測る。目的のベクトルを $\vec{t}_{t}$ とすると

J(\Theta) = \frac{1}{2} \sum_{t=1}^{T-1} \| \vec{e}_{t} \|^{2}

となる。ここで

\vec{e}_{t} = \vec{z}_{t} - \vec{t}_{t}

とおいた。また、$\Theta$ は最適化したいパラメータで、

\Theta = \left\{W, \vec{b},
    W^\textrm{in}    , U^\textrm{in}    , b^\textrm{in},
    W^\textrm{out}   , U^\textrm{out}   , b^\textrm{out},
    W^\textrm{forget}, U^\textrm{forget}, b^\textrm{forget}
  \right\}

である。

目的ベクトル $\vec{t}_{t}$ は用途に合わせて設定する。たとえば

\vec{t}_{t} = \vec{x}_{t+1}

などとする。

勾配

パラメータは確率的勾配法で最適化することを想定しており、勾配を計算する必要があるので、ここで導出しておく。

$W$ と $\vec{b}$ についての誤差関数の勾配はそれぞれ

\begin{aligned}
\nabla_{W}       J(\Theta) &= \sum_{t=1}^{T-1} f_{W      ,t-1}(\vec{a}_{t}) + f_{W      ,t}(\vec{b}_{t}) \\
\nabla_{\vec{b}} J(\Theta) &= \sum_{t=1}^{T-1} f_{\vec{b},t-1}(\vec{a}_{t}) + f_{\vec{b},t}(\vec{b}_{t})
\end{aligned}

となる。ここで

\begin{aligned}
f_{W,t}(\vec{e})
 &= f_{W,t-1}(\vec{c}_{t}) 
  + \left[
      \vec{e} \circ \vec{g}_{t}^\textrm{in} \circ
      (\vec{1} - \vec{y}_{t}^{2})
    \right] \vec{x}_{t}^{\top}
 \\
f_{\vec{b},t}(\vec{e})
 &= f_{\vec{b},t-1}(\vec{c}_{t})
  + \left[
      \vec{e} \circ \vec{g}_{t}^\textrm{in} \circ
      (\vec{1} - \vec{y}_{t}^{2})
    \right]
 \\
\end{aligned}

と定義した。ただし

\begin{aligned}
f_{W,0}(\vec{e}) &= 0 \\
f_{\vec{b},0}(\vec{e}) &= 0
\end{aligned}

である。また

\begin{aligned}
\vec{a}_{t} &= U^{\textrm{out} \top} \vec{d}_{t} \\
\vec{b}_{t} &= \vec{e}_{t} \circ \vec{g}_{t}^\textrm{out} \\
\vec{c}_{t}
 &= U^{\textrm{in} \top} \left[
      \vec{e} \circ \vec{y}_{t} \circ \vec{s}_{t}^\textrm{in}
    \right]
  + U^{\textrm{forget} \top} \left[
      \vec{e} \circ \vec{h}_{t-1} \circ \vec{s}_{t}^\textrm{forget}
    \right]
  + \vec{e} \circ \vec{g}_{t}^\textrm{forget} \\
\end{aligned}

および

\begin{aligned}
\vec{d}_{t}
 &= \vec{e}_{t} \circ
    \vec{h}_{t} \circ
    \vec{s}_{t}^\textrm{out}
 \\

s_{t}^\textrm{in}     &= \vec{g}_{t}^\textrm{in}     \circ \left(\vec{1} - \vec{g}_{t}^\textrm{in}    \right) \\
s_{t}^\textrm{out}    &= \vec{g}_{t}^\textrm{out}    \circ \left(\vec{1} - \vec{g}_{t}^\textrm{out}   \right) \\
s_{t}^\textrm{forget} &= \vec{g}_{t}^\textrm{forget} \circ \left(\vec{1} - \vec{g}_{t}^\textrm{forget}\right) \\

\vec{y}^{2}
 &= \vec{y} \circ
    \vec{y}
\end{aligned}

とおいた。

入力ゲート

$W^\textrm{in}$・$U^\textrm{in}$・$\vec{b}^\textrm{in}$ についても同様に

\begin{aligned}
\nabla_{W^\textrm{in}} J(\Theta)
 &= \sum_{t=1}^{T-1}\left[
      f_{W^\textrm{in},t-1}(\vec{a}_{t})
    + f_{W^\textrm{in},t  }(\vec{b}_{t})
    \right]
 \\
\nabla_{U^\textrm{in}} J(\Theta)
 &= \sum_{t=1}^{T-1}\left[
      f_{U^{\textrm{in}},t-1}(\vec{a}_{t})
    + f_{U^{\textrm{in}},t  }(\vec{b}_{t})
    \right]
 \\
\nabla_{\vec{b}^\textrm{in}} J(\Theta)
 &= \sum_{t=1}^{T-1}\left[
      f_{\vec{b}^\textrm{in},t-1}(\vec{a}_{t})
    + f_{\vec{b}^\textrm{in},t  }(\vec{b}_{t})
    \right]
\end{aligned}

および

\begin{aligned}
f_{W^\textrm{in},t}(\vec{e})
 &= f_{W^{\textrm{in}},t-1}(\vec{c}_{t})
  + \left[
      \vec{e} \circ \vec{y}_{t} \circ \vec{s}_{t}^\textrm{in}
    \right] \vec{x}_{t}^{\top}
 \\
f_{U^\textrm{in},t}(\vec{e})
 &= f_{U^{\textrm{in}},t-1}(\vec{c}_{t})
  + \left[
      \vec{e} \circ \vec{y}_{t} \circ \vec{s}_{t}^\textrm{in}
    \right] \vec{h}_{t-1}^{\top}
 \\
f_{\vec{b}^\textrm{in},t}(\vec{e})
 &= f_{\vec{b}^{\textrm{in}},t-1}(\vec{c}_{t})
  + \left[
      \vec{e} \circ \vec{y}_{t} \circ \vec{s}_{t}^\textrm{in}
    \right]
\end{aligned}

そして

\begin{aligned}
f_{W^{\textrm{in}},0}(\vec{e}) &= 0 \\
f_{U^{\textrm{in}},0}(\vec{e}) &= 0 \\
f_{\vec{b}^{\textrm{in}},0}(\vec{e}) &= 0
\end{aligned}

のように求められる。

出力ゲート

$W^\textrm{out}$・$U^\textrm{out}$・$\vec{b}^\textrm{out}$ はもうすこし単純で

\begin{aligned}
\nabla_{W^\textrm{out}} J(\Theta) &= \sum_{t=1}^{T-1} \vec{d}_{t} \vec{y}_{t  }^{\top} \\
\nabla_{U^\textrm{out}} J(\Theta) &= \sum_{t=1}^{T-1} \vec{d}_{t} \vec{h}_{t-1}^{\top} \\
\nabla_{\vec{b}^\textrm{out}} J(\Theta) &= \sum_{t=1}^{T-1} \vec{d}_{t}
\end{aligned}

となる。ただし初期条件として $\vec{h}_{0} = \vec{0}$ とする。

忘却ゲート

$W^{\textrm{forget}}$・$U^{\textrm{forget}}$・$\vec{b}^{\textrm{forget}}$ も同様に

\begin{aligned}
\nabla_{W^{\textrm{forget}}} J(\Theta)
 &= f_{W^{\textrm{forget}},t-1}(\vec{a}_{t})
  + f_{W^{\textrm{forget}},t  }(\vec{b}_{t})
 \\
\nabla_{U^{\textrm{forget}}} J(\Theta)
 &= f_{U^{\textrm{forget}},t-1}(\vec{a}_{t})
  + f_{U^{\textrm{forget}},t  }(\vec{b}_{t})
 \\
\nabla_{\vec{b}^{\textrm{forget}}} J(\Theta)
 &= f_{\vec{b}^{\textrm{forget}},t-1}(\vec{a}_{t})
  + f_{\vec{b}^{\textrm{forget}},t  }(\vec{b}_{t})
\end{aligned}

および

\begin{aligned}
f_{W^\textrm{forget},t}(\vec{e})
 &= f_{W^{\textrm{forget}},t-1}(\vec{c}_{t})
  + \left[
      \vec{e} \circ
      \vec{h}_{t-1} \circ
      \vec{s}_{t}^\textrm{forget}
    \right] \vec{x}_{t}^{\top}
 \\
f_{U^\textrm{forget},t}(\vec{e})
 &= f_{U^{\textrm{forget}},t-1}(\vec{c}_{t})
  + \left[
      \vec{e} \circ
      \vec{h}_{t-1} \circ
      \vec{s}_{t}^\textrm{forget}
    \right] \vec{h}_{t-1}^{\top}
 \\
f_{\vec{b}^\textrm{forget},t}(\vec{e})
 &= f_{\vec{b}^{\textrm{forget}},t-1}(\vec{c}_{t})
  + \left[
      \vec{e} \circ
      \vec{h}_{t-1} \circ
      \vec{s}_{t}^\textrm{forget}
    \right]
\end{aligned}

そして

\begin{aligned}
f_{W^\textrm{forget},0}(\vec{e}) &= 0 \\
f_{U^\textrm{forget},0}(\vec{e}) &= 0 \\
f_{\vec{b}^\textrm{forget},0}(\vec{e}) &= 0
\end{aligned}

と得られる。

参考文献

  1. Long short-term memory