1. 程式人生 > >吳恩達《神經網路與深度學習》課程筆記歸納(三)-- 神經網路基礎之Python與向量化

吳恩達《神經網路與深度學習》課程筆記歸納(三)-- 神經網路基礎之Python與向量化

上節課我們主要介紹了邏輯迴歸,以輸出概率的形式來處理二分類問題。我們介紹了邏輯迴歸的Cost function表示式,並使用梯度下降演算法來計算最小化Cost function時對應的引數w和b。通過計算圖的方式來講述了神經網路的正向傳播和反向傳播兩個過程。本節課我們將來探討Python和向量化的相關知識。

1. 向量化

深度學習演算法中,資料量很大,在程式中應該儘量減少使用loop迴圈語句,而可以使用向量運算來提高程式執行速度。

向量化(Vectorization)就是利用矩陣運算的思想,大大提高運算速度。例如下面所示在Python中使用向量化要比使用迴圈計算速度快得多。

(

現在處理的是一維陣列,得到的是兩陣列的內積(1*4+2*5+3*6=32)

如果是二維陣列(矩陣)之間的運算,則執行的是矩陣間的乘法運算

)

從程式執行結果上來看,該例子使用for迴圈執行時間是使用向量運算執行時間的約300倍。因此,深度學習演算法中,使用向量化矩陣運算的效率要高得多。

為了加快深度學習神經網路運算速度,可以使用比CPU運算能力更強大的GPU。事實上,GPU和CPU都有並行指令(parallelization instructions),稱為Single Instruction Multiple Data(SIMD)。SIMD是單指令多資料流,能夠複製多個運算元,並把它們打包在大型暫存器的一組指令集。SIMD能夠大大提高程式執行速度,例如python的numpy庫中的內建函式(built-in function)就是使用了SIMD指令。相比而言,GPU的SIMD要比CPU更強大一些。

2. 向量化的更多例子

上一部分我們講了應該儘量避免使用for迴圈而使用向量化矩陣運算。在python的numpy庫中,我們通常使用np.dot()函式來進行矩陣運算。

我們將向量化的思想使用在邏輯迴歸演算法上,儘可能減少for迴圈,而只使用矩陣運算。值得注意的是,演算法最頂層的迭代訓練的for迴圈是不能替換的。而每次迭代過程對J,dw,b的計算是可以直接使用矩陣運算。

3. 向量化邏輯迴歸

4. 向量化邏輯迴歸的梯度輸出

5. Python中的廣播

下面介紹使用python的另一種技巧:廣播(Broadcasting)。

簡而言之,就是python中可以對不同維度的矩陣進行四則混合運算,但至少保證有一個維度是相同的。下面給出幾個廣播的例子,具體細節可參閱python的相關手冊,這裡就不贅述了。

è¿éåå¾çæè¿°

值得一提的是,在python程式中為了保證矩陣運算正確,可以使用reshape()函式來對矩陣設定所需的維度。這是一個很好且有用的習慣。

6. 關於python/numpy向量的說明

接下來我們將總結一些python的小技巧,避免不必要的code bug。

python中,如果我們用下列語句來定義一個向量:

7. Jupyter/iPython Notebook快速指南

Jupyter notebook(又稱IPython notebook)是一個互動式的筆記本,支援執行超過40種程式語言。本課程所有的程式設計練習題都將在Jupyter notebook上進行,使用的語言是python。

關於Jupyter notebook的簡介和使用方法可以看我的另外兩篇部落格:

8. 邏輯迴歸的代價函式的解釋(選修)

在上一節課的筆記中,我們介紹過邏輯迴歸的Cost function。接下來我們將簡要解釋這個Cost function是怎麼來的。

9. 總結

本節課我們主要介紹了神經網路基礎——python和向量化。在深度學習程式中,使用向量化和矩陣運算的方法能夠大大提高執行速度,節省時間。以邏輯迴歸為例,我們將其演算法流程包括梯度下降轉換為向量化的形式。同時,我們也介紹了python的相關程式設計方法和技巧。