深度学习中的一些基本概念

news/2024/11/24 6:16:52/

深度学习中的一些基本概念

一维卷积(离散)

对于一维卷积的理解,是在一次坐火车的时候。所谓的一维卷积,无非就是两列火车相向而驰,从头碰头,到尾离尾的过程。我们把两个向量比作两列火车,向量的元素比作每个车厢,那么两个向量做卷积得到的值的每个分量就是计算每个时刻火车重叠部分的点乘,所谓的点乘,就是对应位置做乘法最后求和。花了一点时间做了一个gif如下:

一维卷积

这里需要注意的是,两列火车的长度不定,更不一定等长,可能只有一节车厢,也可能有一列火车或者两列火车有无限长度。所以,卷积的长度=长火车的车厢数+短火车的车厢数-1。当然,也有的一维卷积只考虑计算短火车和长火车重叠部分包含短火车的时刻,即所谓的没有padding。当然,滑动步长也可以不是1。

二维卷积(离散)

理解了一维卷积,二维卷积不过只是在一维卷积的基础上,将一维向二维进行了扩充。即拿一个所谓的小矩阵(卷积核、滤波器)去按一定的顺序去扫原矩阵,每个“时刻”都计算矩阵的一个点积,得到一个数值。如下图所示:

反卷积

卷积

可以看出,在从有数字的地方开始卷(没有padding)的话,且步长为1的话,卷出来的矩阵边长=大矩阵边长-小矩阵边长+1。
那么,这么多有什么意义呢?举个简单的例子,它可以提取边缘,如下:
卷积意义

padding

卷积网络,经常说padding,那么所谓的padding又是什么意思呢?一般来说,为了减少信息的丢失或者其他的一些目的。padding表示在原有向量或者矩阵的边缘上扩充地补一些数,比如说补0(zero padding)。padding有三种模式,valid、same和full。什么意思呢?

  • **valid:**表示不填充,那么在二维情况下,那么它输出的size就可以表示为:
 out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))
out_width = ceil(float(in_width - filter_width + 1) / float(strides[2]))

这个表达式中的 out_height 表示输出的高度,in_height表示输入的高度,filter_height 表示滤波器的高度,strides表示步长(两个维度)。width亦如是。
也就是说当步长为1时,如果用valid(不填充),那么做完卷积之后,矩阵的边的长度就会减小 滤波器的长度-1。如果步长不为1,卷到后面如果不够的话,后面的也不填充,直接drop掉。
举个例子,一维,输入长度为13,滤波器长度为6,步长为5。后面两个数字,不够滤波器长度,直接drop掉。
valid padding

  • **same:**所谓的相同,做填充,使得输出的特征图的空间维度和输入的特征图的空间维度是相同的(这里特征图的概念后面会讲到)。事实上,这句话只是对步长为1的时候的描述是准确的。
    我们先来看看这个输出长度的表达式,再理解这个就简单了。
out_height = ceil(float(in_height) / float(strides[1]))
out_width = ceil(float(in_width) / float(strides[2]))

我们现在要做的就是,在两边均匀地填充,使得卷出来的输出满足这个长度。一般的填充,我们都是尽可能均匀地填充在两边,如果要填充的个数为奇数个,实在无法均匀地填充地话,我们一般选择让右边多填充一个。
很容易计算得到,我们需要填充的量为,以宽为例:max{filter_width-in_width%strides[2],0},百分号表示取余,特别地,in_width%1的值为1,算得这个数字之后,平均分配到两边。
下面举几个例子:
1、步长为1,卷出来的规模和原来的相同,体现了same的含义。
same padding
从这也可以看出,如果步长为1的话,我们做卷积一般是让卷积核的中心放到最边上一个开始卷,这样的话,能保持卷出来的规模和原来的一样。但是如果步长不为1的话就不一样了,可以看下面一个例子。
2、一维,输入长度为13,滤波器长度为6,步长为5。因为13/6取上界为3,所以要做一些填充,使得卷出来的东西长度为3。这也体现了所谓的same。
same padding

  • **full:**如图所示,设输入的大小是7x7,filter的大小是3x3,full型的padding就是让卷积卷出来的矩阵在不完全失去原有信息的基础上尽可能大,所谓的不完全失去,就是做卷积卷积核和原矩阵至少有一格的重复。full padding
    橙色部分为输入, 蓝色部分为filter。full模式的意思是,从filter和输入矩阵刚相交开始就做卷积,白色部分为填0。
