---
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。
向量: 又稱為矢量,向量通常用**陣列或矩陣方式**呈現,在空間上**有大小也有方向**。向量表示形式為

這個向量表示式的解讀方式為向量x為一個d個實數維度的向量,向量x內的每一個元素(element)都是一個維度(通常是純量)。
機器學習通常都在實數空間處理問題,少遇到複數空間
> 在推導有指數的數學比較有可能會遇到複數情形,和在訊號處理比較會遇到複數問題。
>
> * Note: 機器學習推導習慣把每個樣本寫成**d×1的向量**,在寫公式也會先定義好。但在程式撰寫時我們會把每個樣本變成**1×d的陣列下去寫程式**,所以程式跟公式基本上都有一點點差異。
通常為了區隔向量和純量的差異,**向量**如果用變數表示都會加上**粗體**
向量表示式都是以原點當作出發點,向量內的元素當作終點,方向性就是從原點到元素值的方向。
在機器/深度學習/資料科學的**維度等於「特徵數」**。
這邊舉一個2維度的圖,因為一般視覺化的圖最多畫到3維度,在更高維度基本上只能用想像的,圖是畫不出來的。

不同座標下的向量,具有大小與方向性
從上圖可以得知,向量的方向性,向量的長度就是向量大小(眼睛看的出長度,但真正的大小必須算出**歐基里德距離才是向量的大小**,也就是向量點和原點的距離)。數學表示式為:

> Note: ||x||_2 就是2-norm,也可以說2-norm就是算和原點的歐基里德距離。
這邊用x=[-3,3]當例子去計算向量大小

### 2. 矩陣(Matrix)
矩陣為多個向量的擴充,矩陣的數學表示形式為

這個矩陣表示式的解讀方式為矩陣X為一個d列(row)×m行(column)的實數矩陣,矩陣的**每個行**(column)都是一個**向量**(xi),向量每個**列**(row)都是**一個元素**(xji),i=1,..,m; j=1,..,d。
> Note: 剛剛有提到通常為了區隔向量和純量的差異,向量如果用變數表示都會加上粗體,此例x,純量就不會加上粗體,如果是**矩陣會通常用大寫英文、斜體和粗體**。
### 3. 矩陣運算
這邊分成
* 純量和矩陣運算

這邊的a就是純量。
假設為a=2,就是將矩陣放大2倍,假設a=0.1,就是將矩陣縮小10倍(等於除的概念)。

* 矩陣和矩陣運算
矩陣和矩陣運算沒有除的概念,**矩陣和矩陣運算必須元素數可以對上。**

**矩陣相加減**
假設有兩個矩陣相乘(X和Y),矩陣相加減等於矩陣內的元素作pairwise的相加減,但**矩陣大小必須一致
假設**


**矩陣相乘**
假設有兩個矩陣相乘(X和Y),X和Y矩陣大小有可能會不一樣,因為矩陣相乘之間的關係如下(相乘後的新矩陣為C):

> note: X的第2個維度數(行數column)必須等於Y的第1個維度數(列數row)
矩陣相乘計算方式如下:

從矩陣計算的公式來看,可以得知新矩陣C的第i列第j行的元素等於矩陣X第i列和矩陣Y第j行作pair-wise的相乘總和,下圖舉一個c21的計算方式,

### 4. 逆矩陣(Inverse matrix)
用矩陣取逆矩陣(inverse)後在相乘,達到矩陣的相除。
逆矩陣會有很多限制,第一個一般會算逆矩陣,這個矩陣**必須是方陣**,也就是矩陣的行跟列的數量要一樣,第二**矩陣不能是奇異矩陣(singular)**。
假設X是d維的方陣,數學表示會寫

因為是方陣,所以就不會完整寫d×d了,這邊是舉實數,當然也可以是複數。
> 判斷矩陣可不可逆,最簡單的方式就是取它的行列式值(Determinant),如果*行列式值不等於0*,則此矩陣可逆。
假設X是d維方陣,如果存在一個d維方陣Y,使得

X就是可逆矩陣或稱為非奇異方陣,Y就是X的逆矩陣,

這邊的I是d維的單位矩陣,單位矩陣是一個對角線元素都為1,其他都為0的矩陣。

> Note: 矩陣不可逆情況,這時候矩陣不能取inverse,當然有其他手法可以達到不可逆狀況下還是取它的逆矩陣,比如用pseudo inverse或是 singular value decomposition (SVD) (SVD找出來的逆矩陣也是pseudo inverse。)。
### 5. 矩陣轉置(Transpose)
假設有一個矩陣為X,矩陣的轉置在數學上會寫成XT

矩陣轉置有一些性質在機器學習上比較需要被特別注意,假設有矩陣X和矩陣Y和純量c;

