當前位置:
首頁 > 新聞 > OpenAI 研究線性網路的非線性行為,數值計算的玄機帶來全新的網路表現

OpenAI 研究線性網路的非線性行為,數值計算的玄機帶來全新的網路表現

雷鋒網 AI 科技評論按:不管是一般的編程還是機器學習,凡是計算機中的數據都是以一定的數據格式表示的。但有些情況下數據格式會帶來明顯的限制,造成計算結果的異常。

不過在 OpenAI 的研究人員們看來,這種「計算結果的異常」可以成為給神經網路帶來新的可能性的落腳點。在這篇博文中,他們就介紹了一種異常的來源以及如何運用,還取得了不錯的效果。雷鋒網 AI 科技評論把文章編譯如下。

OpenAI 研究線性網路的非線性行為,數值計算的玄機帶來全新的網路表現

之前已經有證據表明,深度線性網路如果用浮點數值運算實現的話,結果是不完全線性的,會展現出一些非線性的計算特點。在這項研究中,OpenAI的研究人員們使用了進化計算的策略,在線性網路中找到帶來非線性特點的參數,希望能夠幫助一些疑難問題。

神經網路是由許多線性層和其後的非線性層堆疊起來形成的,常見的非線性函數有 tanh 或者 ReLU。如果沒有這些非線性的部分,連續的幾個線性層在數學理論上應當等效於單獨一個線性層。所以浮點數的計算具有足夠的非線性程度,以至於這樣也能形成一個可訓練的深度神經網路,這就有點出乎意料。

背景

計算機中使用的數字並不是理想的數學化的對象,而是用有限位的0和1近似地表示的。計算機中常用的一類數學對象表示方法就是浮點數。每個浮點格式的數據都可以分為小數和指數兩個部分。在 IEEE 的32位浮點數標準中,其中的23位用來表示小數部分,8位用來表示指數部分,還有一位用來表示符號。

根據浮點數的定義和其中使用的2進位位的表示範圍限制,它所能表示的最小非零數字就是(二進位)1.000...0 x 2^-126,這裡把這個值稱為 min。然而,可表示的數字裡面第二小的是 1.000...01 x 2^-126,這個數字可以用 min + 0.000...01 x 2^-126 表示。可以明顯看到, min 和第二小的數之間的差距,只有min和0之間差距的 2^-20 那麼大,還不到一百萬分之一倍。在32位浮點數中,如果要需要表示的數字比min還要接近0,那麼這個數就會直接被表示為0。由於這種「下溢」(underflow)的影響,所有在0附近進行的浮點數運算都會變成非線性的。

「非規格化數」(denormal numbers)就不受這些限制的影響,不過某些計算硬體上是不支持這種數據格式的。雖然 GPU 和 cuBLAS 默認都是可以使用非規格化數的,TensorFlow 在構建模型的時候卻是默認把非規格化數選項關閉的(對於 ftz=true 標誌集)。這就意味著,在TensorFlow中編寫的所有非矩陣乘法操作都帶有隱含的非線性(假設參與計算的數量級在 e^-38 附近)。

所以,雖然總體來說任何一個數字的真實值和用浮點格式表示以後的值之間的區別都很小,但是當這個數字非常接近0的時候,這一部分近似誤差就會變得非常顯著。

OpenAI 研究線性網路的非線性行為,數值計算的玄機帶來全新的網路表現

這件事的後果就是我們熟悉的數學規律不再適用,接下來就會有很多奇怪的事情發生。比如 (a + b) x c 就不再和 a x c + b x c 相等。


舉例說明,令 a = 0.4 x min,b = 0.5 xmin,c = 1/min

那麼, (a+b) x c = (0.4 x min+ 0.5 xmin ) x 1 /min= (0 + 0) x 1 /min= 0

然而 (a x c) + (b x c) = 0.4 x min/min+ 0.5 xminx 1 /min= 0.9

再舉一個例子,這次令 a = 2.5 x min, b = -1.6 xmin, c = 1 xmin

那麼 (a+b) + c = (0) + 1 x min=min

然而 (b+c) + a = (0 x min) + 2.5 xmin= 2.5 xmin

在這樣的數量級上,連最基本的結合律都變得非線性了!

藉助進化策略利用非線性

OpenAI 的研究人員們很想知道這種固有的非線性可否作為計算中的非線性得到利用,如果可行的話就可以讓深度線性網路實現非線性的計算操作。其中的挑戰是,用到的現代微分庫通常都對如此小尺度下的非線性視而不見。這樣以來,就非常困難、甚至沒有可能通過反向傳播的方法訓練一個神經網路來利用這些非線性。

OpenAI 的研究人員們決定使用進化策略(evolution strategies)來估計梯度,不再依靠微分一類的方法。通過進化策略,他們確實能夠把32位浮點數在零值附近的非線性行為加以利用,發展為計算性的非線性。以 MNIST 數據集的訓練為例,用反向傳播演算法訓練的深度線性網路可以達到94%的訓練準確率和92%的測試準確率;相比之下,同一個線性神經網路可以達到超過99%的訓練準確率和96.7%的測試準確只,就是用進化策略訓練得到的,同時保證激活權重都足夠小,在32位浮點數的非線性行為能夠產生影響的範圍內即可。這種訓練表現的提升就是因為進化策略發現並充分利用了32位浮點數表示中的非線性。這些強有力的非線性行為可以讓任意一個層根據低層特徵的非線性組合產生全新的特徵。這個網路的結構如下:


x = tf.placeholder(dtype=tf.float32, shape=[batch_size,784])

y = tf.placeholder(dtype=tf.float32, shape=[batch_size,10])

w1 = tf.Variable(np.random.normal(scale=np.sqrt(2./784),size=[784,512]).astype(np.float32))

b1 = tf.Variable(np.zeros(512,dtype=np.float32))

w2 = tf.Variable(np.random.normal(scale=np.sqrt(2./512),size=[512,512]).astype(np.float32))

b2 = tf.Variable(np.zeros(512,dtype=np.float32))

w3 = tf.Variable(np.random.normal(scale=np.sqrt(2./512),size=[512,10]).astype(np.float32))

b3 = tf.Variable(np.zeros(10,dtype=np.float32))

params = [w1,b1,w2,b2,w3,b3]

nr_params = sum([np.prod(p.get_shape().as_list()) for p in params])

scaling = 2**125

def get_logits(par):

h1 = tf.nn.bias_add(tf.matmul(x , par[0]), par[1]) / scaling

h2 = tf.nn.bias_add(tf.matmul(h1, par[2]) , par[3] / scaling)

o = tf.nn.bias_add(tf.matmul(h2, par[4]), par[5]/ scaling)*scaling

return o

除了 MNIST 之外,OpenAI 的研究人員們相信未來還會有更多有意思的實驗把這種思想拓展到循環神經網路,或者把非線性計算運用在提升複雜語言建模和翻譯之類的機器學習任務表現中。他們非常期待可以和廣大研究人員們一起探索其中的可能性。

via OpenAI Blog,雷鋒網 AI 科技評論編譯

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雷鋒網 的精彩文章:

靠磁場驅動的微型機器人軍隊, 構建複雜結構之餘還能捕捉酵母細胞
它拿了3.5億要做機器人平台,機器人企業卻說不知道它在幹什麼
2018 年,AI 晶元也許會出現在每一款旗艦智能手機上
莫斯科計劃在 17 萬個監控攝像頭中引入人臉識別;廣東農行「刷臉取款」實現 1600 多個網點全覆蓋丨AI 掘金晚報
最快只要 6 年,自動駕駛汽車就會改變你的生活

TAG:雷鋒網 |