はじめに
『ゼロから作るDeep Learning 2――自然言語処理編』の初学者向け【実装】攻略ノートです。『ゼロつく2』学習の補助となるように適宜解説を加えています。本と一緒に読んでください。
本の内容を1つずつ確認しながらゆっくりと組んでいきます。
この記事は、5.5.2項「言語モデルの評価」の内容です。Perplexityを解説して、Pythonで実装します。
【前節の内容】
【他の節の内容】
【この節の内容】
5.5.2 言語モデルの評価
RNNの予測性能に対する評価指標として、パープレキシティ(Perplexity)を用います。パープレキシティとは、簡単に言うと確率の逆数です。この項では、パープレキシティについて確認します。
# 5.5.2項で利用するライブラリ import numpy as np import matplotlib.pyplot as plt
・確率とPerplexityの関係
まずは、確率とその逆数の関係をグラフで見ましょう。(0除算にならないように、また0付近は値が高くなるので省いています。)
# 確率の範囲 p = np.arange(0.1, 1.01, 0.01) # perplexityを計算 perplexity = 1 / p # 作図 plt.plot(p, perplexity) plt.xlabel('prob') plt.ylabel('perplexity') plt.grid() plt.show()
確率値が高くなるほどperplexityの値が下がるのが確認できます。確率が最大の1のとき、perplexityは最小の$\frac{1}{1} = 1$となります。
・交差エントロピー誤差とperplexityの関係
次にRNNにおけるperplexityを考えます。最終層においてSoftmax関数により正規化した出力$\mathbf{y}$は、0から1の値をとり確率として扱えるのでした。簡単な例として、データ数が$N = 1$の場合の交差エントロピー誤差を計算し、そこからperplexityを求めましょう。
先ほどと同様に、予測値(出力)がとり得る範囲の値を設定し、交差エントロピー誤差を計算します。1データの交差エントロピー誤差は
で計算します。ただし正解データが$k$番目の要素のとき、$k$に関する項のみ計算すればいいのでした。
交差エントロピー誤差については、「2巻の1.3.1項」、または「1巻の4.2節」を参照してください。
# 予測値(確率)の範囲 y = np.arange(0.1, 1.01, 0.01) print(np.round(y, 2)) # 交差エントロピー誤差を(簡易的に)計算 L = - np.log(y) print(np.round(L, 2))
[0.1 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23
0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.34 0.35 0.36 0.37
0.38 0.39 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.5 0.51
0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.61 0.62 0.63 0.64 0.65
0.66 0.67 0.68 0.69 0.7 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79
0.8 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.9 0.91 0.92 0.93
0.94 0.95 0.96 0.97 0.98 0.99 1. ]
[2.3 2.21 2.12 2.04 1.97 1.9 1.83 1.77 1.71 1.66 1.61 1.56 1.51 1.47
1.43 1.39 1.35 1.31 1.27 1.24 1.2 1.17 1.14 1.11 1.08 1.05 1.02 0.99
0.97 0.94 0.92 0.89 0.87 0.84 0.82 0.8 0.78 0.76 0.73 0.71 0.69 0.67
0.65 0.63 0.62 0.6 0.58 0.56 0.54 0.53 0.51 0.49 0.48 0.46 0.45 0.43
0.42 0.4 0.39 0.37 0.36 0.34 0.33 0.31 0.3 0.29 0.27 0.26 0.25 0.24
0.22 0.21 0.2 0.19 0.17 0.16 0.15 0.14 0.13 0.12 0.11 0.09 0.08 0.07
0.06 0.05 0.04 0.03 0.02 0.01 0. ]
交差エントロピー誤差を用いたperplexityは、次の式で計算します。
# perplexityを計算 perplexity = np.exp(L) # 作図 plt.plot(y, perplexity) plt.xlabel('y') plt.ylabel('perplexity') plt.grid() plt.show()
確率の逆数から求めた場合と一致します。これは次の理由からです。
ネイピア数を用いた指数関数$\exp(\cdot)$と自然対数$\log$は打ち消しあうので、$\exp(\log x) = x$です。また自然対数には$- \log x = \log x^{-1}$という性質があります。さらに負の指数は逆数$x^{-1} = \frac{1}{x}$です。従って(データ数が1で正解データが$k$の場合の)perplexityの式は、次のように変形できます。
つまり予測値(確率)の逆数になります。
またデータ数が複数の場合であっても、$N$個分の交差エントロピー誤差を足して$N$で割って求めるため、平均(1データあたりの)交差エントロピー誤差といえます。つまり値がとり得る範囲は1データのときと同じです。
以上で予測性能の評価方法を確認しました。次項では、RNNLMを用いた学習を行います。
参考文献
おわりに
区切りの問題でこれまでで一番短い記事になったかも。でも細かく分けた方が読みやすいと最近気付いた。
2020年12月30日はJuice=Juiceの植村あかりさんの22歳のお誕生日です。おめでとうございます!
年内最後のハロメンバースデーですね。来年は皆が満足に活動できることを願ってます。(観る側の私のためにも)
【次節の内容】