まったりAI勉強記

AI(人工知能)について、特にゆかりがあるわけでもない社会人が、まったりとAIについて勉強していく勉強日記です。

【G検定】活性化関数

どうも、カタミチです。

さて、今日は活性化関数のお話です。前々回、事前学習なしでディープラーニングを実現する方法のところでキーワードとして出てきたのがこの活性化関数。

さっそく見てみましょう!

tanh関数

ディープニューラルネットワークは隠れ層を増やしたネットワークであり、理論的には層が深いほど複雑な関数を近似できます。しかし、層が深くなればなるほど誤差を逆伝播する際に勾配が消失しやすくなってしまう問題がある…という話でしたね。これは、活性化関数であるシグモイド関数微分の最大値が、微分するごとに減少していく事が問題でした。

f:id:feh_asama:20220131161037j:image

出力層ではシグモイド関数(もしくはソフトマックス関数)を用いなければ出力を確率を表すことができないので変えることはできませんが、隠れ層では、任意の実数を変換することができる関数であれば、特にどんな関数でも問題ないと分かっていました。

で、そんな模索の中でも良い結果が得られたのがtanh(ハイパボリックタンジェント)関数でした。なんか、大学の数学でこんなのあった気がするなー(20年以上前の記憶)

シグモイド関数が0から1の値を取るのに対して、tanh関数は-1から1の値を取ります。

f:id:feh_asama:20220131161844j:image

で、この関数、微分しても最大値が1!と言うことで、勾配が消失しにくくなります。

しかしこれも、あくまで微分の「最大値が」1であり、1より小さくなってしまうことがほぼすべてなので、勾配消失問題を完全には防げていない…ということになります。

ReLU関数

と、そんなところに登場したのがReLU関数です。こんなやつです。

f:id:feh_asama:20220131185015j:image

すごいシンプルですね。どんな関数でも問題ないということでしたが、こんなんでもいいんですね。

この場合、xが0以下の場合は微分した際0になることで学習がうまくいかない場合もありますが、0より大きい場合は微分で1になるので、勾配消失しにくいと言えます。

このReLU関数の登場が、劇的に精度の向上に貢献したそうです。なので、様々なは整形も考えられたようです。そのひとつが、Leaky ReLU関数。グラフはこんな感じ。

f:id:feh_asama:20220131190229j:image

xがマイナスのときも若干傾斜がついていて、微分結果が0になりません。

一見すると、ReLU関数よりLeaky ReLU関数のほうが絶対いい!…という気がするんですが、実際は、精度が出るときもあれば、ReLUのほうが良い場合もあり、どちらがいいとは必ずしも言い切れない状態らしいです。

このあたりが微妙なところなんでしょうねー。シロウトから見ると、0以下もy=xにしてしまえば常に微分結果が1になるから絶対ええやん、と思うんですが、どうもそういうものでもないみたいです。

他にも亜種で、Parametric ReLUや、Randomized ReLUといったものもあるようです。

ということで

とりあえず、活性化関数にはReLUやその仲間たちを使うといい、ってことまでは分かりました。だとすると、最初に教わった、数学シロウトからすると割と難解な関数であるシグモイド関数を教わったのはいったい何だったのか…という気もしますが、最後の出力層に対してはシグモイド関数を使う必要があるので、まぁどのみち覚える必要はあるんですかねー。さて、引き続きこの調子で5章を駆け抜けますかねー。

ではまた。

勉強に使ってる書籍はこちら↓
深層学習教科書 ディープラーニング G検定(ジェネラリスト)公式テキスト 第2版