PytouchにおけるSoftmaxとLogSigmoidの比較分析
4640 ワード
PytouchのSoftmaxとLogSigmoidの比較
toch.nn.Softmax
作用:
1、Softmax関数を入力のn次元Tensorに適用して、それらの規格を改めて変えて、n次元出力テンソルの要素を[0,1]の範囲内に位置させて、そして1とすることを求めます。
2、戻ってきたTensorは元のTensorと同じ大きさで、値は[0,1]の間です。
3、NLLLossと一緒に使うことを提案しないで、LogSoftmaxを使って代替することができます。
4、Softmaxの公式:
パラメータ:
次元は、ソフトウェアを使用して計算される次元です。
例:
mのパラメータdim=1の場合、出力のtenssorは元tensorを行に従ってソフトウェアxを操作します。mのパラメータがdim=0の場合、出力のtensorは元tenssorを列に従ってソフトウェアxを行います。
深さ学習の展開:
一般的にSoftmax関数は分類問題に使用されます。例えば、VGGなどの深度神経ネットワークにおいて、画像が一連の畳み込み、池化されて操作された後に、その特徴ベクトルを得ることができ、さらにこの画像の中の物体がどのカテゴリーに属するかを判断するために、その特徴ベクトルをカテゴリ数*各種の得点という形に変化させ、得点を確率値に変換するために、私たちはこのベクトルをもう一つの層のSoftmaxで処理します。
toch.nn.LogSigmoid
数式:
関数図:
関数値は[0,-]の間で,入力値が大きいほど,函数数値距離が0に近いほど,勾配消失問題がある程度解決されることが分かる。
例:
1、最初の行のデータはSoftmaxを経て、最初のクラスを選択します。LogSigmoidを経て最初のものを選択します。
2、2行目のデータはSoftmaxを経て、3つ目のカテゴリを選択します。LogSigmoidを経て、三つ目を選択します。
3、一般的に、両者はある程度の違いが大きくなく、sigmoid関数に勾配が消えてしまうため、使われるシーンは多くない。
4、しかし、多分類問題において、Sigmoid関数を分類関数として選択してみることができます。Softmaxは多分類問題を扱う上で、各得点が非常に近い状況が現れやすいからです。ボトルネックの値は実際の状況によって決められます。
nn.Softmax()とnn.LogSoftmax()
nn.Softmax()で算出された値の和は1であり、出力は確率分布であり、具体的な公式は以下の通りである。
これは、出力値がすべて0より大きく、0、1の範囲内であることを保証する。
nn.LogSoftmax()公式は以下の通りです。
Softmax出力は0-1の間ですので、logsofmax出力は0の数より小さいです。
ソフトマックスのコンダクタンス:
logsofmaxリクエスト:
例:
out put 1:Varable containing:
0.689
0.7311
[toch.Float Tensor of size 2]
out put 2:Varable containing:
-1.333
-0.333
[toch.Float Tensor of size 2]
以上は個人の経験ですので、参考にしていただければと思います。
toch.nn.Softmax
作用:
1、Softmax関数を入力のn次元Tensorに適用して、それらの規格を改めて変えて、n次元出力テンソルの要素を[0,1]の範囲内に位置させて、そして1とすることを求めます。
2、戻ってきたTensorは元のTensorと同じ大きさで、値は[0,1]の間です。
3、NLLLossと一緒に使うことを提案しないで、LogSoftmaxを使って代替することができます。
4、Softmaxの公式:
パラメータ:
次元は、ソフトウェアを使用して計算される次元です。
例:
# tensor
a = torch.randn(2, 3)
print(a) # tensor
# Softmax , tensor 2
m = nn.Softmax(dim=1)
# a softmax
output = m(a)
print(output) # tensor
tensor([[ 0.5283, 0.3922, -0.0484],
[-1.6257, -0.4775, 0.5645]])
tensor([[0.4108, 0.3585, 0.2307],
[0.0764, 0.2408, 0.6828]])
入力されたtensorの値が正か負かにかかわらず、出力されたtenssorの値は正の値であり、加算された値は1であることが見える。mのパラメータdim=1の場合、出力のtenssorは元tensorを行に従ってソフトウェアxを操作します。mのパラメータがdim=0の場合、出力のtensorは元tenssorを列に従ってソフトウェアxを行います。
深さ学習の展開:
一般的にSoftmax関数は分類問題に使用されます。例えば、VGGなどの深度神経ネットワークにおいて、画像が一連の畳み込み、池化されて操作された後に、その特徴ベクトルを得ることができ、さらにこの画像の中の物体がどのカテゴリーに属するかを判断するために、その特徴ベクトルをカテゴリ数*各種の得点という形に変化させ、得点を確率値に変換するために、私たちはこのベクトルをもう一つの層のSoftmaxで処理します。
toch.nn.LogSigmoid
数式:
関数図:
関数値は[0,-]の間で,入力値が大きいほど,函数数値距離が0に近いほど,勾配消失問題がある程度解決されることが分かる。
例:
a = [[ 0.5283, 0.3922, -0.0484],
[-1.6257, -0.4775, 0.5645]]
a = torch.tensor(a)
lg = nn.LogSigmoid()
lgoutput = lg(a)
print(lgoutput)
tensor([[-0.4635, -0.5162, -0.7176],
[-1.8053, -0.9601, -0.4502]])
両者の比較:
import torch
import torch.nn as nn
# a 2*3 tensor
a = [[ 0.5283, 0.3922, -0.0484],
[-1.6257, -0.4775, 0.5645]]
a = torch.tensor(a)
print(a)
print('a.mean:', a.mean(1, True)) # a
m = nn.Softmax(dim=1) # Softmax ,dim=1
lg = nn.LogSigmoid() # LogSigmoid
output = m(a)
print(output)
# a Softmax
print('output.mean:', output.mean(1, True))
lg_output = lg(a)
print(lg_output)
# a LogSigmoid
print('lgouput.mean:', lg_output.mean(1, True))
# :
tensor([[ 0.5283, 0.3922, -0.0484],
[-1.6257, -0.4775, 0.5645]])
a.mean: tensor(-0.1111)
tensor([[0.4108, 0.3585, 0.2307],
[0.0764, 0.2408, 0.6828]])
output.mean: tensor([[0.3333], [0.3333]]) # Softmax
tensor([[-0.4635, -0.5162, -0.7176],
[-1.8053, -0.9601, -0.4502]])
lgouput.mean: tensor([[-0.5658], [-1.0719]]) # LogSigmoid
以上から分かるように、分類問題、同じデータを引き続き考慮し、SoftmaxとLogSigmoid処理を経た後、最大確率値対応カテゴリを分類結果とすると、1、最初の行のデータはSoftmaxを経て、最初のクラスを選択します。LogSigmoidを経て最初のものを選択します。
2、2行目のデータはSoftmaxを経て、3つ目のカテゴリを選択します。LogSigmoidを経て、三つ目を選択します。
3、一般的に、両者はある程度の違いが大きくなく、sigmoid関数に勾配が消えてしまうため、使われるシーンは多くない。
4、しかし、多分類問題において、Sigmoid関数を分類関数として選択してみることができます。Softmaxは多分類問題を扱う上で、各得点が非常に近い状況が現れやすいからです。ボトルネックの値は実際の状況によって決められます。
nn.Softmax()とnn.LogSoftmax()
nn.Softmax()で算出された値の和は1であり、出力は確率分布であり、具体的な公式は以下の通りである。
これは、出力値がすべて0より大きく、0、1の範囲内であることを保証する。
nn.LogSoftmax()公式は以下の通りです。
Softmax出力は0-1の間ですので、logsofmax出力は0の数より小さいです。
ソフトマックスのコンダクタンス:
logsofmaxリクエスト:
例:
import torch.nn as nn
import torch
import numpy as np
layer1=nn.Softmax()
layer2=nn.LogSoftmax()
input=np.asarray([2,3])
input=Variable(torch.Tensor(input))
output1=layer1(input)
output2=layer2(input)
print('output1:',output1)
print('output2:',output2)
出力:out put 1:Varable containing:
0.689
0.7311
[toch.Float Tensor of size 2]
out put 2:Varable containing:
-1.333
-0.333
[toch.Float Tensor of size 2]
以上は個人の経験ですので、参考にしていただければと思います。