反卷积(转置卷积)

好像要说清楚这个东西不是特别容易的事情。一句话解释就是:反卷积相对于卷积,像是一个逆过程,注意,这里说的逆,只是规模上的逆,而不是整整意义下恢复原来矩阵的逆,想想这也是不可能的。

转置卷积,把矩阵拉成向量来理解比较好理解。举个栗子:4x4的输入,卷积Kernel为3x3, 没有Padding / Stride, 则输出为2x2。这时,输入矩阵可展开为16维向量,记作 x x x,输出矩阵可展开为4维向量,记作 y y y。那么卷积运算可表示为 y = C x y = Cx y=Cx。事实上, C C C可以表示为如下:

W矩阵

那么,转置卷积是什么呢?没错,就是 x ^ = C T y ^ \hat x = C^T\hat y x^=CTy^

矩阵拉成向量确实好理解了,但是它在原矩阵(向量)时,又是怎么样一种表现呢?能否可视化一下?二维比较抽象,以一维举个例子。考虑no padding,步长为1的卷子,看看它的反卷积是什么。因为:
一维反卷积
由上描述,可知:
一维反卷积

可以看得出来,这种情况下的反卷积,其实就是把卷积核倒过来,然后对输入做full_padding的卷积。这是没有步长的情况,我们再来看看有步长的情况。假设步长是2,依然是没有padding的卷积,我们来看看反卷积。

一维反卷积
反卷积表示为:
一维反卷积

我们找一下上面两种情况的规律,发现所谓的反卷积,就是把卷积核倒一下,对输入矩阵做一些0值得插补,最后做各种形式的卷积(same、full等)。我们把这个推广到二维,梳理一下过程如下:

  • 首先是将卷积核反转(并不是转置,而是上下左右方向进行递序操作)。
  • 再将卷积结果作为输入,做补0扩充操作,即往每一个元素后面补0。这一步是根据步长来的,对于每个元素沿着步长方向补(步长-1)个0。例如,步长为1就不用补0了。
  • 在扩充后的输入基础上再对整体补0。以原始输入的shape作为输出,按照前面介绍的卷积padding规则,计算pading的补0的位置及个数,得到补0的位置及个数,得到补0的位置要上下和左右各自颠倒一下。
  • 将补0后的卷积结果作为真正的输入,反转后的卷积核为filter,进行步长为1的卷积操作。

注意:计算padding按规则补0时,统一按照padding=‘SAME’、步长为1*1的方式来计算。

通过以上的介绍,我们已经基本了解了反卷积操作的过程,看下面几张图能够更好地帮助理解。

反卷积

上图是步长为2的反卷积的一个图示,在蓝色内部补够0后,需要做到5的same padding,所以需要在蓝色外部也要做padding。这里灰色那个是卷积核,表示原卷积核的一个上下颠倒,左右颠倒。当然,反卷积还有很多更一般的情况,总结起来为一下几种:

反卷积gif

反卷积,可以理解为卷积操作的逆运算。千万不要当成反卷积操作可以复原卷积操作的输入值,反卷积并没有那个功能,它仅仅是将卷积变换过程中的步骤反向变换一次而已,通过将卷积核转置,与卷积后的结果再做一遍卷积,所以它还有个名字叫转置卷积。
虽然它不能还原出原来卷积的样子,但是在作用上具有类似的效果,可以将带有小部分缺失的信息最大化恢复,也可以用来恢复被卷积生成后的原始输入。

学习率

就是梯度下降的步长。

反向传播

应用梯度下降方法,需要导数,求导数的方法,有反向传播,其实就是链式法则。

正则化

避免过拟合,提高泛化能力的方法有:

  • L1、L2正则化
  • 早点停止训练
  • 数据集扩增
  • dropout
  • 其他

正则化(Regularization)包括L1正则化、L2正则化。正则化其实就是在原有的loss funtion后面加上权重。

L2正则化(权重衰减)为:
L2正则化

对权重求导,可得:
L2这里体现了权重的一个衰减。

L1正则化为:
L1

这个也可以做类似的求导。

