--- tags: 深度學習筆記 --- # 常用運算 1. 純量(scalar)和向量(vector) 2. 矩陣(Matrix) 3. 矩陣運算 4. 逆矩陣(Inverse matrix) 5. 矩陣轉置(Transpose) --- ### 1. 純量(scalar)和向量(vector) 純量: 通常我們知道的數字0,1,2,3或是-0.1, 0.1,0.5,0.99都稱為純量,純量只有大小區分,也就是1>0,0.9<1.1,0=0。 向量: 又稱為矢量,向量通常用**陣列或矩陣方式**呈現,在空間上**有大小也有方向**。向量表示形式為 ![](https://i.imgur.com/CPByIUJ.png) 這個向量表示式的解讀方式為向量x為一個d個實數維度的向量,向量x內的每一個元素(element)都是一個維度(通常是純量)。 機器學習通常都在實數空間處理問題,少遇到複數空間 > 在推導有指數的數學比較有可能會遇到複數情形,和在訊號處理比較會遇到複數問題。 > > * Note: 機器學習推導習慣把每個樣本寫成**d×1的向量**,在寫公式也會先定義好。但在程式撰寫時我們會把每個樣本變成**1×d的陣列下去寫程式**,所以程式跟公式基本上都有一點點差異。 通常為了區隔向量和純量的差異,**向量**如果用變數表示都會加上**粗體** 向量表示式都是以原點當作出發點,向量內的元素當作終點,方向性就是從原點到元素值的方向。 在機器/深度學習/資料科學的**維度等於「特徵數」**。 這邊舉一個2維度的圖,因為一般視覺化的圖最多畫到3維度,在更高維度基本上只能用想像的,圖是畫不出來的。 ![](https://i.imgur.com/hPArmMX.png) 不同座標下的向量,具有大小與方向性 從上圖可以得知,向量的方向性,向量的長度就是向量大小(眼睛看的出長度,但真正的大小必須算出**歐基里德距離才是向量的大小**,也就是向量點和原點的距離)。數學表示式為: ![](https://i.imgur.com/hGt6KlY.png) > Note: ||x||_2 就是2-norm,也可以說2-norm就是算和原點的歐基里德距離。 這邊用x=[-3,3]當例子去計算向量大小 ![](https://i.imgur.com/jl2xVZb.png) ### 2. 矩陣(Matrix) 矩陣為多個向量的擴充,矩陣的數學表示形式為 ![](https://i.imgur.com/8ULDBvF.png) 這個矩陣表示式的解讀方式為矩陣X為一個d列(row)×m行(column)的實數矩陣,矩陣的**每個行**(column)都是一個**向量**(xi),向量每個**列**(row)都是**一個元素**(xji),i=1,..,m; j=1,..,d。 > Note: 剛剛有提到通常為了區隔向量和純量的差異,向量如果用變數表示都會加上粗體,此例x,純量就不會加上粗體,如果是**矩陣會通常用大寫英文、斜體和粗體**。 ### 3. 矩陣運算 這邊分成 * 純量和矩陣運算 ![](https://i.imgur.com/RB84OsP.png) 這邊的a就是純量。 假設為a=2,就是將矩陣放大2倍,假設a=0.1,就是將矩陣縮小10倍(等於除的概念)。 ![](https://i.imgur.com/hwg75ke.png) * 矩陣和矩陣運算 矩陣和矩陣運算沒有除的概念,**矩陣和矩陣運算必須元素數可以對上。** ![](https://i.imgur.com/JCe69J0.png) **矩陣相加減** 假設有兩個矩陣相乘(X和Y),矩陣相加減等於矩陣內的元素作pairwise的相加減,但**矩陣大小必須一致 假設** ![](https://i.imgur.com/luT3OIK.png) ![](https://i.imgur.com/u3XQ1vv.png) **矩陣相乘** 假設有兩個矩陣相乘(X和Y),X和Y矩陣大小有可能會不一樣,因為矩陣相乘之間的關係如下(相乘後的新矩陣為C): ![](https://i.imgur.com/P0SIZGw.png) > note: X的第2個維度數(行數column)必須等於Y的第1個維度數(列數row) 矩陣相乘計算方式如下: ![](https://i.imgur.com/orzUMEp.png) 從矩陣計算的公式來看,可以得知新矩陣C的第i列第j行的元素等於矩陣X第i列和矩陣Y第j行作pair-wise的相乘總和,下圖舉一個c21的計算方式, ![](https://i.imgur.com/7Tg4Uo6.png) ### 4. 逆矩陣(Inverse matrix) 用矩陣取逆矩陣(inverse)後在相乘,達到矩陣的相除。 逆矩陣會有很多限制,第一個一般會算逆矩陣,這個矩陣**必須是方陣**,也就是矩陣的行跟列的數量要一樣,第二**矩陣不能是奇異矩陣(singular)**。 假設X是d維的方陣,數學表示會寫 ![](https://i.imgur.com/6oITYnm.png) 因為是方陣,所以就不會完整寫d×d了,這邊是舉實數,當然也可以是複數。 > 判斷矩陣可不可逆,最簡單的方式就是取它的行列式值(Determinant),如果*行列式值不等於0*,則此矩陣可逆。 假設X是d維方陣,如果存在一個d維方陣Y,使得 ![](https://i.imgur.com/P82297Q.png) X就是可逆矩陣或稱為非奇異方陣,Y就是X的逆矩陣, ![](https://i.imgur.com/tquUYGa.png) 這邊的I是d維的單位矩陣,單位矩陣是一個對角線元素都為1,其他都為0的矩陣。 ![](https://i.imgur.com/pONqhpq.png) > Note: 矩陣不可逆情況,這時候矩陣不能取inverse,當然有其他手法可以達到不可逆狀況下還是取它的逆矩陣,比如用pseudo inverse或是 singular value decomposition (SVD) (SVD找出來的逆矩陣也是pseudo inverse。)。 ### 5. 矩陣轉置(Transpose) 假設有一個矩陣為X,矩陣的轉置在數學上會寫成XT ![](https://i.imgur.com/DcOWueW.png) 矩陣轉置有一些性質在機器學習上比較需要被特別注意,假設有矩陣X和矩陣Y和純量c; ![](https://i.imgur.com/Jzge7tR.png) --- ![](https://i.imgur.com/C1xmMTm.png) ![](https://i.imgur.com/CzT0pJW.png) 多變量高斯分佈內的x、μ和Σ就是向量和矩陣 ![](https://i.imgur.com/UsrBedz.png) ![](https://i.imgur.com/oOtZDAm.png) --- [reference link] https://chih-sheng-huang821.medium.com/%E5%8D%B7%E7%A9%8D%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF-convolutional-neural-network-cnn-%E5%8D%B7%E7%A9%8D%E8%A8%88%E7%AE%97%E7%9A%84%E5%80%92%E5%82%B3%E9%81%9E%E6%8E%A8%E5%B0%8E%E8%88%87%E7%A8%80%E7%96%8F%E7%9F%A9%E9%99%A3%E8%A7%80%E9%BB%9E%E4%BE%86%E7%9C%8B%E5%8D%B7%E7%A9%8D%E8%A8%88%E7%AE%97-e82ac16e510f 計算過程 https://pdfs.semanticscholar.org/5d79/11c93ddcb34cac088d99bd0cae9124e5dcd1.pdf ## 倒傳遞推導方式 卷積計算的倒傳遞推導方式 ![](https://i.imgur.com/9cjiOQP.png) 差別在於x部份與w部份,MLP在x部份通常是一個1D array的input,w則是全連結權重(fully connection)。 而在卷積計算(一般影像的卷積)部份: x: 影像(2D array) w: kernel map h: output 卷積計算通常是實現局部連結(local connection) 這篇文張會舉一個影像大小是3*3,kernel map為2*2的例子來說明。 影像: ![](https://i.imgur.com/ZK8lbFj.png) Kernel map: ![](https://i.imgur.com/j3KtYgW.png) ### Forward pass: 卷積計算,stride=1如下: *: convolution ![](https://i.imgur.com/tp0eFle.png) ![](https://i.imgur.com/12ELA1b.png) ![](https://i.imgur.com/501UfT7.png) ### **Backward pass:** ![](https://i.imgur.com/fazX6VI.png) 因為這邊需要學習的參數是kernel map(w)內的元素(wij),所以需要對卷積後的輸出和下一層的loss function(L)作偏微分(denote: ∂L / ∂w),可以參考MLP那篇文章,然後因為∂L / ∂w無法直接計算,利用chain rule將其拆成兩項 ![](https://i.imgur.com/YdqHLWU.png) 此時,∂L / ∂h和 ∂h / ∂w比較容易計算,如下: ![](https://i.imgur.com/YKivFAy.png) ![](https://i.imgur.com/cXKw2EI.png) --- 從稀疏矩陣觀點來看卷積計算 **Forward pass:** 上述forward pass卷積的式子其實等價於兩個矩陣相成如下: ![](https://i.imgur.com/JJeMTdq.png) 所以從這個式子來看其實卷積計算其實等價於一個MLP的一層,只是這個權重矩陣(W)為一個稀疏矩陣,而輸出層連結用到的概念是Local connected neural nets和權重共享(Shared Weight)的概念,權重在此範例只有4個(kernel map的元素)。 > Note: 稀疏矩陣(sparse matrix)簡單說就是一個矩陣,裡面有很多元素都是0。 下圖是介紹為什麼是Local connection,左圖為「全連結」的連結方式,右圖為「區域連結」的連結方式 「全連結」的每個weight都是一個參數,此例共有9*4=36個參數 「區域連結」有權重共享的好處,此例則會只有4個參數。 ![](https://i.imgur.com/EHafz2Y.png) **Backward pass:** 雖然local connection部份看起來很像full connection,但倒傳遞部份找解不是完全跟MLP一樣 Recall: 前面的backward pass結果 ![](https://i.imgur.com/9078eU2.png) 從上圖看到黃色的線(權重是w11),在backward pass部份則是只看黃色線有連結到的部份 ![](https://i.imgur.com/X9awncY.png) --- ## 梯度下降 尚未詳細看 [文章](https://chih-sheng-huang821.medium.com/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E5%9F%BA%E7%A4%8E%E6%95%B8%E5%AD%B8-%E4%B8%89-%E6%A2%AF%E5%BA%A6%E6%9C%80%E4%BD%B3%E8%A7%A3%E7%9B%B8%E9%97%9C%E7%AE%97%E6%B3%95-gradient-descent-optimization-algorithms-b61ed1478bd7) 因為梯度的方向是走向局部最大的方向,所以在梯度下降法中是往梯度的反方向走。 要算一個函數f(x)的梯度有一個前提,就是這個函數要是**任意可微分函數**,這也是深度學習為什麼都要找可微分函數出來當**激活函數(activation function)。** 一維度的純量x的梯度,通常用f'(x)表示。 多維度的向量x的梯度,通常用∇f(x)表示。 > 一維度的純量x的梯度就是算f(x)對x的微分 > 多維度的向量x的梯度就是算f(x)對x所有元素的偏微分 多維度的梯度,一般公式寫的是 ![](https://i.imgur.com/o4SdGcg.png) 假設x有兩個維度的參數,梯度就分別需要對不同維度的參數做偏微分 ![](https://i.imgur.com/FcnyJgs.png) 多維度的範例1: ![](https://i.imgur.com/a1JORpZ.png) 多維度的範例2:![](https://i.imgur.com/toX7IBD.png) ## **Adagrad** SGD和momentum在更新參數時,都是用同一個學習率(γ),Adagrad算法則是在**學習過程中對學習率不斷的調整**,這種技巧叫做「**學習率衰減(Learning rate decay)**」。 通常在神經網路學習,一開始會用大的學習率,接著在變小的學習率,從上述例子可以發現,大的學習率可以較快走到最佳值或是跳出局部極值,但越後面到要找到極值就需要小的學習率。 Adagrad則是針對每個參數客制化的值,所以Ada這個字跟是Adaptive的簡寫,這邊假設 g_t,i為第t次第i個參數的梯度,![](https://i.imgur.com/oXWomBS.png) SGD更新就是![](https://i.imgur.com/pmc10Zf.png) Adagrad則是![](https://i.imgur.com/jDxiLE2.png) * ε是平滑項,主要避免分母為0的問題,一般設定為1e-7。 * Gt這邊定義是一個對角矩陣,對角線每一個元素是相對應每一個參數梯度的平方和。 * 一般文章都寫說分母是the sum of the squares of the gradients, i.e. θi up to time step t。 其實G(t)的算法如下,假設x是d維度的參數:![](https://i.imgur.com/2h3VoNp.png) 所以是一開始第一次到第t次的梯度平方和。 這邊舉個例子來說明Adagrad是怎麼計算的,這邊的ε我先設為0,公式比較不亂![](https://i.imgur.com/KneDCHV.png) 如果iteration (t)次數越大,Gradient平方和(分母)越大,會讓學習率越來越小,這樣學習率就可以**達到隨著時間減少的目的**,在接近目標函數的最小值時就不會向上圖例在解的左右跳來跳去。但當Gradient平方和(分母)越小,學習率會越大。但因為每個參數的學習率會不一樣,所以在學習過程中就比較不會卡在Saddle point (最後有圖例)。 ***缺點*** Adagrad缺點是在訓練中後段時,有可能因為分母累積越來越大(因為是從第1次梯度到第t次梯度的和)導致梯度趨近於0,如果有設定early stop的,會使得訓練提前結束。 ## Adam Adam全名Adaptive Moment Estimation。 剛剛介紹的Momentum是「計算參數更新方向前會考慮前一次參數更新的方向」, RMSprop則是「在學習率上依據梯度的大小對學習率進行加強或是衰減」。 > Adam則是兩者合併加強版本(Momentum+RMSprop+各自做偏差的修正)。 ![](https://i.imgur.com/pLyVUCv.png) mt和vt分別是梯度的一階動差函數和二階動差函數(非去中心化)。因為mt和vt初始設定是全為0的向量,Adam的作者發現算法偏量很容易區近於0,因此他們提出修正項,去消除這些偏量,細節:[ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION](https://arxiv.org/pdf/1412.6980.pdf)(equ. 4)。 ![](https://i.imgur.com/Nk8Lv6I.png) Adam更新的準則: ![](https://i.imgur.com/rx02rQi.png) 作者有建議預設值β1=0.9, β2=0.999, ε=10^(-8)。 --- 舉一個例子將所有算法都去執行一遍,如下圖: ![](https://i.imgur.com/dd3VsSt.png) ![](https://i.imgur.com/NqXDjnD.gif)