アカデミック

【Pythonお悩み解決】Lossは減るけど急にNanに飛んでしまう。

この記事は, Pythonを利用して研究を行なっていく中で私がつまずいてしまったポイントをまとめていくものです。同じような状況で苦しんでいる方々の参考になれば嬉しいです。Pythonつまずきポイント集の目次は以下のページをご覧ください。

【超初心者お悩み解決】Pythonつまずきポイント記事まとめページこの記事は,Pythonを利用して研究を行なっていく中で私がつまずいてしまったポイントをまとめていくものです。同じような状況で苦しんでい...
本記事で紹介する解決策がBestという保証はできません。正確な情報を発信するように心掛けていますが図らずも誤った情報を記載してしまう場合があります。もしご指摘等がありましたら,コメント欄またはお問い合わせページよりご連絡下さい。

読みたい場所へジャンプ!

環境

●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に限りなく近づいたとき,対数全体としては負の無限大に近づきアンダーフローを起こしてしまうからだと考えられます。

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です