1. 程式人生 > >演算法工程師之路——Deeplearning.ai神經網路與深度學習篇Week3

演算法工程師之路——Deeplearning.ai神經網路與深度學習篇Week3

上一週的回顧

      過去的一週真的發生了很多意想不到、驚心動魄的事情,從大學四年最後一次體測到唐獎競爭,從小IG力挽狂瀾到RNG遺憾折戟,生活可謂是充滿了無數的可能。也正是因為這樣,我們的生活才不至於那麼乏味,像工廠流水線生產一樣標準化、制度化,而隨時都可能發生一段令人難忘的奇妙冒險。做學問、努力學習的過程其實也是這樣,不僅要腳踏實地,還要學會正確處理遇到的一系列非預期範圍內的問題。我越來越相信一句話:真正的大師常懷一顆學徒的心。保持謙遜低調,不驕不躁,才是大將之風。繼續努力吧!

地窪下,水流之;人謙下,德歸之。——魏徵

Deeplearning.ai神經網路與深度學習(Week3)

1.1 向量化

      向量化是一種當採集的資料量特別大時,用來顯著提高計算速度,節省計算時間的優化方法。當我們運用logistic迴歸對採集到的資料集進行計算時,如果我們在Python程式碼裡顯式的使用到for迴圈,當資料集並不是很大時,也許其執行速度還沒什麼毛病,一旦資料量增大,這將會帶來非常大的計算效率方面的困擾。為了解決for迴圈帶來的效率問題,聰明的人們發明了向量化這種聰明的方法進行優化。基本思路是:當我們需要將兩組變數對應相乘時,我們可以將其作為兩個矩陣進行矩陣之間的運算。這樣就算不需要顯式的寫出for迴圈,我們一樣可以得到精確的答案。為了證明向量化的高效,我們需要用Python程式碼進行驗證:

import numpy as np
import time

a = np.random.rand(1000000)
b = np.random.rand(1000000)

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

print(c)
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迴圈和向量化兩種方式對資料集進行操作時,兩者計算效率之間的比較。執行結果如下:

      結果是顯而易見的:使用for迴圈的計算時間是使用向量化的計算時間的500多倍!這個結果是驚人的,證明了向量化的高效。如果說在機器學習、深度學習發展的初期,我們會驚豔於向量化這種優化方式的高效,那麼在深度學習飛速發展的今天,我們已經完全離不開它所提供的高效。資料的海量性、操作的複雜性使我們必須摒棄任何地方都使用for迴圈這種低效操作的習慣,並且不斷去探究如何才能使我們的演算法更加高效,這充滿了挑戰性,同時也充滿了樂趣。

1.2 向量化Logistic Regression

      現在,有了向量化這個有力的武器,我們需要讓它有用武之地,而目標就是logistic regression中的向量化應用。回顧logistic regression的步驟,我們可以發現,前後需要用到兩次for迴圈,第一次是在對樣本進行迴圈時,第二次是在對樣本特徵進行迴圈時:

      很明顯,在對每一個樣本的特徵進行計算時,我們可以將w以及x看作兩個矩陣在進行矩陣的乘法運算,用向量化的方法改寫計算方式:

      將每一個樣本的特徵平鋪在X矩陣中,那麼最後的結果便可以改寫為X矩陣與w矩陣轉置相乘後再加上b矩陣。我們將兩次for迴圈減少到了一次,當樣本數量集很大時,這樣的做法可以使我們的logistic regression效率大大提高。對於反向傳播過程(即修正引數過程),也可以應用到:

      綜上,我們再描述一次完整的向量化logistic regression過程:

      怎麼樣,是不是感覺在一次迴圈迭代中不用到任何for迴圈就可以完成計算很爽呢?       接下來我們說說如何在實際生產中運用向量化的思想。其實很簡單,Python爸爸已經有了一個非常強大的資料科學工具庫Numpy,提供了大量高效的矩陣運算方法,使用起來也相當方便,比如我要建立一個維度為百萬級別的隨機數矩陣,只需要輸入以下命令:

import numpy as np
a = np.random.rand(1000000)

      又比如,我想建立兩個百萬級別維度的隨機數矩陣並將它們相乘:

a = np.random.rand(1000000)
b = np.random.rand(1000000)
c = np.dot(a,b)

      是不是很簡單呢?在資料科學的學習過程,還將大量用到這個強大的工具,想想還真是有點小興奮呢。

論文與工程訓練總結

      本週呢由於唐獎和某些亂七八糟的事情,我也沒有閱讀新的論文,但是學習了增強學習Reinforcement Learning領域,DQN的部分知識,也瞭解到了MDP即馬爾科夫過程是一個怎樣的決策過程,對增強學習的世界觀有了進一步的瞭解,也算是基礎的入門。雖然僅僅學習了一些這方面的知識,不過也引起了我極大的興趣,可能也是因為我自己覺得這樣的技術更符合我對人工智慧的預期吧!工程方面,本週抽了兩天的時間做了下專案,感覺敲程式碼的過程還是很爽的,哈哈。嗯,下個月還有大學生涯最後的一次ACM-Region(好吧,其實也是唯一一次),繼續努力吧!