6.2 損失函數(shù)性質(zhì)
上一節(jié)咱們講解了最優(yōu)化和深度學(xué)習(xí)的密切關(guān)系和區(qū)別。簡(jiǎn)單地說(shuō),在深度學(xué)習(xí)求解損失函數(shù)的時(shí)候,因?yàn)樗鼪](méi)有解析解,因此必須借助最優(yōu)化的算法來(lái)逼近求解。這個(gè)過(guò)程中產(chǎn)生了一系列問(wèn)題,要一個(gè)個(gè)的搞定。在講解具體的最優(yōu)化算法之前,有必要先充分了解損失函數(shù)的各種特點(diǎn)和性質(zhì)。這就是本節(jié)要講的內(nèi)容了。
在深度學(xué)習(xí)中,損失函數(shù)是用來(lái)衡量預(yù)測(cè)結(jié)果與真實(shí)結(jié)果之間的差距的函數(shù)。損失函數(shù)的性質(zhì)決定了模型的性能和訓(xùn)練效果。
可微性:損失函數(shù)應(yīng)當(dāng)是可微的,這意味著可以計(jì)算出損失函數(shù)在任意一點(diǎn)處的導(dǎo)數(shù)。可微性是梯度下降法的基本前提,因?yàn)樘荻认陆捣ㄐ枰褂脫p失函數(shù)的導(dǎo)數(shù)來(lái)更新模型參數(shù)。
單調(diào)性:損失函數(shù)應(yīng)當(dāng)具有單調(diào)性,即在模型訓(xùn)練過(guò)程中,損失函數(shù)的值應(yīng)該逐漸減小。如果損失函數(shù)不具有單調(diào)性,則模型的訓(xùn)練效果可能會(huì)變差。
凸性:損失函數(shù)應(yīng)當(dāng)是凸的,這意味著其圖像在任意兩點(diǎn)間連線段上方的區(qū)域都是損失函數(shù)的圖像。凸性是優(yōu)化算法的基本前提,因?yàn)檫@意味著總存在一個(gè)全局最優(yōu)解。
可分離性:損失函數(shù)應(yīng)當(dāng)是可分離的,這意味著可以將損失函數(shù)分解為每一個(gè)輸入樣本的損失函數(shù)之和??煞蛛x性使得我們可以使用梯度下降法來(lái)更新模型參數(shù),因?yàn)樘荻认陆捣ㄐ枰獙?duì)每一個(gè)輸入樣本求和來(lái)計(jì)算損失函數(shù)的總體梯度。
可導(dǎo)性:損失函數(shù)應(yīng)當(dāng)是可導(dǎo)的,這意味著可以計(jì)算出損失函數(shù)的導(dǎo)函數(shù)??蓪?dǎo)性是使用梯度下降法和牛頓法等優(yōu)化算法的基本前提,因?yàn)檫@些算法需要使用損失函數(shù)的導(dǎo)函數(shù)來(lái)更新模型參數(shù)。
可表示性:損失函數(shù)應(yīng)當(dāng)具有足夠的表示能力,即能夠準(zhǔn)確地表示預(yù)測(cè)結(jié)果與真實(shí)結(jié)果之間的差距。常用的損失函數(shù)包括均方誤差、交叉熵?fù)p失函數(shù)等。
選擇合適的損失函數(shù)是深度學(xué)習(xí)模型訓(xùn)練的關(guān)鍵,因兩個(gè)模型訓(xùn)練出來(lái)的結(jié)果可能不一樣。損失函數(shù)的性質(zhì)決定了模型的性能并影響著模型訓(xùn)練的效果。因此,在選擇損失函數(shù)時(shí),應(yīng)該根據(jù)問(wèn)題的特點(diǎn)來(lái)選擇合適的損失函數(shù)。
例如,在回歸問(wèn)題中,常用的損失函數(shù)有均方誤差(mean squared error,MSE)和平均絕對(duì)誤差(mean absolute error,MAE)。這兩種損失函數(shù)都是可微的、可導(dǎo)的、可分離的、單調(diào)的和凸的。在分類(lèi)問(wèn)題中,常用的損失函數(shù)有交叉熵?fù)p失函數(shù)(cross-entropy loss)和二次損失函數(shù)(squared loss)。交叉熵?fù)p失函數(shù)是一種常用的分類(lèi)損失函數(shù),它可以表示模型預(yù)測(cè)結(jié)果與真實(shí)結(jié)果之間的差距。二次損失函數(shù)是可微的、可導(dǎo)的、可分離的、單調(diào)的和凸的。
對(duì)于損失函數(shù)的選擇,需要根據(jù)問(wèn)題的特點(diǎn)進(jìn)行分析,選擇合適的損失函數(shù)才能得到較好的模型性能。
損失函數(shù)上面這些性質(zhì)當(dāng)中,有的比較好理解我們就沒(méi)有必要細(xì)講了,著重講解一下大家比較容易弄混的和不太好理解的概念:先講講可微和可導(dǎo),然后重點(diǎn)講凸性的問(wèn)題。
6.2.1 可微和可導(dǎo)的區(qū)別
可微性(differentiability)和可導(dǎo)性(continuity)是兩個(gè)概念,它們?cè)跀?shù)學(xué)中有著重要的意義。
可微性指的是函數(shù)在任意一點(diǎn)處都有一個(gè)導(dǎo)數(shù),即在任意一點(diǎn)處都可以計(jì)算出函數(shù)的導(dǎo)數(shù)。可微函數(shù)的導(dǎo)數(shù)可以幫助我們更好地理解函數(shù)的變化趨勢(shì)??蓪?dǎo)性指的是函數(shù)有一個(gè)連續(xù)的導(dǎo)函數(shù),即在函數(shù)的任意一個(gè)區(qū)間內(nèi)都可以計(jì)算出函數(shù)的導(dǎo)函數(shù)。因此,可微性和可導(dǎo)性的區(qū)別在于,可微性是指函數(shù)在任意一點(diǎn)處都有導(dǎo)數(shù),而可導(dǎo)性則是指函數(shù)在任意一個(gè)區(qū)間內(nèi)都有連續(xù)的導(dǎo)函數(shù)。
這么說(shuō)你可能還是不好理解,來(lái),梗直哥給你舉個(gè)反例就好懂了。來(lái)看可微不可導(dǎo)的函數(shù),這類(lèi)指的是函數(shù)在某些點(diǎn)處有導(dǎo)數(shù),但在其他點(diǎn)處沒(méi)有導(dǎo)數(shù)的函數(shù)。這類(lèi)函數(shù)的導(dǎo)函數(shù)不連續(xù),也就是說(shuō),在函數(shù)的某些區(qū)間內(nèi)可以計(jì)算出導(dǎo)函數(shù),但在其他區(qū)間內(nèi)則不能。例如,在函數(shù) f(x)=|x| 的點(diǎn) x=0 處,函數(shù)的導(dǎo)數(shù)為0,但在其他點(diǎn)處,函數(shù)的導(dǎo)數(shù)為1或-1。因此,函數(shù) f(x)=|x| 既可微(即在任意一點(diǎn)處都有導(dǎo)數(shù)),但又不可導(dǎo)(即在任意一個(gè)區(qū)間內(nèi)都沒(méi)有連續(xù)的導(dǎo)函數(shù))。另外,還有一類(lèi)特殊的函數(shù),即在所有點(diǎn)處都沒(méi)有導(dǎo)數(shù)的函數(shù),這類(lèi)函數(shù)既不可微,也不可導(dǎo)。例如,函數(shù) f(x)=x^2sin(1/x) 在 x=0 處的導(dǎo)數(shù)無(wú)限大,因此函數(shù)在任意一點(diǎn)處都沒(méi)有導(dǎo)數(shù),即不可微。
這么說(shuō)你理解著還是有點(diǎn)難度,咱們看看它們的函數(shù)圖像。
import?math
import?matplotlib.pyplot?as?plt
import?numpy?as?np
import?torch
def?f(x):
????return?abs(x)
#?生成輸入?x
x?=?np.linspace(-5,?5,?100)
#?計(jì)算函數(shù)值
y?=?[f(xx)?for?xx?in?x]
#?可視化函數(shù)圖像
plt.plot(x, y)
plt.show()

