摘要

基於現今帶動第三次人工智慧熱潮的深度學習逐漸蓬勃發展許多產業包括金融、電機、生醫電子等等產業都在想盡辦法運用這一技術,來提升他們產品的附加價值。所以我覺得現在開始學習深度神經網路,我覺得是一件香值得的事。

 

                                Abstract(我不確定這樣寫有沒有錯...)

Recently, Deep Learning bring the third rush of artificial intelligence and more and more industry start to develop this technology include financial industryelectrical engineer and biomedical electron and so on. There use Deep Learning to rise the value of their product so I think that I learn how to set up the deep neural network from now on is worth.

 

 

What is tensorflow

Tensorflow是一個由google brain 所開發的開源軟體庫,它可以資源多種作業系統,向windowMACUnix等等,也可以支援多種程式語言,pythonjavac++皆可,這篇報告以python來寫,因為tensorflow提供了較多的機械學習相關APIpython

它主要的優勢在於它能夠讓使用者已相當簡單且便捷的方式去搭建一個神經網路,這大大的降低了建立一個深度神經網路的成本及難度。

安裝tensorflow

如果要安裝tensorflowwindow上,tensorflow官網提供了兩種方式來安裝。

這裡以Anconda來說明,因為在window上來說這種方式較為方便,如果用pip來安裝則要在下載完python後,要去注意有沒有安裝到numpymicrosoft Visuall c++的版本問題。

Anconda安裝(取自tensorflow官網)

  • 先安裝好Anconda
  • 在指令視窗中安裝好tensorflow的環境
=>C:> conda create -n tensorflow python=3.5

三、激活tensorflow環境

=>C:> activate tensorflow

四、開始下載tensorflow

=>C:> pip install --ignore-installed --upgrade tensorflow

 

五、測試程式

出現了Hello, TensoFlow!代表下載成功

人工神經網路 vs 生物神經網路

生物神經網路

生物神經網路的學習過程是指大腦中無數神經元連接的過程,透過外接不段的刺激大腦神經元突觸,改變了他們的連接方式,然後不段的加強已建立的神經元連接並建立新的連接方式,師除那些不常用到的路徑,就是以這種方式不段的強化神經網路。

人工神經網路

人工神經網路的學習過程是指用人類用電腦所模擬出的神經網路靠著正向與反向的傳遞來更新神經元內的參數,本質上來說就是一個讓電腦去處理優化的數學模型。

訓練神經網路

我們可以簡單地把訓練人工神經網路這一動作想像成一種擬和參數的過程

我們給電腦大量的數據讓他去輸出結果,一開始會得到很多的錯誤答案,此時再反過來將與真實答案的誤差逆向傳給電腦,讓每個神經元的參數向正確方向改動,這過程稱誤差反向傳遞。

在上述中有提到的神經原理的參數深入來說就是指他們的激勵函數(activation function),隨著第一次輸入時只有一部分神經元被激勵函數激,被激活的神經元會對輸出產生重大影響,若輸出有誤則所有參數都將被修改,容易被激活的神經元會變遲鈍,則另一些會敏感起來變得容易被激活。

:激勵函數

激勵函數簡單來說是為了解決生活中不能用線性方城所概括的問題。

舉個例子來說

如果我們將整個神經網路的處理架構簡化為一個簡單的算式

求出的W為一常數,故整個式子為一個linear function

但是在現實生活中不可能有這麼理想的事,所以當我們要描述一個複雜的系統時,我們需要用到nonlinear function,也就是激勵函數的本質,像這樣:

其中AF()就是激勵函數,以下舉幾個激勵函數的例子

 

:

這些激勵函數必須是可微分的,因為在backpropagation誤差反向傳遞時只有這些可微分的函數才能把誤差傳遞回去。

 

補充:遷移學習概念

當我們好不容易把每個神經元中的激勵函數都修正好之後卻發現這些神經元只能在這個神經網路中運作並做輸出,這是一件非常可惜的事,因為訓練一個龐大的神經網路非常費時,尤其像知名的AlphaGo那種能夠在圍棋下贏高手的系統。所以我們必須開始想如何將這些已經訓練好的神經元用在其他神經網路上,也就是說所謂的遷移學習就是神經網路中的輸出成去掉並轉移到下一個神經網路中。

註:這個功能不論在mxnet還是tensorflow都有內建API

Tensorflow 的處理結構
~如何讓tensor(張量)在網路中流動

取自tensorflow教學網站

這張圖說明著tensorflow資料流程圖圖中的線(edges)則表示在節點間相互聯繫的多維資料陣列, 即張量(tensor)input開始向著隱藏層、輸出層移動到數據處理中心,用優化器把loss降到最低,這其中會不斷的修改著weightbias的值,以達到最佳化。

 

 

 

 

第一個練習程式:一次回歸線的建立

1.首先是用亂數產生1000~1typefloat32的常數(float32是相對於C中的floatfloat64是相對於C中的double),並建立學習目標weight=0.1bias=0.3

