前回、手で描いた数字を自作のネットワークに読ませました。出口には10本の棒が並び、いちばん長い棒の数字が答えでした。ただ、あの棒の高さは、10個の出力ニューロンがそれぞれ勝手に出した反応の強さで、足しても100%にはなりません。だから「答えは3」とは言えても、「どのくらいの自信で3なのか」「2番手の8とどれだけ差があるのか」は、あの棒のままでは読み取れませんでした。

今回は、その生の出力を確率のかたちに整える、小さな仕上げを一つ入れます。名前はソフトマックスといいます。仕組みはあっけないほど単純で、けれどこの先ずっと出てくる部品です。

生の反応は、そのままでは確率にできない

やりたいことは、10個(今回は話を追いやすいよう、3・5・8の3個で考えます)の生スコアを、足すと100%になる確率に変えることです。素朴に考えると、全部を合計で割ればよさそうに思えます。3個のスコアを足して、各自をその合計で割れば、たしかに合計は1になります。

ところが、これはうまくいきません。ニューロンの出す生スコアには、マイナスの値がふつうに混じるからです。マイナスのスコアを合計で割ると、マイナスの確率という意味をなさない数字が出てしまう。合計そのものがゼロに近くなれば、割り算も破綻します。確率は0%から100%のあいだの正の数でなければならないのに、生スコアはその約束を守ってくれません。

そこで一手はさむ。合計で割る前に、すべてのスコアを指数関数に通します。指数関数というのは、$e^x$ ── ネイピア数$e$(約2.718)を、スコアの数だけ掛け合わせる関数です。難しく身構える必要はなくて、ここで効く性質はたった二つだけです。ひとつ、どんな入力(負の数でも)を入れても、出てくる値は必ずプラスになる。もうひとつ、入力が大きいほど、出力は急激に大きくなる ── つまりスコアの差を、より際立たせる。

指数で全部プラスに直してしまえば、あとは安心して合計で割れます。これでようやく、足すと100%になる確率が手に入ります。

生スコア3個を指数で持ち上げてから合計で割り、足して100%になる確率へ変換する3段階の図。負のスコアが指数でプラスに直り、いちばん高いスコアの数字がいちばん高い確率になる

図の左端、数字5の生スコアはマイナス0.5でした。このままでは確率にできませんが、指数に通すと0.61という小さなプラスの値になります。数字3のスコア2.0は指数で7.39まで持ち上がり、8の1.0は2.72になる。三つを合計すると10.72。あとはそれぞれを10.72で割れば、69%・6%・25%という、足してちょうど100%の確率が出そろいます。いちばんスコアの高かった3が、いちばん高い確率になる。順位は変わらないまま、「どれくらい自信があるか」という情報が新しく読めるようになりました。これがソフトマックスの全部です。

式で書けば、$i$番目の出力の確率は次のように決まります。分子が「そのスコアを指数に通したもの」、分母が「全員を指数に通して足したもの」で、割り算がまさに正規化にあたります。

$$ p_i = \frac{e^{z_i}}{\displaystyle\sum_j e^{z_j}} $$

触って確かめる

言葉より、動かすのが早いです。下で3つの数字の生スコアをスライダーで動かすと、ソフトマックスが整えた確率が、その場で棒に組み替わります。

うまく表示されないときは、デモを別タブで開く

どんなふうにスコアを動かしても、3本の確率を足すと必ず100%になります。ここがソフトマックスの効き目です。「3と8が僅差」のボタンを押すと、二つがほぼ半々に割れて、ネットワークが迷っている様子がそのまま数字に出ます。「3が断然」なら、3が98%まで跳ね上がる。答えを一つ選ぶだけなら生スコアの大小を見れば済みますが、こうして確率にしておくと、その答えをどれだけ信用していいかまで一緒に読めるわけです。

温度で、自信の尖り方が変わる

デモにはもう一つ、温度$T$というスライダーがあります。これは指数に通す前に、スコアをまるごと$T$で割っておく、という小さな細工です。式でいえば分子と分母の肩が$z_i/T$に変わるだけ。

$$ p_i = \frac{e^{z_i/T}}{\displaystyle\sum_j e^{z_j/T}} $$

温度を下げると($T$を1より小さく)、スコアの差が拡大されて、確率は一点へ尖ります。勝者がほぼ100%を総取りして、自信満々の出力になる。逆に温度を上げると($T$を1より大きく)、差が薄められて、確率はなだらかに均されます。三つが横並びに近づいて、迷いの多い出力になる。デモの「温度を下げる/上げる」で、この尖りとなだらかさを行き来してみてください。

この温度という言葉は、ずっと先で言語モデルに次の単語を選ばせるときに、また出てきます。文章生成AIの設定項目として実在するもので、開発者向けの画面(GoogleのAI StudioやOpenAIのPlaygroundなど)を開くと、温度のスライダーが並んでいます。上げると突飛で多様な言葉が出やすくなり、下げると無難で堅い言葉に寄る ── あれは、次の単語の候補につけたソフトマックスの確率を、いま見たとおりに尖らせたり均したりしているだけなのです。普段のチャット画面には出てこない設定ですが、裏ではこの計算が動いています。

確率にしておくと、学習も素直になる

自信が読めるようになるのは、人間が結果を眺めるときに便利、というだけではありません。学習そのものにも効きます。この連載では第0回から、学習とは「どれだけ外したか」を表す一本の数字(誤差、専門的には損失とも呼びます)を小さくしていくことだ、とくり返してきました。数字の分類では、正解のラベル(たとえば「これは3」)に対して、ネットワークが3にどれだけ高い確率を割り当てられたかで、この間違いの大きさを測ります。正解の確率が1に近ければ損失は小さく、0に近ければ損失は大きい。この測り方(交差エントロピーと呼びます)は、出力が確率になっていて初めて素直に使えます。ソフトマックスは、答えを読みやすくすると同時に、学習の土台もきれいに整えているわけです。

新しい部品としては、これで打ち止めです。ソフトマックスは、指数で持ち上げて合計で割るだけ。それでネットワークの生の反応が、足して100%の確率に変わり、答えと一緒に自信の大きさまで返せるようになりました。

前回のネットは、これで確率まで返せる一人前の分類器になりました。ただ、テスト正解率95.7%という数字には、まだ一つ問い返す余地があります。このネットは本当に数字の形を理解して読めているのか、それとも訓練で見た6万枚を、うまく丸暗記しているだけなのか。次回は、その「理解」と「暗記」の境目を見にいきます。


連載「手で動かすAI」
← 前回 手で描いた数字を、自作のネットワークが読む
次回 → 覚えるのと分かるのは違う