花书《深度学习》数学知识点难点分析(持续更新)

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},还是可以用一层隐藏层来表示,这样无论加多少层,和一层的效果都是一样的。为了强化模型的表达能力,我们引入非线性变化,也就是激活函数。

优化方法:(优化器)

 

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