花書《深度學習》數學知識點難點分析(持續更新)

1.P27最後一句:正定矩陣保證x^TAx=0=>x=0

x^TAx=0=>x=0的結果爲一個二次性,當A爲正定矩陣時,可以通過正交變換將原二次型變爲\sum_{i=1}^{n}y_{i}^2,而正交變換並不會改變原來二次型的值,所以平方和的結果爲0可以推出y_{i}=0,而對x做正交變換爲一種線性變換,且正交變換一定可逆,由線性代數的知識可知,線性齊次方程在係數矩陣爲可逆矩陣的時候只有零解,推出原向量滿足x_{i}=0

2.奇異值分解與主成分分析(PCA)

類似於特徵分解A=Pdiag(v)P^{-1},對於一個非方陣的矩陣來說,沒有辦法直接做特徵值分解,但是我們借鑑特徵分解的思想,設想可以構造一個等式A=UDV^{T},滿足U和V均爲正交矩陣。                                                                                                                                                                                                                                                                                                                      我們可以觀察到,假設A爲m*n型的矩陣,A^{T}A爲m*m型,而利用上面的等式我們可以得到:A^{T}A=VD^{T}U^{T}UDV^{T}=VD^{T}DV^{T}=VD^{2}V^{T},上述化簡利用了兩條特殊矩陣的性質                                                            1.正交矩陣的轉置×本身爲單位矩陣    2.對角矩陣的轉置×本身的結果爲每個對角線的元素都平方 。                                                    觀察可知,(A^{T}A)^{T}=A^{T}A,所以A^{T}A爲一個實對稱矩陣,由實對稱矩陣的性質:實對稱矩陣一定可以相似對角化且滿足A^{T}A=Pdiag(v)P^{-1}=Pdiag(v)P^{T}。對比可知,要求的V就是這個P,且對角矩陣D中的值爲diag(v)中值的平方根。                 同理對AA^{T}進行相同的分析可以得到U。

奇異值分解有一些很有用的性質,我們發現對於奇異值來說,值下降的速度非常快,因此我們經過奇異值分解後,取前K個奇異值和對應的左右奇異向量(左奇異向量爲U中的列向量,右奇異向量爲V^{T}中的行向量)就可以很大程度上表示原來的矩陣數據,這種降維方法就稱爲主成分分析。

3.混淆矩陣

以二分類爲例,當我們訓練了一個分類器,用於測試的時候,我們需要一些參數指標用於評估該分離器的性能指標。混淆矩陣就是一種衡量性能指標的工具。

  預測負樣本(55) 預測正樣本(45)
實際負樣本(60) TN(True Negative) 50 FP(False Positive) 10
實際正樣本(40) FN(False Negative) 5 TP(True Positive) 35

假設這個樣本空間爲100,實際正樣本爲40,實際負樣本爲60,而預測正樣本有45,預測負樣本有55。

幾個重要概念:

1.TN(真陰性):樣本爲實際負樣本,預測也爲負樣本。

2.FP(假陽性):樣本爲實際負樣本,預測爲正樣本。

3.FN(假陰性):樣本爲實際正樣本,預測爲負樣本。

4.TP(真陽性):樣本爲實際正樣本,預測爲正樣本。

所謂真假,是按照預測是否錯誤來評判,而陽性陰性是按照分類器的預測結果決定。

由混淆矩陣衍生出的幾個重要概念:

1.正確率(Accuracy):被正確分類[包括正樣本預測爲正樣本,負樣本預測爲負樣本]的樣本佔總體樣本的比例。

Accuracy=(TP+TN)/Total=(35+50)/100=85%

2.錯誤率(Error Rate/Misclassification):被錯誤分類的比例。

Misclassification=1-Accuracy=(FP+FN)/Total=(10+5)/100=15%

3.真陽率(True Positive Rate)、敏感度(Sensitivity)、召回率(Recall):被正確預測爲正樣本的樣本佔實際全部正樣本的比例,可以描述分類器對正樣本的敏感程度。

Recall=TP/實際正樣本=35/40=87%

4.精確率(Precision):預測的正樣本中,實際正樣本的比例。

Percision=TP/(TP+FP)=35/45=78%

區別精確率與召回率:

精確率實際考察的是分類器對於將某個樣本歸爲正樣本這一行行爲的準確程度,針對的是預測。

召回率實際考察的是所有的正樣本中被正確檢測的樣本的比例,針對的是樣本。

5.F1-score:由於召回率和精確率兩者呈負相關的關係,因此用一個新的一維指標統一二者,我們通常希望二者都不太大並且足夠接近。

F1-score=(2*Recall*Percision)/(Recall+Precision)。

4.損失函數(以餘霆嵩大牛給的代碼做實驗,並加以註釋):

1.L1Loss(理論上兩個矩陣只要經過廣播能運算,但是實際中並不會有人這麼用)。

計算原理:對對應分量上的值做差,可以選擇返回差值矩陣,差值和或者差值加和平均值。

A=

A11 A12
A21 A22

B=

B11 B12
B21 B22

差值矩陣C=

|A11-B11| |A12-B12|
|A21-B21| |A22-B22|
# coding: utf-8

import torch
import torch.nn as nn

# ----------------------------------- L1 Loss

