『壹』 sigmoid函數、tanh函數和relu函數對比
之前碰到的一個筆試題,當時做答時總感覺不太全面,現總結記錄如下:
題目:畫出relu函數和sigmoid函數的曲線以及一階導數圖像,並進行對比。在此記錄:
(a) sigmoid函數公式: y = 1 / (1+e^(-x)) 一階導數: y' = y(1-y)
(b) 曲線圖像可自行查閱,網上有很多
(c) 從三方面解釋sigmoid函數:
》圖像本身 :sigmoid函數值域為(0,1),當x逼近+∞或者-∞也即在飽和區域時,導數接近於零。只有在合適的區域,導數才具有一定明顯的值;圖像不是奇函數,即關於原點不對稱。
》Forward Propagation :sigmoid函數引入了非線性因素,使得隱藏層的效果開始凸顯,即不是簡單的線性輸入和輸出,即區別於原始的感知機。
》Back Propagation :sigmoid的導數涉及到了除法,不可避免的會出現計算量較大的情況;sigmoid函數的導數在飽和區域時,導數較小,容易出現梯度消失(梯度彌散)的情況:即如果在一個DNN中,靠近輸出層的梯度較大,參數更新快,會快速收斂,而靠近輸入層時,由於梯度會慢慢變小,參數會更新較慢。
(a)tanh函數公式: y = (e^x - e^(-x)) / (e^x + e^(-x)) 一階導數 y' = (1+y)(1-y)
(b)曲線圖像同上所述:請自行查閱
(c)從和sigmoid函數對比的角度解釋tanh函數:
》圖像本身 :tanh函數關於原點對稱(與sigmoid的區別就是值域不同(-1,1)),tanh可是使得a的取值( z = wx +b, a = tanh(z) )有正有負,而sigmoid使得取值只能為正,這樣是不好的,參見知乎:
https://www.hu.com/question/50396271?from=profile_question_card
》Back Propagation :並未解決sigmoid函數中的梯度消失的問題,計算量大的問題同樣存在
(a)relu函數公式: y = max(0,x) 一階導數: x>0: y' = 1; x<0: y' = 0
(b)曲線圖像同上所述:請自行查閱
(c)從和sigmoid函數以及tanh函數做對比的角度解釋relu函數:
》圖像本身 :relu函數只有在自變數大於0的情況下,才會有值
》Forward Propagation & Back Propagation :正是由於relu函數簡單,relu函數在進行計算時會比較快;而且relu函數使得一部分輸入直接為0,這樣使得一些輸入神經元直接失效,就會造成網路的稀疏性,可以在一定程度上緩解過擬合;同時由於導數為常量,在一定程度上解決了梯度消失的問題。
注1:梯度爆炸:即權值W設置初始值不合適(或者是誤差梯度積累),導致權值愈來愈大,造成網路的不穩定。
注2:relu函數如何實現非線性的:參考:
https://blog.csdn.net/tianguiyuyu/article/details/79875641
以後會多多增加圖片的。
慢慢來-jony j
『貳』 神經網路如何外推:從前饋網路到圖網路
How Neural Networks Extrapolate: From Feedforward to Graph Neural Networks
ICLR2021最高分論文 https://arxiv.org/abs/2009.11848
52頁論文,正文佔9頁,主要都是附錄,不過附錄里很多圖片(一頁就一兩張圖),排除這些一頁一圖的,只有40頁
我們研究用梯度下降法訓練的神經網路如何外推,也就是說,它們在訓練分布的支持之外學習什麼。以前的工作報告了使用神經網路進行外推時混合的實證結果:雖然前饋神經網路,即多層感知器(MLP)在某些簡單任務中外推效果不好,但圖形神經網路(GNN)——帶有MLP模塊的結構化網路——在更復雜的任務中取得了一些成功。為了得到理論解釋,我們確定了MLPs和GNNs外推良好的條件。首先,我們量化了ReLU-MLPs從原點沿任意方向快速收斂到線性函數的觀測結果,這意味著ReLU-MLPs不能外推大多數非線性函數。但是,當訓練分布足夠「多樣化」時,他們可以證明學習線性目標函數。其次,在分析GNNs的成功和局限性時,這些結果提出了一個假設,我們提供了理論和經驗證據:GNNs在將演算法任務外推到新數據(例如。,較大的圖或邊權重)依賴於編碼體系結構或特徵中特定於任務的非線性。我們的理論分析建立在過度參數化網路與神經切線核的聯繫上。根據經驗,我們的理論適用於不同的培訓環境
1簡介
人類在許多任務中推斷得很好。例如,我們可以對任意大的數應用算術。人們可能想知道,神經網路是否也能做到這一點,並將其推廣到任意遠離訓練數據的示例中(Lake et al.,2017)。奇怪的是,以前的工作報告混合外推結果與神經網路。早期的工作表明,前饋神經網路,又稱多層感知器(MLPs),在學習簡單多項式函數時不能很好地進行外推(Barnard&Wessels,1992;Haley&Soloway,1992年)。然而,最近的研究表明,圖神經網路(GNNs)(Scarselli et al.,2009)是一類具有MLP構建塊的結構化網路,在具有挑戰性的演算法任務中,如預測物理系統的時間演化(Battaglia et al.,2016),可以推廣到比訓練圖大得多的圖,學習圖形演算法(Velickovic et al.,2020),求解數學方程(Lample&Charton,2020)。
為了解釋這個難題,我們正式研究了梯度下降(GD)訓練的神經網路是如何外推的,即它們在訓練分布的支持之外學習什麼。我們說,如果一個神經網路在訓練分布之外學習了一個任務,它就能很好地進行外推。乍一看,似乎神經網路可以在訓練分布之外任意行為,因為它們具有高容量(Zhang et al.,2017),並且是通用逼近器(Cybenko,1989;Funahashi,1989年;Hornik等人,1989年;庫爾科娃,1992年)。然而,神經網路受到梯度下降訓練的限制(Hardt等人,2016;Soudry等人,2018年)。在我們的分析中,我們通過類比過參數化神經網路的訓練動態和通過神經切線核(NTK)的核回歸,明確考慮了這種隱式偏差(Jacot等人,2018)。
從前饋網路、最簡單的神經網路和更復雜的體系結構(如GNNs)的構建塊開始,我們建立了由GD訓練的具有ReLU激活的過參數mlp的預測從原點沿任意方向收斂到線性函數。我們證明了兩層網路的收斂速度,並從經驗上觀察到收斂經常發生在訓練數據附近(圖1),這表明ReLU-MLPs不能很好地外推大多數非線性任務。我們強調,我們的結果並不是基於ReLU網路具有有限多個線性區域的事實(Arora et al.,2018;Hanin&Rolnick,2019年;Hein等人,2019年)。雖然有有限多個線性區域意味著ReLU MLPs最終會變為線性,但MLPs是否會學習到接近訓練分布的正確目標函數並沒有說明。相比之下,我們的結果是非漸近的,並且量化了MLPs將學習什麼樣的函數接近於訓練分布。其次,我們確定了mlp外推良好的條件:任務是線性的,訓練分布的幾何結構是充分「多樣化」的。據我們所知,我們的結果是這種前饋神經網路的第一個外推結果。
然後,我們將我們對前饋神經網路的見解與GNNs聯系起來,以解釋GNNs在某些演算法任務中外推得好的原因。先前的工作報告了可以通過動態規劃(DP)解決的任務的成功外推(Bellman,1966),其計算結構與GNNs一致(Xu等人,2020)。DP更新通常可以分解為非線性和線性步驟。因此,我們假設GD訓練的GNN可以在DP任務中很好地外推,如果我們在架構和輸入表示中編碼適當的非線性(圖2)。重要的是,編碼非線性可能不需要GNNs插值,因為MLP模塊可以很容易地學習訓練分布中的許多非線性函數(Cybenko,1989;Hornik等人,1989年;Xu等人,2020),但GNNs正確外推至關重要。我們使用圖NTK(Du等人,2019b)證明了簡化情況下的這一假設。在經驗上,我們驗證了三個DP任務的假設:最大度、最短路徑和n體問題。我們證明了具有適當結構、輸入表示和訓練分布的GNNs可以很好地預測具有未知大小、結構、邊權值和節點特徵的圖。我們的理論解釋了以往工作的經驗成功,並指出了它們的局限性:成功的外推依賴於編碼任務特定的非線性,這需要領域知識或廣泛的模型搜索。從更廣泛的角度來看,我們的見解超越了GNNs,並廣泛應用於其他神經網路。
總之,我們研究神經網路如何外推。首先,由GD訓練的ReLU-mlp以O(1/t)的速率沿原點方向收斂為線性函數。其次,為了解釋為什麼GNNs在一些演算法任務中可以很好地外推,我們證明了ReLU-MLPs在線性任務中可以很好地外推,從而引出一個假設:當適當的非線性被編碼到結構和特徵中時,神經網路可以很好地外推。我們用一個簡化的例子證明了這個假設,並為更一般的情況提供了經驗支持。
1.1相關工作
早期的工作顯示了MLP不能很好地外推的示例任務,例如學習簡單多項式(Barnard&Wessels,1992;Haley&Soloway,1992年)。相反,我們展示了ReLU MLPs如何外推的一般模式,並確定MLPs外推良好的條件。最近的工作研究了在NTK和平均場兩種情況下,梯度下降對MLP產生的隱性偏差(Bietti和Mairal,2019;Chizat&Bach,2018年;Song等人,2018年)。與我們的結果相關,一些工作表明MLP預測收斂於「簡單」分段線性函數,例如,具有很少的線性區域(Hanin&Rolnick,2019;Maennel等人,2018年;Savarese等人,2019年;威廉姆斯等人,2019年)。我們的工作不同之處在於,這些工作都沒有明確研究外推法,有些只關注一維輸入。最近的研究還表明,在NTK區域的高維環境中,MLP在某些標度極限下至多是一個漸近線性預測因子(Ba等人,2020;Ghorbani等人,2019年)。我們研究不同的設置(外推),我們的分析是非漸近性質,不依賴於隨機矩陣理論。
先前的工作通過在較大的圖上進行測試來探索GNN外推(Battaglia et al.,2018;Santoro等人,2018年;薩克斯頓等人,2019年;Velickovic等人,2020年)。我們是第一個從理論上研究GNN外推法的人,我們完成了外推法的概念,包括看不見的特徵和結構。
2准備工作
3前饋神經網路如何外推
前饋網路是最簡單的神經網路和更復雜的體系結構(如GNNs)的構建塊,因此我們首先研究它們在GD訓練時是如何外推的。在本文中,我們假設ReLU激活。第3.3節包含其他激活的初步結果。
3.1 RELU MLP的線性外推行為
通過架構,ReLU網路學習分段線性函數,但是在訓練數據的支持之外,這些區域究竟是什麼樣的呢?圖1舉例說明了當GD對各種非線性函數進行訓練時,ReLU MLP如何進行外推。這些例子表明,在訓練支持之外,預測很快就會沿著原點的方向線性化。我們通過線性回歸對MLPs的預測進行了系統的驗證:決定系數(R2)總是大於0.99(附錄C.2)。也就是說,ReLU MLPs幾乎立即在訓練數據范圍之外「線性化」。
我們使用GD通過神經切線核(NTK)訓練的神經網路的隱式偏差來形式化這個觀察:GD訓練的過參數化網路的優化軌跡等價於具有特定神經切線核的核回歸的軌跡,在一系列被稱為「NTK制度」的假設下(Jacot等人,2018年)。我們在這里提供了一個非正式的定義;更多詳情,請參閱Jacot等人(2018)和附錄A。
定義2。
(非正式)在NTK區域訓練的神經網路是無限寬的,以一定的比例隨機初始化,並且由GD以無窮小的步長訓練。
先前的工作通過NTK分析過參數化神經網路的優化和分布泛化(Allen-Zhu等人,2019a;b類;Arora等人,2019a;b類;曹顧,2019;杜等人,2019c;一個;李亮,2018;日田和鈴木,2021年)。相反,我們分析外推。
定理1將我們從圖1中觀察到的結果形式化:在訓練數據范圍之外,沿著原點的任何方向tv,兩層ReLU MLP的預測迅速收斂為速率為O(1/t)的線性函數。線性系數β收斂速度中的常數項依賴於訓練數據和方向v。證據見附錄B.1
定理1
ReLU網路具有有限多個線性區域(Arora等人,2018;漢寧和羅爾尼克,2019),因此他們的預測最終成為線性。相反,定理1是一個更細粒度的分析MLP如何外推,並提供了收斂速度。雖然定理1假設兩層網路處於NTK狀態,但實驗證實,線性外推行為發生在具有不同深度、寬度、學習速率和批量大小的網路上(附錄C.1和C.2)。我們的證明技術也可能擴展到更深層次的網路。
圖4a提供了一個更積極的結果:MLP在許多不同的超參數上很好地外推了線性目標函數。雖然學習線性函數一開始似乎非常有限,但在第4節中,這一見解將有助於解釋GNN在非線性實際任務中的外推特性。在此之前,我們首先從理論上分析了MLPs外推的好時機。
3.2當RELU MLPS可證明外推井
圖4a顯示,當目標函數為線性時,MLP可以很好地外推。然而,這並不總是正確的。在本節中,我們展示了成功的外推依賴於訓練數據的幾何結構。直觀地說,訓練分布必須足夠「多樣化」,以便進行正確的推斷
我們提供了兩個條件,將訓練數據的幾何結構與外推聯系起來。引理1指出,過參數化的mlp只需二維例子就可以學習線性目標函數。
實驗:訓練數據的幾何結構影響外推。
定理2中的條件形式化了一種直覺,即訓練分布必須是「多樣的」,才能成功地進行外推,例如,D包括所有方向。從經驗上講,當滿足定理2的條件時(圖4b中的「all」),外推誤差確實很小。相反,當訓練示例僅限於某些方向時,外推誤差要大得多(圖4b和圖3)。
與之前的工作相關,定理2提出了為什麼虛假相關性可能會損害外推,補充了因果關系論點(Arjovsky et al.,2019;Peters等人,2016年;Rojas Carulla等人,2018年)。當訓練數據具有虛假相關性時,某些特徵組合丟失;e、 例如,駱駝可能只出現在沙漠中的圖像收集。因此,定理2的條件不再成立,模型可能外推錯誤。定理2也類似於線性模型的可辨識條件,但更為嚴格。如果訓練數據具有全(特徵)秩,我們可以唯一地識別一個線性函數。mlp更具表現力,因此識別線性目標函數需要附加約束。
綜上所述,我們分析了ReLU-MLPs是如何外推的,並提供了兩個啟示:(1)MLPs由於其線性外推而不能外推大多數非線性任務(定理1);當目標函數是線性函數時,如果訓練分布是「多樣的」(定理2),mlp可以很好地外推。在下一節中,這些結果將幫助我們理解更復雜的網路是如何外推的。
3.3具有其他激活功能的MLPS
在繼續討論GNNs之前,我們通過對其他激活函數tanh的實驗來完成MLPs的描述σ(x) =tanh(x),餘弦σ(x) =cos(x)(Lapedes&Farber,1987年;McCaughan,1997年;Sopena和Alquezar,1994),和σ(x) =x2(杜和李,2018;Livni等人,2014年)。詳情見附錄C.4。當激活函數和目標函數相似時,MLPs外推效果較好;e、 例如,當學習tanh時,tanh激活可以很好地推斷,但不能推斷其他功能(圖5)。而且,每個激活函數都有不同的局限性。要用tanh激活外推tanh函數,訓練數據范圍必須足夠寬。當學習具有二次激活的二次函數時,只有兩層網路可以很好地進行外推,而更多的層可以得到更高階的多項式。對於高維數據,餘弦激活很難優化,因此我們只考慮一維/二維餘弦目標函數。
4圖形神經網路如何外推
上面,我們看到非線性任務中的外推對於MLP來說是困難的。盡管存在這一局限性,GNNs在一些非線性演算法任務中表現出了很好的外推能力,如直觀物理(Battaglia et al.,2016;Janner等人,2019),圖演算法(Battaglia等人,2018;Velickovic等人,2020)和符號數學(Lample&Charton,2020)。為了解決這個差異,我們建立在MLP結果的基礎上,研究GD訓練的GNNs是如何外推的。
4.1假設:線性演算法對齊有助於外推
我們從一個例子開始:訓練GNNs來解決最短路徑問題。對於這項任務,先前的工作觀察到,具有最小聚集的改進GNN架構可以推廣到比訓練集中的圖更大的圖(Battaglia et al.,2018;Velickovic等人,2020):
我們首先提供一個直觀的解釋(圖2a)。最短路徑可通過Bellman-Ford(BF)演算法(Bellman,1958)求解,並進行以下更新
其中w(v,u)是邊(v,u)的權重,d[k][u]是k步內到節點u的最短距離。這兩個方程可以很容易地對齊:如果GNNs的MLP模塊學習一個線性函數d[k],那麼它將模擬BF演算法−1] [v]+w(v,u)。由於mlp可以外推線性任務,這種「對齊」可以解釋為什麼GNNs可以在這個任務中很好地外推。
為了進行比較,我們可以解釋為什麼我們不希望GNN使用更常用的和聚合(Eqn。1) 在這項任務中推斷得很好。對於和聚合,MLP模塊需要學習一個非線性函數來模擬BF演算法,但定理1表明,它們不會在訓練支持之外外推大多數非線性函數。
我們可以將上述直覺推廣到其他演算法任務。許多GNNs外推良好的任務可以通過動態規劃(DP)來解決(Bellman,1966),這是一種具有類似GNNs(Eqn)的遞歸結構的演算法範式。1) (Xu等人,2020年)。
定義3。動態規劃(DP)是一個帶有更新的遞歸過程
其中答案[k][s]是迭代k和狀態s索引的子問題的解決方案,DP Update是一個任務特定的更新函數,它基於上一次迭代解決子問題。從更廣泛的角度出發,我們假設:如果我們將適當的非線性編碼到模型結構和輸入表示中,使MLP模塊只需要學習接近線性的步驟,那麼所得到的神經網路就可以很好地外推。
假設1。
我們的假設建立在(Xu等人,2020)的演算法對齊框架之上,該框架指出,如果模塊「對齊」以便於學習(可能是非線性)函數,則神經網路插值良好。成功的外推更難:模塊需要與線性函數對齊。
線性演算法對準的應用。
一般來說,線性演算法對准不局限於GNN,廣泛應用於神經網路。為了滿足這種情況,我們可以在結構或輸入表示中編碼適當的非線性操作(圖2)。使用GNNs學習DP演算法是在體系結構中編碼非線性的一個例子(Battaglia等人,2018;Corso等人,2020年)。另一個例子是對體系結構中的日誌和exp變換進行編碼,以幫助外推算術任務中的乘法(Trask等人,2018;Madsen&Johansen,2020年)。神經符號程序進一步發展,並對符號操作庫進行編碼,以幫助推斷(Johnson等人,2017年;Mao等人,2019年;易等,2018年)。
對於某些任務,更改輸入表示可能更容易(圖2b)。有時,我們可以將目標函數f分解為f=g◦ 將h嵌入特徵嵌入h和一個簡單的目標函數g中,我們的模型可以很好地推斷。我們可以通過使用領域知識通過專門的特徵或特徵轉換獲得h(Lample&Charton,2020;Webb等人,2020年),或通過X\D中未標記的未標記的未標記的分發數據的表示學習(例如,BERT)(Chen等人,2020年);Devlin等人,2019年;胡等,2020;Mikolov等人,2013b;Peters等人,2018年)。這為表示如何幫助在不同應用領域進行外推提供了新的視角。例如,在自然語言處理中,預處理表示(Mikolov等人,2013a;Wu&Dredze,2019)和使用領域知識進行特徵轉換(袁等,2020年;Zhang等人,2019)幫助模型在語言之間進行概括,這是一種特殊的外推。在定量金融中,確定正確的「因素」或特徵對於深入學習模型至關重要,因為金融市場可能經常處於外推制度中(Banz,1981;法蘭西,1993年;羅斯,1976)。
線性演算法對齊解釋了文獻中成功的外推,並指出外推一般更難:編碼適當的非線性通常需要領域專家或模型搜索。其次,我們為我們的假設提供理論和實證支持。
4.2理論和經驗支持
我們驗證了我們對三個DP任務的假設:最大度、最短路徑和n-體問題,並證明了最大度假設。我們強調了圖結構在外推中的作用。
理論分析。
我們從一個簡單而基本的任務開始:學習一個圖的最大度,一個DP的特例。作為定理1的推論,常用的基於和的GNN(Eqn。1) 無法很好地推斷(證據見附錄B.4)。
推論1。
具有和聚集和和和讀出的GNNs在最大程度上不能很好地外推。為了實現線性演算法對齊,我們可以對讀出器中唯一的非線性max函數進行編碼。定理3證實了具有最大讀數的GNN在這個任務中可以很好地外推。
定理3並不是緊跟定理2,因為GNNs中的MLP模塊只接受間接的監視。我們分析圖NTK(Du等人,2019b)來證明附錄B.5中的定理3。雖然定理3假設相同的節點特徵,但我們在經驗上觀察到相同和不相同特徵的相似結果(附錄中的圖16)。
條件的解釋。
定理3中的條件類似於定理2中的條件。這兩個定理都需要不同的訓練數據,用定理3中的圖結構或定理2中的方向來度量。在定理3中,如果所有訓練圖都具有相同的最大或最小節點度,例如,當訓練數據來自以下族之一時,違反了該條件:路徑、C-正則圖(具有C度的正則圖)、圈和階梯。
實驗:有助於推斷的架構。
我們用兩個DP任務來驗證我們的理論分析:最大度和最短路徑(詳見附錄C.5和C.6)。而以前的工作只測試不同大小的圖(Battaglia et al.,2018;Velickovic等人,2020),我們還測試了具有不可見結構、邊權重和節點特徵的圖。結果支持了我們的理論。對於最大度,具有最大讀數的GNNs優於具有和讀數的GNNs(圖6a),證實了推論1和定理3。對於最短路徑,具有最小讀數和最小聚集的GNN優於具有和讀數的GNN(圖6a)。
實驗證實了訓練圖結構的重要性(圖7)。有趣的是,這兩個任務支持不同的圖結構。對於最大度,如定理3所預測的,當訓練在樹、完全圖、擴張圖和一般圖上時,GNNs外推效果很好,當訓練在4-正則圖、圈圖或梯形圖上時,外推誤差更大。對於最短路徑,當我們改變訓練圖的稀疏性時,外推誤差遵循U形曲線(附錄中的圖7b和圖18)。直覺上,在稀疏或稠密圖上訓練的模型可能學習退化解。
實驗:有助於推斷的表徵。
最後,我們展示了一個很好的輸入表示幫助外推。我們研究了n體問題(Battaglia等人,2016;Watters等人,2017年)(附錄C.7),即預測重力系統中n個物體的時間演化。根據之前的工作,輸入是一個完整的圖形,其中節點是對象(Battaglia等人,2016)。
5與其他分布外設置的連接
我們討論幾個相關的設置。直觀地說,從我們上述結果的觀點來看,相關設置中的方法可以通過1)學習超出訓練數據范圍的有用非線性和2)將相關測試數據映射到訓練數據范圍來改進外推。
領域適應研究對特定目標領域的泛化(Ben-David等人,2010;Blitzer等人,2008年;Mansour等人,2009年)。典型的策略會調整訓練過程:例如,使用來自目標域的未標記樣本來對齊目標和源分布(Ganin等人,2016;趙等,2018)。在訓練期間使用目標域數據可能會導致有用的非線性,並可能通過匹配目標和源分布來減輕外推,盡管學習映射的正確性取決於標簽分布(Zhao等人,2019)。
對大量未標記數據的自監督學習可以學習超出標記訓練數據范圍的有用非線性(Chen et al.,2020;Devlin等人,2019年;He等人,2020年;Peters等人,2018年)。因此,我們的結果提出了一個解釋,為什麼像BERT這樣的預訓練表示可以提高分布外魯棒性(Hendrycks et al.,2020)。此外,自監督學習可以將語義相似的數據映射到相似的表示,因此映射後的一些域外實例可能會落入訓練分布中。
不變模型旨在學習在多個訓練分布中尊重特定不變性的特徵(Arjovsky et al.,2019;Rojas Carulla等人,2018年;周等人,2021)。如果模型真的學習到了這些不變性,這可能發生在線性情況下,當存在混雜或反因果變數時(Ahuja等人,2021;Rosenfeld等人,2021),這可能從本質上增加了訓練數據范圍,因為模型可以忽略不變特徵的變化。
分布魯棒性考慮了數據分布的小干擾,並確保模型在這些干擾下表現良好(Goh&Sim,2010;Sagawa等人,2020年;Sinha等人,2018年;Staib&Jegelka,2019年)。相反,我們看的是更多的全局擾動。盡管如此,人們還是希望,有助於外推的修改通常也能提高對局部擾動的魯棒性。
6結論
本文是一個初步的步驟,正式了解如何神經網路訓練梯度下降外推。我們確定了MLPs和GNNs按期望外推的條件。我們還提出了一種解釋,說明GNNs在復雜的演算法任務中是如何能夠很好地進行外推的:在架構和特性中編碼適當的非線性可以幫助外推。我們的結果和假設與本文和文獻中的實證結果一致
『叄』 python報錯 ...construct 100-D input array ...
看報錯信息:
1.range函數傳入的參數得是整形數,不能是浮點型數據。你應該是想寫的:for step in range(1,10),但是你寫的是:for step in range(1.10),【1,10】和【1.10】區別很大,多半是把逗號打錯成點號了
2.然後for循環下的代碼要縮進四個空格
3.然後input本來是一個關鍵詞,原則上關鍵詞不要再作為變數重新賦值,不是不可以,盡量別這么干
『肆』 深度前饋網路
看過西瓜書和李航的《統計學習方法》,對機器學習的基本演算法算是有了初步的理解。機器學習的演算法和思想固然重要,在實際中也有很多應用場景,但在超大數據集的表現上,深度學習才是當下效果最好的工具。可惜的是,花書這樣一本經典著作的中文版翻譯和機翻差不多水平,因此看的時候只能放慢速度。閑言少敘,下面是第六章的學習記錄。
深度前饋網路(deep feedforward network) ,也叫作前饋神經網路(feedforward neural network)或者多層感知機(multilayer perceptron, MLP),是典型的深度學習模型。 前饋網路的目標是近似某個函數 。例如,對於分類器, 將輸入 映射到一個類別 。前饋網路定義了一個映射 ,並且學習參數 的值使它能夠得到最佳的函數近似。
下面我們把「深度前饋網路」這個詞拆開來看:
那麼深度前饋網路的各層之間有什麼區別呢?從功能來講,訓練樣本直接指明了 輸出層 在每一點x上必須做什麼,它必須產生一個接近 y 的值。但訓練數據並沒有給出其它層中的所需的輸出,所以這些層被稱為 隱藏層(hidden layer) 。
一種理解前饋網路的方式是從線性模型開始,並考慮如何克服它的局限性。如果各層的函數 都是線性函數,那麼復合後的函數依然是線性的,此時我們的網路模型等價於線性模型。為了提高模型的表示能力,我們需要將各層的 設置為非線性的,從而得到一個非線性映射 。我們可以認為 提供了一組描述 的特徵,或者認為它提供了 的一個新的表示。
設計和訓練神經網路與使用梯度下降訓練其他任何機器學習模型並沒有太大不同。神經網路和線性模型等演算法的最大區別,在於神經網路的非線性導致大多數我們感興趣的代價函數都變得 非凸 。這意味著神經網路的訓練通常使用迭代的、基於梯度的優化, 僅僅使得代價函數達到一個非常小的值 ;而不是像用於訓練線性回歸模型的線性方程求解器或者用於訓練邏輯回歸或 SVM 的凸優化演算法那樣保證全局收斂。
用於非凸損失函數的隨機梯度下降沒有這種收斂性保證,並且 對參數的初始值很敏感。對於前饋神經網路,將所有的權重值初始化為小隨機數是很重要的。偏置可以初始化為零或者小的正值。
大多數現代的神經網路使用最大似然來訓練。這意味著代價函數就是負的對數似然,它與訓練數據和模型分布間的 交叉熵 等價。這個代價函數表示為
使用最大似然來導出代價函數的方法的一個優勢是,它減輕了為每個模型設計代價函數的負擔。明確一個模型 則自動地確定了一個代價函數 。
用於實現最大似然估計的交叉熵代價函數有一個不同尋常的特性,那就是當它被應用於實踐中經常遇到的模型時,它 通常沒有最小值。 如果模型可以控制輸出分布的密度(例如,通過學習高斯輸出分布的方差參數),那麼它可能對正確的訓練集輸出賦予極其高的密度,這將導致交叉熵趨向負無窮。 正則化技術提供了一些不同的方法來修正學習問題,使得模型不會通過這種方式來獲得無限制的收益。
一種簡單的輸出單元是基於仿射變換的輸出單元,仿射變換不具有非線性。這些單元往往被直接稱為 線性單元 。給定特徵 ,線性輸出層產生一個向量 ,線性輸出層經常被用來 產生條件高斯分布的均值 :
最大化其對數似然此時等價於最小化均方誤差。
許多任務需要預測二值型變數 的值。具有兩個類的分類問題可以歸結為這種形式。此時最大似然的方法是定義 在 條件下的 Bernoulli 分布。為保證模型給出了錯誤答案時,總能有一個較大的梯度。可以使用 sigmoid輸出單元 結合最大似然來實現。sigmoid 輸出單元定義為:
這種在對數空間里預測概率的方法可以很自然地使用最大似然學習。因為用於最大似然的代價函數是 ,代價函數中的 抵消了 中的 。如果沒有這個效果,sigmoid 的飽和性會阻止基於梯度的學習做出好的改進。因此, 最大似然幾乎總是訓練 輸出單元的優選方法。
當我們想要表示一個具有 n 個可能取值的離散型隨機變數的分布時,我們可以使用 函數。它可以看作是 函數的擴展。
函數最常用作分類器的輸出,來表示 個不同類上的概率分布。比較少見的是, 函數可以在模型內部使用,例如如果我們想要在某個內部變數的 個不同選項中進行選擇。 函數的形式為:
和 一樣,當使用最大化對數似然訓練 來輸出目標值 時,使用指數函數工作地非常好。
隱藏單元的設計是一個非常活躍的研究領域,並且還沒有許多明確的指導性理論原則。
整流線性單元(Rectified Linear Unit, ReLU)是隱藏單元極好的默認選擇。許多其他類型的隱藏單元也是可用的。決定何時使用哪種類型的隱藏單元是困難的事(盡管整流線性單元通常是一個可接受的選擇)。我們這里描述對於每種隱藏單元的一些基本直覺。這些直覺可以用來建議我們何時來嘗試一些單元。 通常不可能預先預測出哪種隱藏單元工作得最好。設計過程充滿了試驗和錯誤,先直覺認為某種隱藏單元可能表現良好,然後用它組成神經網路進行訓練,最後用驗證集來評估它的性能。
大多數的隱藏單元都接受輸入向量 x,計算仿射變換 ,然後使用一個逐元素的非線性函數 。大多數隱藏單元的區別僅僅在於激活函數 的形式。
整流線性單元使用激活函數:
整流線性單元通常作用於仿射變換之上:
當初始化仿射變換的參數時,可以將 b 的所有元素設置成一個小的正值,例如 0.1。這使得整流線性單元很可能初始時就對訓練集中的大多數輸入呈現激活狀態,並且允許導數通過。
整流線性單元的一個缺陷是它們不能通過基於梯度的方法學習那些使它們激活為零的樣本。整流線性單元的各種擴展保證了它們能在各個位置都接收到梯度。
整流線性單元的三個擴展基於當 時使用一個非零的斜率 :
絕對值整流(absolute value rectification) 固定 來得到: ,它用於圖像中的對象識別 (Jarrett et al., 2009a); 滲漏整流線性單元(Leaky ReLU) (Maas et al., 2013) 將 固定成一個類似 0.01 的小值; 參數化整流線性單元(parametric ReLU) 將 作為學習的參數 (He et al., 2015)。
maxout 單元(maxout unit) (Goodfellow et al., 2013a) 進一步擴展了整流線性單元。maxout單元將 劃分為每組有 個值的組,而不是使用作用於每個元素的函數 。每個maxout單元則輸出每組中的最大元素:
這里 是組 的輸入索引集 。因為激活函數中有了max操作,所以整個maxout網路也是一種非線性的變換。
maxout的擬合能力是非常強的,它可以擬合任意的的凸函數。最直觀的解釋就是任意的凸函數都可以由分段線性函數以任意精度擬合,而maxout又是取k個隱隱含層節點的最大值,這些」隱隱含層"節點也是線性的,所以在不同的取值范圍下,最大值也可以看做是分段線性的(分段的個數與k值有關)。
整流線性單元和它們的這些擴展都是基於一個原則,那就是如果它們的行為更接近線性,那麼模型更容易優化。
在引入整流線性單元之前,大多數神經網路使用 logistic sigmoid 激活函數:
或者是雙曲正切激活函數:
這些激活函數緊密相關,因為:
我們已經看過 sigmoid 單元作為輸出單元用來預測二值型變數取值為 1 的概率。與分段線性單元不同,sigmoid 單元在其大部分定義域內都飽和——當 z 取絕對值很大的正值時,它們飽和到一個高值,當 z 取絕對值很大的負值時,它們飽和到一個低值,並且僅僅當 z 接近 0 時它們才對輸入強烈敏感。sigmoid 單元的廣泛飽和性會使得基於梯度的學習變得非常困難。因為這個原因,現在不鼓勵將它們用作前饋網路中的隱藏單元。當使用一個合適的代價函數來抵消 sigmoid 的飽和性時,它們作為輸出單元可以與基於梯度的學習相兼容。
當必須要使用 sigmoid 激活函數時,雙曲正切激活函數通常要比 logistic sigmoid 函數表現更好。在 而 的意義上,它更像是單位函數。因為 tanh 在 0 附近與單位函數類似。
架構(architecture) 一詞是指網路的整體結構: 它應該具有多少單元,以及這些單元應該如何連接。
在鏈式架構中,主要的架構考慮是選擇網路的深度和每一層的寬度。我將會看到,即使只有一個隱藏層的網路也足夠適應訓練集。 更深層的網路通常能夠對每一層使用更少的單元數和更少的參數,並且經常容易泛化到測試集,但是通常也更難以優化。 對於一個具體的任務,理想的網路架構必須通過實驗,觀測在驗證集上的誤差來找到。
萬能近似定理(universal approximation theorem)
一個前饋神經網路如果具有線性輸出層和至少一層具有任何一種 『『擠壓』』 性質的激活函數(例如logistic sigmoid激活函數)的隱藏層,只要給予網路足夠數量的隱藏單元,它可以 以任意的精度來近似任何從一個有限維空間到另一個有限維空間的 Borel 可測函數 。前饋網路的導數也可以任意好地來近似函數的導數 (Hornik et al., 1990)。
萬能近似定理意味著無論我們試圖學習什麼函數,我們知道一個大的MLP一定能夠表示這個函數。
然而,我們不能保證訓練演算法能夠學得這個函數。即使 MLP能夠表示該函數,學習也可能因兩個不同的原因而失敗。 首先,用於訓練的優化演算法可能找不到用於期望函數的參數值。其次,訓練演算法可能由於過擬合而選擇了錯誤的函數。
總之,具有單層的前饋網路足以表示任何函數,但是網路層可能大得不可實現,並且可能無法正確地學習和泛化。在很多情況下,使用更深的模型能夠減少表示期望函數所需的單元的數量,並且可以減少泛化誤差。
存在一些函數族能夠在網路的深度大於某個值d時被高效地近似,而當深度被限制到小於或等於d時需要一個遠遠大於之前的模型。在很多情況下,淺層模型所需的隱藏單元的數量是n的指數級。
Montufar et al. (2014) 的主要定理指出, 具有 個輸入深度為 每個隱藏層具有 個單元的深度整流網路可以描述的線性區域的數量是 :
根據經驗,更深的模型似乎確實在廣泛的任務中泛化得更好。
目前為止,我們都將神經網路描述成層的簡單鏈式結構,主要的考慮因素是網路的深度和每層的寬度。在實踐中,神經網路顯示出相當的多樣性。
一般的,層不需要連接在鏈中,盡管這是最常見的做法。許多架構構建了一個主鏈,但隨後又添加了額外的架構特性,例如從層 i 到層 i + 2 或者更高層的 跳躍連接 。這些跳躍連接使得梯度更容易從輸出層流向更接近輸入的層。
架構設計考慮的另外一個關鍵點是如何將層與層之間連接起來。默認的神經網路層採用矩陣 W 描述的線性變換,每個輸入單元連接到每個輸出單元。許多專用網路具有較少的連接,使得輸入層中的每個單元僅連接到輸出層單元的一個小子集。這些用於 減少連接數量 的策略減少了參數的數量以及用於評估網路的計算量,但通常高度依賴於問題。
當我們使用前饋神經網路接收輸入 並產生輸出 時,信息通過網路向前流動。輸入 提供初始信息,然後傳播到每一層的隱藏單元,最終產生輸出 。這稱之為 前向傳播(forward propagation) 。在訓練過程中,前向傳播可以持續向前直到它產生一個標量代價函數 。 反向傳播(back propagation) 演算法 (Rumelhart et al., 1986c),經常簡稱為backprop,允許來自代價函數的信息通過網路向後流動,以便計算梯度。
將計算形式化為圖形的方法有很多。這里,我們使用圖中的每一個節點來表示一個變數。變數可以是標量、向量、矩陣、張量、或者甚至是另一類型的變數。為了形式化我們的圖形,我們還需引入操作(operation)這一概念。操作是指一個或多個變數的簡單函數。我們的圖形語言伴隨著一組被允許的操作。我們可以通過將多個操作復合在一起來描述更為復雜的函數。
如果變數 y 是變數 x 通過一個操作計算得到的,那麼我們畫一條從 x 到 y 的有向邊。我們有時用操作的名稱來注釋輸出的節點,當上下文很明確時,有時也會省略這個標注。計算圖的實例如下:
使用符號到符號的方法計算導數的示例如下。在這種方法中,反向傳播演算法不需要訪問任何實際的特定數值。相反,它將節點添加到計算圖中來描述如何計算這些導數。通用圖形求值引擎可以在隨後計算任何特定數值的導數。 本例從表示 的圖開始,運行反向傳播演算法,指導它構造表達式 對應的圖。
這部分花書上講了很多內容……我看得有些失去耐心……可能是講得太細致了吧……我對反向傳播演算法的認識很簡單,就是一個鏈式法則,一層一層計算梯度然後向後傳播。這里根據之前上課時候的課件內容做下簡單回顧:
總之反向傳播演算法的要點就是 以恰當的順序計算梯度,從而充分利用鏈式法則來提高計算效率 。我個人認為理解BP的最佳方式就是自己畫個圖手推一遍。
『伍』 一文讀懂神經網路
要說近幾年最引人注目的技術,無疑的,非人工智慧莫屬。無論你是否身處科技互聯網行業,隨處可見人工智慧的身影:從 AlphaGo 擊敗世界圍棋冠軍,到無人駕駛概念的興起,再到科技巨頭 All in AI,以及各大高校向社會輸送海量的人工智慧專業的畢業生。以至於人們開始萌生一個想法:新的革命就要來了,我們的世界將再次發生一次巨變;而後開始焦慮:我的工作是否會被機器取代?我該如何才能抓住這次革命?
人工智慧背後的核心技術是深度神經網路(Deep Neural Network),大概是一年前這個時候,我正在回老家的高鐵上學習 3Blue1Brown 的 Neural Network 系列視頻課程,短短 4 集 60 多分鍾的時間,就把神經網路從 High Level 到推導細節說得清清楚楚,當時的我除了獲得新知的興奮之外,還有一點新的認知,算是給頭腦中的革命性的技術潑了盆冷水:神經網路可以解決一些復雜的、以前很難通過寫程序來完成的任務——例如圖像、語音識別等,但它的實現機制告訴我,神經網路依然沒有達到生物級別的智能,短期內期待它來取代人也是不可能的。
一年後的今天,依然在這個春運的時間點,將我對神經網路的理解寫下來,算是對這部分知識的一個學習筆記,運氣好的話,還可以讓不了解神經網路的同學了解起來。
維基網路這樣解釋 神經網路 :
這個定義比較寬泛,你甚至還可以用它來定義其它的機器學習演算法,例如之前我們一起學習的邏輯回歸和 GBDT 決策樹。下面我們具體一點,下圖是一個邏輯回歸的示意圖:
其中 x1 和 x2 表示輸入,w1 和 w2 是模型的參數,z 是一個線性函數:
接著我們對 z 做一個 sigmod 變換(圖中藍色圓),得到輸出 y:
其實,上面的邏輯回歸就可以看成是一個只有 1 層 輸入層 , 1 層 輸出層 的神經網路,圖中容納數字的圈兒被稱作 神經元 ;其中,層與層之間的連接 w1、w2 以及 b,是這個 神經網路的參數 ,層之間如果每個神經元之間都保持著連接,這樣的層被稱為 全連接層 (Full Connection Layer),或 稠密層 (Dense Layer);此外,sigmoid 函數又被稱作 激活函數 (Activation Function),除了 sigmoid 外,常用的激活函數還有 ReLU、tanh 函數等,這些函數都起到將線性函數進行非線性變換的作用。我們還剩下一個重要的概念: 隱藏層 ,它需要把 2 個以上的邏輯回歸疊加起來加以說明:
如上圖所示,除輸入層和輸出層以外,其他的層都叫做 隱藏層 。如果我們多疊加幾層,這個神經網路又可以被稱作 深度神經網路 (Deep Neural Network),有同學可能會問多少層才算「深」呢?這個沒有絕對的定論,個人認為 3 層以上就算吧:)
以上,便是神經網路,以及神經網路中包含的概念,可見,神經網路並不特別,廣義上講,它就是
可見,神經網路和人腦神經也沒有任何關聯,如果我們說起它的另一個名字—— 多層感知機(Mutilayer Perceptron) ,就更不會覺得有多麼玄乎了,多層感知機創造於 80 年代,可為什麼直到 30 年後的今天才爆發呢?你想得沒錯,因為改了個名字……開個玩笑;實際上深度學習這項技術也經歷過很長一段時間的黑暗低谷期,直到人們開始利用 GPU 來極大的提升訓練模型的速度,以及幾個標志性的事件:如 AlphaGo戰勝李世石、Google 開源 TensorFlow 框架等等,感興趣的同學可以翻一下這里的歷史。
就拿上圖中的 3 個邏輯回歸組成的神經網路作為例子,它和普通的邏輯回歸比起來,有什麼優勢呢?我們先來看下單邏輯回歸有什麼劣勢,對於某些情況來說,邏輯回歸可能永遠無法使其分類,如下面數據:
這 4 個樣本畫在坐標系中如下圖所示
因為邏輯回歸的決策邊界(Decision Boundary)是一條直線,所以上圖中的兩個分類,無論你怎麼做,都無法找到一條直線將它們分開,但如果藉助神經網路,就可以做到這一點。
由 3 個邏輯回歸組成的網路(這里先忽略 bias)如下:
觀察整個網路的計算過程,在進入輸出層之前,該網路所做的計算實際上是:
即把輸入先做了一次線性變換(Linear Transformation),得到 [z1, z2] ,再把 [z1, z2] 做了一個非線性變換(sigmoid),得到 [x1', x2'] ,(線性變換的概念可以參考 這個視頻 )。從這里開始,後面的操作就和一個普通的邏輯回歸沒有任何差別了,所以它們的差異在於: 我們的數據在輸入到模型之前,先做了一層特徵變換處理(Feature Transformation,有時又叫做特徵抽取 Feature Extraction),使之前不可能被分類的數據變得可以分類了 。
我們繼續來看下特徵變換的效果,假設 為 ,帶入上述公式,算出 4 個樣本對應的 [x1', x2'] 如下:
再將變換後的 4 個點繪制在坐標系中:
顯然,在做了特徵變換之後,這兩個分類就可以很容易的被一條決策邊界分開了。
所以, 神經網路的優勢在於,它可以幫助我們自動的完成特徵變換或特徵提取 ,尤其對於聲音、圖像等復雜問題,因為在面對這些問題時,人們很難清晰明確的告訴你,哪些特徵是有用的。
在解決特徵變換的同時,神經網路也引入了新的問題,就是我們需要設計各式各樣的網路結構來針對性的應對不同的場景,例如使用卷積神經網路(CNN)來處理圖像、使用長短期記憶網路(LSTM)來處理序列問題、使用生成式對抗網路(GAN)來寫詩和作圖等,就連去年自然語言處理(NLP)中取得突破性進展的 Transformer/Bert 也是一種特定的網路結構。所以, 學好神經網路,對理解其他更高級的網路結構也是有幫助的 。
上面說了,神經網路可以看作一個非線性函數,該函數的參數是連接神經元的所有的 Weights 和 Biases,該函數可以簡寫為 f(W, B) ,以手寫數字識別的任務作為例子:識別 MNIST 數據集 中的數字,數據集(MNIST 數據集是深度學習中的 HelloWorld)包含上萬張不同的人寫的數字圖片,共有 0-9 十種數字,每張圖片為 28*28=784 個像素,我們設計一個這樣的網路來完成該任務:
把該網路函數所具備的屬性補齊:
接下來的問題是,這個函數是如何產生的?這個問題本質上問的是這些參數的值是怎麼確定的。
在機器學習中,有另一個函數 c 來衡量 f 的好壞,c 的參數是一堆數據集,你輸入給 c 一批 Weights 和 Biases,c 輸出 Bad 或 Good,當結果是 Bad 時,你需要繼續調整 f 的 Weights 和 Biases,再次輸入給 c,如此往復,直到 c 給出 Good 為止,這個 c 就是損失函數 Cost Function(或 Loss Function)。在手寫數字識別的列子中,c 可以描述如下:
可見,要完成手寫數字識別任務,只需要調整這 12730 個參數,讓損失函數輸出一個足夠小的值即可,推而廣之,絕大部分神經網路、機器學習的問題,都可以看成是定義損失函數、以及參數調優的問題。
在手寫識別任務中,我們既可以使用交叉熵(Cross Entropy)損失函數,也可以使用 MSE(Mean Squared Error)作為損失函數,接下來,就剩下如何調優參數了。
神經網路的參數調優也沒有使用特別的技術,依然是大家剛接觸機器學習,就學到的梯度下降演算法,梯度下降解決了上面迭代過程中的遺留問題——當損失函數給出 Bad 結果時,如何調整參數,能讓 Loss 減少得最快。
梯度可以理解為:
把 Loss 對應到 H,12730 個參數對應到 (x,y),則 Loss 對所有參數的梯度可以表示為下面向量,該向量的長度為 12730:
$$
abla L(w,b) = left[
frac{partial L}{partial w_1},
frac{partial L}{partial w_2},...,
frac{partial L}{partial b_{26}}
ight] ^ op
$$
所以,每次迭代過程可以概括為
用梯度來調整參數的式子如下(為了簡化,這里省略了 bias):
上式中, 是學習率,意為每次朝下降最快的方向前進一小步,避免優化過頭(Overshoot)。
由於神經網路參數繁多,所以需要更高效的計算梯度的演算法,於是,反向傳播演算法(Backpropagation)呼之欲出。
在學習反向傳播演算法之前,我們先復習一下微積分中的鏈式法則(Chain Rule):設 g = u(h) , h = f(x) 是兩個可導函數,x 的一個很小的變化 △x 會使 h 產生一個很小的變化 △h,從而 g 也產生一個較小的變化 △g,現要求 △g/△x,可以使用鏈式法則:
有了以上基礎,理解反向傳播演算法就簡單了。
假設我們的演示網路只有 2 層,輸入輸出都只有 2 個神經元,如下圖所示:
其中 是輸入, 是輸出, 是樣本的目標值,這里使用的損失函數 L 為 MSE;圖中的上標 (1) 或 (2) 分別表示參數屬於第 (1) 層或第 (2) 層,下標 1 或 2 分別表示該層的第 1 或 第 2 個神經元。
現在我們來計算 和 ,掌握了這 2 個參數的偏導數計算之後,整個梯度的計算就掌握了。
所謂反向傳播演算法,指的是從右向左來計算每個參數的偏導數,先計算 ,根據鏈式法則
對左邊項用鏈式法則展開
又 是輸出值, 可以直接通過 MSE 的導數算出:
而 ,則 就是 sigmoid 函數的導數在 處的值,即
於是 就算出來了:
再來看 這一項,因為
所以
注意:上面式子對於所有的 和 都成立,且結果非常直觀,即 對 的偏導為左邊的輸入 的大小;同時,這里還隱含著另一層意思:需要調整哪個 來影響 ,才能使 Loss 下降得最快,從該式子可以看出,當然是先調整較大的 值所對應的 ,效果才最顯著 。
於是,最後一層參數 的偏導數就算出來了
我們再來算上一層的 ,根據鏈式法則 :
繼續展開左邊這一項
你發現沒有,這幾乎和計算最後一層一摸一樣,但需要注意的是,這里的 對 Loss 造成的影響有多條路徑,於是對於只有 2 個輸出的本例來說:
上式中, 都已經在最後一層算出,下面我們來看下 ,因為
於是
同理
注意:這里也引申出梯度下降的調參直覺:即要使 Loss 下降得最快,優先調整 weight 值比較大的 weight。
至此, 也算出來了
觀察上式, 所謂每個參數的偏導數,通過反向傳播演算法,都可以轉換成線性加權(Weighted Sum)計算 ,歸納如下:
式子中 n 代表分類數,(l) 表示第 l 層,i 表示第 l 層的第 i 個神經元。 既然反向傳播就是一個線性加權,那整個神經網路就可以藉助於 GPU 的矩陣並行計算了 。
最後,當你明白了神經網路的原理,是不是越發的認為,它就是在做一堆的微積分運算,當然,作為能證明一個人是否學過微積分,神經網路還是值得學一下的。Just kidding ..
本文我們通過
這四點,全面的學習了神經網路這個知識點,希望本文能給你帶來幫助。
參考:
『陸』 電池片高低電壓搞錯會造成明暗片嗎
以太陽能為代表的新能源在近些年得到了廣泛的研究和應用,特別是光伏發電技術。光伏太陽能的核心組件是光伏電池組件,除了電池材料自身存在的缺陷,生產時對電池片的多次加工也可能導致電池片的損壞,如過焊片、黑斑片、隱裂片等缺陷問題,加上安裝和使用過程中的機械損傷,都會影響組件的轉化效率和使用壽命。在實際應用中,更會對光伏發電系統自身的安全構成威脅。因此,研究光伏組件的缺陷檢測顯得尤為重要。
目前電池組件缺陷檢測的技術主要有[1]:紅外成像技術、光致發光成像技術、(ELectrofluorescence,EL)成像。EL成像是用於光伏組件缺陷檢測的非接觸式成像技術,根據硅材料的電致發光原理進行檢測。給晶體硅電池組件加上正向偏壓,組件會發出一定波長的光,電荷耦合器件圖像感測器(CCD)可以捕捉到這個波長范圍的光並在電腦上成像。但電池組件存在缺陷會減弱其發光強度,所以可以根據EL圖像中電池發光強度的不同來判斷電池組件是否存在缺陷。
在以往的研究中,2012年TSIA D M等[2]提出了利用獨立分量分析(ICA)基圖像識別缺陷的監督學習方法,該方法在80個太陽電池單元的測試樣本上平均識別率為93.4%。2014年ANWAR S A和ABDULLAH M Z提出了檢測多晶電池微裂紋的演算法[3],即基於各向異性擴散和形狀分類的圖像分割方法,在600張圖像上檢測微裂紋的精度上達到88%。深度學習特別是卷積神經網路(Convolutional Neural Network,CNN)在圖像識別[4]和檢測上備受重視。2018年DEITSCH S等提出自動檢測單一光伏電池EL圖像缺陷的方法[5],分別用支持向量機和卷積神經網路進行訓練及預測,平均准確率分別達到了82.44%和88.42%。另外,隨著深度學習的網路結構趨於更深,增加了訓練及實際應用的時間,因此,對網路模型的壓縮的研究顯得尤為重要[6]。
本文針對傳統缺陷識別演算法的不足,通過深度學習演算法對EL圖像進行分類,進而識別出有缺陷和沒有缺陷的電池片。經過實驗證明,改進的VGG16[7]網路具有很好的准確率,並且大幅降低了神經網路由於層數過多而帶來的大量運算,縮減後的模型有更大的實用性。
1 實驗數據及預處理
實驗數據來自於BUERHOP-LUTZ C等人公開的數據集[8],該數據集提供了從光伏組件的高解析度電致發光圖像中提取的太陽能電池圖像。圖片來自於44個不同的PV模塊,其中18個模塊為單晶型,26個為多晶型。圖片可以拆分為2 624個300×300像素的電池單元的EL圖像。這些圖像包含了常見的內外缺陷,如黑心片、黑斑片、短路黑片、過焊片、斷柵片、明暗片、隱裂等類型,如圖1所示,出現的這些缺陷會對太陽電池組件的轉換效率和使用壽命造成嚴重影響。
原數據集中將單晶和多晶的電池單元進行注釋,並且按照缺陷的概率對每張圖片進行標注,統計樣本的總數以及各類樣本分立情況,發現各類樣本數目相差較大,樣本分布的不平衡將導致訓練後模型對各類別識別出現偏差。為了減少分布不平衡的差異,本文首先將概率為0%和33.33%的圖片作為無缺陷的正樣本,66.67%和100%的圖片作為有缺陷的負樣本,因此得到的樣本分布如圖2所示。
本文所使用的神經網路模型需要224 pixel×224 pixel大小的輸入圖像,由於給定數據集EL圖像大小都是300 pixel×300 pixel,在輸入前需要對通過壓縮來得到符合大小的圖片。對於樣本分布不平衡問題,本文使用了數據增強方法。採用的第一種數據增強方法是隨機水平和垂直翻轉圖像;第二種方法是對原始圖像隨機旋轉一定角度(不超過2°),旋轉所使用的插值方法為雙三次插值;第三種方法是調整圖像的亮度和對比度,因為光照強度的變化會對成像結果造成很大影響。在預處理階段還對輸入圖片進行了去噪處理。
2 基於VGGNet的缺陷識別分類網路
神經網路在20世紀就已經被發現,經過十多年的發展,研究人員提出了各種不同的網路結構,從AlexNet到VGGNet、GoogLeNet和ResNet,隨著網路深度和寬度的增加以及不同功能層的引入,其在圖像識別的准確率不斷提高。一方面,當增加網路層數後,網路可以進行更加復雜的特徵提取,理論上可以取得更好的結果。但隨著網路深度的增加,會出現退化的問題,由於深層網路存在著梯度消失或者爆炸的問題,深度學習模型很難訓練。因此,設計一個實用的EL圖像缺陷識別分類網路,需要結合理論分析和實驗驗證。
卷積神經網路作為一種特殊的深層的神經網路模型,它的核心思想是將局部感知、權值共享以及下采樣結合起來,通過深度神經網路的逐層計算來學習圖像的像素特徵、低級特徵、高級特徵直至類別的隱式表達關系。2014年SIMONYAN K等人提出VGG網路,探索了CNN的深度與其性能之間的關系,成功地構築了16~19層深的神經網路,輸入為224×224×3的圖片,經過卷積和池化的處理輸出圖像所屬類別的概率[7],在具有1 000多個類別一百多萬張圖片的ImageNet數據集上取得了當時很好的效果。因此不少分類問題採用的卷積神經網路都以此為基礎。
原始的VGG16網路結構如圖3所示,由5組卷積層、3層全連接層、softmax輸出層構成,每組卷積層之間使用max-pooling(最大化池)分開,所有隱層的激活單元都採用ReLU函數做非線性變換,用以加快網路收斂。圖中,3×3 conv,64等表示卷積核尺寸為3×3,通道數為64的卷積層;pool/2表示滑動步長為2的池化層(這里為最大池化);fc 4096表示通道數為4096的全連接層;softmax表示softmax函數。對於每一組卷積操作,都包含多個特別小的3×3卷積核構成的卷積層,採用小卷積核既可以減少參數,又增加了非線性映射,從而增強網路的擬合效果。滑動步長為1,採用邊界填充的方式,使得每個卷積層的輸入/輸出特徵圖的像素不變。池化層採用2×2的池化核。每一組的通道數從64開始擴大2倍,分別為64、128、256、512、512,使得更多的信息可以被提取出來。之後的3個全連接層通道數分別為4 096、4 096、1 000,最後通過softmax層得到圖片屬於每個類別的概率。在以下研究中,將最後的3層全連接層替換為卷積核為7×7和1×1的卷積層,通道數分別為4 096、4 096和2。
3 實驗及其分析
3.1 網路訓練方法
實驗所用計算機內存為8 GB,使用英偉達GTX 1060顯卡加速模型訓練,顯存為6 GB。軟體環境為Ubuntu 16.04 LTS 64位系統,選用Python作為編程語言,採用TensorFlow深度學習開源框架,CUDA版本為9.0。
實驗選取圖片總數的80%進行訓練,20%用來測試,即訓練集圖片數量為2 099,測試集數量為525。採用批量訓練的方法,將訓練集和測試集分成多個批次(batch),每個批次的大小為16或32,在對每一個batch訓練完之後,對所有的測試集圖片進行測試,迭代的次數記為steps。採用隨機梯度下降演算法作為優化器,學習率在訓練中控制著參數的更新速度,這里使用指數衰減學習率,初始學習率為0.005,衰減速度為1 000,學習率衰減系數為0.9。訓練得到的損失和准確率如圖4所示。
通過大量實驗,發現CNN在缺陷識別上有不錯的效果,為了進一步提高分類的性能及減少訓練所需的時間,下面將對不同的dropout概率和損失函數進行討論,以期望得到更優的模型。
3.2 不同損失函數下的識別准確率
損失函數用來估量模型的預測值與真實值的相差程度,這里比較了兩種常見的損失函數Hinge loss和Softmax loss。Hinge loss又稱為折頁損失函數,其函數表達式為:
其中,L為損失,t=[t1,t2,…,tN]T表示目標值;y=[y1,y2,…,yN]T,表示預測值輸出;1≤j≤N,N為輸出節點的數量。
這兩種損失函數隨著迭代次數變化的曲線如圖5所示。在訓練的初始階段,Softmax loss要小於Hinge loss,但其下降的速度比較緩慢;訓練200次以後Hinge loss迅速減小,說明模型收斂得更快,並且模型的魯棒性更好。從這里可以看出,在電致發光圖像缺陷識別的數據集上,二分類的Hinge loss具有更好的效果。
3.3 不同Dropout概率下的識別准確率
在數據集有限的情況下,通常使用dropout來緩解過擬合的發生,在一定程度上起到正則化的效果。它是指在標準的BP神經網路基礎之上,使BP網路的隱藏層激活值以一定的比例變為0,即按照一定的比例,隨機地讓一部分隱藏層節點失效。存在dropout的神經網路計算過程如下:
圖6給出了在不同dropout概率時對缺陷識別的准確率,從圖中可以看出,當dropout概率在0.3時准確率最高。在訓練的過程中,概率越小,網路的參數較多,對於訓練集樣本不足夠大情況下,容易出現過擬合的現象;概率越小,由於所訓練的神經網路節點數不足,並不能有效地擬合訓練數據,導致最終的識別准確率下降,所以找到合適的概率對於模型的訓練效果至關重要。
3.4 不同網路結構的識別效果分析
基於VGG16的卷積神經網路雖然在現有數據集上取得了良好的限制,但訓練時間過長,通過對dropout概率的研究也表明網路中存在著冗餘參數,因此為了提高訓練的速度,本文對網路進行縮減,計算不同網路層數時的參數總量,記錄下訓練時的時間以及在測試集上的准確率,如表1所示。
表1中,結構1為完整的VGG16網路;結構2將每組卷積的卷積層個數減少為1、1、2、2、2,通道數不變;結構3將每組卷積的卷積層個數改為2、2、4、4、4,通道數不變,用來作對比;結構4將每組卷積的卷積層個數改為2、2、2、2、2,通道數不變;結構5~6每組卷積的個數均為1,結構4的通道數為64、128、256、512、512、4096、4096、2,結構5的通道數為32、64、128、256、256、2048、2048、2,結構6的通道數為16、32、64、128、128、1024、1024、2。
從表1中可以看出網路的參數主要集中在全連接層,在將全連接層的神經元節點數目縮減之後,訓練的時間大大縮減。卷積操作承擔著圖像特徵提取的任務,卷積層數量的縮減雖然會稍微降低識別的結果,但是能大大加速模型的訓練速度,這對於工業上的電致發光圖像缺陷識別有重要意義。
4 結論
本文提出將卷積神經網路用於太陽電池單元電致發光圖像缺陷識別,它能夠很好地提取電池片的缺陷,進行正確的分類。在2 624張樣本上,用全卷積VGG16網路進行訓練,經過大量的參數調節,識別的准確率達到93.95%。在此基礎上本文研究了模型壓縮後的訓練速率以及識別准確率,得出在減少網路層數之後,模型的訓練速率大大加快,並且不會使准確率明顯下降。下一步的研究中,將在簡化網路結構的基礎上,提高模型性能和識別准確率,以便用於實際的電池片缺陷識別當中。
參考文獻
[1] 施光輝,崔亞楠,劉小嬌,等.電致發光(EL)在光伏電池組件缺陷檢測中的應用[J].雲南師范大學學報(自然科學版),2016,36(2):17-21.
[2] TSAI D M,WU S C,LI W C.Defect detection of solar cells in electroluminescence images using Fourier image reconstruction [J].Solar Energy Materials and Solar Cells,2012,99(none):250-262.
[3] ANWAR S A,ABDULLAH M Z.Micro-crack detection of multicrystalline solar cells featuring an improved anisotropic diffusion filter and image segmentation technique[J].Eurasip Journal on Image & Video Processing,2014,2014(1):1-17.
[4] 許少尉,陳思宇.基於深度學習的圖像分類方法[J].電子技術應用,2018,44(6):116-119.
[5] DEITSCH S,CHRISTLEIN V,BERGER S,et al.Automatic classification of defective photovoltaic mole cells in electroluminescence images[J].arXiv preprint arXiv:1807.02894,2018.
[6] 馬治楠,韓雲傑,彭琳鈺,等.基於深層卷積神經網路的剪枝優化[J].電子技術應用,2018,44(12):119-122,126.
[7] SIMONYAN K,ZISSERMAN A.Very deep convolutional networks for large-scale image recognition[J].arXiv preprint arXiv:1409.1556,2014.
[8] BUERHOP-LUTZ C,DEITSCH S,MAIER A F,et al.A benchmark for visual identification of defective solar cells in electroluminescence imagery[C].35th European PV Solar Energy Conference and Exhibition
『柒』 c++難道不支持指針
二維數組不是用二級指針去指的,應該用數組指針 int n[3][4]; int (*p)[4] = n; 當然你認為這樣看起來不舒服,完全可以用一級指針去指 int *p = &n[0][0]; 訪問時使用p[i*4+j]訪問下標為i、j的元素,這里的4為數組的列數,比如p[1*4+2]為1行2列的元素=7
希望採納
『捌』 C語言里的char, if, el, se, for,relurn,drawtxt,rect是什麼
感覺你是不是寫錯了好多?
是else。和return。具體還是看一些C語言的入門書吧。或者教學視頻