「5.2.7 長期依存性の学習評価」については、以下のような感じでデータセットを確認:
# シグナルの前半 print(x[0, :, 0][:30]) # マスク print(x[0, :, 1]) indices_of_one = np.where(x[0, :, 1] == 1) # マスクが 1 の箇所 print(indices_of_one) # マスクが 1 の箇所のシグナルの抽出と和の計算 print(x[0, :, 0][indices_of_one], '->', np.sum(x[0, :, 0][indices_of_one])) # 正解 print(t[0])
$X_i \sim U(0,1),\ Y_i \sim U(0,1)$ な独立同分布の時、$E[X_i] = E[Y_i] = 1/2$ で $V[X_i] = V[Y_i] = 1/12$ である。書籍にあるように、常に、$0.5 + 0.5 = 1$ と予測するようになった場合、損失関数 MSELoss の値は平均的には
\begin{align*}
\mathrm{MSELoss} &= E \left[ \frac{1}{n} \left( (X_1 + Y_1 - 1)^2 + (X_2 + Y_2 - 1)^2 + \cdots + (X_n + Y_n - 1)^2 \right) \right] \\
& = E[(X_1 + Y_1 - 1)^2] \\
& = V[X_1] + V[Y_1] + 2E[(X_1 - 0.5)(Y_1 - 0.5)] \\
&= V[X_1] + V[Y_1] + 2E[(X_1 - 0.5)]E[(Y_1 - 0.5)] \\
&= V[X_1] + V[Y_1] = 1/12 + 1/12 = 1/6 = 0.16666666666666666
\end{align*}
なので、暫く当てずっぽうっぽいけど、80 エポック目くらいで急激に減少してくる。K80 上で 500 エポック回すのに 30 分くらいかかった。なかなかかかる・・・。
epoch: 1, loss: 0.351, val_loss: 0.181 epoch: 2, loss: 0.168, val_loss: 0.178 epoch: 3, loss: 0.168, val_loss: 0.178 epoch: 4, loss: 0.168, val_loss: 0.178 epoch: 5, loss: 0.168, val_loss: 0.178 epoch: 6, loss: 0.169, val_loss: 0.178 epoch: 7, loss: 0.168, val_loss: 0.178 epoch: 8, loss: 0.168, val_loss: 0.177 epoch: 9, loss: 0.168, val_loss: 0.177 epoch: 10, loss: 0.168, val_loss: 0.179 ... epoch: 77, loss: 0.166, val_loss: 0.176 epoch: 78, loss: 0.165, val_loss: 0.177 epoch: 79, loss: 0.164, val_loss: 0.170 epoch: 80, loss: 0.131, val_loss: 0.108 epoch: 81, loss: 0.0571, val_loss: 0.027 epoch: 82, loss: 0.0253, val_loss: 0.018 epoch: 83, loss: 0.014, val_loss: 0.010 epoch: 84, loss: 0.00996, val_loss: 0.008 epoch: 85, loss: 0.00719, val_loss: 0.006 epoch: 86, loss: 0.00725, val_loss: 0.006
総当たりで色々試しているうちにそのうちピンと来るようになるって感じなんだろうか・・・。
p.296 まで何となく眺めたということで。GRU と BiRNN は飛ばして次は p.322〜 で seq2seq を見る。