損失函式的作用是衡量實際輸出與預計輸出之間的差異,損失函式的設計是深度學習中十分重要的部分,不僅會影響到訓練的速度,還會影響隱含層中資料的分布情況。目前僅僅是總結了部分常用損失函式的計算方法,其中涉及很多統計學最優化知識,對此僅僅是淺嘗輒止,其中更多的原理還需要以後慢慢總結體會,以下僅簡要記錄其計算方法。
目前記錄的損失函式有限,後續會繼續更新
均方誤差算是最簡單也是最經典的一種計算損失的方法,其中 y
^\hat y
y^ 為實際輸出,y
yy 為標籤。
m se
_los
s=1n
∑i=1
n(yi
−y^i
)2
mse\_loss =\frac \sum _ ^n (y_i - \hat y_i)^2
mse_lo
ss=n
1i=
1∑n
(yi
−y^
i)2
交叉熵是從kl散度中引出,用於衡量兩個分布之間差異的大小,其值總是大於等於0,兩個分布越相似其值越接近於0。訓練時的標籤可以當成一種分布,實際輸出堪稱另一種分布,常與softmax層結合用於分類模型。
c ro
ssen
trop
y_lo
ss=−
∑iyi
⋅log
y^
icrossentropy\_loss = -\sum _i y_i·log\hat y_i
crosse
ntro
py_l
oss=
−i∑
yi⋅
logy
^i
上面說到kl散度(kl divergence)用於衡量兩個分布之間的大小的差異,這和mse的度量方法是不一樣的。下面講到的log損失函式也是 divergence 的一種。
log損失通常用於邏輯回歸,是二分類中常用的損失函式,若二分類中使用mse損失會造成最後優化函式為非凹函式,不利於訓練。其中 x
xx 表示輸出該特徵,y
yy 表示所屬類別, p(1
/x
)p(1/x)
p(1/x)
表示輸入特徵 x
xx 屬於類別 1
11 的概率。
l og
_los
s=
-log[p(1/x)], &&&y=1 \\ -log[1-p(1/x)],&&&y=0 \end
log_lo
ss= \limits_g\mathop \limits_ d v(g,d) = e_[logd(x)]+e_[log(1−d(g(x)))]
gmind
max
v(g,
d)=e
x∼pd
ata(
x)[
logd
(x)]
+ez∼
pz(z
)[l
og(1
−d(g
(x))
)]l1loss即是l1範數下度量的距離,就是計算網路輸出與標籤之間對應元素絕對值然後求和。使用pytorch中的定義如下
ℓ (x
,y)=
l=′,
ln=∣
xn−y
n∣
\ell(x, y)=l=\left\, \ldots, l_\right\}^, \quad l_=\left|x_-y_\right|
ℓ(x,y)
=l=′
,ln
=∣xn
−yn
∣其中n表示batch的大小。
ℓ (x
,y)=
(l),} & =\text } \\ (l),} & =\text }\end\right.
ℓ(x,y)
==\left\-y_\right)^,} & \left|x_-y_\right|<1} \\ -y_\right|-0.5,} & }\end\right.
zi=
||p_g) = \int_x p_g(x)f(\frac(x)})\, dx
df(pd
ata
∣∣pg
)=∫
xpg
(x)
f(pg
(x)
pdat
a(x
))d
xthe total variation (tv) loss encourages spatial smoothness in the generated image.(總變差(tv)損失促進了生成的影象中的空間平滑性。)詳細定義見維基百科–total variation
tv loss rubin等人在2023年左右觀察到受雜訊汙染的影象的tv比無噪影象的總變分明顯的大。 那麼最小化tv理論上就可以最小化雜訊。中相鄰畫素值的差異可以通過降低tv loss來一定程度上解決。比如降噪,對抗checkerboard等等。
實現**如下:
#tv loss(total variation regularizer)
class
tvloss
(nn.module)
:def
__init__
(self,tvloss_weight=1)
:super
(tvloss,self)
.__init__(
) self.tvloss_weight = tvloss_weight
defforward
(self,x)
: batch_size = x.size()[
0]h_x = x.size()[
2]w_x = x.size()[
3]count_h = self._tensor_size(x[:,
:,1:
,:])
count_w = self._tensor_size(x[:,
:,:,
1:])
h_tv = torch.
pow(
(x[:,:
,1:,
:]-x[:,:
,:h_x-1,
:]),
2).sum()
w_tv = torch.
pow(
(x[:,:
,:,1
:]-x[:,:
,:,:w_x-1]
),2)
.sum()
return self.tvloss_weight*2*
(h_tv/count_h+w_tv/count_w)
/batch_size
def_tensor_size
(self,t)
:return t.size()[
1]*t.size()[
2]*t.size()[
3]
目前還有很多損失函式沒有總結,比如用於人臉識別的tripletmarginloss 比起一般的損失函式能夠很好地將不同的人臉特徵分開。總之損失函式對深度學習的影響非常重要,很多時候使用一種損失導致訓練崩壞而換一種損失便能得到不錯的效果。 深度學習損失函式
在利用深度學習模型解決有監督問題時,比如分類 回歸 去噪等,我們一般的思路如下 在第2步中,我們通常會見到多種損失函式的定義方法,常見的有均方誤差 error of mean square 最大似然誤差 maximum likelihood estimate 最大後驗概率 maximum poste...
深度學習 損失函式
深度學習中損失函式是整個網路模型的 指揮棒 通過對 樣本和真實樣本標記產生的誤差反向傳播指導網路引數學習。分類任務的損失函式 假設某分類任務共有n個訓練樣本,針對網路最後分層第 i 個樣本的輸入特徵為 xixi 其對應的標記為yiyi是最終的分類結果 c個分類結果中的乙個 h h1,h2,hch1,...
深度學習基礎篇 常用的損失函式
損失函式是用來度量模型一次 結果的好壞 我們規定輸入值為x,則f x 為 值,y為真實值。這個時候我們需要乙個衡量 值和真實值之間的差距的函式,我們就稱這個函式為損失函式,記作l y,f x 均方誤差 n個平方損失函式之和再求平均值 mse 1n i 1n y i f x i 2 mse frac ...