softmax関数の功罪

今回は softmax 関数についてのぼやきです

NN使っていると、最終出力を得た後にほぼ必ずと言って良いぐらい入っている softmax 関数。今回はそれについて書きます。ちなみに、確かにこれがないと困るという事は良ーくわかるのですが、これがあるおかげで妙な誤解とかも生まれていそうな気がするので、単なるぼやきとして書いてみようかと思います。

softmax 関数って?

まぁ、何となく入れているとは思いますが、この関数は、いくつかのバラバラな値をそれなりに成形して出力してくれるいわば便利関数です。
具体的には、ニューラルネットワークで分類問題を解くとき、最後にこいつを挟むことで何となく出力が確率っぽくなるので使いやすいといった感じです。
で、説明する人も何か面倒くさいんだと思いますが、softmax関数をかけることで確率値が得られるみたいな説明をしているケースをよーく見かけます。
いや、それでいいんか?って言うのが今回の記事の目的です。

softmax 関数がやっていること

式を見てもわからない場合は、Excel とか使って色々と値を試してみるとよくわかります。アレがやっているのは、それなりに値の範囲が狭い結果に対して、値の振れ幅がバラバラだと困るので、足して1になるような加工を施すだけです。んで、この加工ですが、NNの出力がそれなりに似たような値になることが大前提です。もし時間があったら、Excel つかって数百とかその辺の値を入れてみましょう。かなり急激に値が変わるような出力になります。でもまぁ、NNの出力だし、そんなに気にする必要もないかな?みたいな雰囲気で今のところ多くの人が使っています。

私が softmax 関数について思う事

いや、softmax 関数は、確かに便利に使えるケースが多いんだけど、こいつのおかげで妙なことが起きているとも思っているのですよ。
具体的には以下のケース。

  • 犬と猫を識別するモデルに対して、自動車の画像を与えたとき。
    この時、NNはむりやり犬の確率と猫の確率を計算して出力する。

なんとなくみんなそんなもんだと思って使っていますが、そもそも車は犬でも猫でもない。だから、確率はどっちも限りなく0であるべき。でも、softmax はどっちかにむりやり寄せる。だから、知らないデータに対してもむりやり確率っぽいものを計算して出力する。

そんな事が良いわけがないと私は思うのです。

softmax 関数でごまかされる事象

分類問題はAとBのどっちかにするという問題なんですが、AでもBでもないというケースなんてむちゃくちゃたくさんあるわけです。だから、本来はA,B,どちらでもないという3値の分類問題にするべき。でも、何故かそうやって学習する人はあんまりいない。まぁ、多くの場合はA,Bのデータしか入ってこないし、だったらその他を学習する意味なんかないよね?ってところだと思う。
それはそれで別にいいんです。それは、データの特徴を踏まえた上で、その他は無いという判断をした上でそのケースを削除しているから。
問題は、上に挙げた犬猫判定で自動車の映像を与えるケースです。
これは2値分類問題として解くことが適切なのか?という事を考えるべきなんです。でも、何故かそれをせずに犬猫で学習した挙げ句「この車は犬っぽい」みたいな意味不明な結論に達する。
もちろん、これは作っている人がもっと考えれば済む話なんです。でも、そうなる一番の理由は「softmax関数を挟むことで、どんな出力もむりやり確率っぽいものに補正される」という事だと私は思っています。

初心者にこれを理解してもらうのは正直しんどい

初心者にこのことを教えたところであんまりピンとこないと私は思っています。だって、データについての知見も乏しいし、モデルがどういう振る舞いをするかだって大して知らない。しかも、本を見たら多くのサンプルは2値分類問題を解いているし、softmax関数はお約束で入れるものみたいな扱いになっている。そして、それを使うとなんだかわかんないけど確率値が出てくるから「これでいいんじゃないかな?」って思ってしまう。
なんか、この辺の問題をしっかり理解して教える人がそもそも居ない。だから、初心者はこの問題の存在にすらそもそも気がつかない。結果、怪しい理解のまま突っ切ってしまい「この車は犬っぽい」という結論に至ってしまうわけです。

分類問題をよりよく考えるには

そもそも、どんなデータがあって、どう分類したいのか?が基本です。
入力として想定しているもの、出力として想定しているもの、これが明らかに出来ないならば、そりゃ変なことになってしまいます。
これは、実はシステムを設計するときに考えることとそっくりそのままおなじです。機械学習のモデルの学習だって、結局は入力と出力がある。つまり、やたらと理解しにくい関数と一緒です。システム作るときも一緒。その辺を明らかにして設計していくわけですから、機械学習もその例に倣うだけで良いんです。

なんでこんな基本がやられていないのか?

多分、機械学習とITをバラバラで考えているからだと思います。まぁ、たしかに違う分野だからそう思いたくなるのもわからんでもない。でも、その結果、おかしな事になっていると私は思うのです。
別に全てをいきなり知って実践する必要は無い。そんな事は無理だ。
でも、自分がやっていることについては常に疑問を持つという姿勢は大事だと思います。そして、そういう姿勢でいれば、やがてこんなシンプルな問題、気がつくと思うのです。

鵜呑みがいけない

まぁ、本にsoftmax使えと書いてあるから俺のせいじゃないと思う人はきっと多いことでしょう。まぁ、それはそれでいいんですが、本が悪いと言ってもあなたのプロダクトの性能が低い理由にはなりません。
なんか変だな?と思う気持ちはとても大切です。それを持てば、ここに書いた疑問ぐらいさくっとみんな思いつくはずです。
だからこそ、疑問を持ち、自分で考えることは重要なのです。

最後に

なんか、勢いで  Data-Centric AI Community の勉強会のライトニングトークに参加させてもらうことにしました。第1回 Data-Centric AI勉強会です。2023/06/01 19:00~ になります。とりあえず、持ち時間10分だから何もしゃべれませんが、機械学習に対する私の思いを手短にぶちまけてきます。
参加する方で興味がおありでしたら、石を投げずに聞いていただけますと幸いです。

この記事が気に入ったらサポートをしてみませんか?