深層学習 - 損失関数 (損失)

深層学習のすべての学習アルゴリズムには、損失関数、または「目的関数」、「コスト関数」と呼ばれる関数を最小化または最大化する関数が必要です。損失関数は、モデルのパフォーマンス評価の尺度です。例: 関数の最小点を見つけるために最も一般的に使用される方法は、勾配降下法です:勾配降下の詳細な説明

(例: フルバッチ勾配降下バッチ GD、確率的勾配降下 SGD、スモールバッチ勾配降下ミニバッチ GD、アダグラド法、アダデルタ法、アダム法など)。損失関数はなだらかな丘のようなものであり、勾配降下は丘を下って底点まで滑り落ちるようなものです。

明らかに、すべてのタスクに適した 1 つの損失関数はありません。損失関数の選択は、外れ値の処理、深層学習アルゴリズムの選択、勾配降下の時間効率など、多くの要因に依存します。この記事の目的は、損失関数とその理論的根拠を紹介することです。

損失関数 (Loss_function):

以前の研究では、機械学習モデル (分類、回帰、クラスタリング、次元削減) を研究しました:基本的な機械学習モデルの紹介、深層学習では: 損失関数は分類損失回帰損失の2のカテゴリに厳密に分けることができます分類損はカテゴリの数によって二値分類損多分類損に分けることができますこれを使用する場合、回帰関数は数値を予測し、分類関数はラベルを予測することに注意してください。

1. 平均二乗誤差損失 (MSE)

平均二乗誤差 (MSE) 損失は、機械学習およびディープ ラーニングの回帰タスクで最も一般的に使用される損失関数です。平均二乗誤差損失を直感的に理解すると、この損失関数の最小値は 0 (予測が真の値と等しい場合) であり、最大値は無限大です。MSE は、予測値と実際の値の間のユークリッド距離を計算することです。予測値が実際の値に近いほど、両者の平均二乗誤差は小さくなります. 平均二乗誤差関数は、線形回帰、つまり関数フィッティングでよく使用されます.

平均二乗誤差損失関数は、予測データと元データの対応点誤差の二乗和の平均値であり、式は次のとおりです。

MSE=\frac{1}{N}(\hat{y}-y)^{2}

N: サンプル数、\hat{y}: サンプルの実際の値、y は出力値

MSE コードの実装:

import torch.nn as nn
import torch
import random
#MSE损失参数
# loss_fun=nn.MSELoss(size_average=None, reduce=None, reduction='mean')
input=torch.randn(10)#定义输出(随机的1,10的数组)可以理解为概率分布
#tensor([-0.0712,  1.9697,  1.4352, -1.3250, -1.1089, -0.5237,  0.2443, -0.8244,0.2344,  2.0047])
print(input)
target= torch.zeros(10)#定义标签
target[random.randrange(10)]=1#one-hot编码
#tensor([0., 0., 0., 0., 0., 0., 0., 1., 0., 0.])
print(target)
loss_fun= nn.MSELoss()
output = loss_fun(input, target)#输出,标签
print(output)#loss:tensor(0.8843)

#=============不用nn.MSELoss实现均方差===================
result=(input-target)**2
result =sum(result)/len(result)#求和之后求平均
print(result)#tensor(0.8843)
#其结果和上面一样

注: 複数分類タスクで平均二乗誤差を損失関数として使用する場合は、ラベルをワンホット エンコーディング形式に変換する必要があります: one- hot encoding 。エントロピー損失関数。平均二乗誤差は、シグモイド関数と一緒に使用しないでください (シグモイド関数には、横軸が座標の原点から遠いほど微分が 0 に近づき、出力が近いほど微分が 0 に近づくという特性があります。を 1 にすると、導関数が小さくなり、最終的に勾配が消えます)。

2. 交差エントロピー損失 ( Cross Entropy )

クロスエントロピー損失関数の起源と導入については、この記事で詳しく説明しました: 深層学習の紹介 - 確率と情報の観点から (数学への追記)

機械学習では、実際のラベルと予測されたラベルの差は KL ダイバージェンス を使用して評価できますが、KL ダイバージェンスの最初の項目は固定値であるため、交差エントロピーのみ最適化プロセス中に注意が払われる それだけです。一般に、ほとんどの機械学習アルゴリズムはクロス エントロピーを損失関数として選択します。

交差エントロピーの公式によると:

H(p,q)=-\sum _{i=1}^{n}p(x_{i})\log q(x_{i})

p(x_{i})実数ラベルを表します. 実数ラベルでは, 対応するカテゴリ以外の他のカテゴリの確率は 0 であるため, 次のように省略できます.

H(p,q)=-logq(x_{クラス})

代表レーベルはこちらx_{クラス}(レーベル)

クロス エントロピー コードの実装:

#交叉熵
import torch.nn as nn
nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')
import torch
import torch.nn as nn
# #假设batch size为4,待分类标签有3个,隐藏层的输出为:
input = torch.tensor([[ 0.8082,  1.3686, -0.6107],#1
        [ 1.2787,  0.1579,  0.6178],#0
        [-0.6033, -1.1306,  0.0672],#2
        [-0.7814,  0.1185, -0.2945]])#取1
target = torch.tensor([1,0,2,1])#假设标签值(不是one-hot编码,直接代表类别)
loss = nn.CrossEntropyLoss()#定义交叉熵损失函数(自带softmax输出函数)
output = loss(input, target)
print(output)#tensor(0.6172)

#======不用 nn.CrossEntropyLoss(),解释其计算方法======
net_out=nn.Softmax(dim=1)(input)#input前面已经定义
print(net_out)
out= torch.log(net_out)#对每个size(每行求log)
"""
tensor([[-1.0964, -0.5360, -2.5153],
        [-0.6111, -1.7319, -1.2720],
        [-1.2657, -1.7930, -0.5952],
        [-1.6266, -0.7267, -1.1397]])
"""
print(out)
#根据公式求和
out=torch.max(out,dim=1)#我们默认取每个size的输出最大值为类别
print(out)
"""
torch.return_types.max(
values=tensor([-0.5360, -0.6111, -0.5952, -0.7267]),
indices=tensor([1, 0, 2, 1]))
"""
#tages=(1,0,2,2),这里的输出out就是每一个size(样本)的交叉熵损失
#别忘了除以batch size(4),我们最后求得的是整个batch(批次,一批次4个样本)的平均loss
#out求和再除以size(4)————————求平均
out_Input=-torch.mean(out.values)#这里求平均时只取max输出的values
print(out_Input)#tensor(0.6172)

注:関数とは別にtorch.nn.CrosEntropyLoss()クロスエントロピーを計算する関数がありtorch.nn.BCELoss(),、これは従来とは異なり、二項分布(0-1分布)のクロスエントロピーを計算する関数です(シグミオッド出力を含む)関数)。


要約:

現段階では私の能力が限られているため、これら 2 つの関数の詳細な比較を行うことはできず、損失関数については詳しくわかりませんが、ご容赦いただければ幸いです。後で学習しながら徐々に改善していきます。

一般に、MSE の線形勾配を取得するには、出力が活性化関数を通過してはなりません。この場合、線形回帰しかないので、回帰問題には SE、分類問題には CE が適しています. 分類問題では、CE は線形勾配を得ることができ、勾配の消失を効果的に防ぐことができます; MSE が使用されます.の場合、活性化関数の導出の影響により、1 より小さい数と 0 より大きい数を連続して乗算すると、勾配が消失し、誤差曲面も粗くなり、より局所最適に到達します。ゆっくり。

おすすめ

転載: blog.csdn.net/GWENGJING/article/details/126772128