らんだむな記憶

blogというものを体験してみようか!的なー

ゼロつく 2 (16)

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$ を計算する形になっている。