この記事は, Pythonを利用して研究を行なっていく中で私がつまずいてしまったポイントをまとめていくものです。同じような状況で苦しんでいる方々の参考になれば嬉しいです。Pythonつまずきポイント集の目次は以下のページをご覧ください。
【超初心者お悩み解決】Pythonつまずきポイント記事まとめページ
この記事は,Pythonを利用して研究を行なっていく中で私がつまずいてしまったポイントをまとめていくものです。同じような状況で苦しんで...
スポンサーリンク
環境
●Ubuntu 16.04
●Python 3.7.3
●conda 4.7.12
●pytorch 1.2.0
現象
VAEの学習時にLossはしっかり下がっていくのですが,いきなりLossがNanに飛んでしまうという現象がおきました。(スクショを撮るのを忘れてしまいました)
解決策
対数の中身に微小量を加えればOKでした。
Before
~~~
KL = 0.5 * torch.sum(1 + torch.log(var) - mean**2 - var)
z = self.sample_z(mean, var)
y = self.decoder(z)
reconstruction = torch.mean(x * torch.log(y) + (1 - x) * torch.log(1 - y))
~~~
After
~~~
# 微小量を定義
# 1e-7は適当
delta = 1e-7
# logの中身に微小量を加える
KL = 0.5 * torch.sum(1 + torch.log(var + delta) - mean**2 - var)
z = self.sample_z(mean, var)
y = self.decoder(z)
reconstruction = torch.mean(x * torch.log(y + delta) + (1 - x) * torch.log(1 - y + delta))
~~~
原因
対数の中身が0に限りなく近づいたとき,対数全体としては負の無限大に近づきアンダーフローを起こしてしまうからだと考えられます。