連載
» 2020年04月08日 05時00分 公開

AI・機械学習の用語辞典:[活性化関数]ソフトマックス関数(Softmax function)とは?

用語「ソフトマックス関数(Softmax function)」について説明。複数の出力値の合計が「1.0」(=100%)になるような値を返す、ニューラルネットワークの活性化関数を指す。主に分類問題の出力層で使われる。

[一色政彦,デジタルアドバンテージ]
「AI・機械学習の用語辞典」のインデックス

連載目次

用語解説

 AI/機械学習のニューラルネットワークにおけるソフトマックス関数Softmax function、もしくは正規化指数関数Normalized exponential function)とは、複数の出力値の合計が1.0(=100%)になるように変換して出力する関数である。各出力値の範囲は0.01.0となる。

 滑らかな(=ソフトな)曲線となり、1つの出力値が最大となるため、「ソフトマックス関数」と呼ばれる。

図1 「ソフトマックス関数」のグラフ 図1 「ソフトマックス関数」のグラフ

 例えば図1は、「猫」「虎」「ライオン」を分類する問題を仮定している。その問題を解くニューラルネットワークの出力層において、

  • 猫(x0i=0
  • 虎(x1i=1
  • ライオン(x2i=2

という3つの入力(xi)があり、それをソフトマックス関数で変換した出力結果(yi)をグラフ化したものである。例えば入力値x04.0のときを見てほしい。オレンジ色の線(y0=猫)だけがほぼ1.0となり、それ以外の緑色の線(y1=虎)や赤色の線(y2=ライオン)はほぼ0.0となっている。なお、この曲線は、各変数の入力値の状況などによって変わる(=常にこのグラフになるわけではない)ので注意してほしい。

 この結果から、x04.0のときは、「猫」と分類されることになる。

 このようにソフトマックス関数は、主に分類問題における出力層の活性化関数として用いられる。その場合、損失関数には(基本的に)交差エントロピー(Cross entropy、後日解説)が用いられる。

 主要ライブラリでは、次の関数/クラスで定義されている。

定義と数式

 冒頭では文章により説明したが、厳密に数式で表現すると次のようになる。

 eオイラー数)や、それに対応するnp.exp(x)という後述のコードについては、「シグモイド関数」で説明しているので、詳しくはそちらを参照してほしい。オイラー数は、微分計算がしやすいというメリットがある。具体的に上記の数式の導関数Derivative function:微分係数の関数)を求めると、次のように非常にシンプルな式になる。

Pythonコード

 上記のソフトマックス関数の数式をPythonコードの関数にするとリスト1のようになる。なお、テンソル(多次元配列)の計算を簡単にするため、ライブラリ「NumPy」をインポートして使った。

import numpy as np

def softmax(x):
  if (x.ndim == 1):
    x = x[None,:]    # ベクトル形状なら行列形状に変換
  # テンソル(x:行列)、軸(axis=1: 列の横方向に計算)
  return np.exp(x) / np.sum(np.exp(x), axis=1, keepdims=True)

# 入力(x)と出力(y)の例
x = np.array([[1,0,0], [0,1,0], [0,0,1]]) 
y = softmax(x)
print(y)  # 以下のように出力される
# [[0.57611688 0.21194156 0.21194156]  # → 猫: 全部足すと「1.0」になる
#  [0.21194156 0.57611688 0.21194156]  # → 虎: Σ=1.0
#  [0.21194156 0.21194156 0.57611688]] # → ライオン: Σ=1.0

リスト1 ソフトマックス関数のPythonコード例

 ソフトマックス関数の導関数(derivative function)のPythonコードも示しておくと、リスト2のようになる。

# リスト1のコードを先に記述する必要がある

def der_softmax(x):
  y = softmax(x)                        # ソフトマックス関数の出力
  jcb = - y[:,:,None] * y[:,None,:]     # ヤコビ行列を計算(i≠jの場合)
  iy, ix = np.diag_indices_from(jcb[0]) # 対角要素のインデックスを取得
  jcb[:,iy,ix] = y * (1.0 - y)          # 対角要素値を修正(i=jの場合)
  return jcb                            # 微分係数をヤコビアンのまま出力

der_y = der_softmax(x)
print(der_y)  # 以下のように出力される
# [[[ 0.24420622 -0.12210311 -0.12210311]
#  [-0.12210311  0.16702233 -0.04491922]
#  [-0.12210311 -0.04491922  0.16702233]]
#
# [[ 0.16702233 -0.12210311 -0.04491922]
#  [-0.12210311  0.24420622 -0.12210311]
#  [-0.04491922 -0.12210311  0.16702233]]
#
# [[ 0.16702233 -0.04491922 -0.12210311]
#  [-0.04491922  0.16702233 -0.12210311]
#  [-0.12210311 -0.12210311  0.24420622]]]

リスト2 ソフトマックス関数の「導関数」のPythonコード例

「AI・機械学習の用語辞典」のインデックス

AI・機械学習の用語辞典

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。