2.12 向量化更多例子-深度学习-Stanford吴恩达教授
| 2.11 向量化 | 回到目錄 | 2.13 向量化 Logistic 回歸 |
向量化更多例子 (More Vectorization Examples)
從上節(jié)視頻中,你知道了怎樣通過numpy內(nèi)置函數(shù)和避開顯式的循環(huán)(loop)的方式進行向量化,從而有效提高代碼速度。
經(jīng)驗提醒我,當我們在寫神經(jīng)網(wǎng)絡程序時,或者在寫邏輯(logistic)回歸,或者其他神經(jīng)網(wǎng)絡模型時,應該避免寫循環(huán)(loop)語句。雖然有時寫循環(huán)(loop)是不可避免的,但是我們可以使用比如numpy的內(nèi)置函數(shù)或者其他辦法去計算。當你這樣使用后,程序效率總是快于循環(huán)(loop)。
讓我們看另外一個例子。如果你想計算向量 u=Avu=Avu=Av ,這時矩陣乘法定義為,矩陣乘法的定義就是: ui=∑jAijviu_i=\sum_jA_{ij}v_iui?=∑j?Aij?vi? ,這取決于你怎么定義 uiu_iui? 值。同樣使用非向量化實現(xiàn), u=np.zeros(n,1)u=np.zeros(n,1)u=np.zeros(n,1) , 并且通過兩層循環(huán) for(i):for(j):for(i):for(j):for(i):for(j): ,得到 u[i]=u[i]+A[i][j]?v[j]u[i]=u[i]+A[i][j]*v[j]u[i]=u[i]+A[i][j]?v[j] 。現(xiàn)在就有了 iii 和 jjj 的兩層循環(huán),這就是非向量化。向量化方式就可以用 u=np.dot(A,v)u=np.dot(A,v)u=np.dot(A,v) ,右邊這種向量化實現(xiàn)方式,消除了兩層循環(huán)使得代碼運行速度更快。
下面通過另一個例子繼續(xù)了解向量化。如果你已經(jīng)有一個向量 vvv ,并且想要對向量 vvv 的每個元素做指數(shù)操作,得到向量 uuu 等于 eee 的 v1v_1v1? , eee 的 v2v_2v2? ,一直到 eee 的 vnv_nvn? 次方。這里是非向量化的實現(xiàn)方式,首先你初始化了向量 u=np.zeros(n,1)u=np.zeros(n,1)u=np.zeros(n,1) ,并且通過循環(huán)依次計算每個元素。但事實證明可以通過python的numpy內(nèi)置函數(shù),幫助你計算這樣的單個函數(shù)。所以我會引入import numpy as np,執(zhí)行 u=np.exp(v)u=np.exp(v)u=np.exp(v) 命令。注意到,在之前有循環(huán)的代碼中,這里僅用了一行代碼,向量 vvv 作為輸入, uuu 作為輸出。你已經(jīng)知道為什么需要循環(huán),并且通過右邊代碼實現(xiàn),效率會明顯的快于循環(huán)方式。
事實上,numpy庫有很多向量函數(shù)。比如 u=np.log是計算對數(shù)函數(shù)(logloglog)、 np.abs() 是計算數(shù)據(jù)的絕對值、np.maximum() 計算元素 yyy 中的最大值,你也可以 np.maximum(v,0) 、 v??2v**2v??2 代表獲得元素 yyy 每個值得平方、 1v\frac1vv1? 獲取元素 yyy 的倒數(shù)等等。所以當你想寫循環(huán)時候,檢查numpy是否存在類似的內(nèi)置函數(shù),從而避免使用循環(huán)(loop)方式。
那么,將剛才所學到的內(nèi)容,運用在邏輯回歸的梯度下降上,看看我們是否能簡化兩個計算過程中的某一步。這是我們邏輯回歸的求導代碼,有兩層循環(huán)。在這例子我們有 nnn 個特征值。如果你有超過兩個特征時,需要循環(huán) dw1dw_1dw1? 、 dw2dw_2dw2? 、 dw3dw_3dw3? 等等。所以 jjj 的實際值是1、2 和 nxn_xnx? ,就是你想要更新的值。所以我們想要消除第二循環(huán),在這一行,這樣我們就不用初始化 dw1dw_1dw1? , dw2dw_2dw2? 都等于0。去掉這些,而是定義 dwdwdw 為一個向量,設置 u=np.zeros(n(x),1)u=np.zeros(n(x),1)u=np.zeros(n(x),1) 。定義了一個 xxx 行的一維向量,從而替代循環(huán)。我們僅僅使用了一個向量操作 dw=dw+x(i)dz(i)dw=dw+x^{(i)}dz^{(i)}dw=dw+x(i)dz(i) 。最后,我們得到 dw=dw/mdw=dw/mdw=dw/m 。現(xiàn)在我們通過將兩層循環(huán)轉(zhuǎn)成一層循環(huán),我們?nèi)匀贿€有這個循環(huán)訓練樣本。
希望這個視頻給了你一點向量化感覺,減少一層循環(huán)使你代碼更快,但事實證明我們能做得更好。所以在下個視頻,我們將進一步的講解邏輯回歸,你將會看到更好的監(jiān)督學習結(jié)果。在訓練中不需要使用任何 for 循環(huán),你也可以寫出代碼去運行整個訓練集。到此為止一切都好,讓我們看下一個視頻。
課程PPT
| 2.11 向量化 | 回到目錄 | 2.13 向量化 Logistic 回歸 |
總結(jié)
以上是生活随笔為你收集整理的2.12 向量化更多例子-深度学习-Stanford吴恩达教授的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.11 向量化-深度学习-Stanfo
- 下一篇: 2.13 向量化 Logistic 回归