kumitatepazuru's blog

中学生のメモブログ。みんなの役に立ちたい。

kerasでfit_generatorを実行していた時にlossがnanになった件について

f:id:kumitatepazuru:20200715181903p:plain nan!?

前回の記事の続き 前回の記事を見ていない人は下のリンクから見てね。

kumitatepazuru.hatenablog.com

本題

前回、google fontが恐ろしかった話をしたが、次はlossがnanになる事件が発生。

どうして?

プログラムは前回の記事から変更なし。 そういえば、AI作成者としてはしておいて損はないということでsigmoidについてある噂を聞いたことがある。ここからは以下のサイトの引用。

denden-seven.hatenablog.com

y = \frac{1}{1+e^{-x}}

数式はこうなるが、この関数がクセモノ。

f:id:denden_seven:20190322005442p:plain

σ()でよく表せられたりします.この関数の出力は(0,1)におさまり,傾きがどのxについても存在しますが,関数が原点を通らないためにこの関数を通した,データの分布がいびつになります. また,傾きの最大値が x=0 のとき 0.25 であるために,階層を深くしていくと勾配が単調減少するため勾配消失が起きるという問題があります.

活性化関数をまとめた - 電電のブログ

そう。

また,傾きの最大値が x=0 のとき 0.25 であるために,階層を深くしていくと勾配が単調減少するため勾配消失が起きるという問題があります.

原因はこれ。勾配消失が起きて結果的にlossがnanになってしまうらしい。

どうするの?

その時に出てくるのはtanh関数。かなり傾き等が似ていてsigmoidの問題も解決されている最強関数。 ここからは先程のサイトの引用

y = \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}=\frac{e^{2x}-1}{e^{2x}+1}

f:id:denden_seven:20190322011151p:plain

tanh関数はさきほどのsigmoid関数と形状がとても似ています.が大きく異なる点が二つあり,それらがよりよい性質となっています.一つ目は原点に関して点対称な関数であること. 二つ目は傾きの最大値が1であることです.これにより,勾配消失がsigmoidよりも起きにくく,より階層が深く作れます.

活性化関数をまとめた - 電電のブログ

ということ。なので、もしsigmoid関数を使っていてlossがnanになったら確認してみると良い。ちなみに、今回はしっかり動いてくれて1epoch20分という時間で頑張ってもらっているw。f:id:kumitatepazuru:20200712122752p:plain

最後に

お腹すいた。なんか食べよ。


個人的な質問等はこちらまで。

https://forms.gle/V6NRhoTooFw15hJdA

また、自分が参加しているRobocup soccer シミュレーションリーグのチームでは参加者募集中です!活動の見学、活動に参加したい方、ご連絡お待ちしております!

詳しくはこちら

kumitatepazuru.github.io