1. 程式人生 > >神經網絡(未完)

神經網絡(未完)

適用於 開始 increase tor 否則 任務 log model sta

目錄

  • 神經網絡
    • perceptron(了解)
    • Multi-Layer Perceptron(MLP)
    • DNN的挑戰
      • Vanishing/Exploding Gradients Problems
      • 模型建立
      • 模型訓練
      • 模型優化

神經網絡

perceptron(了解)

perceptron:最簡單的ANN結構,它是一個linear threshold unit(LTU),接收wx,經過step func f,轉為輸出。step func通常是heaviside(返回0或1)或者sign(返回-1、0或1)

技術分享圖片

訓練實際上就是更新w。過程是不斷輸入inputs,每個inputs都會得出一個output,當預測錯誤時,增強對正確判斷貢獻大的連接,即權重w。

\(w_{i,j} =w_{i,j}+η(\hat{y}_j?y_j)x_i\)

上述簡單結構只適用於線性可分數據,幾乎就是Stochastic Gradient Descent求解的無regularization的線性回歸,所以效果並不好。

Multi-Layer Perceptron(MLP)

one (passthrough,即不作任何變化) input layer, one or more layers of LTUs, called hidden layers, and one final layer of LTUs called the output layer

激活函數step func被sigmoid func取代,因為sigmoid的導數非0且到處可導,可以實現Back Propagation。其他激活函數有:

hyperbolic tangent function:$ tanh (z) = 2σ(2z) – 1$,它與sigmoid類似,但範圍是-1到1,可以使得每層輸出在訓練開始時是normalized的(以0為中心),且通常加快收斂。

ReLU function\(\max(0,z)\),它是連續的,但在z=0處不可導(the slope changes abruptly, which can make Gradient Descent bounce around)。但在實踐上能夠加快計算,更重要的是他的輸出不會是最大值?可以減少GD期間的一些問題。

技術分享圖片

有多兩層或以上的hidden layers稱為DNN。

技術分享圖片

\(x => wx => f(x) =>uf(x) => f(uf(x))\)按照這個方式不斷加深。

\(w_{ij}^l\)中l代表l-1到l層的權重,i表示第l-1層的第i個節點,j表示第l層的第j個節點。

\(z_i^l = \sum_{j=1}^Nw_{ij}^la_j^{l-1}+b_i^l\) 這裏z表示第l層第i個節點,它由l-1層輸出的線性組合而成。整層l的z用矩陣表示為\(z^l=W^la^{l-1}+b^l\)

所有的z會經過Sigmoid函數變為\(a^l\)

訓練方式:Back Propagation,求梯度的方式稱為reverse-mode autodiff。

從l層求解l-2甚至更前的層中的梯度w。一開始最底層w隨機給定,然後結合數據一路算到最上層,記錄每個節點運算的結果。然後從後往前求導數,一直到最前面。例如最右端,-0.53是通過後面節點的導數\(-1/x^2\),其中x為-0.53上面的1.37,乘上上一個梯度1得出的。

技術分享圖片

如上圖所示,知道梯度後就可以根據\(w_i=w_i+\alpha \triangledown w_i\)對w進行更新。

feedforward neural network(FNN):signal flows only in one direction (from the inputs to the outputs)

DNN的挑戰

Vanishing/Exploding Gradients Problems

vanishing:output layer到input layer越遠,梯度越小,使得模型進步緩慢。

exploding:和vanishing相反,梯度越來越大,使得算法結果diverge而無法收斂,經常出現在RNN。

總的來說,DNN的梯度不穩定,具體來說是每層的進步相差很大。這個問題和過去使用傳統的正態分布初始化權重和logistics作為激活函數有關。這兩個設定下,variance在forward時越來越大,直到飽和。簡單來說,當input的絕對值很大時,從logistics的圖像可以知道,梯度是接近0的,這使得變換很難傳遞到底層。

Glorot and Bengio認為我們需要每層輸出的方差等於其輸入的方差,並且我們還需要梯度在反向流過一層之前和之後具有相等的方差。但除非layers具有相同數量的輸入和輸出連接,否則實際上不可能保證這兩個條件。他們提出一個實用的方法:the connection weights must be initialized randomly。