import?torch
import?matplotlib.pyplot?as?plt
def?abs_function(x):
????return?x.abs()
# Generate some data
x?=?torch.linspace(-2,?2,?100)
x.requires_grad_(True) ?# Set x to be a tensor that requires gradients
y?=?abs_function(x)
# Plot the function
plt.plot(x.detach().numpy(), y.detach().numpy())
plt.show()
# Compute the derivative of the function
y_prime?=?torch.autograd.grad(y.sum(), x, create_graph=True)[0]
# Plot the derivative
plt.plot(x.detach().numpy(), y_prime.detach().numpy())
plt.show()


關(guān)于函數(shù) y=|x| 的導(dǎo)數(shù),請(qǐng)注意,當(dāng) x<0 時(shí),導(dǎo)數(shù)為 -1;當(dāng) x>0 時(shí),導(dǎo)數(shù)為 1;當(dāng) x=0 時(shí),導(dǎo)數(shù)不存在。因此,導(dǎo)數(shù)圖像應(yīng)該在 x=0 處斷開(kāi)。
6.2.2 凸性
在優(yōu)化算法設(shè)計(jì)中,凸性是指函數(shù)圖像的凸度或凸度方向。優(yōu)化算法通常用于最小化或最大化一個(gè)目標(biāo)函數(shù),因此損失函數(shù)的凸性可能會(huì)影響優(yōu)化算法的性能。凸函數(shù)是指在所有點(diǎn)處都向上彎曲的函數(shù),類(lèi)似于彎曲的橋身。而凹函數(shù)則是指在所有點(diǎn)處都向下彎曲的函數(shù),類(lèi)似于彎曲的河床。

