1. 程式人生 > >用Python 進行深度學習

用Python 進行深度學習

摘要: 深度學習背後的主要原因是人工智慧應該從人腦中汲取靈感。本文就用一個小例子無死角的介紹一下深度學習!

人腦模擬

深度學習背後的主要原因是人工智慧應該從人腦中汲取靈感。此觀點引出了“神經網路”這一術語。人腦中包含數十億個神經元,它們之間有數萬個連線。很多情況下,深度學習演算法和人腦相似,因為人腦和深度學習模型都擁有大量的編譯單元(神經元),這些編譯單元(神經元)在獨立的情況下都不太智慧,但是當他們相互作用時就會變得智慧。

我認為人們需要了解到深度學習正在使得很多幕後的事物變得更好。深度學習已經應用於谷歌搜尋和影象搜尋,你可以通過它搜尋像“擁抱”這樣的詞語以獲得相應的影象。-傑弗裡·辛頓

神經元

神經網路的基本構建模組是人工神經元,它模仿了人類大腦的神經元。這些神經元是簡單、強大的計算單元,擁有加權輸入訊號並且使用啟用函式產生輸出訊號。這些神經元分佈在神經網路的幾個層中。

clipboard.pnginputs 輸入 outputs 輸出 weights 權值 activation 啟用

人工神經網路的工作原理是什麼?

深度學習由人工神經網路構成,該網路模擬了人腦中類似的網路。當資料穿過這個人工網路時,每一層都會處理這個資料的一方面,過濾掉異常值,辨認出熟悉的實體,併產生最終輸出。

clipboard.png

輸入層:該層由神經元組成,這些神經元只接收輸入資訊並將它傳遞到其他層。輸入層的圖層數應等於資料集裡的屬性或要素的數量。輸出層:

輸出層具有預測性,其主要取決於你所構建的模型型別。隱含層:隱含層處於輸入層和輸出層之間,以模型型別為基礎。隱含層包含大量的神經元。處於隱含層的神經元會先轉化輸入資訊,再將它們傳遞出去。隨著網路受訓練,權重得到更新,從而使其更具前瞻性。

神經元的權重

權重是指兩個神經元之間的連線的強度或幅度。你如果熟悉線性迴歸的話,可以將輸入的權重類比為我們在迴歸方程中用的係數。權重通常被初始化為小的隨機數值,比如數值0-1。

前饋深度網路

前饋監督神經網路曾是第一個也是最成功的學習演算法。該網路也可被稱為深度網路、多層感知機(MLP)或簡單神經網路,並且闡明瞭具有單一隱含層的原始架構。每個神經元通過某個權重和另一個神經元相關聯。

該網路處理向前處理輸入資訊,啟用神經元

clipboard.pnginput layer 輸入層 hidden layer 輸出層 output layer 輸出層

啟用函式

啟用函式就是求和加權的輸入到神經元的輸出的對映。之所以稱之為啟用函式或傳遞函式是因為它控制著啟用神經元的初始值和輸出訊號的強度。

用數學表示為:

clipboard.png

我們有許多啟用函式,其中使用最多的是整流線性單元函式、雙曲正切函式和solfPlus函式。

啟用函式的速查表如下:

clipboard.png

反向傳播

在網路中,我們將預測值與預期輸出值相比較,並使用函式計算其誤差。然後,這個誤差會傳回這個網路,每次傳回一個層,權重也會根絕其導致的誤差值進行更新。這個聰明的數學法是反向傳播演算法。這個步驟會在訓練資料的所有樣本中反覆進行,整個訓練資料集的網路更新一輪稱為一個時期。一個網路可受訓練數十、數百或數千個時期。

clipboard.pngprediction error 預測誤差

代價函式和梯度下降

代價函式度量了神經網路對給定的訓練輸入和預期輸出“有多好”。該函式可能取決於權重、偏差等屬性。

代價函式是單值的,並不是一個向量,因為它從整體上評估神經網路的效能。在運用梯度下降最優演算法時,權重在每個時期後都會得到增量式地更新。

相容代價函式

用數學表述為差值平方和:

clipboard.pngtarget 目標值 output 輸出值

權重更新的大小和方向是由在代價梯度的反向上採取步驟計算出的。

clipboard.png

其中η 是學習率

其中Δw是包含每個權重係數w的權重更新的向量,其計算方式如下:

clipboard.pngtarget 目標值 output 輸出值

圖表中會考慮到單系數的代價函式

clipboard.pnginitial weight 初始權重 gradient 梯度 global cost minimum 代價極小值

在導數達到最小誤差值之前,我們會一直計算梯度下降,並且每個步驟都會取決於斜率(梯度)的陡度。

多層感知器(前向傳播)

這類網路由多層神經元組成,通常這些神經元以前饋方式(向前傳播)相互連線。一層中的每個神經元可以直接連線後續層的神經元。在許多應用中,這些網路的單元會採用S型函式或整流線性單元(整流線性啟用)函式作為啟用函式。

現在想想看要找出處理次數這個問題,給定的賬戶和家庭成員作為輸入

要解決這個問題,首先,我們需要先建立一個前向傳播神經網路。我們的輸入層將是家庭成員和賬戶的數量,隱含層數為1, 輸出層將是處理次數。

將圖中輸入層到輸出層的給定權重作為輸入:家庭成員數為2、賬戶數為3。

現在將通過以下步驟使用前向傳播來計算隱含層(i,j)和輸出層(k)的值。

步驟:

1, 乘法-新增方法。

2, 點積(輸入*權重)。

3,一次一個資料點的前向傳播。

4, 輸出是該資料點的預測。

clipboard.png

i的值將從相連線的神經元所對應的輸入值和權重中計算出來。

i = (2 1) + (3 1) → i = 5

同樣地,j = (2 -1) + (3 1) → j = 1

K = (5 2) + (1 -1) → k = 9

clipboard.png

Python中的多層感知器問題的解決

clipboard.png

clipboard.png

啟用函式的使用

為了使神經網路達到其最大預測能力,我們需要在隱含層應用一個啟用函式,以捕捉非線性。我們通過將值代入方程式的方式來在輸入層和輸出層應用啟用函式。

這裡我們使用整流線性啟用(ReLU):

clipboard.png

clipboard.png

clipboard.png

用Keras開發第一個神經網路

關於Keras:

Keras是一個高階神經網路的應用程式程式設計介面,由Python編寫,能夠搭建在TensorFlow,CNTK,或Theano上。

使用PIP在裝置上安裝Keras,並且執行下列指令。

clipboard.png

在keras執行深度學習程式的步驟

1,載入資料;

2,建立模型;

3,編譯模型;

4,擬合模型;

5,評估模型;

開發Keras模型

全連線層用Dense表示。我們可以指定層中神經元的數量作為第一引數,指定初始化方法為第二引數,即初始化引數,並且用啟用引數確定啟用函式。既然模型已經建立,我們就可以編譯它。我們在底層庫(也稱為後端)用高效數字庫編譯模型,底層庫可以用Theano或TensorFlow。目前為止,我們已經完成了建立模型和編譯模型,為進行有效計算做好了準備。現在可以在PIMA資料上執行模型了。我們可以在模型上呼叫擬合函式f(),以在資料上訓練或擬合模型。

我們先從KERAS中的程式開始,

clipboard.png

clipboard.png

神經網路一直訓練到150個時期,並返回精確值。

本文作者:【方向】

閱讀原文