原來激活函數(shù)是這樣基活神經(jīng)網(wǎng)絡(luò)的
如何比較數(shù)學地詮釋格局比努力更重要。
01坐標系的選擇
數(shù)學中一個基本但又重要的方法是找到一個坐標變換,讓復(fù)雜甚至不可能問題變得簡單可行。
舉個栗子,就是一個圓的方程。如果是在笛卡爾坐標系下用方程表示單位圓的話,可以將圓的軌跡表示為如下隱函數(shù),

但是,如果將 y 求解出來,以獲得顯式表達式的話,情況將會變得很糟,

這樣做,我們必須將平方根的兩個分支(圓的上半部分和下半部分)對應(yīng)的簡單函數(shù)組合在一起才能表示一個完整的圓。這種表示方式不僅美學上有所遺憾,還有礙于展示圓固有的幾何簡單性。
講到這里,想到一個疑問。圓的軌跡貌似需要兩個坐標來刻畫,但是古人(不管中國人還是外國人)還沒有坐標的概念,那么古代數(shù)學家是如何描述圓的呢?
A circle is a plane figure bounded by one curved line, and such that all straight lines drawn from a certain point within it to the bounding line, are equal. The bounding line is called its circumference and the point, its centre.
“圓,一中同長也”。

這就是墨家經(jīng)典《墨經(jīng)》中對圓下的定義。

墨子雖然以思想家傳世,但其實是木匠出身。不過,跟一般木匠不同,干技術(shù)活的同時還喜歡鉆研光學、力學和幾何學等。估計是靠畫線、畫圓、打孔等技能吃飯的同時啟發(fā)了他對相關(guān)問題的思考,從而提出了一些概念和方法。
比如講計算機視覺時不得不提的一項我國古代的創(chuàng)舉,小孔成像,就是他老人家及門徒的杰作。這可能也是第一顆量子科學實驗衛(wèi)星取名墨子號的原因吧。

再進一步,如果要定義橢圓呢?我國古代貌似沒有橢圓的概念,但順著墨家定義圓的方式,可以推廣一下。那應(yīng)該就是: 橢圓,兩中同長也。
在那個沒有坐標系,沒有符號的年代,墨家學派提出了很多數(shù)學中的概念。不過,他們也沒有提出坐標系這個強大的數(shù)學工具。但如果在他們定義圓的時候配上一個坐標系,那我想應(yīng)該是極坐標。
現(xiàn)在我們知道了,因為古代沒有坐標系,所以不能用公式來表示圖形。只能用文字來描述,古希臘人的定義雖然很詳細,但跟墨家的定義在意思上完全一致。
不過要注意的是,坐標系只是工具,能用它來更好地解決某些問題。但并不代表沒有它不行,甚至數(shù)學家后來又會追求不依賴于坐標系的辦法。

事物及其性質(zhì)以及事物之間的關(guān)系等,本身就在那里,不需要坐標系。只是便于我們刻畫,所以才引入不同的坐標系。如果把坐標系比作衣服,那么有些衣服可能會更合身,但是不穿衣服也有不穿衣服的美。
繞了一大圈想說什么呢?其實想說的是,對于像圓這種圖形,直角坐標并不直觀(我們現(xiàn)代人的腦袋已經(jīng)從小被數(shù)學知識改造過了)。也許另一個坐標更自然,對,那就是極坐標,用(距離,角度)來表示,而不是兩個抽象的變量。

如果我們使用極坐標表示單位圓,它將變得簡單明了。

在極坐標中,我們的單位圓采用簡單形式
直角坐標是矩形的自然坐標,極坐標是圓形的自然坐標。本文將把這種思路簡單應(yīng)用于構(gòu)建神經(jīng)網(wǎng)絡(luò),通過一個示例來說明選擇正確坐標系的重要性。
02神經(jīng)網(wǎng)絡(luò)擬合函數(shù)
我們知道,人工神經(jīng)網(wǎng)絡(luò)(ANN)就是通過將簡單的非線性函數(shù)(層)鏈接起來構(gòu)建的網(wǎng)絡(luò)(函數(shù))。