# 生成網絡輸出 以及 目標輸出
output = torch.ones(2, 2, requires_grad=True)*0.5#[[0.5,0.5],[0.5,0.5]]
target = torch.ones(2, 2)#[[1,1],[1,1]]

print(output)
print(target)

# 設置三種不同參數的L1Loss  L1Loss在每一個分量上都做絕對值的差
#reduce:True(返回標量) False(返回分量差值形成的矩陣)
#size_average·[僅當返回標量時(reduce=True)有效]:True(將每個分量上的差值以加和均值的方式返回該標量) False(將每個分量上的差值加和但不求均值的方式返回該標量)
reduce_False = nn.L1Loss(size_average=True, reduce=False)#返回差值矩陣
size_average_True = nn.L1Loss(size_average=True, reduce=True)#返回差值和的均值
size_average_False = nn.L1Loss(size_average=False, reduce=True)#返回差值的累加,不求平均

o_0 = reduce_False(output, target)
o_1 = size_average_True(output, target)
o_2 = size_average_False(output, target)

print('\nreduce=False, 輸出同維度的loss:\n{}\n'.format(o_0))
print('size_average=True,\t求平均:\t{}'.format(o_1))
print('size_average=False,\t求和:\t{}'.format(o_2))

2.MSELoss(均方值誤差)

計算原理:對對應分量做差值的平方,即將差值矩陣的每個分量平方。

差值平方矩陣C=

(A11-B11)*(A11-B11) (A12-B12)*(A12-B12)
(A21-B21)*(A21-B21) (A22-B22)*(A22-B22)
# coding: utf-8

import torch
import torch.nn as nn

# ----------------------------------- MSE loss

# 生成網絡輸出 以及 目標輸出
output = torch.ones(2, 2, requires_grad=True) * 0.5
target = torch.ones(2, 2)

# 設置三種不同參數的L1Loss
#reduce:True(返回標量) False(返回分量差值平方形成的矩陣)
#size_average·[僅當返回標量時(reduce=True)有效]:True(將每個分量上的差值平方以加和均值的方式返回該標量) False(將每個分量上的差值平方加和但不求均值的方式返回該標量)
reduce_False = nn.MSELoss(size_average=True, reduce=False)
size_average_True = nn.MSELoss(size_average=True, reduce=True)
size_average_False = nn.MSELoss(size_average=False, reduce=True)


o_0 = reduce_False(output, target)
o_1 = size_average_True(output, target)
o_2 = size_average_False(output, target)

print('\nreduce=False, 輸出同維度的loss:\n{}\n'.format(o_0))
print('size_average=True,\t求平均:\t{}'.format(o_1))
print('size_average=False,\t求和:\t{}'.format(o_2))

3.CrossEntropyLoss(交叉熵損失)

以二分類爲例,我們希望在預測和實際完全不同時函數的損失值很大,以幫助我們的程序懲罰這種錯誤情況。                                                  

爲了統一兩種情況,便於書寫損失函數,因此我們如下設置損失函數:

loss=-ylogy'-(1-y)log(1-y')

當然這隻適用於預測值y'在[0,1]區間內,因此我們要先用softmax函數對所有的輸出壓縮至[0,1]區間[把輸出變量的數值轉變爲各個分類的概率],然後再採用上述公式進行計算,得到最終的損失值。

然而上述公式的寫法只適用於二分類,在多分類任務中,我們將輸出視作神經網絡認爲依據輸入特徵,被分類對象是這個類的概率。假如我們有一個輸出向量爲[0.3,0.2,0.5],對應的分類爲貓、狗、熊,那麼代表的含義是,神經網絡認爲依據輸入的特徵,是貓的概率爲30%,是狗的概率是20%,是熊的概率是50%。

而我們對這個優化目標有兩點希望:1.最大概率對應着正確的分類[在標籤中的相同地方,標籤中的值爲1]  2.最大概率的值儘可能地大,最理想時是一個one-hot向量,也就是[0,,,,,,,,,1,,,,,,,,,,0]。 不採用平方誤差是因爲,平方誤差太過嚴格,會過分地放大其他儘管小但是不爲0的概率對損失函數值的影響。

首先我們設i爲標籤向量中1值對應的索引[正確分類對應的索引],那麼損失函數可以表示成如下形式:

對於每一個樣本j,我們有:loss=-y_{i}logy^{'}_{i}(y_{i}=1)=-logy^{'}_{i} 。這就是多分類下的交叉熵損失函數,對應了圖像:

爲什麼需要激活函數?

首先,我們知道,神經網絡的基本公式是Y=WX+b,至於爲什麼是這個公式,簡單來說,假如一個特徵x對輸出的實際效果是x^n,我們可以在特徵中加入x^n這一項,然後依舊用線性表達式去擬合,這樣我們將高次的複雜模型通過座標軸的變換變換成簡單線性模型。

直觀上來說,我們有理由相信一個模型越是複雜,他的網絡層數就越深。假設我們有兩層隱藏層:

y^{1}=W^{1}X+b^{1}y^{2}=W^{2}y^{1}+b^{2},容易發現,聯立後可以得到y^{2}=W^{2}W^{1}X+W^{2}b^{1}+b^{2},還是可以用一層隱藏層來表示,這樣無論加多少層,和一層的效果都是一樣的。爲了強化模型的表達能力,我們引入非線性變化,也就是激活函數。

優化方法:(優化器)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章