劉 波,張鼎松
(1.巢湖學(xué)院,安徽巢湖 238000;2.微軟(中國)有限公司,上海 201100)
神經(jīng)網(wǎng)絡(luò)中的損失函數(shù),又叫誤差函數(shù),是用來刻畫神經(jīng)網(wǎng)絡(luò)的輸出值與真實(shí)值之間的誤差大小的。對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練的目標(biāo)就是使這個(gè)誤差最小化,即通過不斷的訓(xùn)練使誤差無限趨于零,每一次訓(xùn)練都會(huì)更新神經(jīng)網(wǎng)絡(luò)系統(tǒng)的權(quán)重參數(shù)。一般當(dāng)誤差小于某個(gè)既定的閾值時(shí),會(huì)認(rèn)為誤差已經(jīng)足夠小,可停止訓(xùn)練,此時(shí)得到的一組神經(jīng)網(wǎng)絡(luò)的權(quán)重參數(shù)就是系統(tǒng)最終的權(quán)重值。影響權(quán)重參數(shù)最終值的因素有很多,其中損失函數(shù)對(duì)參數(shù)的影響不容忽視,如果損失函數(shù)使用得不恰當(dāng),即使訓(xùn)練次數(shù)再多,用得到的參數(shù)組成的神經(jīng)網(wǎng)絡(luò)也不是符合要求的神經(jīng)網(wǎng)絡(luò)模型[1-2]。
對(duì)于不同的問題,損失函數(shù)也不相同,比如,在分類問題中經(jīng)典的損失函數(shù)是交叉熵,在線性回歸問題中常用的損失函數(shù)是均方誤差函數(shù)。然而,針對(duì)一些特定的實(shí)際問題,并不能一味地套用上述方法,需要根據(jù)實(shí)際情況自定義損失函數(shù)[1,3]。
在分類問題中,在神經(jīng)網(wǎng)絡(luò)的訓(xùn)練中常采用交叉熵作為損失函數(shù),交叉熵這個(gè)概念源于信息論,交叉熵的公式定義為:
H(p,q)=-∑p(x)logq(x).
當(dāng)作為分類問題中神經(jīng)網(wǎng)絡(luò)的損失函數(shù)時(shí),p表示真實(shí)值的概率分布,q表示預(yù)測(cè)值的概率分布,交叉熵反映的是p和q之間的差異[4]。例如,假設(shè)p=(0,0,1,0),q1=(0.1,0.1,0.7,0.1),q2=(0.2,0.2,0.5,0.1),明顯地,q1與p更接近。而交叉熵的計(jì)算結(jié)果如下:
H(p,q1)=-(0×log 0.1+0×log 0.1+1×log 0.7+0×log 0.1)≈0.155.
H(p,q2)=-(0×log 0.2+0×log 0.2+1×log 0.5+0×log 0.1)≈0.301.
可見,H(p,q1) 在回歸問題中,在神經(jīng)網(wǎng)絡(luò)的訓(xùn)練中常采用均方誤差作為損失函數(shù),均方誤差的公式定義如下: 這個(gè)公式反映了真實(shí)值y與預(yù)測(cè)值y′之間差異的大小,其中n為訓(xùn)練樣本的數(shù)量。 上述這些常用的損失函數(shù)通用性很好,適用于很多應(yīng)用場(chǎng)合,根據(jù)這些損失函數(shù)訓(xùn)練得出的神經(jīng)網(wǎng)絡(luò)模型都是完全標(biāo)準(zhǔn)的模型。但對(duì)于某些特定環(huán)境的實(shí)際問題,有時(shí)并不需要一個(gè)標(biāo)準(zhǔn)模型,而需要一個(gè)符合實(shí)際要求的模型,這個(gè)符合實(shí)際要求的模型不一定是標(biāo)準(zhǔn)的。因此,還需要根據(jù)實(shí)際需求,設(shè)計(jì)自定義損失函數(shù),從而保證得到的神經(jīng)網(wǎng)絡(luò)模型更貼合實(shí)際情況。 在現(xiàn)實(shí)生活中,常常有一些實(shí)際問題采用常用損失函數(shù)得到的效果并不能讓人滿意。比如關(guān)于高速公路收費(fèi)站,有時(shí)會(huì)根據(jù)車流量來開放收費(fèi)通道數(shù),車流量少時(shí),會(huì)關(guān)閉若干通道數(shù)以節(jié)省收費(fèi)員人數(shù)等人力成本,而在節(jié)假日等車流高峰日,會(huì)多安排一些收費(fèi)員上班。而作為交通管理部門或許希望多開放一些通道數(shù),以進(jìn)一步保持道路暢通。關(guān)于這個(gè)實(shí)際問題,在車流量預(yù)測(cè)的神經(jīng)網(wǎng)絡(luò)系統(tǒng)中,由于屬于回歸問題,損失函數(shù)通常采用均方誤差。然而,均方誤差不能很好地反映無論是交管部門還是收費(fèi)站管理公司任意一方的需求,交通管理部門希望模型預(yù)測(cè)出來的值是偏多的,從而保證多開放通道數(shù),而收費(fèi)站管理公司希望模型預(yù)測(cè)出來的值是偏少的,從而節(jié)省人力成本。 對(duì)于上述實(shí)際問題,使用經(jīng)典的損失函數(shù)得到的將是標(biāo)準(zhǔn)模型。而實(shí)際情況中,無論是交通管理部門還是收費(fèi)站管理公司,都并不需要這樣的標(biāo)準(zhǔn)模型。因此,需要針對(duì)該實(shí)際問題,進(jìn)行自定義損失函數(shù)的設(shè)計(jì),自定義損失函數(shù)如下: 圖1 實(shí)驗(yàn)所用的神經(jīng)網(wǎng)絡(luò)系統(tǒng)結(jié)構(gòu)圖 基于Tensorflow編寫代碼進(jìn)行對(duì)比實(shí)驗(yàn)。設(shè)計(jì)一個(gè)預(yù)測(cè)車流量的神經(jīng)網(wǎng)絡(luò)系統(tǒng),簡單起見,該神經(jīng)網(wǎng)絡(luò)系統(tǒng)僅有輸入層和輸出層,沒有隱藏層。輸入層有3個(gè)神經(jīng)元x1、x2和x3,輸出層有一個(gè)神經(jīng)元y,y即為輸出的預(yù)測(cè)值。由該模型可推算該神經(jīng)網(wǎng)絡(luò)系統(tǒng)的權(quán)重值w有3個(gè),分別記作w1、w2和w3[5]。具體結(jié)構(gòu)如圖1所示。 實(shí)驗(yàn)所需的數(shù)據(jù)集是通過隨機(jī)數(shù)生成的。在Tensorflow中,隨機(jī)生成輸入數(shù)據(jù)x的代碼如下: x=rdm.rand(100,3) 而真實(shí)值yt設(shè)置為在3個(gè)輸入之和的基礎(chǔ)上再加上一個(gè)小的隨機(jī)數(shù),相應(yīng)的TensorFlow代碼編寫如下: y=[[x1+x2+x3+(rdm.rand()/10.0-0.05)]for(x1,x2,x3)in x] 在實(shí)驗(yàn)中分別設(shè)置a=20,b=1,或者a=1,b=20,其它不變。為表述方便,將設(shè)置a=20,b=1的實(shí)驗(yàn)記作實(shí)驗(yàn)1,將設(shè)置a=1,b=20的實(shí)驗(yàn)記作實(shí)驗(yàn)2。在Tensorflow中,該自定義損失函數(shù)的代碼可表示為self_defined_loss=tf.reduce_sum(tf.where(tf.greater(y,yt),(y-yt)*a,(yt-y)*b))。其中,yt表示真實(shí)值,y表示預(yù)測(cè)值,self_defined_loss為損失函數(shù)[1]。 同時(shí),為了與傳統(tǒng)的經(jīng)典均方誤差函數(shù)做對(duì)比,在實(shí)驗(yàn)1或?qū)嶒?yàn)2中將原有的自定義損失函數(shù)替換為均方誤差函數(shù)再進(jìn)行一次實(shí)驗(yàn),記作實(shí)驗(yàn)3。在Tensorflow中,均方誤差函數(shù)的代碼可表示為: loss=tf.losses.mean_squared_error(y,yt). 其中,yt表示真實(shí)值,y表示預(yù)測(cè)值,loss為損失函數(shù)。此外,實(shí)驗(yàn)中的訓(xùn)練次數(shù)統(tǒng)一設(shè)為10000次。 表1展示了訓(xùn)練10000次之后3個(gè)實(shí)驗(yàn)的最終結(jié)果,即得到的3個(gè)模型的最終權(quán)重值。 表1 三次實(shí)驗(yàn)得到的最終權(quán)重 從實(shí)驗(yàn)1得到的預(yù)測(cè)函數(shù)為0.97799325×x1+0.97289824×x2+0.9656626×x3,系數(shù)都小于1,偏向于少預(yù)測(cè)車流量,符合收費(fèi)站管理公司的需求。 從實(shí)驗(yàn)2得到的預(yù)測(cè)函數(shù)為1.00788939×x1+1.03763902×x2+1.02715361×x3,系數(shù)都大于1,偏向于多預(yù)測(cè)車流量,符合交管部門的需求。 從實(shí)驗(yàn)3得到的預(yù)測(cè)函數(shù)為0.98959422×x1+1.01077771×x2+0.99803776×x3,實(shí)驗(yàn)3所用的損失函數(shù)不是自定義的損失函數(shù),而是經(jīng)典的均方誤差函數(shù),最終的預(yù)測(cè)函數(shù)更偏向于標(biāo)準(zhǔn)值,但得到的模型并不是一個(gè)符合實(shí)際需求的模型。 本文在分析神經(jīng)網(wǎng)絡(luò)系統(tǒng)中經(jīng)典損失函數(shù)局限性的基礎(chǔ)上,針對(duì)實(shí)際問題提出一種自定義損失函數(shù),并設(shè)計(jì)實(shí)驗(yàn)進(jìn)行對(duì)比分析,結(jié)果表明使用自定義的損失函數(shù)比使用經(jīng)典的均方誤差函數(shù)更符合實(shí)際需求。因此,在使用神經(jīng)網(wǎng)絡(luò)解決實(shí)際問題時(shí),需要根據(jù)實(shí)際需求選用經(jīng)典的損失函數(shù)或者設(shè)計(jì)自定義損失函數(shù)。1.2 均方誤差
1.3 局限性
2 實(shí)際問題及自定義損失函數(shù)
2.1 實(shí)際問題的提出
2.2 自定義損失函數(shù)的提出和設(shè)計(jì)
3 對(duì)比實(shí)驗(yàn)
3.1 實(shí)驗(yàn)的設(shè)計(jì)
3.2 實(shí)驗(yàn)結(jié)果及對(duì)比分析
4 結(jié)語