L正则化,有点罚函数的味道,这里因为把权重加入到损失函数了,就尽量使得权重尽量小了。人们普遍认为:更小的权值w,从某种意义上说,表示网络的复杂度更低,对数据的拟合刚刚好(这个法则也叫做奥卡姆剃刀)。

softmax

softmax是一种归一化,它的好处就是使得计算上非常方便,谁用谁知道。

softmax

Softmax计算简单,效果显著,非常好用。它也能缓解局部极值的问题。

过拟合

所谓的过拟合就是说训练得太好了,以至于在测试集上效果不好。过拟合发生在测试误差和训练误差相差太大的情况下。

dropout

所谓的dropout,就是以一定的概率p(比如说0.5)先把隐藏层的部分节点藏起来(之所以叫藏起来,是因为与之相关的权重一直都在,只是不更新,下一次选择的时候,如果被藏的节点显示出来了,与之相关的权重还是保持原来的权重),变成一个比较小的网络,对于这个比较小的网络训练,训练到一定程度后,这些显示节点的权重有所更新了,这时候显示隐藏节点,重新以概率p进行选择……反复进行这个过程,知道训练好一个网络。测试的时候,用的是所有的节点,只不过权重得乘以p。

它的基本过程如下:

  • 首先随机(临时)删掉网络中一半的隐藏神经元(备份被删除神经元的参数),输入输出神经元保持不变(图中虚线为部分临时被删除的神经元)。
  • 对于修改后的网络,使用一小批训练样本去训练,按随机梯度下降法更新对应的参数。
  • 恢复隐藏的神经元,包括恢复与它相关的原来的参数,重复上述过程(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新)。

dropout

dropout是一种有效的防止过拟合的方法,另外也是为了减少计算量。它是缓解过拟合的技巧之一。

dropout也是一种集成,如图:

dropout集成

它相当于训练时随机丢弃部分神经元,测试时整合所有神经元。dropout为什么能work呢?好像大家都没有一个很好的解释。简单地理解,有时候,老板交付的任务,两个人单独完成再整合,总比两个人一块做结果要好,有点“三个和尚没水喝”的意思,但也不是绝对的。

历史

历史

随机梯度下降(mini-batch)

我们知道,在做有监督的问题中,有一个损失函数,用来衡量模型的好坏。在回归问题中,如果我们已经知道方程的形式,我们可以做出问题的损失函数。那么我们要做的就是寻找方程的最佳参数,即寻找参数,使得损失函数函数达到最小。乍一听,这就是个优化问题。当然可以对参数的各个分量求导,最后解方程组。问题是,你能确定最后的方程组好解?一般的数值解法有梯度下降法、牛顿法、拟牛顿方法以及信赖域方法等等。梯度下降方法简单易行,可是当数据量比较大时,梯度下降的计算就特别大。

为解决大数据量的优化求解,我们一般可以采用随机梯度下降。所谓的随机梯度下降,就是相比梯度下降,我们不选择全部的数据点,而是每次随机选择一个或者若干个数据点(一个数据点)来构建损失函数,接着再用梯度下降方法求解。看起来很不靠谱的样子,事实上多做几次这个操作,它是可以收敛的最优解的某个邻域的。

万有逼近定理
  • 如果一个隐层包含足够多的神经元,三层前馈神经网络(输入-隐层
    -输出)能以任意精度逼近任意预定的连续函数。

  • 当隐层足够宽时,双隐层感知器(输入-隐层1-隐层2-输出)可以逼
    近任意非连续函数:可以解决任何复杂的分类问题。

几种激活函数

常用激活函数如下:

激活函数
激活函数

白化

白化的目的是去除输入数据的冗余信息。比如训练数据是图像,由于图像中相邻像素之间具有很强的相关性,所以用于训练时输入是冗余的。白化的目的就是降低输入的冗余性。

所谓白化,就是对输入数据分布变换到均值为0,方差为1的正态分布,那么神经网络较快收敛。BN也是源于这个想法。

动量方法

动量方法

梯度下降,一般是沿着当前点的负梯度方向走一小步,到下一点,又沿那个那个点的负梯度方向走一步,那么这样走走停停,无疑是走得很慢。

Alt text

而一个真正的小球的下降要比这聪明多了,从A点滚动到B点的时候,小球带有一定的初速度,在当前初速度下继续加速下降,小球会越滚越快,更快的奔向谷底。momentum动量法就是模拟这一过程来加速神经网络的优化的。