損失函數(shù)凸性為什么重要?
在深度學(xué)習(xí)中,凸性是很重要的一個(gè)因素,因?yàn)樗梢詭椭覀兇_定使用哪種優(yōu)化算法來(lái)最小化模型的損失函數(shù)。如果損失函數(shù)是凸的,則意味著在函數(shù)的所有點(diǎn)處都是向上彎曲的。這表明,對(duì)于任意給定的自變量值,損失函數(shù)都有一個(gè)單谷,即使在函數(shù)的多個(gè)局部最小值處也是如此。這意味著我們可以使用最優(yōu)化算法來(lái)找到函數(shù)的全局最小值,因?yàn)樽顑?yōu)化算法可以避免停留在局部最小值處。例如,梯度下降法是一種常見(jiàn)的最優(yōu)化算法,它通過(guò)不斷沿著負(fù)梯度方向更新自變量的值來(lái)最小化目標(biāo)函數(shù)。如果目標(biāo)函數(shù)是凸的,則梯度下降法可以有效地找到函數(shù)的全局最小值。
但是,有時(shí)損失函數(shù)并不是凸函數(shù)。例如,當(dāng)模型中使用了 ReLU 激活函數(shù)時(shí),損失函數(shù)可能是凹函數(shù)。在這種情況下,簡(jiǎn)單的優(yōu)化算法可能無(wú)法有效地最小化損失函數(shù),因?yàn)樗鼈兛赡軙?huì)被“卡”在局部最小值處。如果損失函數(shù)是凹的,則意味著在函數(shù)的所有點(diǎn)處都是向下彎曲的。這表明,對(duì)于任意給定的自變量值,損失函數(shù)都可能有多個(gè)局部最小值。最優(yōu)化算法可能會(huì)停留在局部最小值處,而無(wú)法找到函數(shù)的全局最小值。因此,在優(yōu)化算法設(shè)計(jì)中,對(duì)于凹函數(shù),我們通常需要使用更復(fù)雜的最優(yōu)化算法,如擬牛頓法或共軛梯度法,才能有效地找到函數(shù)的全局最小值。這些算法使用二階信息來(lái)調(diào)整自變量的值,從而使得最優(yōu)化算法更加穩(wěn)定并能夠跳出局部最小值。另外,還有一些最優(yōu)化算法,如遺傳算法和隨機(jī)梯度下降法,可以用于優(yōu)化凹函數(shù)。但是,這些算法通常不如擬牛頓法或共軛梯度法那樣高效,并且對(duì)于高維函數(shù)的優(yōu)化效果可能較差。
總之,凸性是優(yōu)化算法設(shè)計(jì)中一個(gè)重要的考慮因素。對(duì)于凸函數(shù),可以使用較簡(jiǎn)單的最優(yōu)化算法來(lái)最小化目標(biāo)函數(shù);對(duì)于凹函數(shù),則需要使用更復(fù)雜的最優(yōu)化算法來(lái)最小化目標(biāo)函數(shù)。
怎么確定損失函數(shù)的凸性呢?
講到這,你肯定好奇,那怎么判斷一個(gè)損失函數(shù)的凸性呢?這方法可就多了,舉幾個(gè)例子吧。更復(fù)雜的方法你如果感興趣,可以選修更高階的課程。
要確定損失函數(shù)的凸性,可以使用以下方法之一:
直接求解二階導(dǎo)數(shù):通過(guò)計(jì)算損失函數(shù)的二階導(dǎo)數(shù),可以直接判斷損失函數(shù)是否是凸函數(shù)。如果損失函數(shù)的二階導(dǎo)數(shù)大于 0,則損失函數(shù)是凸函數(shù);如果損失函數(shù)的二階導(dǎo)數(shù)小于 0,則損失函數(shù)是凹函數(shù);如果損失函數(shù)的二階導(dǎo)數(shù)等于 0,則損失函數(shù)是平函數(shù)。
使用凸性定理:凸性定理是一個(gè)經(jīng)典的定理,它可以幫助我們判斷函數(shù)的凸性。根據(jù)凸性定理,如果一個(gè)函數(shù)的二階導(dǎo)數(shù)大于 0,則該函數(shù)是凸函數(shù);如果一個(gè)函數(shù)的二階導(dǎo)數(shù)小于 0,則該函數(shù)是凹函數(shù);如果一個(gè)函數(shù)的二階導(dǎo)數(shù)等于 0,則該函數(shù)可能是凸函數(shù)也可能是凹函數(shù)。
可視化函數(shù):可以使用可視化工具,如 Matplotlib 或 Plotly,來(lái)繪制損失函數(shù)的圖像。通過(guò)觀察圖像,可以直接判斷損失函數(shù)是否是凸函數(shù)。
枚舉自變量的值:可以嘗試枚舉自變量的值,計(jì)算損失函數(shù)的值。如果損失函數(shù)的值是單調(diào)遞增或單調(diào)遞減的,則損失函數(shù)是凸函數(shù);如果損失函數(shù)的值存在局部最小值或局部最大值,則損失函數(shù)是凹函數(shù)。
凸約束和凸優(yōu)化是什么關(guān)系?
我們知道損失函數(shù)是可以帶有約束條件的。因此凸約束和凸優(yōu)化有密切聯(lián)系,但是并不是同一個(gè)概念。凸約束是指在優(yōu)化問(wèn)題中,約束條件是凸函數(shù)的情況。這意味著,對(duì)于給定的自變量,約束條件的值是單調(diào)遞增或單調(diào)遞減的。例如,當(dāng)約束條件為 x<=1時(shí),約束條件是凸函數(shù)。凸優(yōu)化是指使用凸優(yōu)化算法來(lái)最小化凸函數(shù)的優(yōu)化問(wèn)題。凸優(yōu)化算法是指那些只能處理凸函數(shù)的優(yōu)化算法。例如,梯度下降法和共軛梯度法都是凸優(yōu)化算法。總之,凸約束是指優(yōu)化問(wèn)題中的約束條件是凸函數(shù),而凸優(yōu)化是指使用凸優(yōu)化算法來(lái)最小化凸函數(shù)的優(yōu)化問(wèn)題。
一階信息和二階信息區(qū)別是什么
上面我們提到了一階信息和二階信息,它們具體啥意思呢? 一階信息通常指的是目標(biāo)函數(shù)的導(dǎo)數(shù),即梯度。使用一階信息的優(yōu)化算法,如梯度下降法,是通過(guò)計(jì)算目標(biāo)函數(shù)的梯度來(lái)調(diào)整自變量的值,從而使得目標(biāo)函數(shù)取到最小值。二階信息通常指的是目標(biāo)函數(shù)的二階導(dǎo)數(shù),即海森矩陣或共軛梯度。使用二階信息的優(yōu)化算法,如擬牛頓法和共軛梯度法,是通過(guò)計(jì)算目標(biāo)函數(shù)的海森矩陣或共軛梯度來(lái)調(diào)整自變量的值,從而使得目標(biāo)函數(shù)取到最小值。相比較而言,使用二階信息的優(yōu)化算法通常更加精確,但同時(shí)也更加復(fù)雜。因此,我們通常會(huì)根據(jù)問(wèn)題的具體情況來(lái)選擇使用一階信息還是二階信息。
Jensen不等式的重要性