Activation function Uniform distribution[-r, r] Normal distribution
Logistic \(r=\sqrt{6/(n_{inputs}+n_{outputs})}\) \(σ = \sqrt{2/(n_{inputs}+n_{outputs})}\)
Hyperbolic tangent \(r=4\sqrt{6/(n_{inputs}+n_{outputs})}\) \(σ = 4\sqrt{2/(n_{inputs}+n_{outputs})}\)
ReLU(and its variants) \(r=\sqrt{2}\sqrt{6/(n_{inputs}+n_{outputs})}\) \(σ = \sqrt{2}\sqrt{2/(n_{inputs}+n_{outputs})}\)

Nonsaturating Activation Functions

ReLU對於正數不會飽和,而且計算快。

dying ReLUs: during training, some neurons effectively die, meaning they stop outputting anything other than 0.當使用大的learning rate時更加常見。在訓練期間,如果神經元的權重得到更新,使得神經元輸入的加權和為負,則它將開始輸出0。此時該神經元就死掉了,因為ReLU的輸入為負數時,其梯度為0。

Name Equation Comment
leaky ReLU \(\max(\alpha z, z)\) \(\alpha\)通常設置為0.01,0.2可能更好。至少神經元不會死掉,且有機會回復正常。
randomized leaky ReLU (RReLU) 訓練時\(\alpha\)在一個範圍內隨機,測試時取訓練時的均值。有點regularizer的效果。
parametric leaky ReLU (PReLU) \(\alpha\)作為參數進行學習。一些研究發現對大規模的image數據效果相當好,而小數據則容易overfitting
exponential linear unit (ELU) \(α(exp(z)?1) \ \ \ if \ \ z<0;\\ z \ \ \ \ if\ \ z ≥ 0\) \(\alpha\)表示z趨向負無窮時函數趨向的值。任何地方都平滑,包括0點,這能加快GD,因為在0處不會bounce。做預測時比較慢。
SELU \(\lambdaα(exp(z)?\alpha) \ \ \ if \ \ z<0;\\ \lambda z \ \ \ \ if\ \ z ≥ 0\) 其中\(\lambda>1\)每層的輸出將傾向於在訓練期間保持相同的均值和方差。優於上述,它解決了vanishing/exploding問題。

一般來說,SELU > ELU > leaky ReLU(及其變體)> ReLU > tanh > logistic。 如果非常關心運行時性能,那麽leaky ReLU可能優於SELU。 如果不想調整另一個超參數,可以使用默認α值(leaky ReLU為0.01,ELU為1)。 如果有空閑時間和計算能力,可以使用交叉驗證來評估其他激活函數,特別是如果NN過度擬合則使用RReLU,或者如果您擁有龐大的訓練集,則為PReLU。

Batch Normalization

在FNN中,如果不使用SELU,則一般需要BN來防止vanishing/exploding在訓練期間出現。隨著前一層參數的變化,每一層輸入的分布在訓練期間都會發生變化。該技術在每個層的激活函數之前添加操作,簡單地將輸入zero-centering and normalizing,然後每層使用兩個新參數縮放和移位結果。 換句話說,此操作可讓模型了解每層輸入的最佳縮放比例和平均值。這兩個參數值都是根據每批數據計算得到的。一共四個參數需要學習:γ(scale), β (offset), μ (mean), and σ (standard deviation)

在測試的時候則直接用訓練樣本的總均值和方差。

利用這個方法連會飽和的函數都可以使用,也可以使用更大的學習速度,而且有一定的regularization的作用。當然,這也會減慢預測速度。

模型建立

ransfer learning:找到一個現有的神經網絡來完成與你想要解決的任務類似的任務,然後重用這個網絡的下層。Model Zoos

Freezing the Lower Layers、Caching the Frozen Layers

Tweaking, Dropping, or Replacing the Upper Layers:首先嘗試凍結所有復制的圖層,然後訓練模型並查看其執行情況。 然後嘗試解凍一個或兩個頂部隱藏層,讓反向傳播調整它們,看看性能是否有所改善。數據量限制了層數,所以在缺乏數據時,有時需要刪除頂部隱藏圖層並再次凍結所有剩余的隱藏圖層。反之數據量多也可增加層數。

Unsupervised Pretraining:在label數據不足的情況下:

1.Unsupervised Pretraining,using an unsupervised feature detector algorithma (autoencoders)來逐層訓練層,從最低層開始然後向上移動。

