2.11 向量化-深度学习-Stanford吴恩达教授
| 2.10 m 個樣本的梯度下降 | 回到目錄 | 2.12 向量化的更多例子 |
向量化 (Vectorization)
向量化是非常基礎的去除代碼中for循環的藝術,在深度學習安全領域、深度學習實踐中,你會經常發現自己訓練大數據集,因為深度學習算法處理大數據集效果很棒,所以你的代碼運行速度非常重要,否則如果在大數據集上,你的代碼可能花費很長時間去運行,你將要等待非常長的時間去得到結果。所以在深度學習領域,運行向量化是一個關鍵的技巧,讓我們舉個栗子說明什么是向量化。
在邏輯回歸中你需要去計算 z=wT+bz=w^T+bz=wT+b , www 、 xxx 都是列向量。如果你有很多的特征那么就會有一個非常大的向量,所以 w∈Rnxw\in\R^{n_x}w∈Rnx? , x∈Rnxx\in\R^{n_x}x∈Rnx? ,所以如果你想使用非向量化方法去計算 wTxw^TxwTx ,你需要用如下方式(python)
x z=0 for i in range(n_x)z+=w[i]*x[i] z+=b這是一個非向量化的實現,你會發現這真的很慢,作為一個對比,向量化實現將會非常直接計算 wTxw^TxwTx ,代碼如下:z=np.dot(w,x)+b
這是向量化計算 wTxw^TxwTx 的方法,你將會發現這個非常快
讓我們用一個小例子說明一下,在我的我將會寫一些代碼(以下為教授在他的Jupyter notebook上寫的Python代碼,)
xxxxxxxxxx import numpy as np #導入numpy庫 a = np.array([1,2,3,4]) #創建一個數據a print(a) # [1 2 3 4] import time #導入時間庫 a = np.random.rand(1000000) b = np.random.rand(1000000) #通過round隨機得到兩個一百萬維度的數組 tic = time.time() #現在測量一下當前時間 #向量化的版本 c = np.dot(a,b) toc = time.time() print(“Vectorized version:” + str(1000*(toc-tic)) +”ms”) #打印一下向量化的版本的時間 ? #繼續增加非向量化的版本 c = 0 tic = time.time() for i in range(1000000):c += a[i]*b[i] toc = time.time() print(c) print(“For loop:” + str(1000*(toc-tic)) + “ms”)#打印for循環的版本的時間返回值見圖。
在兩個方法中,向量化和非向量化計算了相同的值,如你所見,向量化版本花費了1.5毫秒,非向量化版本的for循環花費了大約幾乎500毫秒,非向量化版本多花費了300倍時間。所以在這個例子中,僅僅是向量化你的代碼,就會運行300倍快。這意味著如果向量化方法需要花費一分鐘去運行的數據,for循環將會花費5個小時去運行。
一句話總結,以上都是再說和for循環相比,向量化可以快速得到結果。
你可能聽過很多類似如下的話,“大規模的深度學習使用了GPU或者圖像處理單元實現”,但是我做的所有的案例都是在jupyter notebook上面實現,這里只有CPU,CPU和GPU都有并行化的指令,他們有時候會叫做SIMD指令,這個代表了一個單獨指令多維數據,這個的基礎意義是,如果你使用了built-in函數,像np.function或者并不要求你實現循環的函數,它可以讓python的充分利用并行化計算,這是事實在GPU和CPU上面計算,GPU更加擅長SIMD計算,但是CPU事實上也不是太差,可能沒有GPU那么擅長吧。接下來的視頻中,你將看到向量化怎么能夠加速你的代碼,經驗法則是,無論什么時候,避免使用明確的for循環。
以下代碼及運行結果截圖:
課程PPT
| 2.10 m 個樣本的梯度下降 | 回到目錄 | 2.12 向量化的更多例子 |
總結
以上是生活随笔為你收集整理的2.11 向量化-深度学习-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.10 m 个样本的梯度下降-深度学习
- 下一篇: 2.12 向量化更多例子-深度学习-St