PythonでNumpyやTensorflowを使ってソフトマックス関数を実装する方法

スポンサーリンク

学習者の皆さん、こんにちは! この記事では、ソフトマックス関数について、そしてPythonでNumPyを使ってソフトマックス関数を計算する方法について学びます。

また、ソフトマックスのためのビルトインメソッドを持つフレームワークについても知ることができます。

それでは、はじめましょう。

スポンサーリンク

ソフトマックス関数って何?

ソフトマックスとは、数値のベクトルを入力とし、それを確率分布に正規化する数学的な関数で、各値の確率はベクトル内の各値の相対的なスケールに比例します。

ベクトルに対してソフトマックス関数を適用する前に、ベクトルの要素は (-∞, ∞) の範囲にあることができる。

ある要素は負であり,ある要素は正である.

ソフトマックス関数を適用した後は、各値は [0, 1] の範囲となり、値は確率として解釈できるように合計が1になる。

ソフトマックスの計算式は以下の通りです。

import numpy as np
 
def softmax(vec):
  exponential = np.exp(vec)
  probabilities = exponential / np.sum(exponential)
  return probabilities
 
vector = np.array([1.0, 3.0, 2.0])
probabilities = softmax(vector)
print("Probability Distribution is:")
print(probabilities)

です。

ここで、まずベクトルの各要素の指数を求め、求めた指数の和で割る。

ソフトマックス関数は、多クラス分類問題の活性化関数として最もよく使われる関数で、ある範囲の値があり、それらが発生する確率を求める必要があります。

ソフトマックス関数は、多項確率分布を予測するニューラルネットワークの出力層で使用されます。

ソフトマックス関数のPythonによる実装

さて、数値のベクトルに対するソフトマックスの計算式がわかったので、それを実装してみましょう。

ここでは、ベクトルの指数計算にはNumPyの exp() メソッドを、分母の和の計算にはNumPyの sum() メソッドを使用します。

Probability Distribution is:
[0.09003057 0.66524096 0.24472847]
import tensorflow as tf
import numpy as np
 
vector = np.array([5.5, -13.2, 0.5])
 
probabilities = tf.nn.softmax(vector).numpy()
 
print("Probability Distribution is:")
print(probabilities)

ソフトマックスを計算するフレームワークを利用する

多くのフレームワークが、様々な数学的モデルで使用されるベクトル上のsoftmaxを計算するメソッドを提供しています。

1. テンソルフロー

tensorflow.nn.softmax` を使用すると、図のようにベクトルに対する softmax を計算することができる。

Probability Distribution is:
[9.93307142e-01 7.51236614e-09 6.69285087e-03]
import scipy
import numpy as np
 
vector = np.array([1.5, -3.5, 2.0])
probabilities = scipy.special.softmax(vector)
print("Probability Distribution is:")
print(probabilities)

2. Scipy

Scipyライブラリは、以下のように scipy.special.softmax を使ってソフトマックスを計算することができます。

Probability Distribution is:
[0.3765827  0.00253739 0.62087991]
import torch
 
vector = torch.tensor([1.5, -3.5, 2.0])
probabilities = torch.nn.Softmax(dim=-1)(vector)
print("Probability Distribution is:")
print(probabilities)

3. PyTorch

Pytorchの torch.nn.Softmax(dim) を使って、図のように計算したい次元を指定してソフトマックスを計算することができます。

Probability Distribution is:
tensor([0.3766, 0.0025, 0.6209])
sigma(ec{z})_{i}=rac{e^{z_{i}}}{sum_{j=1}^{K} e^{z_{j}}}

まとめ

おめでとうございます!これで、ソフトマックス関数とその様々な実装方法について学びました。

お読みいただきありがとうございました。

タイトルとURLをコピーしました