Neural Networks

人工智慧 Deep Learning (3)

教學目標

「Neural Network and Deep Learning」入門課程心得分享。

重點概念

首先上週終於完成 Coursera 線上課程網站中的「Deep Learning」專項課程中的「Neural Network and Deep Learning」入門課程,吳恩達老師從最基礎的神經網路概念與數學原理引導我們開始透過 Python 實作神經網路進行深度學習的相關應用,預計四周的時間會完成四個實作練習的程式作業,分別為:

  1. 以神經網路思維建立邏輯斯迴歸。
  2. 以隱藏層建立平面資料分類。
  3. 建立深度學習的神經網路。
  4. 透過深度學習的神經網路進行影像分類的應用。

接著每個實作練習的程式作業皆是在 Jupyter Hub 上執行,線上隨時儲存進度,當完成時僅需按下「提交」鈕就能夠送出作業結果進行評分,不同的程式作業將會學習不同的關鍵重點。

程式作業一:以神經網路思維建立邏輯斯迴歸

程式作業一主要教導我們不要在程式碼中使用迴圈的前提,建立一個學習演算法的總體架構,其中包括初始化參數函數、計算成本函數和梯度以及透過梯度下降優化演算法函數,此外按照順序的將上述三個函數整合至主要模型函數中。

程式作業二:以隱藏層建立平面資料分類

程式作業二主要教導我們實作具有單一隱藏層的兩類別分類神經網路,接著使用非線激活函數,並且計算交叉熵損失,以及實作前向傳播和後向傳播。

程式作業三:建立深度學習的神經網路

程式作業三主要教導我們使用像是 ReLU 的非線性單位來改進模型,並且建立一個更深度的神經網路,也就是具有多個隱藏層,同時實作一個容易使用神經網路類別。

程式作業四:透過深度學習的神經網路進行影像分類的應用

程式作業四主要教導如何將程式作業一至程式作業三實作的功能建構深度網路,並且建立應用深度神經網路進行監督式學習的貓分類應用。

再來除了簡單易懂又不失理論深度的教學影片之外,吳恩達老師還特別採訪業界三位大師,分別為神經網路之父 Geoffrey Hinton 、深度強化學習做運動規劃的專家 Pieter Abbeel 和生成對抗網路之父 Ian Goodfellow ,其中神經網路之父 Geoffrey Hinton 是反向傳播演算法的發明之一,深度強化學習做運動規劃的專家 Pieter Abbeel 則是將深度強化學習應用在機器人上,以及生成對抗網路之父 Ian Goodfellow 則是 Deep Learning 教科書作者之一,同時為了解決生成式問題提供了全新的想法 。

最後除了淺顯易懂的數學原理、漸進學習的程式作業和採訪業界大師經驗之外,吳恩達老師還在教學影片中分享神經網路程式開發的習慣,包括參數如何命名比較適當,非常實用,對於神經網路與深度學習的初學者而言非常適合打好神經網路的基礎。

總結深度學習總共有五門課程,在第一門課程中我們從神經網路基礎學習 (邏輯斯迴歸、損失函數、梯度下降法、向量化、…),接著學習淺層神經網路 (前向傳播、反向傳播、激活函數、導數、神經網路、…),再來學習深層神經網路 (核對矩陣維度、深層神經網路塊、參數和超參數、…),循序漸進的學習方式非常建議初學者學習深度學習的概念和神經網路的基礎實作。

Neural Networks and Deep Learning

相關資源

人工智慧 Deep Learning (2)

教學目標

初步了解如何透過 Python 進行神經網路的基本實作,本篇為 Coursera 線上課程學習筆記。

重點概念

首先我們透過 Python 建立神經網路時儘可能避免迴圈,而是採用向量化方式建置,以利加速神經網路的速度,到底有多大的差別呢?我們可透過下述程式了解向量化與迴圈計算時間的差別。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np
a = np.array([1,2,3,4])
print(a)

import time
a = np.random.rand(100000)
b = np.random.rand(100000)

tic = time.time()
c = np.dot(a,b)
toc = time.time()

print(c)
print("向量化版本:" + str(1000*(toc-tic))+"ms")

c = 0
tic = time.time()
for i in range(100000)
c += a[i]*b[i]
toc = time.time()

print(c)
print("迴圈版本:" + str(1000*(toc-tic))+"ms")

接著我們建立神經網路時主要會透過向量化的方式建立邏輯斯迴歸分析,採用 Numpy 函式庫為主。同時因為 Python 中採用有傳播計算的特性,所以在 Python 中如何進行 Numpy 的除錯就非常重要,像是若我們要建立資料結構,建議不要使用「a = np.random.randn(5)」,因為是一維陣列,而是建議使用「a = np.random.randn(5,1)」,並且搭配「assert(a.shape==(5,1))」進行檢查,此外我們也可以透過「a=a.reshape((1,5))」將一維陣列轉二維陣列。

再來我們可以透過神經網路建立簡單的邏輯斯分析,主要有六個階段,分別為:

  1. 載入適當的套件。
  2. 說明問題資料集。
  3. 學習演算法基礎架構。
  4. 建立演算法細節部份。
  5. 匯整演算法細節部份。
  6. 進行後續分析。

其中載入適當的套件必須載入 Numpy 套件,皆著說明問題資料集主要會有訓練資料和測試資料,並且了解資料的維度,同時將資料進行向量化,以利加速神經網路的計算。

