平滑函數(shù)。
柞水網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),柞水網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為柞水1000多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的柞水做網(wǎng)站的公司定做!
交叉熵?fù)p失函數(shù),也稱為對(duì)數(shù)損失或者logistic損失。當(dāng)模型產(chǎn)生了預(yù)測(cè)值之后,將對(duì)類別的預(yù)測(cè)概率與真實(shí)值(由0或1組成)進(jìn)行不比較,計(jì)算所產(chǎn)生的損失,然后基于此損失設(shè)置對(duì)數(shù)形式的懲罰項(xiàng)。
在神經(jīng)網(wǎng)絡(luò)中,所使用的Softmax函數(shù)是連續(xù)可導(dǎo)函數(shù),這使得可以計(jì)算出損失函數(shù)相對(duì)于神經(jīng)網(wǎng)絡(luò)中每個(gè)權(quán)重的導(dǎo)數(shù)(在《機(jī)器學(xué)習(xí)數(shù)學(xué)基礎(chǔ)》中有對(duì)此的完整推導(dǎo)過程和案例,這樣就可以相應(yīng)地調(diào)整模型的權(quán)重以最小化損失函數(shù)。
擴(kuò)展資料:
注意事項(xiàng):
當(dāng)預(yù)測(cè)類別為二分類時(shí),交叉熵?fù)p失函數(shù)的計(jì)算公式如下圖,其中y是真實(shí)類別(值為0或1),p是預(yù)測(cè)類別的概率(值為0~1之間的小數(shù))。
計(jì)算二分類的交叉熵?fù)p失函數(shù)的python代碼如下圖,其中esp是一個(gè)極小值,第五行代碼clip的目的是保證預(yù)測(cè)概率的值在0~1之間,輸出的損失值數(shù)組求和后,就是損失函數(shù)最后的返回值。
參考資料來源:百度百科-交叉熵
參考資料來源:百度百科-損失函數(shù)
從零開始用Python構(gòu)建神經(jīng)網(wǎng)絡(luò)
動(dòng)機(jī):為了更加深入的理解深度學(xué)習(xí),我們將使用 python 語言從頭搭建一個(gè)神經(jīng)網(wǎng)絡(luò),而不是使用像 Tensorflow 那樣的封裝好的框架。我認(rèn)為理解神經(jīng)網(wǎng)絡(luò)的內(nèi)部工作原理,對(duì)數(shù)據(jù)科學(xué)家來說至關(guān)重要。
這篇文章的內(nèi)容是我的所學(xué),希望也能對(duì)你有所幫助。
神經(jīng)網(wǎng)絡(luò)是什么?
介紹神經(jīng)網(wǎng)絡(luò)的文章大多數(shù)都會(huì)將它和大腦進(jìn)行類比。如果你沒有深入研究過大腦與神經(jīng)網(wǎng)絡(luò)的類比,那么將神經(jīng)網(wǎng)絡(luò)解釋為一種將給定輸入映射為期望輸出的數(shù)學(xué)關(guān)系會(huì)更容易理解。
神經(jīng)網(wǎng)絡(luò)包括以下組成部分
? 一個(gè)輸入層,x
? 任意數(shù)量的隱藏層
? 一個(gè)輸出層,?
? 每層之間有一組權(quán)值和偏置,W and b
? 為隱藏層選擇一種激活函數(shù),σ。在教程中我們使用 Sigmoid 激活函數(shù)
下圖展示了 2 層神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)(注意:我們?cè)谟?jì)算網(wǎng)絡(luò)層數(shù)時(shí)通常排除輸入層)
2 層神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)
用 Python 可以很容易的構(gòu)建神經(jīng)網(wǎng)絡(luò)類
訓(xùn)練神經(jīng)網(wǎng)絡(luò)
這個(gè)網(wǎng)絡(luò)的輸出 ? 為:
你可能會(huì)注意到,在上面的等式中,輸出 ? 是 W 和 b 函數(shù)。
因此 W 和 b 的值影響預(yù)測(cè)的準(zhǔn)確率. 所以根據(jù)輸入數(shù)據(jù)對(duì) W 和 b 調(diào)優(yōu)的過程就被成為訓(xùn)練神經(jīng)網(wǎng)絡(luò)。
每步訓(xùn)練迭代包含以下兩個(gè)部分:
? 計(jì)算預(yù)測(cè)結(jié)果 ?,這一步稱為前向傳播
? 更新 W 和 b,,這一步成為反向傳播
下面的順序圖展示了這個(gè)過程:
前向傳播
正如我們?cè)谏蠄D中看到的,前向傳播只是簡(jiǎn)單的計(jì)算。對(duì)于一個(gè)基本的 2 層網(wǎng)絡(luò)來說,它的輸出是這樣的:
我們?cè)?NeuralNetwork 類中增加一個(gè)計(jì)算前向傳播的函數(shù)。為了簡(jiǎn)單起見我們假設(shè)偏置 b 為0:
但是我們還需要一個(gè)方法來評(píng)估預(yù)測(cè)結(jié)果的好壞(即預(yù)測(cè)值和真實(shí)值的誤差)。這就要用到損失函數(shù)。
損失函數(shù)
常用的損失函數(shù)有很多種,根據(jù)模型的需求來選擇。在本教程中,我們使用誤差平方和作為損失函數(shù)。
誤差平方和是求每個(gè)預(yù)測(cè)值和真實(shí)值之間的誤差再求和,這個(gè)誤差是他們的差值求平方以便我們觀察誤差的絕對(duì)值。
訓(xùn)練的目標(biāo)是找到一組 W 和 b,使得損失函數(shù)最好小,也即預(yù)測(cè)值和真實(shí)值之間的距離最小。
反向傳播
我們已經(jīng)度量出了預(yù)測(cè)的誤差(損失),現(xiàn)在需要找到一種方法來傳播誤差,并以此更新權(quán)值和偏置。
為了知道如何適當(dāng)?shù)恼{(diào)整權(quán)值和偏置,我們需要知道損失函數(shù)對(duì)權(quán)值 W 和偏置 b 的導(dǎo)數(shù)。
回想微積分中的概念,函數(shù)的導(dǎo)數(shù)就是函數(shù)的斜率。
梯度下降法
如果我們已經(jīng)求出了導(dǎo)數(shù),我們就可以通過增加或減少導(dǎo)數(shù)值來更新權(quán)值 W 和偏置 b(參考上圖)。這種方式被稱為梯度下降法。
但是我們不能直接計(jì)算損失函數(shù)對(duì)權(quán)值和偏置的導(dǎo)數(shù),因?yàn)樵趽p失函數(shù)的等式中并沒有顯式的包含他們。因此,我們需要運(yùn)用鏈?zhǔn)角髮?dǎo)發(fā)在來幫助計(jì)算導(dǎo)數(shù)。
鏈?zhǔn)椒▌t用于計(jì)算損失函數(shù)對(duì) W 和 b 的導(dǎo)數(shù)。注意,為了簡(jiǎn)單起見。我們只展示了假設(shè)網(wǎng)絡(luò)只有 1 層的偏導(dǎo)數(shù)。
這雖然很簡(jiǎn)陋,但是我們依然能得到想要的結(jié)果—損失函數(shù)對(duì)權(quán)值 W 的導(dǎo)數(shù)(斜率),因此我們可以相應(yīng)的調(diào)整權(quán)值。
現(xiàn)在我們將反向傳播算法的函數(shù)添加到 Python 代碼中
為了更深入的理解微積分原理和反向傳播中的鏈?zhǔn)角髮?dǎo)法則,我強(qiáng)烈推薦 3Blue1Brown 的如下教程:
Youtube:
整合并完成一個(gè)實(shí)例
既然我們已經(jīng)有了包括前向傳播和反向傳播的完整 Python 代碼,那么就將其應(yīng)用到一個(gè)例子上看看它是如何工作的吧。
神經(jīng)網(wǎng)絡(luò)可以通過學(xué)習(xí)得到函數(shù)的權(quán)重。而我們僅靠觀察是不太可能得到函數(shù)的權(quán)重的。
讓我們訓(xùn)練神經(jīng)網(wǎng)絡(luò)進(jìn)行 1500 次迭代,看看會(huì)發(fā)生什么。 注意觀察下面每次迭代的損失函數(shù),我們可以清楚地看到損失函數(shù)單調(diào)遞減到最小值。這與我們之前介紹的梯度下降法一致。
讓我們看看經(jīng)過 1500 次迭代后的神經(jīng)網(wǎng)絡(luò)的最終預(yù)測(cè)結(jié)果:
經(jīng)過 1500 次迭代訓(xùn)練后的預(yù)測(cè)結(jié)果
我們成功了!我們應(yīng)用前向和方向傳播算法成功的訓(xùn)練了神經(jīng)網(wǎng)絡(luò)并且預(yù)測(cè)結(jié)果收斂于真實(shí)值。
注意預(yù)測(cè)值和真實(shí)值之間存在細(xì)微的誤差是允許的。這樣可以防止模型過擬合并且使得神經(jīng)網(wǎng)絡(luò)對(duì)于未知數(shù)據(jù)有著更強(qiáng)的泛化能力。
下一步是什么?
幸運(yùn)的是我們的學(xué)習(xí)之旅還沒有結(jié)束,仍然有很多關(guān)于神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)的內(nèi)容需要學(xué)習(xí)。例如:
? 除了 Sigmoid 以外,還可以用哪些激活函數(shù)
? 在訓(xùn)練網(wǎng)絡(luò)的時(shí)候應(yīng)用學(xué)習(xí)率
? 在面對(duì)圖像分類任務(wù)的時(shí)候使用卷積神經(jīng)網(wǎng)絡(luò)
我很快會(huì)寫更多關(guān)于這個(gè)主題的內(nèi)容,敬請(qǐng)期待!
最后的想法
我自己也從零開始寫了很多神經(jīng)網(wǎng)絡(luò)的代碼
雖然可以使用諸如 Tensorflow 和 Keras 這樣的深度學(xué)習(xí)框架方便的搭建深層網(wǎng)絡(luò)而不需要完全理解其內(nèi)部工作原理。但是我覺得對(duì)于有追求的數(shù)據(jù)科學(xué)家來說,理解內(nèi)部原理是非常有益的。
這種練習(xí)對(duì)我自己來說已成成為重要的時(shí)間投入,希望也能對(duì)你有所幫助
用keras框架較為方便
首先安裝anaconda,然后通過pip安裝keras
1、#導(dǎo)入各種用到的模塊組件
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
2、。#打亂數(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個(gè)類別,keras要求格式為binary class matrices,轉(zhuǎn)化一下,直接調(diào)用keras提供的這個(gè)函數(shù)
label = np_utils.to_categorical(label, 10)
###############
#開始建立CNN模型
###############
#生成一個(gè)model
model = Sequential()
3、#第一個(gè)卷積層,4個(gè)卷積核,每個(gè)卷積核大小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'))
#第二個(gè)卷積層,8個(gè)卷積核,每個(gè)卷積核大小3*3。4表示輸入的特征圖個(gè)數(shù),等于上一層的卷積核個(gè)數(shù)
4、全連接層,先將前一層輸出的二維特征圖flatten為一維的。
#Dense就是隱藏層。16就是上一層輸出的特征圖個(gè)數(shù)。4是根據(jù)每個(gè)卷積層計(jì)算出來的:(28-5+1)得到24,(24-3+1)/2得到11,(11-3+1)/2得到4
#全連接有128個(gè)神經(jīng)元節(jié)點(diǎn),初始化方式為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'))
#############
#開始訓(xùn)練模型
##############
#使用SGD + momentum
#model.compile里的參數(shù)loss就是損失函數(shù)(目標(biāo)函數(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方法,就是一個(gè)訓(xùn)練過程. 訓(xùn)練的epoch數(shù)設(shè)為10,batch_size為100.
#數(shù)據(jù)經(jīng)過隨機(jī)打亂shuffle=True。verbose=1,訓(xùn)練過程中輸出的信息,0、1、2三種方式都可以,無關(guān)緊要。show_accuracy=True,訓(xùn)練時(shí)每一個(gè)epoch都輸出accuracy。
#validation_split=0.2,將20%的數(shù)據(jù)作為驗(yàn)證集。
model.fit(data, label, batch_size=100, nb_epoch=10,shuffle=True,verbose=1,validation_split=0.2)
"""
#使用data augmentation的方法
#一些參數(shù)和調(diào)用的方法,請(qǐng)看文檔
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)] )
集成學(xué)習(xí): 構(gòu)建并結(jié)合多個(gè)學(xué)習(xí)器來完成學(xué)習(xí)任務(wù)。
同質(zhì): 集成中只包含同種類型的個(gè)體學(xué)習(xí)器(基學(xué)習(xí)器);
異質(zhì): 集成中的個(gè)體學(xué)習(xí)器(組件學(xué)習(xí)器)由不同學(xué)習(xí)算法生成。
個(gè)體學(xué)習(xí)器的“準(zhǔn)確性”和“多樣性”很重要,且相互沖突。
分類: 個(gè)體學(xué)習(xí)器間存在強(qiáng)依賴關(guān)系,必須串行生成的序列化方法,eg,Boosting;個(gè)體學(xué)習(xí)器間不存在強(qiáng)依賴關(guān)系,可同時(shí)生成的并行化方法,eg,Bagging和隨機(jī)森林。
工作機(jī)制: 先從初始訓(xùn)練集訓(xùn)練出一個(gè)基學(xué)習(xí)器1,根據(jù)基學(xué)習(xí)器誤差率表現(xiàn)更新訓(xùn)練樣本權(quán)重,使弱學(xué)習(xí)器1學(xué)習(xí)誤差率高的訓(xùn)練樣本權(quán)重變高,讓這些點(diǎn)在弱學(xué)習(xí)器2中得到更多的重視,然后基于調(diào)整權(quán)重后的訓(xùn)練集訓(xùn)練學(xué)習(xí)器2,...重復(fù)進(jìn)行,直至弱學(xué)習(xí)器數(shù)目達(dá)到指定的值T,最終將這T個(gè)基學(xué)習(xí)器進(jìn)行加權(quán)結(jié)合。
Boosting族算法最著名的代表是AdaBoost,是“Adaptive Boosting(自適應(yīng)增強(qiáng))”的縮寫。它的自適應(yīng)在于:前一個(gè)基本分類器分錯(cuò)的樣本會(huì)得到加強(qiáng),加權(quán)后的全體樣本再次被用來訓(xùn)練下一個(gè)基本分類器。同時(shí),在每一輪中加入一個(gè)新的弱分類器,直到達(dá)到某個(gè)預(yù)定的足夠小的錯(cuò)誤率或達(dá)到預(yù)先指定的最大迭代次數(shù)。
算法過程
優(yōu)點(diǎn):作為分類器時(shí)精度很高;在AdaBoost框架下,可使用各種回歸分類模型來構(gòu)建學(xué)習(xí)器;不易發(fā)生過擬合(會(huì)加入正則化項(xiàng))。
缺點(diǎn):對(duì)異常樣本點(diǎn)敏感,異常樣本在迭代中可能會(huì)獲得較高的權(quán)重,影響最終的強(qiáng)學(xué)習(xí)器的預(yù)測(cè)準(zhǔn)確性。
兩者均是0/1誤差的平滑近似:
梯度提升算法首先給定一個(gè)目標(biāo)損失函數(shù),它的定義域是所有可行的基函數(shù)集合,提升算法通過迭代的選擇一個(gè)負(fù)梯度方向上的基函數(shù)來逐漸逼近局部最小值。
GB每一次建立模型 是在之前建立模型 損失函數(shù)的梯度下降方向。一般認(rèn)為損失函數(shù)越小,性能越好,因此最好是使損失函數(shù)沿著梯度方向下降,模型得以不斷改進(jìn)提升性能。
GBDT是GB和DT的結(jié)合,是以決策樹為基學(xué)習(xí)器的gb算法,此處的決策樹是回歸樹。GBDT中的決策樹深度一般不超過5,葉子結(jié)點(diǎn)數(shù)不超過10。GBDT核心在于: 每一棵樹學(xué)得是之前所有樹結(jié)論和的殘差 ,這個(gè)殘差就是一個(gè)加預(yù)測(cè)值后能得真實(shí)值的累加量。比如A的真實(shí)年齡是18歲,但第一棵樹的預(yù)測(cè)年齡是12歲,差了6歲,即殘差為6歲。那么在第二棵樹里我們把A的年齡設(shè)為6歲去學(xué)習(xí),如果第二棵樹真的能把A分到6歲的葉子節(jié)點(diǎn),那累加兩棵樹的結(jié)論就是A的真實(shí)年齡;如果第二棵樹的結(jié)論是5歲,則A仍然存在1歲的殘差,第三棵樹里A的年齡就變成1歲,繼續(xù)學(xué)習(xí)。
xgboost是在GBDT基本思路上改善而來,主要改變有
1) 在損失函數(shù)中加入防止過擬合的懲罰函數(shù)
T是葉子的個(gè)數(shù),w是預(yù)測(cè)函數(shù)的參數(shù),也就是決策樹算法下葉子節(jié)點(diǎn)的權(quán)重值??梢钥刂痞煤挺诉@兩個(gè)超參數(shù)來調(diào)整正則化的懲罰力度。其實(shí)這里的懲罰函數(shù)也就定義了模型復(fù)雜度,比如γ越大,λ越大,復(fù)雜度越小越不易過擬合。
2) 用二階泰勒展式將損失函數(shù)展開,同時(shí)用到了一階和二階導(dǎo)數(shù)
第t次的loss:
對(duì)上式做二階泰勒展開:g為一階導(dǎo)數(shù),h為二階導(dǎo)數(shù)
3)CART回歸樹中尋找最佳分割點(diǎn)的衡量標(biāo)準(zhǔn)是最小化均方差,xgboost 尋找分割點(diǎn)的標(biāo)準(zhǔn)是最大化 ,lamda,gama與正則化項(xiàng)相關(guān)
xgboost算法的步驟和GB基本相同,都是首先初始化為一個(gè)常數(shù),gb是根據(jù)一階導(dǎo)數(shù)ri,xgboost是根據(jù)一階導(dǎo)數(shù)gi和二階導(dǎo)數(shù)hi,迭代生成基學(xué)習(xí)器,相加更新學(xué)習(xí)器。
為得到泛化性能強(qiáng)的集成,集成中的個(gè)體學(xué)習(xí)器應(yīng)盡可能相互獨(dú)立,考慮使用相互有交疊的采樣子集。
并行式集成學(xué)習(xí)的最著名代表,基于自助采樣法,算法流程如下:
優(yōu)點(diǎn):訓(xùn)練一個(gè)Bagging集成與直接使用基學(xué)習(xí)算法訓(xùn)練一個(gè)學(xué)習(xí)器的復(fù)雜度同階;與標(biāo)準(zhǔn)AdaBoost只適用于二分類任務(wù)不同,Bagging能不經(jīng)修改的用于多分類、回歸任務(wù);初始訓(xùn)練集63.2%用于訓(xùn)練,36.8%用作驗(yàn)證集對(duì)泛化性能做“包外估計(jì)”。
但從偏差-方差分解角度看,Bagging主要關(guān)注降低方差。
隨機(jī)森林是Bagging的一個(gè)擴(kuò)展變體,在以決策樹為基學(xué)習(xí)器構(gòu)建Bagging集成的基礎(chǔ)上,在決策樹訓(xùn)練過程中引入了 隨機(jī)屬性選擇 。即對(duì)基決策樹的每個(gè)結(jié)點(diǎn),先從該結(jié)點(diǎn)的屬性集合中隨機(jī)選擇一個(gè)包含k(kd,d為所有屬性個(gè)數(shù))個(gè)屬性的子集,然后從中選一個(gè)最優(yōu)屬性用于劃分。若k=d,則為傳統(tǒng)決策樹;k=1,則隨機(jī)選擇一個(gè)屬性劃分。一般推薦 。
RF起始性能相對(duì)較差,但隨著學(xué)習(xí)器數(shù)目的增加,會(huì)收斂到更低的泛化誤差。另外RF的訓(xùn)練效率常優(yōu)于Bagging,因?yàn)锽agging使用“確定型”決策樹,選擇劃分屬性時(shí)要對(duì)結(jié)點(diǎn)所有屬性進(jìn)行考察,而RF使用“隨機(jī)型”決策樹,只需考慮一個(gè)屬性子集。
學(xué)習(xí)器結(jié)合可能會(huì)從三個(gè)方面帶來好處:
1)統(tǒng)計(jì)方面:當(dāng)多個(gè)假設(shè)達(dá)到同等性能時(shí),可減小因誤選單學(xué)習(xí)器導(dǎo)致泛化性能不佳的風(fēng)險(xiǎn);
2)計(jì)算方面:降低陷入糟糕局部極小點(diǎn)的風(fēng)險(xiǎn);
3)表示方面:擴(kuò)大相應(yīng)假設(shè)空間,學(xué)習(xí)更好的近似。
對(duì)數(shù)值型輸出 ,最常見的結(jié)合策略是平均法。
簡(jiǎn)單平均: ? ? ? ? ? ? ? ? ? ?
(特殊的加權(quán)平均法,宜在個(gè)體學(xué)習(xí)器性能相近時(shí)使用)
加權(quán)平均法: ? ? ? ? ? ? ? ?
其中 是個(gè)體學(xué)習(xí)器 的權(quán)重,一般從訓(xùn)練數(shù)據(jù)中學(xué)習(xí)而得,通常要求 ,宜在個(gè)體學(xué)習(xí)器相差較大時(shí)使用。
對(duì)分類任務(wù),學(xué)習(xí)器從類別標(biāo)記集合中預(yù)測(cè)出一個(gè)標(biāo)記,最常見的結(jié)合策略是投票法。
絕大多數(shù)投票法:
相對(duì)多數(shù)投票法:
? ? ? ? ? ? ? ? ? ? ? ? ?
預(yù)測(cè)為得票最多的標(biāo)記,若同時(shí)有多個(gè)標(biāo)記獲得最高票,則從中隨機(jī)選取一個(gè)。
加權(quán)投票法:
? ? ? ? ? ? ? ? ? ? ?
與加權(quán)平均法類似, 是 的權(quán)重,通常 。
個(gè)體學(xué)習(xí)器的輸出類型:
類標(biāo)記: 硬投票。 ,若 將樣本x預(yù)測(cè)為類別 則取值為1,否則為0。
類概率: 軟投票。 ,相當(dāng)于對(duì)后驗(yàn)概率 的一個(gè)估計(jì)。
不同類型的 值不能混用;對(duì)一些能在預(yù)測(cè)出類別標(biāo)記的同時(shí)產(chǎn)生分類置信度的學(xué)習(xí)器,其分類置信度可轉(zhuǎn)化為類概率使用;分類置信度應(yīng)規(guī)范化后使用;基于類概率進(jìn)行結(jié)合優(yōu)于直接基于類標(biāo)記進(jìn)行結(jié)合;若基學(xué)習(xí)器類型不同,不能直接比較類概率值,應(yīng)先將其轉(zhuǎn)化為類標(biāo)記輸出(eg類概率輸出最大的設(shè)為1,其他為0)再投票。
當(dāng)訓(xùn)練數(shù)據(jù)很多時(shí),常使用通過另一個(gè)學(xué)習(xí)器來進(jìn)行結(jié)合的“學(xué)習(xí)法”,代表算法Stacking
第一階段獲得各個(gè)模型對(duì)樣本x1的預(yù)測(cè)標(biāo)簽值;第二階段將各個(gè)模型的預(yù)測(cè)標(biāo)簽值作為一個(gè)新的特征(x1的真實(shí)標(biāo)簽值還是標(biāo)簽值),再用某個(gè)算法進(jìn)行訓(xùn)練,獲得一個(gè)融合模型,用這個(gè)融合模型進(jìn)行測(cè)試集的預(yù)測(cè)。
周志華《機(jī)器學(xué)習(xí)》
正則化(Regularization)
機(jī)器學(xué)習(xí)中幾乎都可以看到損失函數(shù)后面會(huì)添加一個(gè)額外項(xiàng),常用的額外項(xiàng)一般有兩種,一般英文稱作 ?1-norm 和 ?2-norm ,中文稱作 L1正則化 和 L2正則化 ,或者 L1范數(shù) 和 L2范數(shù) 。
L1正則化和L2正則化可以看做是損失函數(shù)的懲罰項(xiàng)。所謂『懲罰』是指對(duì)損失函數(shù)中的某些參數(shù)做一些限制。對(duì)于線性回歸模型,使用L1正則化的模型建叫做Lasso回歸,使用L2正則化的模型叫做Ridge回歸(嶺回歸)。下圖是Python中Lasso回歸的損失函數(shù),式中加號(hào)后面一項(xiàng)α||w||1即為L(zhǎng)1正則化項(xiàng)。
下圖是Python中Ridge回歸的損失函數(shù),式中加號(hào)后面一項(xiàng)α||w||22即為L(zhǎng)2正則化項(xiàng)。
一般回歸分析中回歸w表示特征的系數(shù),從上式可以看到正則化項(xiàng)是對(duì)系數(shù)做了處理(限制)。 L1正則化和L2正則化的說明如下:
L1正則化是指權(quán)值向量w中各個(gè)元素的 絕對(duì)值之和 ,通常表示為||w||1
L2正則化是指權(quán)值向量w中各個(gè)元素的 平方和然后再求平方根 (可以看到Ridge回歸的L2正則化項(xiàng)有平方符號(hào)),通常表示為||w||2
一般都會(huì)在正則化項(xiàng)之前添加一個(gè)系數(shù),Python中用α表示,一些文章也用λ表示。這個(gè)系數(shù)需要用戶指定。
那添加L1和L2正則化有什么用? 下面是L1正則化和L2正則化的作用 ,這些表述可以在很多文章中找到。
L1正則化可以產(chǎn)生稀疏權(quán)值矩陣,即產(chǎn)生一個(gè)稀疏模型,可以用于特征選擇
L2正則化可以防止模型過擬合(overfitting);一定程度上,L1也可以防止過擬合
稀疏模型與特征選擇
上面提到L1正則化有助于生成一個(gè)稀疏權(quán)值矩陣,進(jìn)而可以用于特征選擇。為什么要生成一個(gè)稀疏矩陣?
稀疏矩陣指的是很多元素為0,只有少數(shù)元素是非零值的矩陣,即得到的線性回歸模型的大部分系數(shù)都是0.
通常機(jī)器學(xué)習(xí)中特征數(shù)量很多,例如文本處理時(shí),如果將一個(gè)詞組(term)作為一個(gè)特征,那么特征數(shù)量會(huì)達(dá)到上萬個(gè)(bigram)。在預(yù)測(cè)或分類時(shí),那么多特征顯然難以選擇,但是如果代入這些特征得到的模型是一個(gè)稀疏模型,表示只有少數(shù)特征對(duì)這個(gè)模型有貢獻(xiàn),絕大部分特征是沒有貢獻(xiàn)的,或者貢獻(xiàn)微?。ㄒ?yàn)樗鼈兦懊娴南禂?shù)是0或者是很小的值,即使去掉對(duì)模型也沒有什么影響),此時(shí)我們就可以只關(guān)注系數(shù)是非零值的特征。這就是稀疏模型與特征選擇的關(guān)系。
L1和L2正則化的直觀理解
這部分內(nèi)容將解釋 為什么L1正則化可以產(chǎn)生稀疏模型(L1是怎么讓系數(shù)等于零的) ,以及 為什么L2正則化可以防止過擬合 。
L1正則化和特征選擇
假設(shè)有如下帶L1正則化的損失函數(shù):
J=J0+α∑w|w|(1)
其中J0是原始的損失函數(shù),加號(hào)后面的一項(xiàng)是L1正則化項(xiàng),α是正則化系數(shù)。注意到L1正則化是權(quán)值的 絕對(duì)值之和 ,J是帶有絕對(duì)值符號(hào)的函數(shù),因此J是不完全可微的。機(jī)器學(xué)習(xí)的任務(wù)就是要通過一些方法(比如梯度下降)求出損失函數(shù)的最小值。當(dāng)我們?cè)谠紦p失函數(shù)J0后添加L1正則化項(xiàng)時(shí),相當(dāng)于對(duì)J0做了一個(gè)約束。令L=α∑w|w|,則J=J0+L,此時(shí)我們的任務(wù)變成 在L約束下求出J0取最小值的解 。考慮二維的情況,即只有兩個(gè)權(quán)值w1和w2,此時(shí)L=|w1|+|w2|對(duì)于梯度下降法,求解J0的過程可以畫出等值線,同時(shí)L1正則化的函數(shù)L也可以在w1w2的二維平面上畫出來。如下圖:
圖1? L1正則化
圖中等值線是J0的等值線,黑色方形是L函數(shù)的圖形。在圖中,當(dāng)J0等值線與L圖形首次相交的地方就是最優(yōu)解。上圖中J0與L在L的一個(gè)頂點(diǎn)處相交,這個(gè)頂點(diǎn)就是最優(yōu)解。注意到這個(gè)頂點(diǎn)的值是(w1,w2)=(0,w)??梢灾庇^想象,因?yàn)長(zhǎng)函數(shù)有很多『突出的角』(二維情況下四個(gè),多維情況下更多),J0與這些角接觸的機(jī)率會(huì)遠(yuǎn)大于與L其它部位接觸的機(jī)率,而在這些角上,會(huì)有很多權(quán)值等于0,這就是為什么L1正則化可以產(chǎn)生稀疏模型,進(jìn)而可以用于特征選擇。
而正則化前面的系數(shù)α,可以控制L圖形的大小。α越小,L的圖形越大(上圖中的黑色方框);α越大,L的圖形就越小,可以小到黑色方框只超出原點(diǎn)范圍一點(diǎn)點(diǎn),這是最優(yōu)點(diǎn)的值(w1,w2)=(0,w)中的w可以取到很小的值。
類似,假設(shè)有如下帶L2正則化的損失函數(shù):
J=J0+α∑ww2(2)
同樣可以畫出他們?cè)诙S平面上的圖形,如下:
圖2? L2正則化
二維平面下L2正則化的函數(shù)圖形是個(gè)圓,與方形相比,被磨去了棱角。因此J0與L相交時(shí)使得w1或w2等于零的機(jī)率小了許多,這就是為什么L2正則化不具有稀疏性的原因。
L2正則化和過擬合
擬合過程中通常都傾向于讓權(quán)值盡可能小,最后構(gòu)造一個(gè)所有參數(shù)都比較小的模型。因?yàn)橐话阏J(rèn)為參數(shù)值小的模型比較簡(jiǎn)單,能適應(yīng)不同的數(shù)據(jù)集,也在一定程度上避免了過擬合現(xiàn)象??梢栽O(shè)想一下對(duì)于一個(gè)線性回歸方程,若參數(shù)很大,那么只要數(shù)據(jù)偏移一點(diǎn)點(diǎn),就會(huì)對(duì)結(jié)果造成很大的影響;但如果參數(shù)足夠小,數(shù)據(jù)偏移得多一點(diǎn)也不會(huì)對(duì)結(jié)果造成什么影響,專業(yè)一點(diǎn)的說法是『抗擾動(dòng)能力強(qiáng)』。
那為什么L2正則化可以獲得值很小的參數(shù)?
以線性回歸中的梯度下降法為例。假設(shè)要求的參數(shù)為θ,hθ(x)是我們的假設(shè)函數(shù),那么線性回歸的代價(jià)函數(shù)如下:
J(θ)=12m∑i=1m(hθ(x(i))?y(i))(3)
那么在梯度下降法中,最終用于迭代計(jì)算參數(shù)θ的迭代式為:
θj:=θj?α1m∑i=1m(hθ(x(i))?y(i))x(i)j(4)
其中α是learning rate. 上式是沒有添加L2正則化項(xiàng)的迭代公式,如果在原始代價(jià)函數(shù)之后添加L2正則化,則迭代公式會(huì)變成下面的樣子:
θj:=θj(1?αλm)?α1m∑i=1m(hθ(x(i))?y(i))x(i)j(5)
其中 λ就是正則化參數(shù) 。從上式可以看到,與未添加L2正則化的迭代公式相比,每一次迭代,θj都要先乘以一個(gè)小于1的因子,從而使得θj不斷減小,因此總得來看,θ是不斷減小的。
最開始也提到L1正則化一定程度上也可以防止過擬合。之前做了解釋,當(dāng)L1的正則化系數(shù)很小時(shí),得到的最優(yōu)解會(huì)很小,可以達(dá)到和L2正則化類似的效果。
正則化參數(shù)的選擇
L1正則化參數(shù)
通常越大的λ可以讓代價(jià)函數(shù)在參數(shù)為0時(shí)取到最小值。下面是一個(gè)簡(jiǎn)單的例子,這個(gè)例子來自 Quora上的問答 。為了方便敘述,一些符號(hào)跟這篇帖子的符號(hào)保持一致。
假設(shè)有如下帶L1正則化項(xiàng)的代價(jià)函數(shù):
F(x)=f(x)+λ||x||1
其中x是要估計(jì)的參數(shù),相當(dāng)于上文中提到的w以及θ. 注意到L1正則化在某些位置是不可導(dǎo)的,當(dāng)λ足夠大時(shí)可以使得F(x)在x=0時(shí)取到最小值。如下圖:
圖3 L1正則化參數(shù)的選擇
分別取λ=0.5和λ=2,可以看到越大的λ越容易使F(x)在x=0時(shí)取到最小值。
L2正則化參數(shù)
從公式5可以看到,λ越大,θj衰減得越快。另一個(gè)理解可以參考圖2,λ越大,L2圓的半徑越小,最后求得代價(jià)函數(shù)最值時(shí)各參數(shù)也會(huì)變得很小。
Reference
過擬合的解釋:
正則化的解釋:
正則化的解釋:
正則化的數(shù)學(xué)解釋(一些圖來源于這里):
原文參考:blog.csdn.net/jinping_shi/article/details/52433975
文章題目:python中損失函數(shù)的簡(jiǎn)單介紹
標(biāo)題網(wǎng)址:http://sd-ha.com/article0/hoogoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、品牌網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、動(dòng)態(tài)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)