残差神经网络_什么是残差——一文让你读懂GBDT(梯度提升树)-和-Resnet-(残差网络)的原理...
殘差
殘差在數理統計中是指實際觀察值與估計值(擬合值)之間的差。在集成學習中可以通過基模型擬合殘差,使得集成的模型變得更精確;在深度學習中也有人利用layer去擬合殘差將深度神經網絡的性能提高變強。這里筆者選了Gradient Boosting和Resnet兩個算法試圖讓大家更感性的認識到擬合殘差的作用機理。
Gradient Boosting
下面的式子時Gradient Boosting的損失函數,其中$F_n(x)=F_{n-1}+T_n(x)$。 $$L(y,F_n(x)) =L(y,F_{n-1}+T_n(x)) $$ 這里的$F_n(x)$意味著最后通過 Gradient Boosting學習出來的模型,而這個最終的模型怎么來呢,參照下方代碼大致可以總結為三部: + 訓練一個基學習器Tree_1(這里采用的是決策樹)去擬合data和label。 + 接著訓練一個基學習器Tree_2,輸入時data,輸出是label和上一個基學習器Tree_1的預測值的差值(殘差),這一步總結下來就是使用一個基學習器學習殘差。 + 最后把所有的基學習器的結果相加,做最終決策。 下方代碼僅僅做了3步的殘差擬合,最后一步就是體現出集成學習的特征,將多個基學習器組合成一個組合模型。
from sklearn.tree import DecisionTreeRegressor
tree_reg1 = DecisionTreeRegressor(max_depth=2)
tree_reg1.fit(X, y)y2 = y - tree_reg1.predict(X)
tree_reg2 = DecisionTreeRegressor(max_depth=2)
tree_reg2.fit(X, y2)y3 = y2 - tree_reg2.predict(X)
tree_reg3 = DecisionTreeRegressor(max_depth=2)
tree_reg3.fit(X, y3)y_pred = sum(tree.predict(X_new) for tree in (tree_reg1, tree_reg2, tree_reg3))其實上方代碼就等價于調用sklearn中的GradientBoostingRegressor這個集成學習API,同時將基學習器的個數n_estimators設為3。
from sklearn.ensemble import GradientBoostingRegressor
gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=3, learning_rate=1.0)
gbrt.fit(X, y)形象的理解Gradient Boosting,其的過程就像射箭多次射向同一個箭靶,上一次射的偏右,下一箭就會盡量偏左一點,就這樣慢慢調整射箭的位置,使得箭的位置和靶心的偏差變小,最終射到靶心。這也是boosting的集成方式會減小模型bias的原因。 接下來我們再來了解一下最近在深度學習領域中的比較火的Residual Block。
Resnet
Resnet是2015年何凱明大神提出來的一個深度CNN模型,主要解決了隨著神經網絡層數變多,擬合效果反而變差的問題。而Residual Block是Resnet中一個最重要的模塊,Residual Block的做法是在一些網絡層的輸入和輸出之間添加了一個快捷連接,這里的快捷連接默認為恒等映射(indentity),說白了就是直接將原始輸入不做任何改變和輸出做加和,其公式如下: $$H(x) = F(x)+x$$ 如下圖所示,x 表示residual block的輸入, H(x)表示residual block的輸出,而F(x)代表著殘差,把公式簡單變換一下: $$ F(x)= H(x) - x$$ 就變成了通過神經網絡去擬合輸入與輸出之間的殘差F(x)。加了這個模塊之后,神經網絡的層數可以構建得越來越深,而且不會出現效果變差的現象,反之該模型在imagenet這個任務上再進一步,拿下了2015年的冠軍。這充分說明使用residual block擬合殘差使得深度學習模型變得更加強大。
對著下方代碼我們可以更清晰的看到residual block的具體操作: + 輸入x, + 將x通過三層convolutiaon層之后得到輸出m, + 將原始輸入x和輸出m加和。
就得到了residual block的總輸出,整個過程就是通過三層convolutiaon層去擬合residual block輸出與輸出的殘差m。
from keras.layers import Conv2D
from keras.layers import add
def residual_block(x, f=32, r=4):"""residual block:param x: the input tensor:param f: the filter numbers:param r::return:"""m = conv2d(x, f // r, k=1)m = conv2d(m, f // r, k=3)m = conv2d(m, f, k=1)return add([x, m])在resnet中殘差的思想就是去掉相同的主體部分,從而突出微小的變化,讓模型集中注意去學習一些這些微小的變化部分。這和我們之前討論的Gradient Boosting中使用一個基學習器去學習殘差思想幾乎一樣。
結語
至此,我們了解到了集成學習和深度學習中如何使用模型擬合殘差去加強模型的性能。使用模型擬合殘差的過程,還可以理解成模型在 Loss 函數上沿著梯度下降的方向前進,每增加一個基學習器就對應著梯度下降的一次更新。如下圖中,每一個紅點就代表著一個當前時刻的集成模型$F_n(x)$,最終的模型對應于loss函數圖像中最低的那個點。
Gradient Boosting通過擬合殘存使得模型的更加精確(降低模型的偏差Bias),Residual Block的通過擬合殘差使得深度網絡能夠變得更深更強。所以,如果你的模型效果性能不足,可以考慮考慮擬合殘差讓模型變強哦。
參考: https://blog.csdn.net/u014665013/article/details/81985082 https://mp.weixin.qq.com/s/Dhp3FbbK5yPYRwJTKjGZSQ Deep Residual Learning for Image Recognition
總結
以上是生活随笔為你收集整理的残差神经网络_什么是残差——一文让你读懂GBDT(梯度提升树)-和-Resnet-(残差网络)的原理...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 边缘计算架构_Openshift为边缘计
- 下一篇: excel高级函数_PowerQuery