這個(gè)定理最初由丹麥數(shù)學(xué)家J.L.W.V. Jensen在1906年提出,因此得名。Jensen 不等式的歷史可以追溯到19世紀(jì)末,當(dāng)時(shí)數(shù)學(xué)家們正在研究凸函數(shù)的性質(zhì)。1890年,德國(guó)數(shù)學(xué)家Gustav Kirchhoff提出了凸性不等式,這個(gè)不等式描述了一個(gè)函數(shù)的平均值與其最大值之間的關(guān)系。在1906年,Jensen 在他的論文《Om mengder af reelle Tall》(關(guān)于實(shí)數(shù)集合的論文)中提出了一個(gè)更一般的不等式,稱(chēng)為 Jensen 不等式。這個(gè)不等式描述了一個(gè)函數(shù)與其平均值之間的關(guān)系,并且不限于凸函數(shù)。Jensen 不等式在過(guò)去的幾十年里廣泛應(yīng)用,并被用于許多不同的領(lǐng)域,包括信息論、機(jī)器學(xué)習(xí)、信號(hào)處理和計(jì)算機(jī)科學(xué)等。它也被用作數(shù)學(xué)優(yōu)化中的一種工具,用于證明最優(yōu)化問(wèn)題的最優(yōu)性。
梗直哥提示:這部分內(nèi)容對(duì)數(shù)學(xué)基礎(chǔ)的要求比較高,如果底子不是很扎實(shí)的話,理解起來(lái)是比較困難的。不過(guò),這取決于你的目標(biāo)是什么,如果僅僅是入門(mén)深度學(xué)習(xí),可以暫時(shí)跳過(guò)去;如果是想深入理解算法背后的原理,那就應(yīng)該搞明白;如果你正在科研,或者看一些關(guān)于變分推斷方面的算法,那這部分內(nèi)容就很關(guān)鍵了。篇幅關(guān)系,這里難以同時(shí)滿足所有同學(xué)的需求,可以入群(微信:gengzhige99),也歡迎來(lái)選修我們深度學(xué)習(xí)的進(jìn)階課程。