技術分享圖片

2.Pretraining on an Auxiliary Task:在輔助任務(可以輕松獲取或生成標記的訓練數據的任務)上訓練第一個神經網絡,然後重復使用該網絡的較低層來完成您的實際任務。又或者將所有訓練樣本標記為“good”,然後通過破壞好的訓練實例來生成許多新的訓練實例,並將這些已損壞的實例標記為“bad”。還有一種方法:訓練第一網絡以輸出每個訓練實例的分數,並使用成本函數來確保good實例的分數比bad實例的分數大至少一些余量(margin)。

模型訓練

Faster Optimizers

提高訓練速度的方法:a good initialization strategy for the connection weights, using a good activation function, using Batch Normalization, and reusing parts of a pretrained network。另外一方面是使用更快的optimizer,而非常規的GD。

這些optimizers包括:Momentum optimization, Nesterov Accelerated Gradient, AdaGrad, RMSProp, and finally Adam optimization. 就目前而言,最後的Adam是最好的選擇。

Learning Rate Scheduling

實際使用中,AdaGrad, RMSProp, and Adam optimization在訓練時會自動減少learning rate,其他optimization才需要這部分調優。

技術分享圖片

模型優化

Fine-Tuning Neural Network Hyperparameters

NN可以調節的超參太多了:

  • network topology (how neurons are interconnected)
  • the number of layers
  • the number of neurons per layer
  • the type of activation function to use in each layer
  • the weight initialization logic

一些選項包括randomized search、Oscar。

層數:即便只有一層hidden layer,只要有足夠的neurons,效果依然很好。但是更多的層數可以指數式地減少neurons的數量,並提高訓練速度。實際數據通常以分層方式構建,DNN便是利用這一事實:較低的隱藏層模擬低級結構(例如,各種形狀和方向的線段),中間隱藏層組合這些低級結構來模擬中間層結構(例如,正方形,圓形),最高隱藏層和輸出層將這些中間結構組合以模擬高級結構(例如,面)。除此之外,NN的結構還有利於模型的組合,比如某部分NN學習了人臉的識別,那麽可以在這個NN的基礎上構建識別發型的NN。因此,還可以將各部分的訓練分開,從而避免極大量數據訓練一個極大的DNN,而是可以並行地利用相對較少的數據訓練不同部分的模型。

每層的neuron數量:通常設置比所需的layers和neurons更多的數量,然後采用early stop防止overfitting。

激活函數:通常使用ReLU或者它的變種。這種函數不會在高點飽和(只要輸入值夠大),而logistic和hyperbolic tangent會在1飽和。在輸出層,logistics for binary, softmax for multiclass, no activation func for regression

Avoiding Overfitting Through Regularization

Early Stopping

l1 and l2 Regularization

dropout:在每個訓練步驟中,每個神經元(包括輸入神經元但排除輸出神經元)有概率p暫時“退出”,這意味著在此訓練步驟中它將被完全忽略,但它可能在下一步“激活”。超參數p稱為丟失率,通常設置為50%。 訓練後,神經元不再被丟棄。

Max-Norm Regularization:for each neuron, it constrains the weights w of the incoming connections such that \(∥w∥_2 ≤ r\), where r is the max-norm hyperparameter and \(∥ · ∥_2\) is the l2 norm. We typically implement this constraint by computing \(∥w∥_2\) after each training step and clipping w if needed (\(w= w\frac{r}{∥w∥_2}\)).Reducing r increases the amount of regularization and helps reduce overfitting. Max-norm regularization can also help alleviate the vanishing/exploding gradients problems (if you are not using Batch Normalization).

Data Augmentation:從現有訓練實例中生成新的訓練實例,人為地增加訓練集的大小。通常最好在訓練期間動態生成訓練實例,而不是浪費存儲空間和網絡帶寬。TensorFlow offers several image manipulation operations such as transposing (shifting), rotating, resizing, flipping,
and cropping, as well as adjusting the brightness, contrast, saturation, and hue.

add skip connections:DRN再說。

參考:

Hands On Machine Learning with Scikit-Learn and TensorFlow
http://cs231n.github.io/optimization-2/(Stanford CS231n, Fei-Fei Li)

神經網絡(未完)