萬能逼近定理告訴我們,通過將這些簡單層鏈接在一起,我們可以用有限深度和寬度的 ANN 來逼近表示一般的函數(shù)。不嚴謹地說,激活函數(shù)的多重復(fù)合構(gòu)成了神經(jīng)網(wǎng)絡(luò)的坐標系。不同的坐標系可以讓神經(jīng)網(wǎng)絡(luò)具有不同的格局或者世界觀。
讓我們看一個簡單的例子,看看如何使用神經(jīng)網(wǎng)絡(luò)來近似逼近正弦函數(shù)。
03神經(jīng)網(wǎng)絡(luò)擬合 sin(x)
讓我們應(yīng)用這種功能強大的函數(shù)逼近方法來構(gòu)建簡單函數(shù)
下面的代碼使用標準的非線性函數(shù) tanh 構(gòu)建一個具有兩個隱藏層的簡單網(wǎng)絡(luò)。
ann?=?Chain(Dense(1,20,tanh),Dense(20,20,tanh),Dense(20,1));
來個草圖展示一下該神經(jīng)網(wǎng)絡(luò),

上圖顯示了我們只有一個輸入和輸出值,中間有兩個隱藏圖層。可以這么理解,該網(wǎng)絡(luò)用于表示特定的一個函數(shù)族,通過固定參數(shù)來指定其中的一個具體函數(shù)。

好了,我們希望可以用該函數(shù)族中的某個成員來近似表示函數(shù)
但是我們沒有這般神力,即使拿出紙和筆去演算也很難下手。那怎么辦呢?我們可以用數(shù)據(jù)驅(qū)動的方法來處理。為了嘗試找到最接近它的成員,我們可以使用一些訓(xùn)練數(shù)據(jù)通過最小化誤差來找到那些參數(shù)。
function?loss(x,?y)
????pred=ann(x)
????loss=Flux.mse(ann(x),?y)
????#loss+=0.1*sum(l1,params(ann))?#l1?reg
????return?loss
end
@epochs?3000?Flux.train!(loss,params(ann),?data,?ADAM())
擬合神經(jīng)網(wǎng)絡(luò)后,我們可以看看它對訓(xùn)練數(shù)據(jù)和一組測試數(shù)據(jù)的表現(xiàn)如何。

這個神經(jīng)網(wǎng)絡(luò)好像學會了一部分,但其他部分就錯的離譜了,怎么回事呢?這其實跟我們的目標有關(guān)系,我們要表示的正弦函數(shù)是個周期函數(shù),但是我們的數(shù)據(jù)只有部分。換句話說,從這些數(shù)據(jù)中學不到周期性,因此網(wǎng)絡(luò)并沒有捕獲信號的周期性,用行話說就是對測試數(shù)據(jù)的泛化極差(綠色)。
這是什么地方出錯了呢?經(jīng)常被引用的萬有逼近定理告訴我們,可以使用有限深度和寬度的前饋神經(jīng)網(wǎng)絡(luò)來表示一般的函數(shù)。對的,神經(jīng)網(wǎng)絡(luò)存在某些參數(shù)(權(quán)重和偏置)可以用來表示函數(shù),這點沒錯,但它并不意味著我們可以輕松地找到這些參數(shù)。
好吧,那我們再次嘗試應(yīng)用蠻力來建立更深的網(wǎng)絡(luò)或訓(xùn)練更長的時間呢。但是,別急,讓我們改變一下思路。一個非常簡單的更改將使我們在很短的時間內(nèi)得到一個接近完美的近似值。
Ξ巧妙的做法
有了這些數(shù)據(jù),我們可以看到它是周期性的。但是,我們前面的神經(jīng)網(wǎng)絡(luò)根本沒有考慮這層信息。那怎么利用周期性呢?除了使用 tanh 非線性函數(shù)外,我們也可以使用 sin 函數(shù)啊。這樣,我們第一層的輸出將是周期性的。
對啊,激活函數(shù)不一定就是 tanh 和 sigmoid 之類的函數(shù),也可以是個周期函數(shù)啊,比如 sin 函數(shù)。這樣一整,我們的神經(jīng)網(wǎng)絡(luò)將具有天生的周期預(yù)見性。所謂的激活函數(shù),相當于賦予了神經(jīng)網(wǎng)絡(luò)一定的世界觀。
下圖顯示的是為該系統(tǒng)提供更好的近似網(wǎng)絡(luò)的想法。

我們用函數(shù)形式寫出上面使用的網(wǎng)絡(luò),