它的基本算法如下:

动量算法

最为关键的一步就是,走的步长 v n v_n vn(称为速度)是由当前的负梯度方向和前一步的速度 v n − 1 v_{n-1} vn1做线性组合得到的。前一步的速度又和前前步的速度有关,以此类推,就把速度积累下来了。也就是说,当前的行走的方向和步长,还要综合考虑之前所有的走过的步的方向和步长。我们知道,不管是做傅里叶分析还是做半加速迭代,都习惯把之前的值做个加权平均,好像收敛就会快很多,monmentum好像就有点这个意思。它是为了解决一般SGD方法一直震荡而迟迟不收敛的情况。

动量方法有点像CG,要结合之前的信息。

交叉熵和KL散度

交叉熵和KL散度以及JS散度都是衡量两个分布(向量)的距离的一种度量。

交叉熵:
交叉熵

KL散度(KL距离,相对熵):
KL散度

JS散度(JS距离,KL散度的变形):
JS散度

batch normalization

所谓的batch normalization(批量归一化)就是“减去均值,除以方差”的标准化过程,比如一般正态分布变成标准正态分布。基本思想就是让每个隐层节点的激活输入分布固定下来,来提升训练速度。

它有什么用呢?它主要是为了**避免梯度消失,加速收敛。**把输入数据重新拉回到均值为0,方差为1的区域,这样让每层的输入落在(-1,1)区间,这段刚好是激活函数性能最好的区域。它是分布变得更加均匀,从而梯度方向更接近极值点方向,如下图:

BN

另外,它也克服神经网络受不同初值影响较大的缺点。促进神经网络稳定性发展:使不同层相对独立,每一层可以专注解决本层的问题。

BN

maxout

maxout是一种新型的激活函数,能够缓解梯度消失,规避了ReLU神经元死亡的情况,但增加的参数和计算量。它其实就是在原有激活的基础上,取个最大值,如下所示:

maxout

既然maxout是一个函数,那么它的输入,输出是什么?函数图像又是如何?

如果我们设置maxout的参数k=5,maxout层就如下所示:

maxtou

相当于在每个输出神经元前面又多了一层。这一层有5个神经元,此时maxout网络的输出计算公式为:

z1=w1*x+b1
z2=w2*x+b2
z3=w3*x+b3
z4=w4*x+b4
z5=w5*x+b5
out=max(z1,z2,z3,z4,z5)

所以这就是为什么采用maxout的时候,参数个数成k倍增加的原因。本来我们只需要一组参数就够了,采用maxout后,就需要有k组参数。

上采样和下采样

上下采样

下采样就是变小输入,上采样就是就是变大矩阵,有点“插值”的意思。

一般来说下采样指的就是池化。上采样包括unpooling和转置卷积(transpose convolution)和一般的插值等。unpooling就是反池化,在池化过程中,记录下max-pooling在对应kernel中的坐标,在反池化过程中,将一个元素根据kernel进行放大,根据之前的坐标将元素填写进去,其他位置补0 。

池化

池化

池化对特征图的每个局域进行下采样,作为这个区域的概括。池化包括平均池化mean-pooling和最大池化max-pooling。所谓的池化,其实就是讲输入分块,对每块去平均值或者最大值。

池化

池化

预训练

假设你想要解决一个复杂的任务,你没有太多的标记的训练数据,但不幸的是,你不能找到一个类似的任务训练模型。 不要失去所有希望! 首先,你当然应该尝试收集更多的有标签的训练数据,但是如果这太难或太昂贵,你仍然可以进行无监督的训练。 也就是说,如果你有很多未标记的训练数据,你可以尝试逐层训练层,从最低层开始,然后上升,使用无监督的特征检测算法,如限制玻尔兹曼机(RBM)或自动编码器。 每个层都被训练成先前训练过的层的输出(除了被训练的层之外的所有层都被冻结)。 一旦所有层都以这种方式进行了训练,就可以使用监督式学习(即反向传播)对网络进行微调。

预训练

然而,貌似主流的深度学习平台甚至都不支持RBM和预训练。所以,不必深究。

预训练在没有太多工具的情况下,能够解决梯度消失和局部极值,训练困难,训练时间长等问题。但它本质上无法解决梯度消失的问题。

自编码机

自编码器其实是通过神经网络,学会重构自己的过程。