2.建立參數(Variable)

此處參數的建立比較奇怪,tensorflow適用tf.Variable指令來建立,以下舉個例子

此處建立了一個state變數還可以幫命名什麼的,最重要的是執行訓練之前一定將這些變數初始化才行,而其中值得一提的是Session指令,以下舉一個例子來解釋他的功能。

Tensorflow中的session比較像是它要執行程式時的命令。

回到建立參數這一步驟,建立完餐術後要開始設定loss的規則讓電腦知道要優化的目標。

3.建立優化器

而這裡我用了GradientDescentOptimizer

所謂GradientDescent優化器的原理簡單來說就是尋找到目標的誤差曲線對它進行偏微分,找到痊癒最小值,此時誤差值最小

此優化器的原始碼引用於tensorflow中的class tf.train.GradientDescent

建立完優化器後,我將loss誤差值minimize到最小。

4.開始訓練

 

5.輸出結果

可看出weight=0.1bias=0.3,與設定的學習目標相同

 

第二個練習程式:二次回歸曲線的建立
y_data = np.square(x_data) - 0.5 + noise

這是本程式的數學模型

這程式就如同剛剛一樣

  • 1.建立隱藏層
  • 2.建立input,與學習目標
  • 3.建立參數(Variable)
  • 4.建立輸出輸入
  • 5.建立優化器

完成這些步驟,豆比較值得一提的是第一部建立影藏層,如下:

tensorflow隱藏層的建立是用定義函數的方式,在建立好內部參數後才會拿過來使用。

最後我將結果用python中的matplotlib函式庫plot出。

紅色為電腦的學習曲線,由涂可看出他越來越接近輸入值也就是藍色的點。

機械學習:分類

有別於剛才的回歸方程,這裡就如同老師上課所提到的讓電腦自行去判斷針對一事物做分類,認為他應該被分類在哪裡,就如同手寫數字便是那樣,把依字母輸入進去在讓電腦去判斷這一字母因該是1~9哪個數字。

要快速入門法的話,我這裡使用了Mnist數據集

它是由 National Institute of Standards and Technology (NIST)收集來的資料,裡面包含70000筆數據分為四個部分

1.Training set images

2.Training set labels

3.Test set images

4.Test set labels

訓練用數據共有60000筆,測試用的則是10000筆。

下載Mnist中的數據集

tensorflow中輸入如下指令

程式的部分

1.建立隱藏層

2.建立inputplaceholder

所謂placeholder就一種將數值握住的站存變數,通常由使用者去修改,以下用個範例說明

 

3.建立參數(Variable)

4.建立輸出

此處使用softmax為激勵函數

5訓練及引入參數(此處用SGD加速訓練)

這裡簡單說明一下tensorflow的加速法

要加速神經網路訓練有下列幾種方法:

1.stochastic Gradient Descent

2.Momentum

3.AdaGrad

4.Rmsprop

5.Adam

 

1.stochastic Gradient Descent(SGD)

原本我們在訓練神經網路時需要將整套數據輸入,但這樣需要大量的計算資源果們將他分批放入,雖然每次使用批輛數據沒法反映整體狀況,但這方法大大加速了整個神經網路的訓練且不會損失太多準確性

雖然這種加速法最簡單但相較於其他加速法卻是最慢的。

大多數的加速法是在更新神經網路參數那一步動手腳

 

2.Momentum

此方法就是把傳統的參數W蕾加上一個父的學習率程式校正值

但這樣會讓學習的過程變得曲折無比,故我們要引導它的方向將學習路徑放在一個下坡上,讓他有個動能會慣性的先往下走,再走回正確值以減少彎路的發生。

3.AdaGrad

這方法會使每一個神經援的參數都有自己的學習率,這可以增加學習路競走灣路的阻力讓他網前走

4.RmsProp

這方法結合了Momentum的慣性原則以及AdaGrad


5.Adam 

這方法將RmsProp所沒用到的屬性完全融入

 

回到訓練及引入參數(此處用SGD加速訓練)那一部分,經過SGD加速後的訓練我將準確值以每50比輸出一次顯示出來。

  • 0.0724
  • 0.6552
  • 0.7433
  • 0.7753
  • 0.8064
  • 0.8163
  •  0.8286
  • 0.8361
  • 0.847
  • 0.8529
  • 0.8561
  • 0.8567
  •  0.8647
  • 0.8624
  • 0.8698
  • 0.8663
  • 0.8719
  •  0.8737
  • 0.8694
  • 0.8692

由上面數據可看出,電腦的準確度越來越高。

 

 

結論以及未來目標

我覺得這次的報告讓我收穫頗豐,因為我從原本只了解,最基礎的python與法規則就直接開始使用pytho去建立神經網路,讓我同時可以熟悉python這一語言的同時還可以了解類神經在電腦的運作模式。

 

創作者介紹
創作者 dodo的部落格 的頭像
dodo

dodo的部落格

dodo 發表在 痞客邦 留言(0) 人氣( 59 )