プログラミングを学ぶ人「ニューラルネットワークのSoftmaxって何?」
こんな方に向けた記事です。
今回はニューラルネットワークでよく用いられる活性化関数の一つであるSoftmax関数について一緒に勉強していきましょう。
Softmaxとはなんでしょうか。Softmax関数の最も大きな特徴は、出力値の合計が1 (=100%)になることから、それぞれの出力値を確立として捉えることができる点です。
ニューラルネットワークについては、【機械学習】ニューラルネットワークをわかりやすく解説で紹介しています。
早速内容を見て参りましょう。
本記事の学習目標
- Softmax関数の数式、概要を理解する。
- Softmax関数を実践する。
Softmaxとは
Softmax関数とは出力の合計値が1 (= 100%)になるように変換して出力する、ニューラルネットワークで頻繁に用いられる関数のことです。
出力値はソフトな曲線を描き、それぞれの出力値の最大が1となることからSoftmax関数と呼ばれています。
もう一つの代表的な出力手法である恒等関数と比較してみましょう。
恒等関数とは入力に対して何も手を加えずに出力する関数のことです。簡単に図で示すと以下のようになります。
このように入力に対して手を加えずに直線的に出力する関数を恒等関数と呼びます。
対してSoftmax関数を数式で表すと以下のようになります。
ご覧のようにi番目の出力yiは、分子が入力xiの指数関数、分母がすべての入力信号の指数関数の和から構成されます。
つまり、Softmax関数は関連する入力一つと相関していた恒等関数とは異なり、出力の各ニューロンが全ての入力信号から影響を受けることになります。簡潔で図で示すと以下のようになります。
具体例で考えてみましょう。
ある手書きの数字が何であるかを認識する場合を想定します。今回認識したい手書き文字はこちらです。
手書き文字を「5」、「2」、「1」に分類するタスクを仮定します。以下の図は5 (X0)、2(X1)、1(X2)の3つの入力、それらをSoftmax関数で変換した出力結果をグラフ化したものになります。
例えば、入力値が2, 3, 4などの時はY0 つまり「5」を表す出力だけがほぼ1(=100%)になり、それ以外の「2」, 「1」を表す出力はほぼ0になります。この時常に出力の合計は1になっています(つまり確率として換算することができます)。つまりY0=0.98 (98%)、Y1=0.015 (1.5%)、Y2=0.005 (0.5%) (0.98 (98%) + 0.015 (1.5%) + 0.005 (0.5%) =1 (100%) )のようになり、最も確率の高いY0つまり「5」に分類されます。
この結果からX=2, 3, 4などの時は手書き文字は「5」に分類されます。
Softmax関数の実践
それでは実際にコードを書いてSoftmax関数を実践してみましょう。
今回は入力を5, 2, 1とします。
import numpy as np
x = np.array([1,2,5])
#指数関数化する
exp_x = np.exp(x)
#分母となる指数関数の和
sum_exp_x = np.sum(exp_x)
#Softmaxの実装
y = exp_x/sum_exp_x
#確認する
print(y)
#[0.01714783 0.04661262 0.93623955]
このようになります。今回は0.936(93.6%)で5に分類されました。
このように数式を用いることで簡単にSoftmax関数を実践することができます。
参考にさせていただきました
・@IT 様 [活性化関数]ソフトマックス関数(Softmax function)とは?
・Qiita Softmax関数を直感的に理解したい
さいごに
いかがでしょうか。今回はディープラーニングの代表的な関数の一つであるSoftmax関数ついて一緒に勉強しました。
ディープラーニングでは広く用いられる非常に代表的な手法になります。この記事が少しでも皆様の役に立てば幸いです。
機械学習はプログラミング言語のPythonを用いれば、今持っている自分のパソコンですぐに実践することができます。
英語論文になっている手法もしっかりと勉強すれば、自分のパソコンで出来ます。
このサイトでは、プログラミングに興味のある医学生、医師のための情報を発信しております。
プログラミングの学習方法には大きく分けて、「独学」と「プログラミングスクール」の2つがあります。
当サイトでは一貫してプログラミングスクールを利用することをおすすめしています。
なぜなら、独学で勉強した私が非常に苦労したからです。
また私はプログラミングを学習するにあたり、師匠・メンターのような存在がいました。
わからないところは教えてもらっていました。
そのような環境でなければ0から独学で勉強するのはとても効率が悪いと思います。
詳しくは、プログラミングの独学は難しいです【私の失敗談】で紹介しています。
この記事が一人でも多くのプログラミングに興味のある方のお役に立てば幸いです。