PCA,白话和BN层

在有一篇博客上看到的,“基础知识掌握情况决定研究的高度,我们刚开始接触深度学习时,一般都是看到别人的概括,这个方法很好能让我们快速上手,但是也有一个很大的缺点, 知识理解的不透彻,导致我们对算法优化时一头雾水。”感觉很有道理,有些知识要深入的理解才行。

1.PCA

部分参考的这里边的

https://www.cnblogs.com/lliuye/p/9156763.html

1.1数据降维

在实际生产生活中,我们所获得的数据集在特征上往往具有很高的维度,对高维度的数据进行处理时消耗的时间很大,并且过多的特征变量也会妨碍查找规律的建立。如何在最大程度上保留数据集的信息量的前提下进行数据维度的降低,是我们需要解决的问题。
  对数据进行降维有以下优点:
  (1)使得数据集更易使用
  (2)降低很多算法的计算开销
  (3)去除噪声
  (4)使得结果易懂
  降维技术作为数据预处理的一部分,即可使用在监督学习中也能够使用在非监督学习中。而降维技术主要有以下几种:主成分分析(Principal Component Analysis,PCA)、因子分析(Factor Analysis),以及独立成分分析(Independent Component Analysis, ICA)。其中主成分分析PCA应用最为广泛,我主要介绍PCA。

1.2有关PCA的函数,数学知识

PCA算法里边涉及了好多数学知识(有的我都我忘了),这里总结一下
在这里插入图片描首先我们应该清楚的区分两个概念,即方差和样本方差的无偏估计:方差公式中分母上是N;样本方差无偏估计公式中分母上是N-1 (N为样本个数)。其中样本方差公式中为什么除的n-1而不是n?样本协方差同样除的是n-1而不是n?如果除的是n,那么求的方差就不是随机抽取变量组成样本的方差,而是整个空间的方差。另外,协方差(函数cov())则是将N-1改成N。

这是相关函数:
在这里插入图片描述
一些零碎的知识:(1)var()是计算方差的。(2)如果x是向量,cov(x)是计算这个向量的方差。(3)matlab把每行看做一个观察值,把每列当做一个变量.也就是说对于一个43的矩阵求协方差矩阵,matlab会认为存在三个变量,即会求出一个33的协方差矩阵。其中,对角线元素为对应变量的方差无偏估计值,其他位置为对应变量间的协方差无偏估计值(即除的是N-1)(4)计算cov(x,y)的时候,x,y必须是各维数都相等的矩阵。(5)dot(x,y)就是正常的x,y矩阵相乘。

1.3 PCA代码

在这里插入图片描述x_decor就是去除线性相关之后的数据矩阵,新属性之间不存在线性相关,即x_decor的协方差矩阵为对角矩阵。x_decor的尺寸和x一样,每行一个样本,每列是所有的样本的新属性值。x_decor是中心化的,即每个属性的均值为零。倒数第二句代码进行奇异值分解,得到正交矩阵C=(C1,C2,…,Cd)和特征向量S=(γ1,γ2,…,γd)。其中S中的特征值是降序排列的,所以x_decor中第一个属性的方差最大,后面依次减小。
COV=np.dot(x.T,x)/x.shape[0]这句代码计算的是不同维度之间的协方差,而不是不同样本间的(可以画个图)。

2.白话

PCA只是对数据点云进行了平移和旋转,数据点云的形状并没有改变。如果需要对属性进行规范化(去除单位量纲的影响),则点云需要改变形状,这时可以利用属性标准差进行规范化,这种规范化也称白话

x_white=x_decor/np.sqrt(S+10**(-5))#添加小常数,防止除0

白话最大的缺点是会扩大噪声,因为它把所有属性的标准差都拉伸为1,包括方差很小的属性(这可能是噪声引起的)。

3.BN

数据预处理是指对神经网络的输入层数据进行逐属性规范化的过程,数据经过网络的多层变换后(包括线性变换),不再是规范化的,即均值不为0,方差不是1.比如经过RELU变换后,输出属性都大于0或等于0,均值肯定大于0,这样对网络的隐含层来说,学习就变得困难了。那么能不能对任意隐含层的输入数据进行规范化,提高手链速度和学习效果呢?BN(Batch Normalization,批量规范化)就是一种著名的对隐含层输入数据进行规范化的方法。

3.1 BN公式

x’=(x-μ)/α , μ为均值,α为标准差
y=γx’+β
γ初始化为1,β初始化为0。这样BN层输出数据的均值为β,标准差为γ,与网络前面的层无关,减小了网络中各层的耦合,有利于学习。γ和β是可学习的,增加了网络的自适应性。因此,增加BN层的网络能极大的提高收敛速度。

3.2 BN代码
D=784 #特征维度
batch=32 #批量数
BN_epsilon=10**(-8) #这是一个小常数,防止分母为零
beta=np.zeros(D) #β(均值),初始化为0
gama=np.ones(D)  #γ(标准差),初始化为1

x_batch=0.1*np.random.randn(batch,D)#x_batch是批量数据,每行一个样本,每列一个属性
mean=np.mean(x_batch,axis=0)
var=np.var(x_batch,axis=0)#方差

x_batch_hat=(x_batch-mean)/np.sqrt(var+BN_epsilon)
y=gama*x_batch_hat+beta
3.3 BN层的梯度反向传播

关于BN层反向传播的数学知识,这一篇博客写的很好
https://blog.csdn.net/weixin_38740463/article/details/90205499
关键是里边有关论文的截图(我没看过论文),清楚的写明了BN反向传播中的链式法则。

给个代码:

#反向传播是已知dy,求dx_batch,dgama和dbeta
dy=np.random.randn(batch,D) #和y的形状一致

dx_batch_hat=gama*dy
dbeta=np.sum(dy,axis=0)
dgama=np.sum(x_batch_hat*dy,axis=0)

std=np.sqrt(var+BN_epsilon)#标准差
dx_batch=dx_batch_hat/std
dmean=-np.sum(dx_batch_hat,axis=0)/std
dstd=-1/(std*std)*np.sum((x_batch-mean)*dx_batch_hat,axis=0)
dvar=1/2*(var**(-0.5))*dstd

dx_batch+=2*(x_batch-mean)/batch*dvar

dx_batch+=dmean/batch
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值