其中 Q 是隱藏層中神經(jīng)元的數(shù)量。這在 Flux 中很容易做到,
Q?=?20;
ann?=?Chain(Dense(1,Q,sin),Dense(Q,1));
讓我們來擬合這個新模型,看看是否可以獲得更好的效果。

是不是如有神力,一下讓神經(jīng)網(wǎng)絡(luò)開了天眼的趕腳?顯然,這是一個更好的模型,因為它捕獲了周期性。但是,請注意,我們在訓(xùn)練和測試數(shù)據(jù)上仍然略有偏差。這可能是因為我們的模型仍然具有實際上并不需要的額外自由度。
我們可以通過對參數(shù)應(yīng)用一些正則化來解決此問題,但是針對這個例子,我們可以用非常酷的數(shù)學來改善它。

其實呢,上面的神經(jīng)網(wǎng)絡(luò)的功能形式與傅立葉級數(shù)的形式非常接近。傅立葉級數(shù)是一組基,可用于表示有限域 [a,b] 上所有的好函數(shù)。如果函數(shù)是周期性的,則可以將對有限域的描述擴展到整個實數(shù)軸。因此,傅立葉級數(shù)通常用于周期函數(shù)。
傅立葉級數(shù)的形式為,

我們的神經(jīng)網(wǎng)絡(luò)與傅立葉級數(shù)之間的唯一區(qū)別是我們的神經(jīng)網(wǎng)絡(luò)允許權(quán)重
在 Flux 庫中,很容易從可訓(xùn)練的參數(shù)集中刪除第一層中的那些權(quán)重參數(shù)。通過將它們設(shè)置為整數(shù)值,我們實際上可以創(chuàng)建一個神經(jīng)網(wǎng)絡(luò),它是一個傅立葉級數(shù)。
#?Fourier?Series?ANN
Q?=?20;
ann?=?Chain(Dense(1,Q,sin),Dense(Q,1));
function?loss(x,?y)
????pred=ann(x)
????loss=Flux.mse(ann(x),?y)
????return?loss
end
opt?=?ADAM()
ps=params(ann)
for?j=1:20
????ann[1].W[j]=j
end
delete!(ps,?ann[1].W)?#Make?the?first?layers?weights?fixed
@epochs?3000?Flux.train!(loss,ps,?data,?opt)
下圖展示的是使用傅立葉 ANN 擬合 sin(x) 函數(shù)的效果,

如果你想知道這種方法是否可以很好地泛化到其他更復(fù)雜的周期函數(shù)。考慮一個混有一些高次諧波的周期信號。

04小結(jié)
這個簡單的示例提供了一些有關(guān) ANN 的工作原理以及我們?nèi)绾胃倪M模型的重要見解。神經(jīng)網(wǎng)絡(luò)的設(shè)計會對結(jié)果產(chǎn)生巨大影響。對問題和領(lǐng)域的特定了解會產(chǎn)生巨大的影響。 確保將你所知道的有關(guān)問題的所有信息都傳達給神經(jīng)網(wǎng)絡(luò)。在這里,我們看到告訴函數(shù)產(chǎn)生周期性信號的作用遠遠超過了增加網(wǎng)絡(luò)規(guī)?;蛴?xùn)練時間所能帶來的好處。

Ξ劃重點
神經(jīng)網(wǎng)絡(luò)相當于定義了一個函數(shù)空間,空間的坐標系(基)是通過一系列網(wǎng)絡(luò)層以及激活函數(shù)以多重復(fù)合方式構(gòu)建出來的。 構(gòu)建神經(jīng)網(wǎng)絡(luò)時用到的激活函數(shù)在表示這個函數(shù)空間的坐標系(基)上發(fā)揮了重要作用,不同的激活函數(shù)能讓網(wǎng)絡(luò)具有不同的表達能力,具體設(shè)計就看具體問題。 有時候,給網(wǎng)絡(luò)配上合適的坐標系,會事半功倍,比加深網(wǎng)絡(luò)、努力訓(xùn)練更重要。這叫什么來著?有沒有那么點格局比努力更重要的趕腳?
?參考資料?
Flux: https://github.com/FluxML/Flux.jl
[2]Kevin Hannay: https://towardsdatascience.com/work-smarter-not-harder-when-building-neural-networks-6f4aa7c5ee61
[3]code: https://github.com/khannay/CurveFittingNeuralNets
