🐻‍❄️

【活性化関数】02 活性化関数の種類5つ

2024/03/04に公開

はじめに

前回は、活性化関数の概要について紹介しました。

↓ Past... ↓
https://zenn.dev/nekoallergy/articles/ml-basic-act-01

今回から、より具体的な内容に入っていきましょう。

さて、活性化関数にはいくつか種類があります。使用する活性化関数を変えることで、変換の方法が変わるため、最終的な結果も変わってきます。それぞれの活性化関数には役割が決まっていて、「こんな時にはこの活性化関数を使う」というのが、ある程度決まっています。

活性化関数の種類はたくさんありますが、だいたい 5種類や6 種類くらい知っていれば OK です。

今回は、代表的な活性化関数を 5 つ紹介します。

この5つについて、順番に解説していきます。

ぜひ最後までご覧ください。

↓ 動画でも視聴できます ↓
https://www.youtube.com/watch?v=lpyrMYzulxE

1. ステップ関数

初めに、ステップ関数について紹介します。

ステップ関数は、ニューロンの値が 0 以下なら、 0 を出力し、0 以上なら、 1 を出力する、という活性化関数です。つまり、ニューロンの値が、マイナスなら 0 に変換し、プラスなら 1 に変換します。

たとえば、マイナス30は0 に変換され、0なら0、   23は1、   4598は1 、といったような結果が出てきます。このように、ニューロンの値が極端に大きくなったり、極端に小さくなったりしても、ステップ関数を使うことで、0 か 1 にならすことができます。

逆に、ステップ関数は 1 と 0 しか出力できないため、それまでの計算結果や、めっちゃデカイやめっちゃ小さい、という大切な情報がなくなってしまいます。

このように、表現力に乏しいのが、ステップ関数のデメリットです。

このステップ関数は、実際の ニューラルネットワーク に使用されることは少ないですが、基本的な活性化関数なので、是非頭の片隅に押さえておきましょう。

2. シグモイド関数

さて、次に、シグモイド関数について紹介します。

シグモイド関数は、ニューロンの値を、 0 から 1 の範囲に変換する、という活性化関数です。

ニューロンの値が小さければ、出力は0に近づき、大きいほど、出力は1に近づきます。0 か 1 しか出せないステップ関数と比べると、シグモイド関数を使うことで、 0.2 とか 、0.5 とか、 0.9 などといった、微妙な値を出せるので、元のニューロンの値を殺しすぎない、と言えます。

また、0 から 1 に変換するということは、言い換えれば、0%から 100%の「割合」に変換することができる、ということです。

例で考えてみましょう。たとえば、シグモイド関数による変換の結果が、 0.45 の場合 45%、0.99 なら 99%、といったふうに考えることができます。この性質を利用して、「2 クラス分類問題」の、出力層に、シグモイド関数を使うことができます。

2 クラス分類問題とは、2 つのものを分類する問題です。

たとえば、犬の画像と、猫の画像を分類する問題を考えてみましょう。この問題は、視点を少し変えることで、犬か猫か、という問題ではなく、犬なのか、犬ではないのか、と言い換えることができます。

さて、この問題を ニューラルネットワークを使って解くとき、出力層の活性化関数に、シグモイド関数を使います。

たとえば、シグモイド関数の出力値が、 0.77 なら、「この画像は、 77%の割合で、犬だ!」と言っていることになります。つまり、2 クラス分類問題なので、残りの 23%の割合で「この画像は猫だ!」と言っていることになります。

このように、シグモイド関数は、「2 クラス分類問題」の出力層として使用されることが多いです。

便利なシグモイド関数ですが、一方で、致命的な欠点もあります。それが、「勾配消失問題を起こしてしまう」という点です。

ニューラルネットワークは、学習をするときに、「バックプロパゲーション」という処理をすることで、重みをいい感じに更新していきます。このとき、「中間層の活性化関数」として、シグモイド関数を使ってしまうと、学習が全然進まなくなってしまう、という問題が発生します。

このような、学習が全然進まなくなってしまう問題を、「勾配消失問題」と呼びます。詳しくはぜひ調べてみてください。

さて、この致命的な勾配消失問題を解決するために、次に紹介する「ReLU 関数」という活性化関数が注目されるようになりました。

3. ReLU 関数

次に、ReLU 関数について紹介します。

ReLU 関数は、ニューロンの値が 0 以下なら、 0 を出力し、0 以上なら、その値をそのまま出力する、という特徴を持った活性化関数です。

さっきのステップ関数との違いは、ニューロンの値がプラスだった場合は、その数値をそのまま次へ送る、という点です。

たとえば、−30なら0に変換され、  0は0、   23は23 、  4598は4598、  といったように変換してくれます。

このように、プラスの数値を残すことで、それまでの表現(計算結果)を消すことなく、次のニューロンに繋げることができます。

一方で、マイナスの数字は、そのまま切り捨ててしまっています。

これは、マイナスの数字を「ノイズ」とみなして、あえて切り捨てようという考え方によるものです。このように、いらないものは潔く無くすことで、データの特徴を出しやすくする効果があります。

