第一週談完基本的單變數線性迴歸 (y=wx+b) 和 cost function的概念之後,
第二週把概念擴展到多變數的線性迴歸上。
真實的世界不會只有一個變因,比方說影響房價的不只會有大小,還包括有幾層樓、屋齡有多久等等,
這些變因,也就是 input,我們稱之為 feature (特徵),特徵的數量以n來表示,
既然有多個特徵,則要給他們編號 j ,編號就會放在右下角,而樣品編號 i 則放在右上角。
公式就是從原本的 f=wx+b變成 f=w1x1 + w2x2 +... +b ,w可以視為每一個input 對 output的影響力,
b即截距就是基本價格,即便所有變因都是0,還是還有一個基本的數字。
為了要方便計算,所以慣例上會把這些model的參數與特徵分別拉出來變成一組向量,
所以可以再把方程式中的w與x 改成向量形態,而 w 與 x之間我們也不再叫它相乘,而是叫「內積」dot product。
這個 Vectroization (向量化) 概念對於加速運算很重要,如下張slide所示:
最差的方式就是用手刻方程式的方程式來做,
如果引入 summation 的方式就可以像右上角那樣用 for loop 來執行,
但最有效率的方式就是用向量向積來表示,
不但程式寫起來簡單明瞭,而且能善用CPU或GPU的平行運算能力大大增速。
為了要使用vectorization,最方面的就是引入 NumPy 這個套件,
要注意的在純量的世界中都是從1開始計數,但是向量的世界則是從0開始,所以第一個input是 x[0]而不是x[1]。
接下來進一步闡釋 vectorization的概念:
要注意到如果是採用傳統的for loop,需要從0開始一個一個跑這個loop 之後再去加總,
但如果是用vectorization,則電腦會幫你把所有的w與x都列出來後每一組w與x的內積都同時運算,
因此時間自然而然就省下很多。這個流程對於大量資料的情境尤其有意義。
在做Gradient descent 時 vectorization 的效果也很明顯,
使用 gradient descent 來調整參數是把原始參數扣掉 learning rate 與 微分項 之間的乘積,
如果有16個weighting要更新,在不使用vectorization 的情況下需要一個一個慢慢用for loop更新,
反觀 vectorization 就是把 weighing 和 gradient 化成向量後全部一起更新,速度自然就快很多了。
在 Notebook中也示範了 vectorization 和 for loop 之間的差異,
如果是要用 vectorization 的內積去運算 a 與 b 兩個1000萬個數字的內積只要花 174 ms,
而如果是用一般的乘積來運算則要花9543 ms,花費接近60倍的時間。
留言列表