ActivatorとSoftMax
【 ActivatorとSoftMax 】
これまで、一つの層しか含まない単純なニューラル・ネットワークのニューロンの状態 x は、入力 X, 重み W, バイアス b という三つのパラメータを使って、簡単な式で表すことができることを見てきました。
同時に、生物のニューロンをシミレートした、コンピュータ上の状態 x のニューロンは、 x <= 0 の時には、何も反応しないが、x > 0 の時には「発火」して、信号 1を他のニューロンに出力するということも見てきました。
Activator φ は、ある条件のもとで、ニューロンを活性化して、ニューロンの状態xをニューロンの出力φ(x)に変え、その出力を行う関数です。
基本的なActivator φは、x > 0 の時、φ(x) = 1 を出力し、それ以外の場合には φ(x) = 0 を出力します。( 0 を出力するというのは、ニューロンが活性化されずに何もしないことだと考えて構いません。)
ただ、この基本形以外のさまざまなタイプのActivatorがあります。それについては、セッションの前半で紹介しています。
今回のセッションの後半では、もう一つの重要なActivatorである、SoftMaxを紹介します。
前半で見たActivatorは、一つのニューロンについて、その状態をそのニューロンの一つの出力に変えるものだったのですが、softmaxは少し違っています。それは、複数のニューロンの状態にまたがって作用するActivatorで、しかも、複数のニューロンごとに出力を行います。
SoftMaxは、引数にN個の要素(ニューロンの状態です)からなるベクトルを取り、N個の要素からなるベクトルを出力します。その出力はN個の要素からなる「確率分布」です。
面倒くさそうですが、例えば、7次元のベクトル a = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0]から、そのSoftMax を計算するPythonコードは、次のように簡単なものです。
>>> import numpy as np
>>> a = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0]
>>> np.exp(a) / np.sum(np.exp(a))
array([0.02364054, 0.06426166, 0.1746813, 0.474833, 0.02364054, 0.06426166, 0.1746813])
ただ、プログラムは簡単に記述できるのですが、計算量は小さいものではありません。先のコードの、np.exp(a)は、ベクトルa の全ての要素a_i について e^{a_i}を計算することですから。
softmax は、大規模言語モデルで、語や文の分散表現 embedding を計算する時にも利用されています。その場合、500次元とか 1,000次元のベクトルが利用されます。その計算量は膨大なものです。
もう一つ。
全く分野が異なるのですが、softmax関数は、ボルツマンやギブスが開拓した統計力学の大スターである「分割関数 Partition function 」と同じものです。二つの不思議な関連については、別の機会にお話しできればと思います。
-------------------------------------------------------
https://youtu.be/LivhQuhhKlo?list=PLQIrJ0f9gMcN8dalyOH9sjVK6CQkd7NJw
資料 pdf「ActivatorとSoftMax」
https://drive.google.com/file/d/1ND9KFzA3Q7ra5ZRSFhrxZnd0Pzj3QD3N/view?usp=sharing
コメント
コメントを投稿