平滑函數(shù)。
10年積累的網(wǎng)站建設、網(wǎng)站制作經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡服務。我雖然不認識你,你也不認識我。但先制作網(wǎng)站后付款的網(wǎng)站建設流程,更有新榮免費網(wǎng)站建設讓你可以放心的選擇與我們合作。
交叉熵損失函數(shù),也稱為對數(shù)損失或者logistic損失。當模型產(chǎn)生了預測值之后,將對類別的預測概率與真實值(由0或1組成)進行不比較,計算所產(chǎn)生的損失,然后基于此損失設置對數(shù)形式的懲罰項。
在神經(jīng)網(wǎng)絡中,所使用的Softmax函數(shù)是連續(xù)可導函數(shù),這使得可以計算出損失函數(shù)相對于神經(jīng)網(wǎng)絡中每個權重的導數(shù)(在《機器學習數(shù)學基礎》中有對此的完整推導過程和案例,這樣就可以相應地調(diào)整模型的權重以最小化損失函數(shù)。
擴展資料:
注意事項:
當預測類別為二分類時,交叉熵損失函數(shù)的計算公式如下圖,其中y是真實類別(值為0或1),p是預測類別的概率(值為0~1之間的小數(shù))。
計算二分類的交叉熵損失函數(shù)的python代碼如下圖,其中esp是一個極小值,第五行代碼clip的目的是保證預測概率的值在0~1之間,輸出的損失值數(shù)組求和后,就是損失函數(shù)最后的返回值。
參考資料來源:百度百科-交叉熵
參考資料來源:百度百科-損失函數(shù)
用keras框架較為方便
首先安裝anaconda,然后通過pip安裝keras
以下轉(zhuǎn)自wphh的博客。
#coding:utf-8
'''
GPU?run?command:
THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32?python?cnn.py
CPU?run?command:
python?cnn.py
2016.06.06更新:
這份代碼是keras開發(fā)初期寫的,當時keras還沒有現(xiàn)在這么流行,文檔也還沒那么豐富,所以我當時寫了一些簡單的教程。
現(xiàn)在keras的API也發(fā)生了一些的變化,建議及推薦直接上keras.io看更加詳細的教程。
'''
#導入各種用到的模塊組件
from?__future__?import?absolute_import
from?__future__?import?print_function
from?keras.preprocessing.image?import?ImageDataGenerator
from?keras.models?import?Sequential
from?keras.layers.core?import?Dense,?Dropout,?Activation,?Flatten
from?keras.layers.advanced_activations?import?PReLU
from?keras.layers.convolutional?import?Convolution2D,?MaxPooling2D
from?keras.optimizers?import?SGD,?Adadelta,?Adagrad
from?keras.utils?import?np_utils,?generic_utils
from?six.moves?import?range
from?data?import?load_data
import?random
import?numpy?as?np
np.random.seed(1024)??#?for?reproducibility
#加載數(shù)據(jù)
data,?label?=?load_data()
#打亂數(shù)據(jù)
index?=?[i?for?i?in?range(len(data))]
random.shuffle(index)
data?=?data[index]
label?=?label[index]
print(data.shape[0],?'?samples')
#label為0~9共10個類別,keras要求格式為binary?class?matrices,轉(zhuǎn)化一下,直接調(diào)用keras提供的這個函數(shù)
label?=?np_utils.to_categorical(label,?10)
###############
#開始建立CNN模型
###############
#生成一個model
model?=?Sequential()
#第一個卷積層,4個卷積核,每個卷積核大小5*5。1表示輸入的圖片的通道,灰度圖為1通道。
#border_mode可以是valid或者full,具體看這里說明:
#激活函數(shù)用tanh
#你還可以在model.add(Activation('tanh'))后加上dropout的技巧:?model.add(Dropout(0.5))
model.add(Convolution2D(4,?5,?5,?border_mode='valid',input_shape=(1,28,28)))?
model.add(Activation('tanh'))
#第二個卷積層,8個卷積核,每個卷積核大小3*3。4表示輸入的特征圖個數(shù),等于上一層的卷積核個數(shù)
#激活函數(shù)用tanh
#采用maxpooling,poolsize為(2,2)
model.add(Convolution2D(8,?3,?3,?border_mode='valid'))
model.add(Activation('tanh'))
model.add(MaxPooling2D(pool_size=(2,?2)))
#第三個卷積層,16個卷積核,每個卷積核大小3*3
#激活函數(shù)用tanh
#采用maxpooling,poolsize為(2,2)
model.add(Convolution2D(16,?3,?3,?border_mode='valid'))?
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,?2)))
#全連接層,先將前一層輸出的二維特征圖flatten為一維的。
#Dense就是隱藏層。16就是上一層輸出的特征圖個數(shù)。4是根據(jù)每個卷積層計算出來的:(28-5+1)得到24,(24-3+1)/2得到11,(11-3+1)/2得到4
#全連接有128個神經(jīng)元節(jié)點,初始化方式為normal
model.add(Flatten())
model.add(Dense(128,?init='normal'))
model.add(Activation('tanh'))
#Softmax分類,輸出是10類別
model.add(Dense(10,?init='normal'))
model.add(Activation('softmax'))
#############
#開始訓練模型
##############
#使用SGD?+?momentum
#model.compile里的參數(shù)loss就是損失函數(shù)(目標函數(shù))
sgd?=?SGD(lr=0.05,?decay=1e-6,?momentum=0.9,?nesterov=True)
model.compile(loss='categorical_crossentropy',?optimizer=sgd,metrics=["accuracy"])
#調(diào)用fit方法,就是一個訓練過程.?訓練的epoch數(shù)設為10,batch_size為100.
#數(shù)據(jù)經(jīng)過隨機打亂shuffle=True。verbose=1,訓練過程中輸出的信息,0、1、2三種方式都可以,無關緊要。show_accuracy=True,訓練時每一個epoch都輸出accuracy。
#validation_split=0.2,將20%的數(shù)據(jù)作為驗證集。
model.fit(data,?label,?batch_size=100,?nb_epoch=10,shuffle=True,verbose=1,validation_split=0.2)
"""
#使用data?augmentation的方法
#一些參數(shù)和調(diào)用的方法,請看文檔
datagen?=?ImageDataGenerator(
featurewise_center=True,?#?set?input?mean?to?0?over?the?dataset
samplewise_center=False,?#?set?each?sample?mean?to?0
featurewise_std_normalization=True,?#?divide?inputs?by?std?of?the?dataset
samplewise_std_normalization=False,?#?divide?each?input?by?its?std
zca_whitening=False,?#?apply?ZCA?whitening
rotation_range=20,?#?randomly?rotate?images?in?the?range?(degrees,?0?to?180)
width_shift_range=0.2,?#?randomly?shift?images?horizontally?(fraction?of?total?width)
height_shift_range=0.2,?#?randomly?shift?images?vertically?(fraction?of?total?height)
horizontal_flip=True,?#?randomly?flip?images
vertical_flip=False)?#?randomly?flip?images
#?compute?quantities?required?for?featurewise?normalization?
#?(std,?mean,?and?principal?components?if?ZCA?whitening?is?applied)
datagen.fit(data)
for?e?in?range(nb_epoch):
print('-'*40)
print('Epoch',?e)
print('-'*40)
print("Training...")
#?batch?train?with?realtime?data?augmentation
progbar?=?generic_utils.Progbar(data.shape[0])
for?X_batch,?Y_batch?in?datagen.flow(data,?label):
loss,accuracy?=?model.train(X_batch,?Y_batch,accuracy=True)
progbar.add(X_batch.shape[0],?values=[("train?loss",?loss),("accuracy:",?accuracy)]?)
"""
正則化(Regularization)
機器學習中幾乎都可以看到損失函數(shù)后面會添加一個額外項,常用的額外項一般有兩種,一般英文稱作 ?1-norm 和 ?2-norm ,中文稱作 L1正則化 和 L2正則化 ,或者 L1范數(shù) 和 L2范數(shù) 。
L1正則化和L2正則化可以看做是損失函數(shù)的懲罰項。所謂『懲罰』是指對損失函數(shù)中的某些參數(shù)做一些限制。對于線性回歸模型,使用L1正則化的模型建叫做Lasso回歸,使用L2正則化的模型叫做Ridge回歸(嶺回歸)。下圖是Python中Lasso回歸的損失函數(shù),式中加號后面一項α||w||1即為L1正則化項。
下圖是Python中Ridge回歸的損失函數(shù),式中加號后面一項α||w||22即為L2正則化項。
一般回歸分析中回歸w表示特征的系數(shù),從上式可以看到正則化項是對系數(shù)做了處理(限制)。 L1正則化和L2正則化的說明如下:
L1正則化是指權值向量w中各個元素的 絕對值之和 ,通常表示為||w||1
L2正則化是指權值向量w中各個元素的 平方和然后再求平方根 (可以看到Ridge回歸的L2正則化項有平方符號),通常表示為||w||2
一般都會在正則化項之前添加一個系數(shù),Python中用α表示,一些文章也用λ表示。這個系數(shù)需要用戶指定。
那添加L1和L2正則化有什么用? 下面是L1正則化和L2正則化的作用 ,這些表述可以在很多文章中找到。
L1正則化可以產(chǎn)生稀疏權值矩陣,即產(chǎn)生一個稀疏模型,可以用于特征選擇
L2正則化可以防止模型過擬合(overfitting);一定程度上,L1也可以防止過擬合
稀疏模型與特征選擇
上面提到L1正則化有助于生成一個稀疏權值矩陣,進而可以用于特征選擇。為什么要生成一個稀疏矩陣?
稀疏矩陣指的是很多元素為0,只有少數(shù)元素是非零值的矩陣,即得到的線性回歸模型的大部分系數(shù)都是0.
通常機器學習中特征數(shù)量很多,例如文本處理時,如果將一個詞組(term)作為一個特征,那么特征數(shù)量會達到上萬個(bigram)。在預測或分類時,那么多特征顯然難以選擇,但是如果代入這些特征得到的模型是一個稀疏模型,表示只有少數(shù)特征對這個模型有貢獻,絕大部分特征是沒有貢獻的,或者貢獻微小(因為它們前面的系數(shù)是0或者是很小的值,即使去掉對模型也沒有什么影響),此時我們就可以只關注系數(shù)是非零值的特征。這就是稀疏模型與特征選擇的關系。
L1和L2正則化的直觀理解
這部分內(nèi)容將解釋 為什么L1正則化可以產(chǎn)生稀疏模型(L1是怎么讓系數(shù)等于零的) ,以及 為什么L2正則化可以防止過擬合 。
L1正則化和特征選擇
假設有如下帶L1正則化的損失函數(shù):
J=J0+α∑w|w|(1)
其中J0是原始的損失函數(shù),加號后面的一項是L1正則化項,α是正則化系數(shù)。注意到L1正則化是權值的 絕對值之和 ,J是帶有絕對值符號的函數(shù),因此J是不完全可微的。機器學習的任務就是要通過一些方法(比如梯度下降)求出損失函數(shù)的最小值。當我們在原始損失函數(shù)J0后添加L1正則化項時,相當于對J0做了一個約束。令L=α∑w|w|,則J=J0+L,此時我們的任務變成 在L約束下求出J0取最小值的解 。考慮二維的情況,即只有兩個權值w1和w2,此時L=|w1|+|w2|對于梯度下降法,求解J0的過程可以畫出等值線,同時L1正則化的函數(shù)L也可以在w1w2的二維平面上畫出來。如下圖:
圖1? L1正則化
圖中等值線是J0的等值線,黑色方形是L函數(shù)的圖形。在圖中,當J0等值線與L圖形首次相交的地方就是最優(yōu)解。上圖中J0與L在L的一個頂點處相交,這個頂點就是最優(yōu)解。注意到這個頂點的值是(w1,w2)=(0,w)。可以直觀想象,因為L函數(shù)有很多『突出的角』(二維情況下四個,多維情況下更多),J0與這些角接觸的機率會遠大于與L其它部位接觸的機率,而在這些角上,會有很多權值等于0,這就是為什么L1正則化可以產(chǎn)生稀疏模型,進而可以用于特征選擇。
而正則化前面的系數(shù)α,可以控制L圖形的大小。α越小,L的圖形越大(上圖中的黑色方框);α越大,L的圖形就越小,可以小到黑色方框只超出原點范圍一點點,這是最優(yōu)點的值(w1,w2)=(0,w)中的w可以取到很小的值。
類似,假設有如下帶L2正則化的損失函數(shù):
J=J0+α∑ww2(2)
同樣可以畫出他們在二維平面上的圖形,如下:
圖2? L2正則化
二維平面下L2正則化的函數(shù)圖形是個圓,與方形相比,被磨去了棱角。因此J0與L相交時使得w1或w2等于零的機率小了許多,這就是為什么L2正則化不具有稀疏性的原因。
L2正則化和過擬合
擬合過程中通常都傾向于讓權值盡可能小,最后構造一個所有參數(shù)都比較小的模型。因為一般認為參數(shù)值小的模型比較簡單,能適應不同的數(shù)據(jù)集,也在一定程度上避免了過擬合現(xiàn)象。可以設想一下對于一個線性回歸方程,若參數(shù)很大,那么只要數(shù)據(jù)偏移一點點,就會對結(jié)果造成很大的影響;但如果參數(shù)足夠小,數(shù)據(jù)偏移得多一點也不會對結(jié)果造成什么影響,專業(yè)一點的說法是『抗擾動能力強』。
那為什么L2正則化可以獲得值很小的參數(shù)?
以線性回歸中的梯度下降法為例。假設要求的參數(shù)為θ,hθ(x)是我們的假設函數(shù),那么線性回歸的代價函數(shù)如下:
J(θ)=12m∑i=1m(hθ(x(i))?y(i))(3)
那么在梯度下降法中,最終用于迭代計算參數(shù)θ的迭代式為:
θj:=θj?α1m∑i=1m(hθ(x(i))?y(i))x(i)j(4)
其中α是learning rate. 上式是沒有添加L2正則化項的迭代公式,如果在原始代價函數(shù)之后添加L2正則化,則迭代公式會變成下面的樣子:
θj:=θj(1?αλm)?α1m∑i=1m(hθ(x(i))?y(i))x(i)j(5)
其中 λ就是正則化參數(shù) 。從上式可以看到,與未添加L2正則化的迭代公式相比,每一次迭代,θj都要先乘以一個小于1的因子,從而使得θj不斷減小,因此總得來看,θ是不斷減小的。
最開始也提到L1正則化一定程度上也可以防止過擬合。之前做了解釋,當L1的正則化系數(shù)很小時,得到的最優(yōu)解會很小,可以達到和L2正則化類似的效果。
正則化參數(shù)的選擇
L1正則化參數(shù)
通常越大的λ可以讓代價函數(shù)在參數(shù)為0時取到最小值。下面是一個簡單的例子,這個例子來自 Quora上的問答 。為了方便敘述,一些符號跟這篇帖子的符號保持一致。
假設有如下帶L1正則化項的代價函數(shù):
F(x)=f(x)+λ||x||1
其中x是要估計的參數(shù),相當于上文中提到的w以及θ. 注意到L1正則化在某些位置是不可導的,當λ足夠大時可以使得F(x)在x=0時取到最小值。如下圖:
圖3 L1正則化參數(shù)的選擇
分別取λ=0.5和λ=2,可以看到越大的λ越容易使F(x)在x=0時取到最小值。
L2正則化參數(shù)
從公式5可以看到,λ越大,θj衰減得越快。另一個理解可以參考圖2,λ越大,L2圓的半徑越小,最后求得代價函數(shù)最值時各參數(shù)也會變得很小。
Reference
過擬合的解釋:
正則化的解釋:
正則化的解釋:
正則化的數(shù)學解釋(一些圖來源于這里):
原文參考:blog.csdn.net/jinping_shi/article/details/52433975
從零開始用Python構建神經(jīng)網(wǎng)絡
動機:為了更加深入的理解深度學習,我們將使用 python 語言從頭搭建一個神經(jīng)網(wǎng)絡,而不是使用像 Tensorflow 那樣的封裝好的框架。我認為理解神經(jīng)網(wǎng)絡的內(nèi)部工作原理,對數(shù)據(jù)科學家來說至關重要。
這篇文章的內(nèi)容是我的所學,希望也能對你有所幫助。
神經(jīng)網(wǎng)絡是什么?
介紹神經(jīng)網(wǎng)絡的文章大多數(shù)都會將它和大腦進行類比。如果你沒有深入研究過大腦與神經(jīng)網(wǎng)絡的類比,那么將神經(jīng)網(wǎng)絡解釋為一種將給定輸入映射為期望輸出的數(shù)學關系會更容易理解。
神經(jīng)網(wǎng)絡包括以下組成部分
? 一個輸入層,x
? 任意數(shù)量的隱藏層
? 一個輸出層,?
? 每層之間有一組權值和偏置,W and b
? 為隱藏層選擇一種激活函數(shù),σ。在教程中我們使用 Sigmoid 激活函數(shù)
下圖展示了 2 層神經(jīng)網(wǎng)絡的結(jié)構(注意:我們在計算網(wǎng)絡層數(shù)時通常排除輸入層)
2 層神經(jīng)網(wǎng)絡的結(jié)構
用 Python 可以很容易的構建神經(jīng)網(wǎng)絡類
訓練神經(jīng)網(wǎng)絡
這個網(wǎng)絡的輸出 ? 為:
你可能會注意到,在上面的等式中,輸出 ? 是 W 和 b 函數(shù)。
因此 W 和 b 的值影響預測的準確率. 所以根據(jù)輸入數(shù)據(jù)對 W 和 b 調(diào)優(yōu)的過程就被成為訓練神經(jīng)網(wǎng)絡。
每步訓練迭代包含以下兩個部分:
? 計算預測結(jié)果 ?,這一步稱為前向傳播
? 更新 W 和 b,,這一步成為反向傳播
下面的順序圖展示了這個過程:
前向傳播
正如我們在上圖中看到的,前向傳播只是簡單的計算。對于一個基本的 2 層網(wǎng)絡來說,它的輸出是這樣的:
我們在 NeuralNetwork 類中增加一個計算前向傳播的函數(shù)。為了簡單起見我們假設偏置 b 為0:
但是我們還需要一個方法來評估預測結(jié)果的好壞(即預測值和真實值的誤差)。這就要用到損失函數(shù)。
損失函數(shù)
常用的損失函數(shù)有很多種,根據(jù)模型的需求來選擇。在本教程中,我們使用誤差平方和作為損失函數(shù)。
誤差平方和是求每個預測值和真實值之間的誤差再求和,這個誤差是他們的差值求平方以便我們觀察誤差的絕對值。
訓練的目標是找到一組 W 和 b,使得損失函數(shù)最好小,也即預測值和真實值之間的距離最小。
反向傳播
我們已經(jīng)度量出了預測的誤差(損失),現(xiàn)在需要找到一種方法來傳播誤差,并以此更新權值和偏置。
為了知道如何適當?shù)恼{(diào)整權值和偏置,我們需要知道損失函數(shù)對權值 W 和偏置 b 的導數(shù)。
回想微積分中的概念,函數(shù)的導數(shù)就是函數(shù)的斜率。
梯度下降法
如果我們已經(jīng)求出了導數(shù),我們就可以通過增加或減少導數(shù)值來更新權值 W 和偏置 b(參考上圖)。這種方式被稱為梯度下降法。
但是我們不能直接計算損失函數(shù)對權值和偏置的導數(shù),因為在損失函數(shù)的等式中并沒有顯式的包含他們。因此,我們需要運用鏈式求導發(fā)在來幫助計算導數(shù)。
鏈式法則用于計算損失函數(shù)對 W 和 b 的導數(shù)。注意,為了簡單起見。我們只展示了假設網(wǎng)絡只有 1 層的偏導數(shù)。
這雖然很簡陋,但是我們依然能得到想要的結(jié)果—損失函數(shù)對權值 W 的導數(shù)(斜率),因此我們可以相應的調(diào)整權值。
現(xiàn)在我們將反向傳播算法的函數(shù)添加到 Python 代碼中
為了更深入的理解微積分原理和反向傳播中的鏈式求導法則,我強烈推薦 3Blue1Brown 的如下教程:
Youtube:
整合并完成一個實例
既然我們已經(jīng)有了包括前向傳播和反向傳播的完整 Python 代碼,那么就將其應用到一個例子上看看它是如何工作的吧。
神經(jīng)網(wǎng)絡可以通過學習得到函數(shù)的權重。而我們僅靠觀察是不太可能得到函數(shù)的權重的。
讓我們訓練神經(jīng)網(wǎng)絡進行 1500 次迭代,看看會發(fā)生什么。 注意觀察下面每次迭代的損失函數(shù),我們可以清楚地看到損失函數(shù)單調(diào)遞減到最小值。這與我們之前介紹的梯度下降法一致。
讓我們看看經(jīng)過 1500 次迭代后的神經(jīng)網(wǎng)絡的最終預測結(jié)果:
經(jīng)過 1500 次迭代訓練后的預測結(jié)果
我們成功了!我們應用前向和方向傳播算法成功的訓練了神經(jīng)網(wǎng)絡并且預測結(jié)果收斂于真實值。
注意預測值和真實值之間存在細微的誤差是允許的。這樣可以防止模型過擬合并且使得神經(jīng)網(wǎng)絡對于未知數(shù)據(jù)有著更強的泛化能力。
下一步是什么?
幸運的是我們的學習之旅還沒有結(jié)束,仍然有很多關于神經(jīng)網(wǎng)絡和深度學習的內(nèi)容需要學習。例如:
? 除了 Sigmoid 以外,還可以用哪些激活函數(shù)
? 在訓練網(wǎng)絡的時候應用學習率
? 在面對圖像分類任務的時候使用卷積神經(jīng)網(wǎng)絡
我很快會寫更多關于這個主題的內(nèi)容,敬請期待!
最后的想法
我自己也從零開始寫了很多神經(jīng)網(wǎng)絡的代碼
雖然可以使用諸如 Tensorflow 和 Keras 這樣的深度學習框架方便的搭建深層網(wǎng)絡而不需要完全理解其內(nèi)部工作原理。但是我覺得對于有追求的數(shù)據(jù)科學家來說,理解內(nèi)部原理是非常有益的。
這種練習對我自己來說已成成為重要的時間投入,希望也能對你有所幫助
標題名稱:包含python中的損失函數(shù)的詞條
網(wǎng)站鏈接:http://vcdvsql.cn/article10/hseego.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、Google、企業(yè)建站、定制網(wǎng)站、標簽優(yōu)化、用戶體驗
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)