前章で考えた Encoder-Decoder では、デコーダの $\bm{h}_t$ はエンコーダ $\bm{h}_s$ の最終状態を表す固定長の文脈ベクトル $\bm{c}$ を用いて下記のように表されました。
\begin{align*}
\bm{h}_t(t) = f(\bm{h}_t(t-1), \bm{y}(t-1), \bm{c})
\end{align*}
とあるが、これは
_, states = self.encoder(source) ... for t in range(len_target_sequences): out, states = self.decoder(y, states) ...
で states
が固定であることを指していると思う。ここから先の話ではエンコーダの時刻は $\tau$ で、デコーダの時刻は $t$ で表記されているので気をつけないとならない。
スコア関数については ゼロつく 2 (13) - らんだむな記憶 で引用した ざっくり理解する分散表現, Attention, Self Attention, Transformer - Qiita を引っ張り出すと、(6.12) は “additive”、(6.13) は “bilinear”、(6.14) は “dot-product” ということになる。
p.360 の内容はパッと見ではよく分からない。ゴールは
\begin{align*}
\bm{h}_t(t) = f(\bm{h}_t(t-1), \bm{y}(t-1), \bm{c}(t))
\end{align*}
という形式に持ち込むことだと思う。が、その前に、従来のまま (記号 $\bm{c}$ を $\bm{c}^\prime$ に変えて)
\begin{align*}
\bm{h}_t(t) = f(\bm{h}_t(t-1), \bm{y}(t-1), \bm{c}^\prime)
\end{align*}
を考えて、この $\bm{h}_t(t)$ を使って
\begin{align*}
a(\tau, t) = \mathrm{softmax}(g(\bm{h}_s(\tau), \bm{h}_t(t)))
\end{align*}
を求めている。その上で
\begin{align*}
\bm{c}(t) = \sum_{\tau=1}^T a(\tau, t) \bm{h}_s(\tau)
\end{align*}
を作るので、もう一度 “修正された” $\bm{h}_t(t)$ を今度は $\bm{c}(t)$ を使って計算する 2 段階式なの?という疑問がわく。この辺は実装も追いつつ眺めないと理解するのは難しそうだ。
アインシュタインの規約はもうお腹いっぱいなので*1、次は p.371 から。
*1:アチコチで見すぎるので物理のコンテキストだけで勘弁してほしい・・・。