先從迴歸(Regression)問題提及。我在本吧已經看到很多人提到若是想實現強AI,就必須讓機器學會觀察並總結規律的言論。具體地說,要讓機器觀察什麼是圓的,什麼是方的,區分各類顏色和形狀,而後根據這些特徵對某種事物進行分類或預測。其實這就是迴歸問題。php
如何解決迴歸問題?咱們用眼睛看到某樣東西,能夠一會兒看出它的一些基本特徵。但是計算機呢?它看到的只是一堆數字而已,所以要讓機器從事物的特徵中找到規律,實際上是一個如何在數字中找規律的問題。html
例:假若有一串數字,已知前六個是一、三、五、7,9,11,請問第七個是幾?
你一眼能看出來,是13。對,這串數字之間有明顯的數學規律,都是奇數,並且是按順序排列的。
那麼這個呢?前六個是0.1四、0.5七、1.2九、2.2九、3.5七、5.14,請問第七個是幾?
這個就不那麼容易看出來了吧!咱們把這幾個數字在座標軸上標識一下,能夠看到以下圖形:算法
用曲線鏈接這幾個點,延着曲線的走勢,能夠推算出第七個數字——7。
因而可知,迴歸問題實際上是個曲線擬合(Curve Fitting)問題。那麼究竟該如何擬合?機器不可能像你同樣,憑感受隨手畫一下就擬合了,它必需要經過某種算法才行。
假設有一堆按必定規律分佈的樣本點,下面我以擬合直線爲例,說說這種算法的原理。編程
其實很簡單,先隨意畫一條直線,而後不斷旋轉它。每轉一下,就分別計算一下每一個樣本點和直線上對應點的距離(偏差),求出全部點的偏差之和。這樣不斷旋轉,當偏差之和達到最小時,中止旋轉。說得再複雜點,在旋轉的過程當中,還要不斷平移這條直線,這樣不斷調整,直到偏差最小時爲止。這種方法就是著名的梯度降低法(Gradient Descent)。爲何是梯度降低呢?在旋轉的過程當中,當偏差愈來愈小時,旋轉或移動的量也跟着逐漸變小,當偏差小於某個很小的數,例如0.0001時,咱們就能夠收工(收斂, Converge)了。囉嗦一句,若是隨便轉,轉過頭了再往回轉,那就不是梯度降低法。網絡
咱們知道,直線的公式是y=kx+b,k表明斜率,b表明偏移值(y軸上的截距)。也就是說,k能夠控制直線的旋轉角度,b能夠控制直線的移動。強調一下,梯度降低法的實質是不斷的修改k、b這兩個參數值,使最終的偏差達到最小。
求偏差時使用 累加(直線點-樣本點)^2,這樣比直接求差距 累加(直線點-樣本點) 的效果要好。這種利用最小化偏差的平方和來解決迴歸問題的方法叫最小二乘法(Least Square Method)。app
問題到此使彷佛就已經解決了,但是咱們須要一種適應於各類曲線擬合的方法,因此還須要繼續深刻研究。
咱們根據擬合直線不斷旋轉的角度(斜率)和擬合的偏差畫一條函數曲線,如圖:
從圖中能夠看出,偏差的函數曲線是個二次曲線,凸函數(下凸, Convex),像個碗的形狀,最小值位於碗的最下端。若是在曲線的最底端畫一條切線,那麼這條切線必定是水平的,在圖中能夠把橫座標軸當作是這條切線。若是能求出曲線上每一個點的切線,就能獲得切線位於水平狀態時,即切線斜率等於0時的座標值,這個座標值就是咱們要求的偏差最小值和最終的擬合直線的最終斜率。
這樣,梯度降低的問題集中到了切線的旋轉上。切線旋轉至水平時,切線斜率=0,偏差降至最小值。機器學習
切線每次旋轉的幅度叫作學習率(Learning Rate),加大學習率會加快擬合速度,可是若是調得太大會致使切線旋轉過分而沒法收斂。 [學習率實際上是個預先設置好的參數,不會每次變化,不過能夠影響每次變化的幅度。]函數
注意:對於凹凸不平的偏差函數曲線,梯度降低時有可能陷入局部最優解。下圖的曲線中有兩個坑,切線有可能在第一個坑的最底部趨於水平。工具
微分就是專門求曲線切線的工具,求出的切線斜率叫作導數(Derivative),用dy/dx或f’(x)表示。擴展到多變量的應用,若是要同時求多個曲線的切線,那麼其中某個切線的斜率就叫偏導數(Partial Derivative),用∂y/∂x表示,∂讀「偏(partial)」。因爲實際應用中,咱們通常都是對多變量進行處理,我在後面提到的導數也都是指偏導數。學習
以上是線性迴歸(Linear Regression)的基本內容,以此方法爲基礎,把直線公式改成曲線公式,還能夠擴展出二次迴歸、三次迴歸、多項式迴歸等多種曲線迴歸。下圖是Excel的迴歸分析功能。
在多數狀況下,曲線迴歸會比直線迴歸更精確,但它也增長了擬合的複雜程度。
直線方程y=kx+b改成二次曲線方程y=ax^2+bx+c時,參數(Parameter)由2個(分別是k、b)變爲3個(分別是a、b、c),特徵(Feature)由1個(x)變爲2個(x^2和x)。三次曲線和複雜的多項式迴歸會增長更多的參數和特徵。
前面講的是總結一串數字的規律,現實生活中咱們每每要根據多個特徵(多串數字)來分析一件事情,每一個原始特徵咱們都看做是一個維度(Dimension)。例如一個學生的學習成績好壞要根據語文、數學、英語等多門課程的分數來綜合判斷,這裏每門課程都是一個維度。當使用二次曲線和多變量(多維)擬合的狀況下,特徵的數量會劇增,特徵數=維度^2/2 這個公式能夠大概計算出特徵增長的狀況,例如一個100維的數據,二次多項式擬合後,特徵會增長到100*100/2=5000個。
下面是一張50*50像素的灰度圖片,若是用二次多項式擬合的話,它有多少個特徵呢?——大約有3百萬!
它的維度是50*50=2500,特徵數=2500*2500/2=3,125,000。若是是彩色圖片,維度會增長到原來的3倍,那麼特徵數將增長到接近3千萬了!
這麼小的一張圖片,就有這麼巨大的特徵量,能夠想像一下咱們的數碼相機拍下來的照片會有多大的特徵量!而咱們要作的是從十萬乃至億萬張這樣的圖片中找規律,這可能嗎?
很顯然,前面的那些迴歸方法已經不夠用了,咱們急需找到一種數學模型,可以在此基礎上不斷減小特徵,下降維度。
因而,「人工神經網絡(ANN, Artificial Neural Network)」就在這樣苛刻的條件下粉墨登場了,神經科學的研究成果爲機器學習領域開闢了廣闊的道路。
神經元
有一種假說:「智能來源於單一的算法(One Learning Algorithm)」。若是這一假說成立,那麼利用單一的算法(神經網絡)處理世界上變幻無窮的問題就成爲可能。咱們沒必要對萬事萬物進行編程,只需採用以不變應萬變的策略便可。有愈來愈多的證據證實這種假說,例如人類大腦發育初期,每一部分的職責分工是不肯定的,也就是說,人腦中負責處理聲音的部分其實也能夠處理視覺影像
下圖是單個神經元(Neuron),或者說一個腦細胞的生理結構:
下面是單個神經元的數學模型,能夠看出它是生理結構的簡化版,模仿的還挺像:
解釋一下:+1表明偏移值(偏置項, Bias Units);X1,X2,X2表明初始特徵;w0,w1,w2,w3表明權重(Weight),即參數,是特徵的縮放倍數;特徵通過縮放和偏移後所有累加起來,此後還要通過一次激活運算而後再輸出。激活函數有不少種,後面將會詳細說明。
舉例說明:
X1*w1+X2*w2+…+Xn*wn這種計算方法稱爲加權求和(Weighted Sum)法,此方法在線性代數裏極爲經常使用。加權求和的標準數學符號是,不過爲了簡化,我在教程裏使用女巫布萊爾的符號表示,
恰好是一個加號和一個乘號的組合。
這個數學模型有什麼意義呢?下面我對照前面那個 y=kx+b 直線擬合的例子來講明一下。
這時咱們把激活函數改成Purelin(45度直線),Purelin就是y=x,表明保持原來的值不變。
這樣輸出值就成了 Y直線點 = b + X直線點*k,即y=kx+b。看到了吧,只是換了個馬甲而已,還認的出來嗎?下一步,對於每一個點都進行這種運算,利用Y直線點和Y樣本點計算偏差,把偏差累加起來,不斷地更新b、k的值,由此不斷地移動和旋轉直線,直到偏差變得很小時停住(收斂)。這個過程徹底就是前面講過的梯度降低的線性迴歸。
通常直線擬合的精確度要比曲線差不少,那麼使用神經網絡咱們將如何使用曲線擬合?答案是使用非線性的激活函數便可,最多見的激活函數是Sigmoid(S形曲線),Sigmoid有時也稱爲邏輯迴歸(Logistic Regression),簡稱logsig。logsig曲線的公式以下:
還有一種S形曲線也很常見到,叫雙曲正切函數(tanh),或稱tansig,能夠替代logsig。
下面是它們的函數圖形,從圖中能夠看出logsig的數值範圍是0~1,而tansig的數值範圍是-1~1。
天然常數e
公式中的e叫天然常數,也叫歐拉數,e=2.71828…。e是個很神祕的數字,它是「天然律」的精髓,其中暗藏着天然增加的奧祕,它的圖形表達是旋渦形的螺線。
融入了e的螺旋線,在不斷循環縮放的過程當中,能夠徹底保持它原有的彎曲度不變,就像一個無底的黑洞,吸進再多的東西也能夠保持原來的形狀。這一點相當重要!它可讓咱們的數據在經歷了多重的Sigmoid變換後仍維持原先的比例關係。
e是怎麼來的?e = 1 + 1/1! + 1/2! + 1/3! + 1/4! + 1/5! + 1/6! + 1/7! + … = 1 + 1 + 1/2 + 1/6 + 1/24 + 1/120+ … ≈ 2.71828 (!表明階乘,3!=1*2*3=6)
再舉個通俗點的例子:從前有個財主,他特別貪財,喜歡放債。放出去的債年利率爲100%,也就是說借1塊錢,一年後要還給他2塊錢。有一天,他想了個壞主意,要一年算兩次利息,上半年50%,下半年50%,這樣上半年就有1塊5了,下半年按1塊5的50%來算,就有1.5/2=0.75元,加起來一年是:上半年1.5+下半年0.75=2.25元。用公式描述,就是(1+50%)(1+50%)=(1+1/2)^2=2.25元。但是他又想,若是按季度算,一年算4次,那豈不是更賺?那就是(1+1/4)^4=2.44141,果真更多了。他很高興,因而又想,那乾脆天天都算吧,這樣一年下來就是(1+1/365)^365=2.71457。而後他還想每秒都算,結果他的管家把他拉住了,說要再算下去別人都會瘋掉了。不過財主仍是不死心,算了不少年終於算出來了,當x趨於無限大的時候,e=(1+1/x)^x≈ 2.71828,結果他成了數學家。
e在微積分領域很是重要,e^x的導數依然是e^x,本身的導數剛好是它本身,這種巧合在實數範圍內絕無僅有。
一些不一樣的稱呼:
e^x和e^-x的圖形是對稱的;ln(x)是e^x的逆函數,它們呈45度對稱。
神經網絡
好了,前面花了很多篇幅來介紹激活函數中那個暗藏玄機的e,下面能夠正式介紹神經元的網絡形式了。
下圖是幾種比較常見的網絡形式:
計算方法:
前面講過,使用梯度降低的方法,要不斷的修改k、b兩個參數值,使最終的偏差達到最小。神經網絡可不僅k、b兩個參數,事實上,網絡的每條鏈接線上都有一個權重參數,如何有效的修改這些參數,使偏差最小化,成爲一個很棘手的問題。從人工神經網絡誕生的60年代,人們就一直在不斷嘗試各類方法來解決這個問題。直到80年代,偏差反向傳播算法(BP算法)的提出,才提供了真正有效的解決方案,使神經網絡的研究絕處逢生。
BP算法是一種計算偏導數的有效方法,它的基本原理是:利用前向傳播最後輸出的結果來計算偏差的偏導數,再用這個偏導數和前面的隱藏層進行加權求和,如此一層一層的向後傳下去,直到輸入層(不計算輸入層),最後利用每一個節點求出的偏導數來更新權重。
爲了便於理解,後面我一概用「殘差(error term)」這個詞來表示偏差的偏導數。
輸出層→隱藏層:殘差 = -(輸出值-樣本值) * 激活函數的導數
隱藏層→隱藏層:殘差 = (右層每一個節點的殘差加權求和)* 激活函數的導數
若是輸出層用Purelin做激活函數,Purelin的導數是1,輸出層→隱藏層:殘差 = -(輸出值-樣本值)
若是用Sigmoid(logsig)做激活函數,那麼:Sigmoid導數 = Sigmoid*(1-Sigmoid)
輸出層→隱藏層:殘差 = -(Sigmoid輸出值-樣本值) * Sigmoid*(1-Sigmoid) = -(輸出值-樣本值)輸出值(1-輸出值)
隱藏層→隱藏層:殘差 = (右層每一個節點的殘差加權求和)* 當前節點的Sigmoid*(1-當前節點的Sigmoid)
若是用tansig做激活函數,那麼:tansig導數 = 1 - tansig^2
殘差所有計算好後,就能夠更新權重了:
輸入層:權重增長 = 當前節點的Sigmoid * 右層對應節點的殘差 * 學習率
隱藏層:權重增長 = 輸入值 * 右層對應節點的殘差 * 學習率
偏移值的權重增長 = 右層對應節點的殘差 * 學習率
學習率前面介紹過,學習率是一個預先設置好的參數,用於控制每次更新的幅度。
此後,對所有數據都反覆進行這樣的計算,直到輸出的偏差達到一個很小的值爲止。
以上介紹的是目前最多見的神經網絡類型,稱爲前饋神經網絡(FeedForward Neural Network),因爲它通常是要向後傳遞偏差的,因此也叫BP神經網絡(Back Propagation Neural Network)。
BP神經網絡的特色和侷限:
- BP神經網絡能夠用做分類、聚類、預測等。須要有必定量的歷史數據,經過歷史數據的訓練,網絡能夠學習到數據中隱含的知識。在你的問題中,首先要找到某些問題的一些特徵,以及對應的評價數據,用這些數據來訓練神經網絡。
- BP神經網絡主要是在實踐的基礎上逐步完善起來的系統,並不徹底是創建在仿生學上的。從這個角度講,實用性 > 生理類似性。
- BP神經網絡中的某些算法,例如如何選擇初始值、如何肯定隱藏層的節點個數、使用何種激活函數等問題,並無確鑿的理論依據,只有一些根據實踐經驗總結出的有效方法或經驗公式。
- BP神經網絡雖然是一種很是有效的計算方法,但它也以計算超複雜、計算速度超慢、容易陷入局部最優解等多項弱點著稱,所以人們提出了大量有效的改進方案,一些新的神經網絡形式也層出不窮。
文字的公式看上去有點繞,下面我發一個詳細的計算過程圖。
參考這個:http://www.myreaders.info/03_Back_Propagation_Network.pdf 我作了整理
這裏介紹的是計算完一條記錄,就立刻更新權重,之後每計算完一條都即時更新權重。實際上批量更新的效果會更好,方法是在不更新權重的狀況下,把記錄集的每條記錄都算過一遍,把要更新的增值所有累加起來求平均值,而後利用這個平均值來更新一次權重,而後利用更新後的權重進行下一輪的計算,這種方法叫批量梯度降低(Batch Gradient Descent)。
推薦的入門級學習資源:
Andrew Ng的《機器學習》公開課: https://class.coursera.org/ml
Coursera公開課筆記中文版(神經網絡的表示): http://52opencourse.com/139/coursera公開課筆記-斯坦福大學機器學習第八課-神經網絡的表示-neural-networks-representation
Coursera公開課視頻(神經網絡的學習): http://52opencourse.com/289/coursera公開課視頻-斯坦福大學機器學習第九課-神經網絡的學習-neural-networks-learning
斯坦福深度學習中文版: http://deeplearning.stanford.edu/wiki/index.php/UFLDL教程
謝謝你們的支持。
今天先發個實際編程操做教程,介紹一下Matlab神經網絡工具箱的用法,後面有空再加些深刻點的知識。
關於Matlab的入門教程,參看這個帖子:http://tieba.baidu.com/p/2945924081
例1:咱們都知道,面積=長*寬,假如咱們有一組數測量據以下:
咱們利用這組數據來訓練神經網絡。(在Matlab中輸入如下的代碼,按回車便可執行)
p = [2 5; 3 6; 12 2; 1 6; 9 2; 8 12; 4 7; 7 9]’; % 特徵數據X1,X2
t = [10 18 24 6 18 96 28 63]; % 樣本值
net = newff(p, t, 20); % 建立一個BP神經網絡 ff=FeedForward
net = train(net, p, t); % 用p,t數據來訓練這個網絡
出現以下的信息,根據藍線的顯示,能夠看出最後收斂時,偏差已小於10^-20。
你也許會問,計算機難道這樣就能學會乘法規則嗎?不用背乘法口訣表了?先隨便選幾個數字,試試看:
s = [3 7; 6 9; 4 5; 5 7]’; % 準備一組新的數據用於測試
y = sim(net, s) % 模擬一下,看看效果
% 結果是:25.1029 61.5882 29.5848 37.5879
看到了吧,預測結果和實際結果仍是有差距的。不過從中也能看出,預測的數據不是瞎蒙的,至少仍是有那麼一點靠譜。若是訓練集中的數據再多一些的話,預測的準確率還會大幅度提升。
你測試的結果也許和個人不一樣,這是由於初始化的權重參數是隨機的,可能會陷入局部最優解,因此有時預測的結果會很不理想。
例2:下面測試一下擬合正弦曲線,此次咱們隨機生成一些點來作樣本。
p = rand(1,50)*7 % 生成1行50個0~7之間的隨機數
t = sin(p) % 計算正弦曲線
s = [0:0.1:7]; % 生成0~7的一組數據,間隔0.1,用於模擬測試
plot(p, t, ‘x’) % 畫散點圖
net = newff(p, t, 20); % 建立神經網絡
net = train(net, p, t); % 開始訓練
y = sim(net, s); % 模擬
plot(s, y, ‘x’) % 畫散點圖
從圖中看出,此次的預測結果顯然是不理想的,咱們須要設置一些參數來調整。
下面的設置是一種標準的批量梯度降低法的配置。
% 建立3層神經網絡 [隱藏層10個節點->logsig, 輸出層1個節點->purelin] traingd表明梯度降低法
net = newff(p, t, 10, {‘logsig’ ‘purelin’}, ‘traingd’); % 10不能寫成[10 1]
% 設置訓練參數
net.trainparam.show = 50; % 顯示訓練結果(訓練50次顯示一次)
net.trainparam.epochs = 500; % 總訓練次數
net.trainparam.goal = 0.01; % 訓練目標:偏差<0.01
net.trainParam.lr = 0.01; % 學習率(learning rate)
net = train(net, p, t); % 開始訓練
注意:newff的第三個參數10不能寫成[10 1],不然就是4層網絡,兩個隱藏層,分別是10個和1個節點。這個很容易弄錯。(輸出層的節點數程序會自動根據t的維度自動判斷,因此不用指定)
y = sim(net, s); % 模擬
plot(s, y, ‘x’) % 畫散點圖
這時的效果顯然更差了。
把精度調高一點看看。訓練次數加到9999,偏差<0.001;學習率調到0.06,但願能加快點速度。
% 建立2層神經網絡 [隱藏層10個節點->logsig, 輸出層1個節點->purelin] traingd表明梯度降低法
net = newff(p, t, 10, {‘logsig’ ‘purelin’}, ‘traingd’);
% 設置訓練參數
net.trainparam.show = 50; % 每間隔50次顯示一次訓練結果
net.trainparam.epochs = 9999; % 總訓練次數
net.trainparam.goal = 0.001; % 訓練目標:偏差<0.001
net.trainParam.lr = 0.06; % 學習率(learning rate)
net = train(net, p, t); % 開始訓練
標準的批量梯度降低法的速度確實夠慢,此次計算花了一分多鐘。
y = sim(net, s); % 模擬
plot(s, y, ‘x’) % 畫散點圖
效果比上次稍好一點。不過這條曲線顯得坑坑窪窪的很難看,這是一種過擬合(Overfitting)現象,與之相反的是欠擬合(Underfitting)。
先來解決速度問題,把traingd改成trainlm便可。trainlm使用LM算法,是介於牛頓法和梯度降低法之間的一種非線性優化方法,不但會加快訓練速度,還會減少陷入局部最小值的可能性,是Matlab的默認值。
net = newff(p, t, 10, {‘logsig’ ‘purelin’}, ‘trainlm’);
… 後面的代碼不變
這個速度比較驚歎了,1秒鐘以內完成,只作了6輪計算,效果也好了一些。不過,LM算法也有弱點,它佔用的內存很是大,因此沒把其它算法給淘汰掉。
下面解決過擬合問題,把隱藏層的節點數目設少一點就好了。
net = newff(p, t, 3, {‘logsig’ ‘purelin’}, ‘trainlm’);
… 後面的代碼不變
這回終於達到滿意的效果了。(有時會出現局部最優解,能夠多試幾回)
若是節點數目太少,會出現欠擬合的狀況。
關於隱藏層的節點個數,通常是要憑感受去調的。若是訓練集的維數比較多,調節起來比較耗時間,這時能夠根據經驗公式上下浮動地去調整。
下面給出幾個經驗公式供參考:
若是把輸出層改成logsig激活會是什麼樣子呢?
net = newff(p, t, 3, {‘logsig’ ‘logsig’}); % 建立神經網絡
net = train(net, p, t); % 開始訓練
y = sim(net, s); % 模擬
plot(s, y, ‘x’) % 畫散點圖
能夠看出,-1~0範圍之間的點都變爲0了。使用logsig輸出時要想獲得完整數值範圍的效果,必須先對數據進行歸一化才行。
歸一化(Normalization),也叫標準化,就是把一堆數字按比例縮放到0~1或-1~1的範圍。
雖然用Purelin輸出能夠沒必要歸一化,但歸一化能在必定程度上加快收斂速度,所以被許多教程定爲訓練前的必須步驟。
公式爲:歸一值 = (當前值x-最小值min)/(最大值max-最小值min)
若是限定了範圍,公式爲:y = (ymax-ymin)*(x-xmin)/(xmax-xmin) + ymin;
0.1~0.9的範圍:(0.9-0.1)(x-min)/(max-min)(0.9-0.1)+0.1
把5, 2, 6, 3這四個數歸一化:
Matlab的歸一化命令爲:mapminmax
注:網上的很多教程裏用premnmx命令來歸一化,要注意Matlab版本R2007b和R2008b,premnmx在處理單列數據時有bug,Matlab已給出了警告,R2009a版才修正。所以推薦使用mapminmax。mapminmax的輸入輸出值和premnmx是行列顛倒的,使用時要注意代碼中是否添加轉置符號。
a = [5, 2, 6, 3];
b = mapminmax(a, 0, 1) % 歸一化到0~1之間
% b = 0.7500 0 1.0000 0.2500
c = mapminmax(a) % 歸一化到-1~1之間
% c = 0.5000 -1.0000 1.0000 -0.5000
反歸一化(Denormalization)就是按歸一化時的比例還原數值。
a = [5, 2, 6, 3];
[c,PS] = mapminmax(a); % PS記錄歸一化時的比例
mapminmax(‘reverse’, c, PS) % 利用PS反歸一化
% ans = 5 2 6 3
神經網絡的歸一化(0~1範圍)代碼:
p = rand(1,50)*7; % 特徵數據
t = sin(p); % 樣本值
s = [0:0.1:7]; % 測試數據
[pn, ps] = mapminmax(p, 0, 1); % 特徵數據歸一化
[tn, ts] = mapminmax(t, 0, 1); % 樣本值歸一化
sn = mapminmax(‘apply’, s, ps); % 測試數據,按ps比例縮放
net = newff(pn, tn, [5 1], {‘logsig’ ‘logsig’}); % 建立神經網絡
net = train(net, pn, tn); % 開始訓練
yn = sim(net, sn); % 模擬
y = mapminmax(‘reverse’, yn, ts); % 按ps的比例還原
plot(s, y, ‘x’) % 畫散點圖
神經網絡工具箱還有一個UI圖形操做界面,執行nntool就能夠打開。我以爲不如寫代碼方便,因此不怎麼用。我提供一個相關的教程連接,有興趣的能夠看一下:matlab神經網絡工具箱建立神經網絡 - http://blog.新浪.com.cn/s/blog_8684880b0100vxtv.html (新浪替換成sina)
關於Sigmoid的由來,中文的網站上不多有說起的。下面簡單講一下,但願能給你們拓展一下思路。
PS: 這裏的公式我都給出了求解過程,但現在這個年頭,用手工解題的人愈來愈少了,通常的方程用軟件來解就好了。
例如解Sigmoid微分方程,能夠用Matlab去解:
dsolve(‘Dx=x*(1-x)’)
% ans = 1/(1+exp(-t)*C1)
若是想獲得求解的步驟或更詳細的信息,推薦使用Wolfram:http://www.wolframalpha.com
在Wolfram的搜索框輸入 x’=x(1-x) 便可。
logsig
Sigmoid函數(S形函數,Logistic Function)是受統計學模型的啓發而產生的激活函數。
基於生物學的神經元激活函數是這樣的:
參看:http://eprints.pascal-network.org/archive/00008596/01/glorot11a.pdf
實踐證實了基於統計學的Sigmoid函數激活效果要比基於生物學的模型好,並且計算起來很方便,因此說不能以機器和人的類似度爲標準來判斷AI算法的好壞。
Sigmoid函數原先是個描述人口增加的數學模型,1838提出,給出的是導數形式(機率密度)。人口增加規律:起初階段大體是指數增加;而後逐漸開始變得飽和,增加變慢;達到成熟時幾乎中止增加;整個過程形如一條S型曲線。
導數的形式知道了,那麼它的原函數是什麼樣子呢?已知導數求原函數,用統計學的話來說,即根據機率密度函數(PDF)求累積分佈函數(CDF),不定積分(Indefinite Integral)就是專門用來作這個的工具。
根據不定積分的知識可知,因爲常數項是可變的,因此存在無數個原函數的可能。讓咱們先用圖解法看一下:既然導數是函數曲線的斜率,那麼能夠把必定數值範圍內的斜率,都畫成一根根的短斜線,組成斜率場(Slope Fields, Direction Fields),而後根據這些斜線的走勢,畫出積分曲線。
Matlab能夠用quiver命令來畫斜率場。
從上圖中能夠看出,在y軸的0~1之間是個分水嶺,0和1處的方向趨於水平。下面放大0~1的範圍看看是什麼樣子的。
看到了吧,咱們要的Logistic Sigmoid就在這裏呢。
下面給出符號求解的過程:
tansig
雙曲正切函數(雙極S形函數, tanh, Hyperbolic Tangent),讀tanch,18世紀就已經出現了。它的定義是:tanh(x)=sinh(x)/cosh(x),能夠由著名的歐拉公式(Euler’s formula)推導出來。
用tanh做激活函數,收斂比較快,效果比Logistic函數還要好。
歐拉公式: i是虛數(Imaginary Number)單位,它的定義是: (即i^2 = -1)
題外話:根據上面的公式變換,能夠得出史上最美的數學公式: ,數學中最神祕的5個符號e、i、π、1和0,全包含在裏面了。
求tanh的導數:
logsig和tansig的關係:
【轉】機器學習入門——淺談神經網絡
本文轉自:http://tieba.baidu.com/p/3013551686?pid=49703036815&see_lz=1#
我的以爲很全,特別適合接觸神經網絡的新手。
---------------------
做者:殘陽飛雪
來源:CNBLOGS
原文:http://www.javashuo.com/article/p-ddrnpgjc-r.html 版權聲明:本文爲做者原創文章,轉載請附上博文連接!