TimeSoftmaxWithLoss.forward
内の xs = xs.reshape(N * T, V)
について考えたい。簡単な動きを見るコードを考える
>>> import numpy as np >>> a = np.array(range(24)).reshape(2, 3, 4) >>> print(a) [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]] >>> print(a.reshape(2*3, 4)) [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15] [16 17 18 19] [20 21 22 23]]
“そのまま” 繋げて展開したような感じになる。
TimeSoftmaxWithLoss.forward
において、N = 10
, T = 5
, V = 418
になっており、それぞれ、バッチサイズ 10, Truncated BPTT の長さ 5, 語彙数 418 個に対応している。mask.sum()
は典型的には 50 になっており、基本的には N * T = 50
個の 1 の総和ということである。
結果、forward
の計算結果は、
\begin{align*}
L = \frac{1}{50} \sum_{n=1}^{50} \sum_{k=1}^{418} t_{nk} \log y_{nk}
\end{align*}
を返している形になっている。
RnnlmTrainer
内で for iters in range(max_iters)
が 3 回まわった時には、
\begin{align*}
L &= \left( \frac{1}{50} \sum_{n=1}^{50} \sum_{k=1}^{418} t_{nk} \log y_{nk} + \frac{1}{50} \sum_{n=51}^{100} \sum_{k=1}^{418} t_{nk} \log y_{nk} + \frac{1}{50} \sum_{n=101}^{150} \sum_{k=1}^{418} t_{nk} \log y_{nk} \right) \Big/ 3 \\
&= \frac{1}{150} \sum_{n=1}^{150} \sum_{k=1}^{418} t_{nk} \log y_{nk}
\end{align*}
を計算した結果を $e$ の肩に乗せて perplexity $e^L$ を計算する形になっている。