神經網絡通常由一個線性層和非線性函數(shù)(比如 tanh 和修正線性單元 ReLU)堆棧而成。如果沒有非線性,理論上一連串的線性層和單一的線性層在數(shù)學上是等價的。因此浮點運算是非線性的,并足以訓練深度網絡。這很令人驚訝。
背景計算機使用的數(shù)字并不是完美的數(shù)學對象,而是使用有限個比特的近似表示。浮點數(shù)通常被計算機用于表示數(shù)學對象。每一個浮點數(shù)由小數(shù)和指數(shù)的組合構成。在 IEEE 的 float32 標準中,小數(shù)分配了 23 個比特,指數(shù)分配了 8 個比特,還有一個比特是表示正負的符號位 sign。
按照這種慣例和二進制格式,以二進制表示的最小非零正常數(shù)是 1.0..0 x 2^-126,以下用 min 來指代。而下一個可表示的數(shù)是 1.0..01 x 2^-126,可以寫作 min+0.0..01 x 2^-126。很顯然,第一和第二個數(shù)之間的 gap 比 0 和 min 之間的 gap 小了 2^20 倍。在 float32 標準中,當一個數(shù)比最小的可表示數(shù)還小的時候,則該數(shù)字將被映射為零。因此,近鄰零的所有包含浮點數(shù)的計算都將是非線性的。(而反常數(shù)是例外,它們在一些計算硬件上可能不可用。在我們的案例中通過設置歸零(flush to zero,F(xiàn)TZ)解決這個問題,即將所有的反常數(shù)當成零。)
因此,雖然通常情況下,所有的數(shù)字和其浮點數(shù)表示之間的區(qū)別很小,但是在零附近會出現(xiàn)很大的 gap,而這個近似誤差可能帶來很大影響。
這會導致一些奇怪的影響,一些常用的數(shù)學規(guī)則無法發(fā)揮作用。比如,(a + b) x c 不等于 a x c + b x c。
比如,如果你設置 a = 0.4 x min,b = 0.5 x min,c = 1 / min。
則:(a+b) x c = (0.4 x min + 0.5 x min) x 1 / min = (0 + 0) x 1 / min = 0。
然而:(a x c) + (b x c) = 0.4 x min / min + 0.5 x min x 1 / min = 0.9。
再比如,我們可以設置 a = 2.5 x min,b = -1.6 x min,c = 1 x min。
則:(a+b) + c = (0) + 1 x min = min
然而:(b+c) + a = (0 x min) + 2.5 x min = 2.5 x min。
在這種小尺度的情況下,基礎的加法運算變成非線性的了!
使用進化策略利用非線性我們想知道這種內在非線性是否可以作為計算非線性的方法,如果可以,則深度線性網絡能夠執(zhí)行非線性運算。挑戰(zhàn)在于現(xiàn)代微分庫在非線性尺度較小時會忽略它們。因此,使用反向傳播利用非線性訓練神經網絡很困難或不可能。
我們可以使用進化策略(ES),無需依賴符號微分(symbolic differenTIaTIon)法就可以評估梯度。使用進化策略,我們可以將 float32 的零點鄰域(near-zero)行為作為計算非線性的方法。深度線性網絡通過反向傳播在 MNIST 數(shù)據集上訓練時,可獲取 94% 的訓練準確率和 92% 的測試準確率(機器之心使用三層全連接網絡可獲得 98.51% 的測試準確率)。相對而言,相同的線性網絡使用進化策略訓練可獲取大于 99% 的訓練準確率、96.7% 的測試準確率,確保激活值足夠小而分布在 float32 的非線性區(qū)間內。訓練性能的提升原因在于在 float32 表征中使用非線性的進化策略。這些強大的非線性允許任意層生成新的特征,這些特征是低級別特征的非線性組合。以下是網絡結構:
在上面的代碼中,我們可以看出該網絡一共 4 層,第一層為 784(28*28)個輸入神經元,這個數(shù)量必須和 MNIST 數(shù)據集中單張圖片所包含像素點數(shù)相同。第二層與第三層都為隱藏層且每層有 512 個神經元,最后一層為輸出的 10 個分類類別。其中每兩層之間的全連接權重為服從正態(tài)分布的隨機初始化值。nr_params 為加和所有參數(shù)的累乘。下面定義一個 get_logist() 函數(shù),該函數(shù)的輸入變量 par 應該可以是上面定義的 nr_params,因為定義添加偏置項的索引為 1、3、5,這個正好和前面定義的 nr_params 相符,但 OpenAI并沒有給出該函數(shù)的調用過程。該函數(shù)第一個表達式計算第一層和第二層之間的前向傳播結果,即計算輸入 x 與 w1 之間的乘積再加上縮放后的偏置項(前面 b1、b2、b3 都定義為零向量)。后面兩步的計算也基本相似,最后返回的 o 應該是圖片識別的類別。不過 OpenAI 只給出了網絡架構,而并沒有給出優(yōu)化方法和損失函數(shù)等內容。