からっぽのしょこ

読んだら書く!書いたら読む!同じ事は二度調べ(たく)ない

5.5.2:言語モデルの評価【ゼロつく2のノート(実装)】

はじめに

 『ゼロから作るDeep Learning 2――自然言語処理編』の初学者向け【実装】攻略ノートです。『ゼロつく2』学習の補助となるように適宜解説を加えています。本と一緒に読んでください。

 本の内容を1つずつ確認しながらゆっくりと組んでいきます。

 この記事は、5.5.2項「言語モデルの評価」の内容です。Perplexityを解説して、Pythonで実装します。

【前節の内容】

www.anarchive-beta.com

【他の節の内容】

www.anarchive-beta.com

【この節の内容】

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

 確率値が高くなるほどperplexityの値が下がるのが確認できます。確率が最大の1のとき、perplexityは最小の$\frac{1}{1} = 1$となります。

・交差エントロピー誤差とperplexityの関係

 次にRNNにおけるperplexityを考えます。最終層においてSoftmax関数により正規化した出力$\mathbf{y}$は、0から1の値をとり確率として扱えるのでした。簡単な例として、データ数が$N = 1$の場合の交差エントロピー誤差を計算し、そこからperplexityを求めましょう。

 先ほどと同様に、予測値(出力)がとり得る範囲の値を設定し、交差エントロピー誤差を計算します。1データの交差エントロピー誤差は

$$ L = - \sum_{k=1}^K t_k \log y_k \tag{1.7} $$

で計算します。ただし正解データが$k$番目の要素のとき、$k$に関する項のみ計算すればいいのでした。

$$ L = - t_k \log y_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は、次の式で計算します。

$$ \mathrm{perplexity} = \exp(L) \tag{5.13} $$
# perplexityを計算
perplexity = np.exp(L)

# 作図
plt.plot(y, perplexity)
plt.xlabel('y')
plt.ylabel('perplexity')
plt.grid()
plt.show()

perplexity

 確率の逆数から求めた場合と一致します。これは次の理由からです。

 ネイピア数を用いた指数関数$\exp(\cdot)$と自然対数$\log$は打ち消しあうので、$\exp(\log x) = x$です。また自然対数には$- \log x = \log x^{-1}$という性質があります。さらに負の指数は逆数$x^{-1} = \frac{1}{x}$です。従って(データ数が1で正解データが$k$の場合の)perplexityの式は、次のように変形できます。

$$ \mathrm{perplexity} = \exp(-\log y_k) = y_k^{-1} = \frac{1}{y_k} $$

 つまり予測値(確率)の逆数になります。

 またデータ数が複数の場合であっても、$N$個分の交差エントロピー誤差を足して$N$で割って求めるため、平均(1データあたりの)交差エントロピー誤差といえます。つまり値がとり得る範囲は1データのときと同じです。

 以上で予測性能の評価方法を確認しました。次項では、RNNLMを用いた学習を行います。

参考文献

おわりに

 区切りの問題でこれまでで一番短い記事になったかも。でも細かく分けた方が読みやすいと最近気付いた。

 2020年12月30日はJuice=Juiceの植村あかりさんの22歳のお誕生日です。おめでとうございます!

 年内最後のハロメンバースデーですね。来年は皆が満足に活動できることを願ってます。(観る側の私のためにも)

【次節の内容】

www.anarchive-beta.com