神經網絡能解決所有問題嗎?
更多深度文章,請關注雲計算頻道:https://yq.aliyun.com/cloud
在深度學習過程中,你或許會碰到一般近似定理(Universal Approximation Theorem)
“隻有單個層的神經網絡可以有效的表現任何函數,但是這一層可能會大得不合理,並可能會泛化失敗”
A feedforward network with a single layer is sufficient to represent any function, but the layer may be infeasibly large and may fail to learn and generalize correctly.
— Ian Goodfellow, DLB
這是一個令人驚奇的觀點。如歌你可以接受大幅多數種類的問題都可以約化成函數,那麼這句話就是說,神經網絡可以在理論上解決任何問題。如果人類的智能可以誒函數建模(即使函數可能極其複雜),那麼我們現在就有工具來再創造人類智能了。神經元或許是AI版本的巴布奇分析機(Babbage analytical engine (1822)),雖然終結者們需要用到一台Macbook Pro。或許UAT(User Acceptance Test)解釋了為什麼深度學習在“困難問題”上如此成功—-包括圖像識別,機器翻譯,語音識別等。
簡而言之,我用經驗和可視化方法為自己證明了UAT表現非平凡函數(奇異函數) (x³+x²-x -1),使用一個隱層和6個神經元。我假設我是一個神經網絡,嚐試自我學習正確的權重。我也用代碼證明了這一工作。
神經網絡是如何建模所有函數的
這個問題難住了我很久,我也並不能在網上找到一個好的解釋。一個引用率大於0.57的句子如下:
Introducing non-linearity via an activation function allows us to approximate any function. It’s quite simple, really. — Elon Musk
“通過激活函數引入非線性因素允許我們估計任何函數,這確實是一個簡單的問題。”
所以非線性的激活函數是神秘配方嗎?我們真的可以使用一連串的sigmoid激活函數來表現任何函數嗎?ReLU激活函數會怎麼樣?當然不行!--因為他的名字裏麵有“線性”這一單詞(Rectified Linear Units)。
我最終發現Michael Neilson的教程非常棒,完美的覆蓋了這一問題(強烈建議去閱讀)。但是現在讓我們假設Michael帶著家人去了迪斯尼樂園而沒有發布這一關於神經網絡的最棒的教程。感謝Michael!
手工進行梯度下降
我很早就發現我很難在與數學證明的戰鬥中獲勝,因此我決定使用實驗的方法。我使用了Desmos來把ReLU激活函數連接起來,看看是否做了一些看上去有趣的事情。我調整了我的函數使他們與目標函數更像---是不是很熟悉?
Left: target function Right: raw materials
我選用 x³+x²-x -1 作為我的目標函數。僅使用ReLU max(0,x),我重複嚐試ReLU單元的不同的組合,直到它粗略看起來很像目標函數。下麵是我使用3個ReLUs的權重組合的結果。
Left: 3 ReLU functions Right: Weighted sum of the 3 ReLU functions
看起來不壞。左邊圖展示了ReLU函數,右邊的圖展示了我的模型對比目標的輸出結果。你可以認為每個ReLU單元是一個神經元,因此結合3個ReLU函數就像訓練隻有3個隱神經元的神經網絡。下麵是我畫出這個圖的公式:
每個神經元的輸出等於ReLU對權重輸入 wx + b 的一層包裝運算。
我發現我可以通過偏置b來調整ReLU向左和向右,通過調整權重來確定傾斜度。我把3個函數結合起來稱為最終的權重輸入Z,按照標準的神經網絡的方法。
Z的符號表明表示最後一層的權重我設置成了-1,為了以x軸翻轉圖像,來匹配我們的目標。最後我得到了下麵的7個等式,一起作用,粗略表現了 x³+x²-x -1 。
通過可視化,最終看起來似乎少量神經元和單個隱層可以為非平凡函數建模。真是太酷了!
硬編碼我的權重到真正的神經網絡中
下麵是一個使用我假的權重(上麵的)和偏置的神經元初始化圖。如果你給這個網絡一個很像 x³+x²-x-1 的數據集,那麼輸出將會在輸入為-2到2時大致正確。
最後一個句子,輸出將會在輸入為-2到2時大致正確,很關鍵。一般近似定理(Universal Approximation Theorem)認為一個單隱層的神經網絡可以近似在一定輸入範圍下的任何連續函數。如果函數跳躍或者有很大的溝,那麼我們就不能逼近估計他。另外,如果我們訓練一個輸入在10到20之間的網絡,那我們不能保證它在輸入在40到50時工作良好。
我的權重真的有效嗎?
我想以編程方式證明我算出的權重在與真實神經網絡(單隱層6神經元)結合後仍然發揮作用。我使用手算的權重,而不是訓練神經網絡學習權重,作為網絡的初始權值和偏置。下麵的方法feed_forward()得輸入是一個向量(如 [-2,-1,0,1..]),輸出是一個使用我的權值的預測。下麵是結果:
(Zh,Zo: weighted inputs . Wh,Wo: weights. Bh,Bo: biases. Ah,Ao: activations)
快看!我真是個天才。這正是我想要的。但是如果我們的boss要求我們擴展輸入範圍超過-2到2呢?如果他想要-5到5怎麼辦呢?
恩,不太好。但是確實支持了我們之前的結論:一個隻有一個隱層的神經網絡可以近似任何連續函數,但是隻能適用特定的輸入範圍。如果你訓練一個輸入在-2到2的網絡,就像我們所做的,那麼它會在相似區域工作良好,但是在不重新訓練和不增加網絡隱神經元時,不能期望他可以泛化到其他輸入。
我的權重可以被學習嗎?
現在我們知道我作為神經網絡可以自己學習權重,但是真實的神經網絡(單隱層6神經元)也可以學習這些參數或者其他參數,來得到同樣的結果嗎?讓我們使用scikit-neuralnetwork測試這一理論。我們設計了一個神經網絡讓他解決回歸問題,使用常用的ReLU,隨機梯度下降和均方誤差的組合來調整。
from sknn.mlp import Regressor
from sknn.mlp import Layer
# Design Network
hiddenLayer = Layer("Rectifier", units=6)
outputLayer = Layer("Linear", units=1)
nn = Regressor([hiddenLayer, outputLayer], learning_rule='sgd',
learning_rate=.001,batch_size=5,loss_type="mse")
# Generate Data
def cubic(x):
return x**3 + x**2 - x - 1
def get_cubic_data(start,end,step_size):
X = np.arange(start, end, step_size)
X.shape = (len(X),1)
y = np.array([cubic(X[i]) for i in range(len(X))])
y.shape = (len(y),1)
return X,y
# Train Model
X,y = get_cubic_data(-2,2,.1)
nn.fit(X,y)
# Predict
predictions = nn.predict(X)
# Visualize
plt.plot(predictions)
plt.plot(y)
plt.show()
下麵是Scikit學習到的權重。他們與我學習到的不同,但是量級順序是相似的。
hiddenLayerWeights = [
[-1.5272, -1.0567, -0.2828, 1.0399, 0.1243, 2.2446]
]
finalLayerWeights = [
[-2.2466],
[ 1.0707],
[-1.0643],
[ 1.8229],
[-0.4581],
[ 2.9386]
]
或許如果我重寫了這篇博客100000次我也會得到這些參數,但是現在我們隻能推測。或許有一日我將得到關於點讚數的導數並通過更新我的句子達到最大瀏覽數。
作者介紹:Brendan Fortuner,深度學習研究者,原計算機工程師
Blog:https://medium.com/@bfortuner
Facebook:https://facebook.com/1090080012
Twitter:https://twitter.com/bfortuner
以上為譯文
文章原標題《Can neural networks solve any problem?》,作者:Brendan Fortuner,譯者:愛小乖
文章為簡譯,更為詳細的內容,請查看原文
最後更新:2017-05-14 13:31:43