このような特徴を持ったReLU 関数は、画像データとの相性が、とてもいいです。

画像は、数字の集まりで構成されていますが、その数字は、必ずプラスの値で表現されています。つまり、その画像を ニューラルネットワークで処理した結果が、もしマイナスのデータになったものは、イレギュラーなノイズなので切り捨てる、というのは、たしかに理にかなった処理です。

また、0 を出力するということは、次のニューロンに「何も出力しない」という事とも言えます。これを難しく言うと、「活性化しない」というふうに言い換えることもできます。

実は、この「何も出力しない」という動きは、人間の脳でも実際によく起こっている現象です。

このように、人間の脳の動きに、できるだけ近づけるような工夫をする事で、人工知能の精度を、もっと上げることができます。

4. Softmax 関数

さて、次に、Softmax 関数について紹介します。Softmax 関数は、「パーセント表示」に変換してくれる活性化関数です。

別の言い方をすると、ニューロンの合計値が、 1.0、つまり、100%、になるように変換して出力する関数です。良く分からないと思うので、順を追って解説していきます。

Softmax関数は、これまで紹介した活性化関数たちとは、少しだけ違う考え方をする必要があります。

これまでの活性化関数は、1 つのニューロンの値だけを入力として考えて、その値を変換し、出力していました。たとえば、ニューロンの値が、マイナス3 なら、その値を 0 に変換する、といった感じです。

一方で、この Softmax 関数は、たくさんのニューロンの値が入力となり、それらの値を使ってうまく変換し、複数の値を出力してくれます。

具体例で考えてみましょう。

例えば、ニューラルネットワーク を使って、動物を分類する AI を作る場合を考えます。入力層のニューロンの数は、 3 つあり、1つめの中間層 は 4 つ、2つめの中間層 は 4 つ、出力層は 3 つです。

このニューラルネットワークに、動物の画像を入れてみましょう。画像はたくさんの数字で作られています。ニューラルネットワーク に画像を入力すると、画像の数字は、入力層と、中間層を通って、出力層へと進みます。

このとき出力層に出てきた、 3 つのニューロンの値が、それぞれ、「1」「15」「4」だったとします。

さて、このような場合、3つの中で、「値が一番大きいニューロン」が結果になります。

たとえば、

  • 最初のニューロンが一番大きかったら、「入力された画像は、犬だ!」と ニューラルネットワーク が判断したことになります。
  • 2 番目のニューロンが一番大きかったら、「入力された画像は、猫だ!」と ニューラルネットワーク が判断したことになります。
  • 3 番目のニューロンが一番大きかったら、「入力された画像は、猿だ!」と ニューラルネットワーク が判断したことになります。

今回の例では、「1」「15」「4」と出力されたので、2 番目のニューロンが一番大きくなっています。つまり、ニューラルネットワークは「猫」と判断したことになります。

さて、この値のままでも良いのですが、この結果を「パーセント表示」に変換して、分かりやすくしてくれるのが、Softmax 関数です。今回のような、犬「1」、猫「15」、猿「4」の場合、犬「5%」、猫「75%」、猿「20%」のように変換してくれます。このように、パーセント表示にすることで、最終結果をより分かりやすくすることができます。

Softmax 関数は、このような分類問題において、出力層の活性化関数として、めっちゃよく使用します。

5. 恒等関数

さて、最後に、恒等関数について紹介します。恒等関数は、何も変換せずに、そのまま出力する、という活性化関数です。

変換しないなら、活性化関数の意味がないよね?、と思った方も多いでしょう。たしかに、実際には何も処理していません。

しかし、この恒等関数は、「回帰問題」を解く際に、重要となってきます。

回帰問題とは、実際の数値を予測する問題です。

先ほどの分類問題は、「犬」「猫」「猿」などのラベルを用意した上で、その中のどのラベルに、どれくらい当てはまるか、といった予測をしていました。最終的に、それぞれの割合を、パーセントで計算して、一番割合が大きいものが、判別結果となります。

一方、回帰問題では、たとえば、「明日の平均気温は 、15℃ 」とか、「来週の店の売り上げは、 22 万円 」といった、実際の数値を出力します。簡単に言えば、分類問題は、割合を予測する、回帰問題は、数値を予測する、といったような感じです。

そして、恒等関数は、回帰問題の、出力層に使われることが多いです。さきほどの、Softmax 関数と同じ位置です。Softmax 関数のように、割合に計算するのではなく、そのままの値を出力に通すことで、 15℃や、22 万円といったような結果を、正しく出力することができます。

まあ正直、無くてもそんなに問題ないってことです。

さいごに

さて、今回は、代表的な活性化関数を、 5 つ紹介しました。それぞれの特徴をおさえて、適切に使うことで、より精度の高い人工知能を作ることができます。

次回は、活性化関数の必要性や、非線形変換、といった考え方について紹介します。さらに発展的な内容を含むため、活性化関数についての理解がさらに進むでしょう

↓ Next... ↓
https://zenn.dev/nekoallergy/articles/ml-basic-act-03

Discussion