最後學習演算法基礎架構則是以神經網路為主,因此我們要有計算損失的函教,其將會是所有訓練例子的總和。當我們有了基礎架構之後,接著就是建立演算法細節部份,主要步驟為:

  1. 定義模型類型和結構。
  2. 初始化模型參數。
  3. 循環計算當目前的損失和梯度,並且更新參數進行梯度下降以利優化。

當我們實作完成演算法細節部份之後就能夠進行匯整,以利針對訓練資料集和測試資料集進行模型準確度的比較,此外我們還能夠透過控制學習率的大小查看學習曲線的變化情況,以利進行後續分析。

總結若是從未接觸深度學習的初學者,非常建議花些時間上 Coursera 線上課程網站中的 Deep Learning 課程,吳老師教得淺顯易懂,同時課程中有許多實際的例子能夠讓我們更有效的理解深度學習的基本概念。

相關資源

人工智慧 Deep Learning (1)

教學目標

初步了解深度學習的基本概念,本篇為 Coursera 線上課程學習筆記。

重點概念

首先什麼是神經網路,若我們要預測房價時,我們將會有資料集知道房子大小和房子價格,接著我們會用一個函數預測房子大小和房子價格 ,此時我們若熟悉線性迴歸分析則會透過一條直線進行預測,同時因為房子價價不會於 0 ,所以若 Y 軸為房子價格和 X 軸為房子大小,則直線會有先 Y 軸房子價格從 0 開始至基礎房子的小時直線才會開始往上升,而這用於預測的直線就是函數,同時也是簡單的神經網路。

接著為何是神經網路呢?因為我們有一個輸入到神經網路的房子大小為 X ,會進入一個節點,輸出房子大小為 Y,其中節點就是在神經網路中的單一神經元,神經元主要是根據輸入的房子大小透過線性函數計算,取最大值 0 ,然後輸出預測的房子價格,一般來說,上述函數先從 0 開始,然後一段時間之後,它會起方成一條直線,稱為 ReLU 函數,全名為線性整流函數 (Rectified Linear Unit,ReLU) ,大型的神經網路主要是由很多的單一神經元堆疊在一起 ,然而我們可能不只有房子大小的資訊,還有房間數量、郵地區號、財富情況、…等資訊,同時藉由房子大小和房間數量可以產生家庭大小的資訊,或是郵地區號和財富情況可以產生學校品質的資訊,此時我們主要有四個輸入為 X,分別為房子大小,房間數量、郵地區號和財富情況,以及預測價格輸出為 Y,此時就能夠產生神經網路,至於其中我們能夠產生許多中間層的節點,也就是家庭大小、學校品質、…等資訊以利找出最佳的預測函數。

再來目前所有由神經網路產生經濟價值的機器學習主要稱監督式學習 (Supervised Learning),在監督式學習中我們將會有輸入的 X 訓一個函數對應至輸出的 Y 的相關應用,請參考下表。

輸入 (X) 輸出 (Y) 相關應用領域
房子特徵 房子價格 房地產
廣告資訊和使用者資訊 廣告點擊率 線上廣告
影像 物件 影像辨識
語音 文字 語音辨識
英文 中文 機器翻譯
影像和雷達資訊 車子位置 自動駕駛

其中房地產和線上廣告會採用標準的神經網路,影像辨識的應用會採用卷積神經網路 (Convolutional Neural Networks,CNN),語言辨識的應用主要是序列資料,因為聲音會隨著時間播放,所以自然成為一維時間序列,同時機器翻譯的應用時語言不論是英文或中文皆會呈現序列資料,此時會採用循環神經網路 (Recurrent Neural Networks,RNN)。至於自動架駛因為採用影像和雷達資訊預測車子位置較為複雜,所以會採用客製的混合神經網路。簡而言之,我們針對不同的應用領域會採用不同類型的神經網路,主要有四種類型,分別為:

  1. 標準神經網路
  2. 卷積神經網路
  3. 循環神經網路
  4. 混合神經網路

此外神經網路應用中所處理的資料可以分為結構化資料和非結構化資料,所謂結構化資料就是在資料庫中的資料,而所謂非結構資料就是語音、影像和文字等資料類型。

最後為何深度學習會在最近幾年非常流行,主要是因為傳統機器學習演算法已經很難處理大量的資料量,但是我們目前已經進入數位化的時代,我們花費很多時間在電腦、行動裝置和網路上建立資料,同時由於內建於手機的照像功能、定位功能、物聯網感測器功能、…等讓我們一直蒐集更多的資料,此時若透過神經網路能夠有有效訓練大量資料產生更好 的成效。然而在早期深度學習的興起主要是因為資料規模和運算規模,當時僅能夠在 CPU 和 GPU 中訓練大量的資料,然而現今我們已經有許多創新的演算法規模,它主要嘗試讓神經網路執行的更快,因此深度學習在最近幾年非常流行,主要有三個關鍵的規模因素,分別為:

  1. 資料規模
  2. 運算規模
  3. 演算法規模

此外快速運算對於經常反覆訓練的神經網路的處理過程是非常的重要,主要有三個階段,分別為:

  1. 想法
  2. 程式
  3. 實驗

通常我們會有個想法之後,透過神經網路架構建立想法至程式上執行一個實驗讓我們了解神經網路做得成效如何?當我們了解結果之後就能夠再改變神經網路的細節,形成想法->程式->實驗三階段循環的方式建立出成效最佳的神經網路。

總結若是從未接觸深度學習的初學者,非常建議花些時間上 Coursera 線上課程網站中的 Deep Learning 課程,吳老師教得淺顯易懂,同時課程中有許多實際的例子能夠讓我們更有效的理解深度學習的基本概念。

相關資源