此文基于周莫煩大神@莫煩的視頻,文章以及自己的一些心得。
1.3.1 ?性能衡量 Evaluation
Training/Validation/Test data
為了檢驗(yàn),評(píng)價(jià)神經(jīng)網(wǎng)絡(luò), 避免和改善這些問(wèn)題, 我們通常會(huì)把收集到的數(shù)據(jù)分為訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù),有時(shí)候還會(huì)分為訓(xùn)練數(shù)據(jù),驗(yàn)證數(shù)據(jù)以及測(cè)試數(shù)據(jù)。 一般用于訓(xùn)練的數(shù)據(jù)可以是所有數(shù)據(jù)的70%, 剩下的30%可以拿來(lái)測(cè)試學(xué)習(xí)結(jié)果.如果你想問(wèn)為什么要分開成兩批, 那就想想我們讀書時(shí)的日子, 考試題和作業(yè)題大部分都是不一樣的吧. 這也是同一個(gè)道理.驗(yàn)證數(shù)據(jù)的作用就是你做完平常的作業(yè)題還不夠瓷马,有時(shí)候老師還會(huì)給你加一些小測(cè),你只有在小測(cè)的時(shí)候也能做的很好你才能參加最后的期末考試跨晴,也就是測(cè)試數(shù)據(jù)欧聘。
誤差曲線
接著, 對(duì)于神經(jīng)網(wǎng)絡(luò)的評(píng)價(jià)基本上是基于這30%的測(cè)試數(shù)據(jù). 想想期末考試雖然花的時(shí)間少, 但是占得總成績(jī)肯定要比你平時(shí)作業(yè)的分多吧. 所以說(shuō)這30%雖然少, 但是很重要. 然后, 我們就可以開始畫圖啦! 評(píng)價(jià)機(jī)器學(xué)習(xí)可以從誤差這個(gè)值開始, 隨著訓(xùn)練時(shí)間的變長(zhǎng), 優(yōu)秀的神經(jīng)網(wǎng)絡(luò)能預(yù)測(cè)到更為精準(zhǔn)的答案, 預(yù)測(cè)誤差也會(huì)越少 . 到最后能夠提升的空間變小, 曲線也趨于水平 . 班上的差生, 從不及格到80分已經(jīng)不容易啦, 再往上沖刺100分, 就變成了更難的事了. 機(jī)器學(xué)習(xí)也一樣. 所以, 如果你的機(jī)器學(xué)習(xí)的誤差曲線是這樣一條曲線, 那就已經(jīng)是很不錯(cuò)的學(xué)習(xí)成果啦.
準(zhǔn)確度曲線
同樣, 除了誤差曲線, 我們可以看他的精確度曲線. 最好的精度是趨向于100%精確. 比如在神經(jīng)網(wǎng)絡(luò)的分類問(wèn)題中, 100個(gè)樣本中, 我有90張樣本分類正確, 那就是說(shuō)我的預(yù)測(cè)精確度是90%. 不過(guò), 不知道大家有沒(méi)有想過(guò)對(duì)于回歸的問(wèn)題呢? 怎樣看預(yù)測(cè)值是連續(xù)數(shù)字的精確度? 這時(shí), 我們可以引用 R2 分?jǐn)?shù)在測(cè)量回歸問(wèn)題的精度 . R2給出的最大精度也是100%, 所以分類和回歸就都有的統(tǒng)一的精度標(biāo)準(zhǔn). 除了這些評(píng)分標(biāo)準(zhǔn), 我們還有很多其他的標(biāo)準(zhǔn), 比如 F1 分?jǐn)?shù) , 用于測(cè)量不均衡數(shù)據(jù)的精度.?
交叉驗(yàn)證 Cross-Validation
神經(jīng)網(wǎng)絡(luò)也有很多參數(shù), 我們?cè)趺创_定哪樣的參數(shù)能夠更有效的解決現(xiàn)有的問(wèn)題呢? 這時(shí), 交叉驗(yàn)證 就是最好的途徑了. 交叉驗(yàn)證不僅僅可以用于神經(jīng)網(wǎng)絡(luò)的調(diào)參, 還能用于其他機(jī)器學(xué)習(xí)方法的調(diào)參. 同樣是選擇你想觀看的誤差值或者是精確度, 不過(guò)橫坐標(biāo)不再是學(xué)習(xí)時(shí)間, 而是你要測(cè)試的某一參數(shù) (比如說(shuō)神經(jīng)網(wǎng)絡(luò)層數(shù)) . 我們逐漸增加神經(jīng)層, 然后對(duì)于每一個(gè)不同層結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò)求出最終的誤差或精度, 畫在圖中. 我們知道, 神經(jīng)層越多, 計(jì)算機(jī)所需要消耗的時(shí)間和資源就越多, 所以我們只需要找到那個(gè)能滿足誤差要求, 有節(jié)約資源的層結(jié)構(gòu). 比如說(shuō)誤差在0.005一下都能接受 , 那我們就可以采用30層的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu) .
1.3.2 ?過(guò)擬合 Overfitting
Overfitting是什么
上面第三個(gè)圖就是 overfitting,就是過(guò)度準(zhǔn)確地?cái)M合了歷史數(shù)據(jù)端盆,而對(duì)新數(shù)據(jù)預(yù)測(cè)時(shí)就會(huì)有很大誤差怀骤。換句話來(lái)說(shuō),就是把訓(xùn)練集的數(shù)據(jù)學(xué)的太透徹了焕妙,以至于你在測(cè)試集上表現(xiàn)的很差蒋伦。有時(shí)候, 意外是猝不及防的, 比如有時(shí)候我們明明每一道作業(yè)習(xí)題都會(huì)做, 可是考試分?jǐn)?shù)為什么總是比作業(yè)分?jǐn)?shù)低許多? 原來(lái), 我們只復(fù)習(xí)了作業(yè)題,并沒(méi)有深入, 拓展研究作業(yè)反映出來(lái)的知識(shí). 這件事情發(fā)生在機(jī)器學(xué)習(xí)中, 我們就叫做過(guò)擬合. 我們?cè)诨氐秸`差曲線, 不過(guò)這時(shí)我們也把訓(xùn)練誤差畫出來(lái). 紅色的是訓(xùn)練誤差, 黑色的是測(cè)試誤差. 訓(xùn)練時(shí)的誤差比測(cè)試的誤差小, 神經(jīng)網(wǎng)絡(luò)雖然學(xué)習(xí)到了知識(shí), 但是對(duì)于平時(shí)作業(yè)太過(guò)依賴, 到了考試的時(shí)候, 卻不能隨機(jī)應(yīng)變, 沒(méi)有成功的把作業(yè)的知識(shí)擴(kuò)展開來(lái)。
(1)過(guò)擬合在回歸問(wèn)題中的體現(xiàn)焚鹊。這里是一些數(shù)據(jù). 如果要你畫一條線來(lái)描述這些數(shù)據(jù), 大多數(shù)人都會(huì)這么畫. 對(duì), 這條線也是我們希望機(jī)器也能學(xué)出來(lái)的一條用來(lái)總結(jié)這些數(shù)據(jù)的線. 這時(shí)藍(lán)線與數(shù)據(jù)的總誤差可能是10. 可是有時(shí)候, 機(jī)器過(guò)于糾結(jié)這誤差值, 他想把誤差減到更小, 來(lái)完成他對(duì)這一批數(shù)據(jù)的學(xué)習(xí)使命. 所以, 他學(xué)到的可能會(huì)變成這樣 . 它幾乎經(jīng)過(guò)了每一個(gè)數(shù)據(jù)點(diǎn), 這樣, 誤差值會(huì)更小 . 可是誤差越小就真的好嗎? 看來(lái)我們的模型還是太天真了. 當(dāng)我拿這個(gè)模型運(yùn)用在現(xiàn)實(shí)中的時(shí)候, 他的自負(fù)就體現(xiàn)出來(lái). 小二, 來(lái)一打現(xiàn)實(shí)數(shù)據(jù) . 這時(shí), 之前誤差大的藍(lán)線誤差基本保持不變 .誤差小的 紅線誤差值突然飆高 , 自負(fù)的紅線再也驕傲不起來(lái), 因?yàn)樗荒艹晒Φ谋磉_(dá)除了訓(xùn)練數(shù)據(jù)以外的其他數(shù)據(jù). 這就叫做過(guò)擬合. Overfitting.
(2)過(guò)擬合在分類問(wèn)題中的體現(xiàn)凉敲。在分類問(wèn)題當(dāng)中 . 過(guò)擬合的分割線可能是這樣 , 小二, 再上一打數(shù)據(jù) . 我們明顯看出, 有兩個(gè)黃色的數(shù)據(jù)并沒(méi)有被很好的分隔開來(lái). 這也是過(guò)擬合在作怪。
解決Overfitting的方法
1.增加數(shù)據(jù)量
大部分過(guò)擬合產(chǎn)生的原因是因?yàn)閿?shù)據(jù)量太少了. 如果我們有成千上萬(wàn)的數(shù)據(jù), 紅線也會(huì)慢慢被拉直, 變得沒(méi)那么扭曲。
2.L1&L2正則化(Regularisation)
運(yùn)用正規(guī)化. L1, l2 regularization等等, 這些方法適用于大多數(shù)的機(jī)器學(xué)習(xí), 包括神經(jīng)網(wǎng)絡(luò). 他們的做法大同小異, 我們簡(jiǎn)化機(jī)器學(xué)習(xí)的關(guān)鍵公式為 y=Wx . W為機(jī)器需要學(xué)習(xí)到的各種參數(shù). 在過(guò)擬合中, W 往往變化率比較大. 為了不讓W(xué)一次性變化太大, 我們?cè)谟?jì)算誤差上做些手腳. 原始的 cost 誤差是這樣計(jì)算 , cost = 預(yù)測(cè)值-真實(shí)值的平方. 如果 W 變得太大, 我們就讓 cost 也跟著變大, 變成一種懲罰機(jī)制. 所以我們把 W 自己考慮進(jìn)來(lái) . 這里 abs 是絕對(duì)值. 這一種形式的 正規(guī)化, 叫做 l1 正規(guī)化. L2 正規(guī)化和l1 類似, , 只是絕對(duì)值換成了平方. 其他的l3.l4 也都是換成了立方和4次方等等. 形式類似. 用這些方法,我們就能保證讓學(xué)出來(lái)的線條不會(huì)過(guò)于扭曲.
3. Dropout
還有一種專門用在神經(jīng)網(wǎng)絡(luò)的正規(guī)化的方法, 叫作 dropout. 在訓(xùn)練的時(shí)候, 我們隨機(jī)忽略掉一些神經(jīng)元和神經(jīng)聯(lián)結(jié) , 是這個(gè)神經(jīng)網(wǎng)絡(luò)變得”不完整”. 用一個(gè)不完整的神經(jīng)網(wǎng)絡(luò)訓(xùn)練一次.到第二次再隨機(jī)忽略另一些 , 變成另一個(gè)不完整的神經(jīng)網(wǎng)絡(luò). 有了這些隨機(jī) drop 掉的規(guī)則, 我們可以想象其實(shí)每次訓(xùn)練的時(shí)候, 我們都讓每一次預(yù)測(cè)結(jié)果都不會(huì)依賴于其中某部分特定的神經(jīng)元. 像l1, l2正規(guī)化一樣, 過(guò)度依賴的 W , 也就是訓(xùn)練參數(shù)的數(shù)值會(huì)很大, L1, L2會(huì)懲罰這些大的參數(shù)爷抓。Dropout 的做法是從根本上讓神經(jīng)網(wǎng)絡(luò)沒(méi)機(jī)會(huì)過(guò)度依賴势决。
1.3.3 特征標(biāo)準(zhǔn)化 (Feature Normalization)
什么是特征標(biāo)準(zhǔn)化
在說(shuō)特征標(biāo)準(zhǔn)化之前, 我們先來(lái)說(shuō)說(shuō)現(xiàn)實(shí)生活中, 我們的數(shù)據(jù)是什么樣的. 它們很可能來(lái)自不同的地方, 被不同的人采集, 有著不同的規(guī)格. 用最經(jīng)典的房?jī)r(jià)預(yù)測(cè)例子來(lái)和大家說(shuō)說(shuō). 我們用機(jī)器學(xué)習(xí)從房屋的各個(gè)層面來(lái)預(yù)測(cè)房?jī)r(jià), 房屋的特征可能包括, 離市中心的距離, 房屋樓層, 房屋面積, 所在城市, 幾室?guī)讖d等等. 這些數(shù)據(jù)的取值范圍往往差距懸殊, 比如樓層一般在2-30層以內(nèi), 面積可能上百, 離市中心距離可以以千來(lái)記.
回到機(jī)器學(xué)習(xí)中, 如果我們以一個(gè)簡(jiǎn)單的線性回歸方程來(lái)預(yù)測(cè)房屋的價(jià)格, 那方程可能會(huì)是這樣 . 價(jià)格= a* 離市中心 + b * 樓層 + c * 面積. 其中的 a b c 就是機(jī)器學(xué)習(xí)需要努力努力再努力 來(lái)優(yōu)化的參數(shù).我們說(shuō)的在具體一點(diǎn), 用 abc 算出來(lái)的價(jià)格是預(yù)測(cè)價(jià)格 . 機(jī)器學(xué)習(xí)需要計(jì)算預(yù)測(cè)值和實(shí)際值的差別, 然后對(duì)這個(gè)誤差進(jìn)行一些數(shù)學(xué)上的處理, 使之變成進(jìn)步的階梯, 然后反向地傳遞回參數(shù) a b c 來(lái)提升下次的預(yù)測(cè)準(zhǔn)確度.
為了好理解, 我們把 b 先排除掉. 再把房?jī)r(jià)問(wèn)題也簡(jiǎn)化一下, 留下兩個(gè)特征. 因?yàn)槊娣e的跨度一般可以從0 到 2-300, 而離市中心的距離跨度一般在10以內(nèi). 所以在這個(gè)公式中, c 只要稍稍變化一點(diǎn), 他乘以面積的變化就會(huì)很大, 因?yàn)槊娣e的值可以很大, 但是當(dāng)a也變化那一點(diǎn)點(diǎn)時(shí), 他對(duì)預(yù)測(cè)價(jià)格的影響力不會(huì)像 c 那樣巨大. 這樣的差別就會(huì)影響最終的工作效率. 所以, 我們要提高效率, 特征的標(biāo)準(zhǔn)化就可以幫上忙. 我們?cè)跈C(jī)器學(xué)習(xí)訓(xùn)練之前, 先對(duì)數(shù)據(jù)預(yù)先處理一下, 取值跨度大的特征數(shù)據(jù), 我們濃縮一下, 跨度小的括展一下, 使得他們的跨度盡量統(tǒng)一.
特征標(biāo)準(zhǔn)化的方法
通常用于特征標(biāo)準(zhǔn)化的途徑有兩種, 一種叫做 min max normalization, 他會(huì)將所有特征數(shù)據(jù)按比例縮放到0-1的這個(gè)取值區(qū)間. 有時(shí)也可以是-1到1的區(qū)間. 還有一種叫做 standard deviation normalization, 他會(huì)將所有特征數(shù)據(jù)縮放成 平均值為0, 方差為1. 使用這些標(biāo)準(zhǔn)化手段. 我們不僅可以快速推進(jìn)機(jī)器學(xué)習(xí)的學(xué)習(xí)速度, 還可以避免機(jī)器學(xué)習(xí)學(xué)得特扭曲.
1.3.4 特征選取(Feature Selection)
為什么要進(jìn)行特征選取
我們假設(shè)世界上的金毛和吉娃娃只有兩種顏色, 偏黃, 偏白 . 然后我們用藍(lán)色和紅色分別代表吉娃娃和金毛所占的比例 . 如果在偏黃這邊, 比例是這樣 ,就可以說(shuō)明, 在偏黃的方面, 吉娃娃和金毛所占的比例基本相同, 同樣 , 如果偏白色的吉娃娃和金毛數(shù)量也基本相同. 這組數(shù)據(jù)就說(shuō)明, 如果給你一個(gè)毛色是偏黃色的特征, 你是沒(méi)有辦法大概判斷這只狗是吉娃娃還是金毛的. 這意味著. 通過(guò)毛色來(lái)觀察這兩種品種, 是不恰當(dāng)?shù)? 這個(gè)特征在區(qū)分品種上沒(méi)有起到作用 . 那我們?cè)贀Q一個(gè)特征看看, 吉娃娃和金毛能不能用身高來(lái)分類呢?
我們拿這張圖具體說(shuō)說(shuō), 圖里面有很多數(shù)據(jù), 我們先舉一這條來(lái)說(shuō)明 , 可以看出, 在這組數(shù)據(jù)中, 如果給出高度50cm, 基本上我們就能夠判定這只狗是金毛啦, 同樣, 大于50cm 的, 都將是金毛. 當(dāng)我們看到這一條數(shù)據(jù) , 我們也可以有相當(dāng)大的信心說(shuō), 在這個(gè)高度范圍的, 很可能是只吉娃娃, 不過(guò), 當(dāng)我們?cè)偾袚Q到這組數(shù)據(jù) , 我們還能不能那么肯定地說(shuō)這是那種狗呢? 這個(gè)高度范圍, 因?yàn)閮煞N狗都存在, 而且每種狗的數(shù)量都差不多, 所以在這個(gè)高度區(qū)間的狗狗我們就沒(méi)辦法判斷. 所以高度是一個(gè)很有用的特征, 但是并不完美, 這就是我們?yōu)槭裁葱枰细嗟奶卣鱽?lái)處理機(jī)器學(xué)習(xí)中的問(wèn)題.
如何進(jìn)行特征選取
避免無(wú)意義的信息
避免重復(fù)性的信息
避免復(fù)雜的信息
1.3.5 激勵(lì)函數(shù)
為什么需要激勵(lì)函數(shù)
激活函數(shù)的作用就是轉(zhuǎn)換你的輸入到不同的域使得其線性可分。
假設(shè)訓(xùn)練一個(gè)沒(méi)有激活函數(shù)的多層神經(jīng)網(wǎng)絡(luò),如下圖:
由式子可以看出,如果沒(méi)有使用激活函數(shù)蓝撇,那么多層神經(jīng)網(wǎng)絡(luò)只是單純的線性組合而已果复。
另外一個(gè)角度,盡管看起來(lái)似乎會(huì)太過(guò)瑣碎渤昌,但我還是想先從「最初的地方」開始:線性回歸(Linear regression)虽抄。
(常規(guī)的最小二乘法)線性回歸的目的是找到最優(yōu)權(quán)重——與輸入線性組合——可得出一個(gè)能夠最小化目標(biāo)與解釋變量之間垂直偏移的模型,但是在此我們并不會(huì)討論模型擬合独柑,因?yàn)檫@是另一個(gè)話題迈窟。
因此,在線性回歸中忌栅,我們會(huì)計(jì)算權(quán)重與輸入的線性組合(讓我們把這個(gè)函數(shù)稱為「凈輸入函數(shù)(net input function)」)车酣。
net(x)=b+x1w1+x2w2+...xnwn= z
接下來(lái),我們來(lái)講邏輯回歸(logistic regression)索绪。我們讓凈輸入量z通過(guò)一個(gè)非線性「激活函數(shù)(activation function)」——即邏輯S型函數(shù)(logistic sigmoid function)湖员。
把它想象成線性的凈輸入量被「擠壓」入一個(gè)擁有良好特性的非線性方程,可以返回條件概率P(y=1 | x)(即樣本x隸屬于類別1的概率)∪鹎現(xiàn)在娘摔,如果我們添加一個(gè)階躍函數(shù),例如:
如果S型函數(shù)輸出大于或等于0.5預(yù)測(cè)為類別1唤反,反之為類別0凳寺;
這樣就可以得到如圖所示的邏輯回歸分類器:
但邏輯回歸(一種泛化的線性模型)其決策面(decision surface)是線性的,從這個(gè)層面上來(lái)看它仍然是一種線性分類器:
如果數(shù)據(jù)類別可以線性劃分彤侍,邏輯回歸分類器對(duì)此可以工作的很好读第,但我們考慮一個(gè)棘手的例子
數(shù)據(jù)類別非線性可分。對(duì)于此處這個(gè)例子拥刻,一個(gè)非線性的分類器可能會(huì)是更好的選擇,如一個(gè)多層神經(jīng)網(wǎng)絡(luò)父泳。接下來(lái)般哼,我訓(xùn)練了一個(gè)簡(jiǎn)單的多層感知器,其有一個(gè)包含200個(gè)這種邏輯S型激活函數(shù)的隱藏層惠窄。讓我們從下圖看一下現(xiàn)在決策面看起來(lái)是怎樣的:
全連接的前饋神經(jīng)網(wǎng)絡(luò)蒸眠,看起來(lái)基本如下圖這樣:
在這個(gè)特例中,我們的輸入層只有3個(gè)單元(分別為x0= 1作為偏置單元杆融,x1和x2作為兩個(gè)特征)楞卡;隱藏層有200個(gè)這樣的S型激活函數(shù)(am),而輸出層有一個(gè)S型函數(shù)。其之后被送入一個(gè)單位階躍函數(shù)(圖中沒(méi)有展示)產(chǎn)生預(yù)測(cè)的輸出類別標(biāo)簽y^蒋腮。
總結(jié)一下淘捡,邏輯回歸分類器有一個(gè)非線性激活函數(shù),但是該模型的權(quán)重系數(shù)本質(zhì)上是一個(gè)線性組合池摧,也因此邏輯回歸是一個(gè)泛化的線性模型〗钩現(xiàn)在可以得到,激活函數(shù)在神經(jīng)網(wǎng)絡(luò)中的功能即通過(guò)對(duì)加權(quán)的輸入進(jìn)行非線性組合產(chǎn)生非線性決策邊界(non-linear decision boundary)作彤。
激活函數(shù)
這里的 AF 就是指的激勵(lì)函數(shù). 激勵(lì)函數(shù)拿出自己最擅長(zhǎng)的”掰彎利器”, 套在了原函數(shù)上 用力一扭, 原來(lái)的 Wx 結(jié)果就被扭彎了.
其實(shí)這個(gè) AF, 掰彎利器, 也不是什么觸不可及的東西. 它其實(shí)就是另外一個(gè)非線性函數(shù). 比如說(shuō)relu, sigmoid, tanh. 將這些掰彎利器嵌套在原有的結(jié)果之上, 強(qiáng)行把原有的線性結(jié)果給扭曲了. 使得輸出結(jié)果 y 也有了非線性的特征. 舉個(gè)例子, 比如我使用了 relu 這個(gè)掰彎利器, 如果此時(shí) Wx 的結(jié)果是1, y 還將是1, 不過(guò) Wx 為-1的時(shí)候, y 不再是-1, 而會(huì)是0.
你甚至可以創(chuàng)造自己的激勵(lì)函數(shù)來(lái)處理自己的問(wèn)題, 不過(guò)要確保的是這些激勵(lì)函數(shù)必須是可以微分的, 因?yàn)樵?backpropagation 誤差反向傳遞的時(shí)候, 只有這些可微分的激勵(lì)函數(shù)才能把誤差傳遞回去.
常用選擇
想要恰當(dāng)使用這些激勵(lì)函數(shù), 還是有竅門的. 比如當(dāng)你的神經(jīng)網(wǎng)絡(luò)層只有兩三層, 不是很多的時(shí)候, 對(duì)于隱藏層, 使用任意的激勵(lì)函數(shù), 隨便掰彎是可以的, 不會(huì)有特別大的影響. 不過(guò), 當(dāng)你使用特別多層的神經(jīng)網(wǎng)絡(luò), 在掰彎的時(shí)候, 玩玩不得隨意選擇利器. 因?yàn)檫@會(huì)涉及到梯度爆炸, 梯度消失的問(wèn)題.?
最后我們說(shuō)說(shuō), 在具體的例子中, 我們默認(rèn)首選的激勵(lì)函數(shù)是哪些. 在少量層結(jié)構(gòu)中, 我們可以嘗試很多種不同的激勵(lì)函數(shù). 在卷積神經(jīng)網(wǎng)絡(luò) Convolutional neural networks 的卷積層中, 推薦的激勵(lì)函數(shù)是 relu. 在循環(huán)神經(jīng)網(wǎng)絡(luò)中 recurrent neural networks, 推薦的是 tanh 或者是 relu膘魄。
1.3.6 加速神經(jīng)網(wǎng)絡(luò)訓(xùn)練 (Speed Up Training)
Stochastic Gradient Descent
所以, 最基礎(chǔ)的方法就是 SGD 啦, 想像紅色方塊是我們要訓(xùn)練的 data, 如果用普通的訓(xùn)練方法, 就需要重復(fù)不斷的把整套數(shù)據(jù)放入神經(jīng)網(wǎng)絡(luò) NN訓(xùn)練, 這樣消耗的計(jì)算資源會(huì)很大.
我們換一種思路, 如果把這些數(shù)據(jù)拆分成小批小批的, 然后再分批不斷放入 NN 中計(jì)算, 這就是我們常說(shuō)的 SGD 的正確打開方式了. 每次使用批數(shù)據(jù), 雖然不能反映整體數(shù)據(jù)的情況, 不過(guò)卻很大程度上加速了 NN 的訓(xùn)練過(guò)程, 而且也不會(huì)丟失太多準(zhǔn)確率.
Momentum
大多數(shù)其他途徑是在更新神經(jīng)網(wǎng)絡(luò)參數(shù)那一步上動(dòng)動(dòng)手腳. 傳統(tǒng)的參數(shù) W 的更新是把原始的 W 累加上一個(gè)負(fù)的學(xué)習(xí)率(learning rate) 乘以校正值 (dx). 這種方法可能會(huì)讓學(xué)習(xí)過(guò)程曲折無(wú)比, 看起來(lái)像 喝醉的人回家時(shí), 搖搖晃晃走了很多彎路.所以我們把這個(gè)人從平地上放到了一個(gè)斜坡上, 只要他往下坡的方向走一點(diǎn)點(diǎn), 由于向下的慣性, 他不自覺(jué)地就一直往下走, 走的彎路也變少了. 這就是 Momentum 參數(shù)更新.
AdaGrad
這種方法是在學(xué)習(xí)率上面動(dòng)手腳, 使得每一個(gè)參數(shù)更新都會(huì)有自己與眾不同的學(xué)習(xí)率, 他的作用和 momentum 類似, 不過(guò)不是給喝醉酒的人安排另一個(gè)下坡, 而是給他一雙不好走路的鞋子, 使得他一搖晃著走路就腳疼, 鞋子成為了走彎路的阻力, 逼著他往前直著走. 他的數(shù)學(xué)形式是這樣的.?
RMSProp
如果把下坡和不好走路的鞋子合并起來(lái), 是不是更好呢?沒(méi)錯(cuò),這就是RMSProp.有了 momentum 的慣性原則 , 加上 adagrad 的對(duì)錯(cuò)誤方向的阻力, 我們就能合并成這樣. 讓 RMSProp同時(shí)具備他們兩種方法的優(yōu)勢(shì). 不過(guò)細(xì)心的同學(xué)們肯定看出來(lái)了, 似乎在 RMSProp 中少了些什么. 原來(lái)是我們還沒(méi)把 Momentum合并完全, RMSProp 還缺少了 momentum 中的 這一部分. 所以, 我們?cè)?Adam 方法中補(bǔ)上了這種想法.
Adam
計(jì)算m 時(shí)有 momentum 下坡的屬性, 計(jì)算 v 時(shí)有 adagrad 阻力的屬性, 然后再更新參數(shù)時(shí) 把 m 和 V 都考慮進(jìn)去. 實(shí)驗(yàn)證明, 大多數(shù)時(shí)候, 使用 adam 都能又快又好的達(dá)到目標(biāo), 迅速收斂. 所以說(shuō), 在加速神經(jīng)網(wǎng)絡(luò)訓(xùn)練的時(shí)候, 一個(gè)下坡, 一雙破鞋子, 功不可沒(méi).
1.3.7 不均衡數(shù)據(jù)(Imbalanced data)
為什么不均衡數(shù)據(jù)會(huì)影響結(jié)果
不均衡數(shù)據(jù)的形式很簡(jiǎn)單. 這里有1個(gè)蘋果和9個(gè)梨, 當(dāng)你發(fā)現(xiàn)你手中的數(shù)據(jù)對(duì)你說(shuō), 幾乎全世界的人都只吃梨, 如果隨便抓一個(gè)路人甲, 讓你猜他吃蘋果還是梨, 正常人都會(huì)猜測(cè)梨.
不均衡的數(shù)據(jù)預(yù)測(cè)起來(lái)很簡(jiǎn)單. 永遠(yuǎn)都猜多的那一方面準(zhǔn)沒(méi)錯(cuò). 特別是紅色多的那一方占了90%. 只需要每一次預(yù)測(cè)的時(shí)候都猜紅色, 預(yù)測(cè)準(zhǔn)確率就已經(jīng)達(dá)到了相當(dāng)高的90%了. 沒(méi)錯(cuò), 機(jī)器也懂這個(gè)小伎倆. 所以機(jī)器學(xué)到最后, 學(xué)乖了, 每次都預(yù)測(cè)多數(shù)派.
解決不均衡數(shù)據(jù)的方法
1.獲取更多數(shù)據(jù)
首先, 我們要想想, 自己還能不能獲取到更多的數(shù)據(jù). 有時(shí)候只是因?yàn)榍岸螘r(shí)期的數(shù)據(jù)多半呈現(xiàn)的是一種趨勢(shì), 等到后半時(shí)期趨勢(shì)又不一樣了. 如果沒(méi)有獲取后半時(shí)期的數(shù)據(jù), 整體的預(yù)測(cè)可能就沒(méi)有那么準(zhǔn)確了.
2.更換評(píng)判方式
通常, 我們會(huì)用到 準(zhǔn)確率 accuracy, 或者誤差 cost來(lái)判斷機(jī)器學(xué)習(xí)的成果. 可是這些評(píng)判方法在不均衡數(shù)據(jù)面前, 高的準(zhǔn)確率和低的誤差變得沒(méi)那么重要. 所以我們得換一種方式評(píng)判. 通過(guò) confusion matrix 來(lái)計(jì)算 precision 和 recall, 然后通過(guò) precision 和 recall 再計(jì)算f1 分?jǐn)?shù).這種方式能成功地區(qū)分不均衡數(shù)據(jù), 給出更好的評(píng)判分?jǐn)?shù).?
3.重組數(shù)據(jù)
第三種方法是最簡(jiǎn)單粗暴的方法之一. 重新組合不均衡數(shù)據(jù), 使之均衡. 方式一: 復(fù)制或者合成少數(shù)部分的樣本, 使之和多數(shù)部分差不多數(shù)量. 方式二: 砍掉一些多數(shù)部分, 使兩者數(shù)量差不多.
4.使用其他機(jī)器學(xué)習(xí)方法
如果使用的機(jī)器學(xué)習(xí)方法像神經(jīng)網(wǎng)絡(luò)等, 在面對(duì)不均衡數(shù)據(jù)時(shí), 通常是束手無(wú)策. 不過(guò)有些機(jī)器學(xué)習(xí)方法, 像決策樹, decision trees 就不會(huì)受到不均很數(shù)據(jù)的影響.
5.修改算法
嘗試修改算法. 如果你用的是 Sigmoid 的激勵(lì)函數(shù), activation function, 他會(huì)有一個(gè)預(yù)測(cè)門檻, 一般如果輸出結(jié)果落在門檻的這一段,預(yù)測(cè)結(jié)果為梨, 如果落在這一段, 預(yù)測(cè)結(jié)果為蘋果, 不過(guò)因?yàn)楝F(xiàn)在的梨是多數(shù)派, 我們得調(diào)整一下門檻的位置, 使得門檻偏向蘋果這邊, 只有很自信的時(shí)候, 模型才會(huì)預(yù)測(cè)這是蘋果. 讓機(jī)器學(xué)習(xí),學(xué)習(xí)到更好的效果.
1.3.8 不均衡數(shù)據(jù)(Imbalanced data)
Batch Normalization, 批標(biāo)準(zhǔn)化, 和普通的數(shù)據(jù)標(biāo)準(zhǔn)化類似, 是將分散的數(shù)據(jù)統(tǒng)一的一種做法, 也是優(yōu)化神經(jīng)網(wǎng)絡(luò)的一種方法. 具有統(tǒng)一規(guī)格的數(shù)據(jù), 能讓機(jī)器學(xué)習(xí)更容易學(xué)習(xí)到數(shù)據(jù)之中的規(guī)律.
每層都做標(biāo)準(zhǔn)化
在神經(jīng)網(wǎng)絡(luò)中, 數(shù)據(jù)分布對(duì)訓(xùn)練會(huì)產(chǎn)生影響. 比如某個(gè)神經(jīng)元 x 的值為1, 某個(gè) Weights 的初始值為 0.1, 這樣后一層神經(jīng)元計(jì)算結(jié)果就是 Wx = 0.1; 又或者 x = 20, 這樣 Wx 的結(jié)果就為 2. 現(xiàn)在還不能看出什么問(wèn)題, 但是, 當(dāng)我們加上一層激勵(lì)函數(shù), 激活這個(gè) Wx 值的時(shí)候, 問(wèn)題就來(lái)了. 如果使用 像 tanh 的激勵(lì)函數(shù), Wx 的激活值就變成了 ~0.1 和 ~1, 接近于 1 的部已經(jīng)處在了 激勵(lì)函數(shù)的飽和階段, 也就是如果 x 無(wú)論再怎么擴(kuò)大, tanh 激勵(lì)函數(shù)輸出值也還是 接近1. 換句話說(shuō), 神經(jīng)網(wǎng)絡(luò)在初始階段已經(jīng)不對(duì)那些比較大的 x 特征范圍 敏感了. 這樣很糟糕, 想象我輕輕拍自己的感覺(jué)和重重打自己的感覺(jué)居然沒(méi)什么差別, 這就證明我的感官系統(tǒng)失效了. 當(dāng)然我們是可以用之前提到的對(duì)數(shù)據(jù)做 normalization 預(yù)處理, 使得輸入的 x 變化范圍不會(huì)太大, 讓輸入值經(jīng)過(guò)激勵(lì)函數(shù)的敏感部分. 但剛剛這個(gè)不敏感問(wèn)題不僅僅發(fā)生在神經(jīng)網(wǎng)絡(luò)的輸入層, 而且在隱藏層中也經(jīng)常會(huì)發(fā)生.
只是時(shí)候 x 換到了隱藏層當(dāng)中, 我們能不能對(duì)隱藏層的輸入結(jié)果進(jìn)行像之前那樣的normalization 處理呢? 答案是可以的, 因?yàn)榇笈儼l(fā)明了一種技術(shù), 叫做 batch normalization, 正是處理這種情況.
BN 添加位置
Batch normalization 的 batch 是批數(shù)據(jù), 把數(shù)據(jù)分成小批小批進(jìn)行 stochastic gradient descent. 而且在每批數(shù)據(jù)進(jìn)行前向傳遞 forward propagation 的時(shí)候, 對(duì)每一層都進(jìn)行 normalization 的處理竭讳。
BN 效果
Batch normalization 也可以被看做一個(gè)層面. 在一層層的添加神經(jīng)網(wǎng)絡(luò)的時(shí)候, 我們先有數(shù)據(jù) X, 再添加全連接層, 全連接層的計(jì)算結(jié)果會(huì)經(jīng)過(guò) 激勵(lì)函數(shù) 成為下一層的輸入, 接著重復(fù)之前的操作. Batch Normalization (BN) 就被添加在每一個(gè)全連接和激勵(lì)函數(shù)之間创葡。
之前說(shuō)過(guò), 計(jì)算結(jié)果在進(jìn)入激勵(lì)函數(shù)前的值很重要, 如果我們不單單看一個(gè)值, 我們可以說(shuō), 計(jì)算結(jié)果值的分布對(duì)于激勵(lì)函數(shù)很重要. 對(duì)于數(shù)據(jù)值大多分布在這個(gè)區(qū)間的數(shù)據(jù), 才能進(jìn)行更有效的傳遞. 對(duì)比這兩個(gè)在激活之前的值的分布. 上者沒(méi)有進(jìn)行 normalization, 下者進(jìn)行了 normalization, 這樣當(dāng)然是下者能夠更有效地利用 tanh 進(jìn)行非線性化的過(guò)程。
沒(méi)有 normalize 的數(shù)據(jù) 使用 tanh 激活以后, 激活值大部分都分布到了飽和階段, 也就是大部分的激活值不是-1, 就是1, 而 normalize 以后, 大部分的激活值在每個(gè)分布區(qū)間都還有存在. 再將這個(gè)激活后的分布傳遞到下一層神經(jīng)網(wǎng)絡(luò)進(jìn)行后續(xù)計(jì)算, 每個(gè)區(qū)間都有分布的這一種對(duì)于神經(jīng)網(wǎng)絡(luò)就會(huì)更加有價(jià)值. Batch normalization 不僅僅 normalize 了一下數(shù)據(jù), 他還進(jìn)行了反 normalize 的手續(xù). 為什么要這樣呢?
BN 算法
我們引入一些 batch normalization 的公式. 這三步就是我們?cè)趧倓傄恢闭f(shuō)的 normalization 工序, 但是公式的后面還有一個(gè)反向操作, 將 normalize 后的數(shù)據(jù)再擴(kuò)展和平移. 原來(lái)這是為了讓神經(jīng)網(wǎng)絡(luò)自己去學(xué)著使用和修改這個(gè)擴(kuò)展參數(shù) gamma, 和 平移參數(shù) β, 這樣神經(jīng)網(wǎng)絡(luò)就能自己慢慢琢磨出前面的 normalization 操作到底有沒(méi)有起到優(yōu)化的作用, 如果沒(méi)有起到作用, 我就使用 gamma 和 belt 來(lái)抵消一些 normalization 的操作.
最后我們來(lái)看看一張神經(jīng)網(wǎng)絡(luò)訓(xùn)練到最后, 代表了每層輸出值的結(jié)果的分布圖. 這樣我們就能一眼看出 Batch normalization 的功效啦. 讓每一層的值在有效的范圍內(nèi)傳遞下去.