---


多變量高斯分佈內的x、μ和Σ就是向量和矩陣


---
[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
## 倒傳遞推導方式
卷積計算的倒傳遞推導方式

差別在於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的例子來說明。
影像:

Kernel map:

### Forward pass:
卷積計算,stride=1如下:
*: convolution



### **Backward pass:**

因為這邊需要學習的參數是kernel map(w)內的元素(wij),所以需要對卷積後的輸出和下一層的loss function(L)作偏微分(denote: ∂L / ∂w),可以參考MLP那篇文章,然後因為∂L / ∂w無法直接計算,利用chain rule將其拆成兩項

此時,∂L / ∂h和 ∂h / ∂w比較容易計算,如下:


---
從稀疏矩陣觀點來看卷積計算
**Forward pass:**
上述forward pass卷積的式子其實等價於兩個矩陣相成如下:

所以從這個式子來看其實卷積計算其實等價於一個MLP的一層,只是這個權重矩陣(W)為一個稀疏矩陣,而輸出層連結用到的概念是Local connected neural nets和權重共享(Shared Weight)的概念,權重在此範例只有4個(kernel map的元素)。
> Note: 稀疏矩陣(sparse matrix)簡單說就是一個矩陣,裡面有很多元素都是0。
下圖是介紹為什麼是Local connection,左圖為「全連結」的連結方式,右圖為「區域連結」的連結方式
「全連結」的每個weight都是一個參數,此例共有9*4=36個參數
「區域連結」有權重共享的好處,此例則會只有4個參數。

**Backward pass:**
雖然local connection部份看起來很像full connection,但倒傳遞部份找解不是完全跟MLP一樣
Recall: 前面的backward pass結果

從上圖看到黃色的線(權重是w11),在backward pass部份則是只看黃色線有連結到的部份

---
## 梯度下降 尚未詳細看
[文章](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所有元素的偏微分
多維度的梯度,一般公式寫的是

假設x有兩個維度的參數,梯度就分別需要對不同維度的參數做偏微分

多維度的範例1:

多維度的範例2:
## **Adagrad**
SGD和momentum在更新參數時,都是用同一個學習率(γ),Adagrad算法則是在**學習過程中對學習率不斷的調整**,這種技巧叫做「**學習率衰減(Learning rate decay)**」。
通常在神經網路學習,一開始會用大的學習率,接著在變小的學習率,從上述例子可以發現,大的學習率可以較快走到最佳值或是跳出局部極值,但越後面到要找到極值就需要小的學習率。
Adagrad則是針對每個參數客制化的值,所以Ada這個字跟是Adaptive的簡寫,這邊假設 g_t,i為第t次第i個參數的梯度,
SGD更新就是
Adagrad則是
* ε是平滑項,主要避免分母為0的問題,一般設定為1e-7。
* Gt這邊定義是一個對角矩陣,對角線每一個元素是相對應每一個參數梯度的平方和。
* 一般文章都寫說分母是the sum of the squares of the gradients, i.e. θi up to time step t。
其實G(t)的算法如下,假設x是d維度的參數:
所以是一開始第一次到第t次的梯度平方和。
這邊舉個例子來說明Adagrad是怎麼計算的,這邊的ε我先設為0,公式比較不亂
如果iteration (t)次數越大,Gradient平方和(分母)越大,會讓學習率越來越小,這樣學習率就可以**達到隨著時間減少的目的**,在接近目標函數的最小值時就不會向上圖例在解的左右跳來跳去。但當Gradient平方和(分母)越小,學習率會越大。但因為每個參數的學習率會不一樣,所以在學習過程中就比較不會卡在Saddle point (最後有圖例)。
***缺點***
Adagrad缺點是在訓練中後段時,有可能因為分母累積越來越大(因為是從第1次梯度到第t次梯度的和)導致梯度趨近於0,如果有設定early stop的,會使得訓練提前結束。
## Adam
Adam全名Adaptive Moment Estimation。
剛剛介紹的Momentum是「計算參數更新方向前會考慮前一次參數更新的方向」, RMSprop則是「在學習率上依據梯度的大小對學習率進行加強或是衰減」。
> Adam則是兩者合併加強版本(Momentum+RMSprop+各自做偏差的修正)。

mt和vt分別是梯度的一階動差函數和二階動差函數(非去中心化)。因為mt和vt初始設定是全為0的向量,Adam的作者發現算法偏量很容易區近於0,因此他們提出修正項,去消除這些偏量,細節:[ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION](https://arxiv.org/pdf/1412.6980.pdf)(equ. 4)。

Adam更新的準則:

作者有建議預設值β1=0.9, β2=0.999, ε=10^(-8)。
---
舉一個例子將所有算法都去執行一遍,如下圖:

