一颅夺、前言
本文主要分為 3 周分別了講解其中視頻講到的難重點(diǎn),第一周分為 2 個(gè)重要的部分:正則化和梯度檢驗(yàn)蛹稍。筆者將自己在學(xué)習(xí)過程中的不理解的地方記錄下倆吧黄,希望能夠幫助到各位讀者,也希望文章有錯(cuò)漏的地方稳摄,還請各位讀者海涵指正稚字。
二、第一周——深度學(xué)習(xí)的使用方法
2.1 模型性能判斷方法
還記得在西瓜書的第一章中厦酬,周志華老師就講了可以使用測試集的性能來評估模型的預(yù)測性能胆描,同時(shí)也說了模型的誤差可以被分解為 偏差、方差仗阅、噪聲這 3 個(gè)元素昌讲。
假設(shè)有訓(xùn)練集誤差 E1
和 驗(yàn)證集E2
,那么通常的判斷方法有 2 個(gè):
- 高方差:E1低减噪、E2高
- 高偏差:E1高短绸、E2更高
PS:其實(shí)這里推薦大家去看吳恩達(dá)的機(jī)器學(xué)習(xí)公開課,那里對偏方差的講解更好一點(diǎn)
那么如何解決因?yàn)檫@ 2 個(gè)結(jié)果帶來的影響呢筹裕? - 偏差:查看訓(xùn)練集的性能醋闭,如果此時(shí)偏差高一般選擇新的網(wǎng)絡(luò)
- 方差:查看驗(yàn)證集的性能,如果此時(shí)方差偏高可以通過增加訓(xùn)練數(shù)據(jù)或者正則化來降低
2.2 正則化
2.2.1 正則化基礎(chǔ)
上面說到正則化可以降低方差朝卒,那么這一節(jié)來講講正則化证逻。
我們一般會(huì)在損失函數(shù)中加入正則化項(xiàng),一般的正則化項(xiàng)有 L1范數(shù)
和 L2范數(shù)
抗斤,其實(shí)分別對應(yīng)的就是曼哈頓距離和歐式距離囚企,讀者自行百度就明白這 2 個(gè)范數(shù)的計(jì)算方式和表達(dá)方式了
假設(shè)我們使用歐式距離來作為正則化,那么損失函數(shù)可以就是:
其中瑞眼,是正則化參數(shù)龙宏,是矩陣 W 的L2范數(shù),作者這里說不加上 b 的原因是因?yàn)?b 的影響很小伤疙,可加可不加银酗。
在神經(jīng)網(wǎng)絡(luò)中的損失函數(shù)中通過包含了第 1 層的到第 l 層的,參數(shù)同理徒像,因?yàn)閾p失函數(shù)是以矩陣為單位來計(jì)算的花吟,那么如果正則化項(xiàng)使用矩陣來表示的話是如下所示:
其中我們稱為范數(shù)平方,被定義為矩陣中所有元素的平方和厨姚。
而矩陣的維度通常是(, )衅澈,這里對 n 定義不明的同學(xué)請看前面的文章,我們使用弗羅貝尼烏斯范數(shù)
來稱呼矩陣的范數(shù)平方谬墙,并用下標(biāo)著名今布,關(guān)于弗羅貝尼烏斯范數(shù)
可在參數(shù)小節(jié)中查閱
如果我們使用的是L2范數(shù)正則化,那么我們可以推導(dǎo)出一個(gè)L2正則化后的梯度公式拭抬。
首先我們在不加正則化項(xiàng)前提下部默,計(jì)算出的對導(dǎo)數(shù)成為,那么增加了正則化項(xiàng)的導(dǎo)數(shù)我們表示為造虎,那么有如下式子:
最后有可得到
從上式可以明顯看得出灶泵,使用了正則化之后的梯度公式比原來多了系數(shù),該系數(shù)小于 1犬金,也就是先讓矩陣W縮小在去減去梯度,所以L2正則化也叫權(quán)重衰減
這里我們知道了如何進(jìn)行L2正則化犁功,但是從代碼上看是怎么進(jìn)行的呢?因?yàn)槲覀兺瞥龅墓綗o法直接用于代碼婚夫,下面舉個(gè)例子說明
比如我們在要計(jì)算第 3 層浸卦,那么第三層的正則化項(xiàng)是,那么在計(jì)算時(shí)我們就需要在等式后面加上
我們一般在驗(yàn)證集調(diào)試超參
2.2.1 正則化原理
我們可以直觀的理解案糙,當(dāng)設(shè)置得足夠大的時(shí)候限嫌,可以將矩陣W 衰減到足夠小,假設(shè)此時(shí)使用的是tanh激活函數(shù)
时捌,那么因?yàn)閃矩陣很小怒医,所以輸出Z也很小。由tanh函數(shù)
的性質(zhì)可知奢讨,如果輸入是數(shù)值在很小的時(shí)候稚叹,相當(dāng)于線性函數(shù)。而此時(shí) Z 很小禽笑,那么此時(shí)激活函數(shù)相當(dāng)于線性函數(shù)入录,多個(gè)線性函數(shù)疊加還是線性函數(shù),所以此時(shí)模型擬合接近線性函數(shù)佳镜。
當(dāng)模型在過擬合和線性函數(shù)之間存在一個(gè)適當(dāng)?shù)木仃嘩使之?dāng)M合程度最為適合僚稿,所以這就可以正則化其效果的原理
2.2.2 dropout隨機(jī)失活
dropout是一種類似正則化的手段,但它并不是通過增加正則項(xiàng)蟀伸,而是通過其他的方法來使模型達(dá)到正則化的效果蚀同。
為了說明其步驟,視頻中以某個(gè)神經(jīng)網(wǎng)絡(luò)的第 3 層為例子啊掏。
在每一輪的前向計(jì)算中蠢络,我們對每一層的生成一個(gè)隨機(jī)矩陣,第 3 層我們假設(shè)隨機(jī)生成了一個(gè)矩陣
d3 = np.random.rand(a3.shape[0], a3.shape[1])
該矩陣是一個(gè)只有 0 和 1 的矩陣迟蜜,其中矩陣元素為 1 的概率是0.8刹孔, 為 0 的概率是 0.2,為超參 keep-porb 控制娜睛,那么在這里 keep-porb 等于 0.8
通過 d3 * a3髓霞,我們可以消去一些神經(jīng)網(wǎng)絡(luò)節(jié)點(diǎn)的輸出,從而使得網(wǎng)絡(luò)更加精簡畦戒,從結(jié)論上看方库,假設(shè)為 1 的概率是0.8,那么相乘只有 a3也是原來的0.8倍障斋,即 d3 * a3 可以看做是 0.8a3纵潦,為了消除對下一層的影響徐鹤,我們需要繼續(xù)使用 a3 /= 0.8(這里是0.8是keep-porb )
下層是z4 = w4 * a3 + b4,為了不影響 z4的期望值邀层,即不想影響該層次的梯度下降返敬,所以需要還原a3的值,不要讓第三層加入dropout后影響該層的梯度
那么問題來了被济,剛剛說的是前向傳播如何使用dropout救赐,那么在后向傳播dropout又該如何處理涧团,其實(shí)是一樣只磷,我們只需要使用在前向傳播中生成的隨機(jī)二值矩陣來乘即可,然后再讓
筆者在做作業(yè)的過程中發(fā)現(xiàn)如果按照給的keep-prob訓(xùn)練出來的模型準(zhǔn)確率只有70%多泌绣,但在調(diào)整keep-prob在0.5以下的時(shí)候真確率提高到了90%钮追,這可謂讓筆者體驗(yàn)到了調(diào)參的重要性
要注意的是。在測試時(shí)不使用dropout阿迈。因?yàn)槲覀儾黄谕敵龅慕Y(jié)果是隨機(jī)元媚,如果輸出結(jié)果不是隨機(jī)的,那么就不會(huì)影響預(yù)測苗沧。我們在前面 a3 /= 0.8是確保在測試時(shí)不執(zhí)行dropout也能讓激活函數(shù)的期望輸出在不會(huì)發(fā)生變化刊棕,這樣就不用在測試階段添加額外的參數(shù),這段話是視頻中給出的待逞,但比較晦澀
這里筆者說一下自己的通俗理解:筆者參考中《理解dropout》的說法甥角,理解的dropout是讓模型在訓(xùn)練時(shí)擺脫各個(gè)神經(jīng)元之間的依賴性,不讓模型的某個(gè)神經(jīng)元只在特定的特征下起作用识樱,這樣就可以讓每一個(gè)神經(jīng)元都能夠在所有的特征下都能起作用嗤无。那么這樣的話,我們?nèi)绻?xùn)練時(shí)加入了dropout怜庸,則無法體現(xiàn)出dropout的結(jié)果当犯,因?yàn)闇y試時(shí)輸出的跟訓(xùn)練時(shí)輸出的一樣
2.2.3 其他正則化方法
2.2.3.1 數(shù)據(jù)擴(kuò)增
1、將圖片水平翻轉(zhuǎn)并加入訓(xùn)練集
2割疾、隨意縮放和裁剪圖像并加入訓(xùn)練集
2.2.3.2 提前停止
在驗(yàn)證集是畫出損失函數(shù)的下降圖形嚎卫,橫軸是迭代次數(shù),縱軸是損失函數(shù)宏榕,對訓(xùn)練集和驗(yàn)證集都畫出圖像拓诸,通常驗(yàn)證集是先降后升,我們可以在降到最低點(diǎn)時(shí)停止訓(xùn)練担扑,此時(shí)獲得一組參數(shù)W恰响。但提前停止有缺點(diǎn)就是無法進(jìn)行正交化
,正交化在后面會(huì)講解到
2.3 歸一化輸入
我們先看看歸一化輸入的執(zhí)行過程涌献,我們知道執(zhí)行過程后比較容易理解歸一化的原理及作用
2.3.1 步驟
歸一化輸入的步驟有 2 個(gè)胚宦,設(shè)我們數(shù)據(jù)集如下
-
零均值化
第一步是對數(shù)據(jù)集進(jìn)行零均值化,設(shè)有參數(shù)
接著我們對每一個(gè)訓(xùn)練數(shù)據(jù)進(jìn)行減去該參數(shù),即
其實(shí)就相當(dāng)于移動(dòng)數(shù)據(jù)集枢劝,使他們的均值為 0 井联,也就是如下圖
歸一化方差
第二部就是歸一化方差,設(shè)有參數(shù)
我們上面已經(jīng)完成了零均值化您旁,那么可以得到如下
從上式可知烙常,是方差,然后我們讓每一個(gè)數(shù)據(jù)都除以鹤盒,得到:
需要注意蚕脏,如果用來調(diào)整訓(xùn)練數(shù)據(jù),那么用相同的 μ 和 σ^2來歸一化測試集侦锯。當(dāng)然歸一化測試集使用的參數(shù)和都是從訓(xùn)練集得來的
2.3.2 原理
在不歸一化數(shù)據(jù)的情況下驼鞭,如果特征的范圍是在[0, 1],而特征在[0, 1000]尺碰。那么訓(xùn)練出來的和的數(shù)量級(jí)就會(huì)相差非常遠(yuǎn)挣棕,從而看起來是類似的一個(gè)圖形,圖中的b和w應(yīng)該分別是和
這樣的話亲桥,如果我們學(xué)習(xí)率確定得不對洛心,對模型的訓(xùn)練完全沒有好處,比如有可能引起振蕩之類的情況题篷。
如果我們歸一化數(shù)據(jù)集后可以得到如下的圖像
無論在哪個(gè)點(diǎn)词身,只要我們設(shè)置的學(xué)習(xí)率不太奇怪,我們總能夠找到最優(yōu)點(diǎn)
2.4 梯度
這一節(jié)將的是梯度悼凑,梯度如果在訓(xùn)練不好的情況下虎發(fā)生梯度消失和梯度爆炸偿枕,如果不理解這 2 個(gè)概念可以參考鏈接《梯度消失和梯度爆炸》
這里簡單說下引起梯度爆炸的 2 個(gè)原因
2.4.1 解決方法
初始化權(quán)值過大容易引起梯度爆炸,過小會(huì)引起梯度消失户辫。
一般的渐夸,我們有公式如下:
當(dāng)n越多時(shí),也就是特征越多時(shí)渔欢,希望w越小
可以這樣初始化墓塌,第 i 層一般有 個(gè)輸入,我們可以用這樣來初始化 W矩陣
WL = np.random.randn(shape) *
不同的激活函數(shù)有不同的初始化方法奥额,對于tanh就有其他初始化公式 苫幢,比如Xavier初始化
如果是ReLu,設(shè)置為 效果更好垫挨。此時(shí)也叫HE初始化
這2個(gè)初始化的作用十分明顯韩肝,筆者目前上了尚未理解,后面理解了再來講述
我們這里的隨機(jī)分布一般使用的是高斯分布
當(dāng)然了九榔,
2.4.2 梯度檢驗(yàn)
梯度檢驗(yàn)是為了確保后向傳播的計(jì)算是正確的哀峻,保證我們的參數(shù)能夠完成優(yōu)化 涡相。
在講梯度檢驗(yàn)之前,先看看導(dǎo)數(shù)的單邊公差跟雙邊公差
- 單邊公差剩蟀,公式如下:
- 雙邊公差催蝗,公式如下:
一般雙邊公差比單邊公差更加接近梯度,在梯度檢驗(yàn)時(shí)我們使用雙邊公差
進(jìn)行梯度檢驗(yàn)時(shí)育特,我們需要將矩陣和....和 轉(zhuǎn)換為向量(視頻中沒有說到 b矩陣也需要轉(zhuǎn)換丙号,但這里必須的理解是需要轉(zhuǎn)換b矩陣的)
那么損失函數(shù)將變成
在運(yùn)算完后我們得到和...和,同樣地我們需要將這些都轉(zhuǎn)換為與同維度的向量缰冤,因?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=dW" alt="dW" mathimg="1">和的維度是一樣的犬缨,b矩陣同理。
展開可得:
視頻中沒有說明如何轉(zhuǎn)換锋谐,也沒說明的具體公式是什么遍尺。舉個(gè)例子說明一下筆者的理解:即和一起轉(zhuǎn)換成截酷,其余同理
那么對于每一個(gè)涮拗,我們?nèi)ビ?jì)算其雙邊公差:
所以計(jì)算出來的是一個(gè)向量。從前面我們已經(jīng)轉(zhuǎn)換出了迂苛,那么我們可以用L2范數(shù)的計(jì)算方式計(jì)算
加入的值小于或等于三热,那么說明梯度是正確的,加入大于這個(gè)數(shù)三幻,那么我們應(yīng)該注意梯度是否有問題就漾,當(dāng)然這里的筆者理解是一個(gè)經(jīng)驗(yàn)數(shù)值,大家可以按照各自的情況進(jìn)行判斷
使用梯度檢驗(yàn)時(shí)有一些注意事項(xiàng) :
- 訓(xùn)練時(shí)不要使用梯度檢驗(yàn)念搬,它只用于調(diào)試
- 如果算法的梯度檢驗(yàn)失敗抑堡,檢查所有項(xiàng) ,如果 2 個(gè)向量之間值相差太大朗徊,要查看哪個(gè) i 值相差最大
- 如果在梯度檢驗(yàn)的過程中使用正則化首妖,需要將正則項(xiàng)加入梯度檢驗(yàn)中
- 梯度檢驗(yàn)和dropout不能同時(shí)使用,因?yàn)閐ropuout會(huì)使代價(jià)函數(shù)很難計(jì)算爷恳,此時(shí)我們可以先將Keep-prob設(shè)置為1
- 在隨機(jī)初始化進(jìn)行梯度檢驗(yàn)有缆,再訓(xùn)練網(wǎng)絡(luò)
2.4.3 轉(zhuǎn)換方法
我們上面說過,需要將參數(shù)矩陣W和b轉(zhuǎn)換為一個(gè)一維向量温亲,但視頻中沒有提高如何轉(zhuǎn)換嗎棚壁,這里筆者從作業(yè)中看到轉(zhuǎn)換的代碼,如下
def dictionary_to_vector(parameters):
"""
Roll all our parameters dictionary into a single vector satisfying our specific required shape.
"""
keys = []
count = 0
for key in ["W1", "b1", "W2", "b2", "W3", "b3"]:
# flatten parameter
new_vector = np.reshape(parameters[key], (-1,1))
keys = keys + [key]*new_vector.shape[0]
if count == 0:
theta = new_vector
else:
theta = np.concatenate((theta, new_vector), axis=0)
count = count + 1
return theta, keys
可以很明顯地看到栈虚,只是簡單地講參數(shù)展開為一維數(shù)據(jù)然后拼接起來
2.4.4 第一周作業(yè)注意事項(xiàng)
- 關(guān)于錯(cuò)誤
因?yàn)閹觳患嫒莸脑蛐渫猓@里的作業(yè)畫圖時(shí)會(huì)出現(xiàn)錯(cuò)誤
c of shape (1, 211) not acceptable as a color sequence for x with size 211, y with size 211
解決方法參考鏈接《課后作業(yè)錯(cuò)誤解決》
- 二值化矩陣
在dropout階段,我們需要生成二值矩陣魂务,可以使用下面的語句來實(shí)現(xiàn)曼验,這里的大概意思就是D1中的元素如果小于keep_prob的話為 0 逆害,否則為 1
np.where(D1 < keep_prob, 0, 1)
- relu導(dǎo)數(shù)
在這一周的課后作業(yè)中,給的代碼使用了下面的語句來作為relu的導(dǎo)數(shù)
dZ2 = np.multiply(dA2, np.int64(A2 > 0))
其中 np.int64(A2 > 0) 應(yīng)該是生成一個(gè)A2同緯度的矩陣蚣驼,但是這個(gè)矩陣是A2中大于 0 的書保持不變魄幕,其余的數(shù)為 0
參考
弗羅貝尼烏斯范數(shù):https://blog.csdn.net/david_jett/article/details/77040087
理解dropout:http://www.pianshen.com/article/4175293217/
梯度消失和梯度爆炸:https://www.cnblogs.com/XDU-Lakers/p/10553239.html
課后作業(yè)錯(cuò)誤解決:https://www.cnblogs.com/buchiyudemao/p/9028704.html