自编码器(autoencoder)假设输出与输入相同(target=input),是一种尽可能复现输入信号的神经网络。将input输入一个encoder编码器,就会得到一个code,加一个decoder解码器,输出信息。通过调整encoder和decoder的参数,使得重构误差最小。它是一种非监督学习,因为无标签数据,误差的来源是直接重构后信号与原输入相比得到。

自编码

自编码

梯度消失(爆炸)和局部极值

所谓的梯度消失,具体来说,由于在向后传递过程中,sigmoid向下传递的梯度包含了一个f’(x) 因子(sigmoid关于输入的导数),因此一旦输入落入饱和区,f’(x) 就会变得接近于0,导致了向底层传递的梯度也变得非常小。此时,网络参数很难得到有效训练。这种现象被称为梯度消失。一般来说, sigmoid 网络在5 层之内就会产生梯度消失现象。Relu函数可以有效缓解这种情况。

梯度消失

反之,如何激活函数导数乘以很大的神经网络权重参数w,那么因为乘积大于1,就会发生梯度爆炸现象。

局部极小值很好理解,因为近似的函数非凸,就容易陷入局部极值。

局部极值

Flatten

Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。其实就是把矩阵拉成一条。

特征图

在做二维卷积中,用滤波器卷一次得到的结果就是一个特征图,不同的滤波器,做多次卷积操作就会得到多个特征图。


http://www.ppmy.cn/news/706792.html

相关文章

以字符串为参数的函数 / 不同形式字符串的使用

面向对象上机,函数参数里面最常用到的应该就是字符串了,但是一直都没有搞清楚具体有哪些使用形式,怎么用,对使用时所会发生的错误有哪些解决办法?于是乎在今天做个总结,方便自己日后回顾。 Ⅰ.字符指针 1.常…

JAVA复习之流程控制、数组、泛型、集合

一、详细教程见: 程序结构(流程控制语句) 二、注意事项: 1、case不可以使用浮点类型 2、如果遇到循环嵌套情况,break语句只会使程序流程跳出包含它的最内层的循环结构,即跳出一层循环 3、break、continue提供了“标签”的功能 三、数组 例…

Hadoop(HDFS+MapReduce+Hive+数仓基础概念)学习笔记(自用)

文章目录 修改虚拟机IP复制网卡的配置 Vi编辑器的常用命令实操部分复制网卡的配置 Hadoop集群初体验20、secondarynameNode如何辅助管理FSImage与Edits文件 ⭐⭐⭐21、SecondaryNamenode存在的意义是什么? ⭐⭐⭐⭐22、SecondaryNamenode工作的触发因素有哪些&#…

MySQL索引【详解】

给大家推荐一款好用的CSDN云服务,新人首购折扣哦,点击下图跳转: 文章目录 第一篇 什么是索引?1、来看一个问题方案1方案2方案3方案4 2、索引是什么? 第二篇 MySQL索引原理详解1、背景2、预备知识什么是索引&#xff1…

服务器域名HTTP

目录 服务器域名层次结构解析过程 HTTPHTTP请求过程get和post的区别 服务器 什么是服务器: 服务器(server),就是一种特殊的计算机,也包括处理器、硬盘、内存、系统总线等,但是由于需要提供更可靠的服务&…

【星球问答精选】我想打造个性化的高效工作流,不会编程怎么办?

题图:Photo by Christin Hume on Unsplash 知识星球上,星友 Kevin 提问(为保护隐私,有删节): 王老师您好,我是您的超级忠实读者以及新晋工具爱好者。由于新晋,所以感觉在接触时会遇见…

数据结构:栈

数据结构:栈 作为本人新开的类型,我就思考了很久,最后决定写与数据结构有关的博客。说到数据结构,我们首先想到的就是栈。 不 怎 么 华 丽 的 分 割 线 一、简介 栈,是只能在某一端插入和删除的特殊线性表。 栈和我…

机器学习基础知识点

机器学习基础知识点 文章目录 机器学习基础知识点监督学习回归线性回归岭回归lasso回归 分类k最近邻分类朴素贝叶斯分类logistic回归支持向量机 其他随机梯度下降线性判别分析决策树 无监督学习聚类k均值分层次聚类谱聚类高斯混合模型 降维PCA降维LLE降维MDS和t-SNE独立成分分析…