> 文章列表 > 深度学习总结

深度学习总结

深度学习总结

1、感知机

首先感知机的大致形状如下:

即感知机是具有输入与输出的算法,在给定一个输入以后,将输出一个确定值。

感知机将权重和偏置设定为参数。

使用感知机可以表示与门与或门。

异或门无法使用,即单层感知机只能表示线性输出,而多层感知机可以表示非线性输出。

这里的感知机的权重参数是我们自己设定的, 而我们在实际中不可能进行自己设置参数,所以我们使用神经网络的方式,利用向前传播与向后传播算法来不断的改变自己的参数以此来获得最优解

 而在这里激活函数就是连接感知机和神经网络的桥梁。实际上,如果将激活函数从阶跃函数换成其他函数,就可以进入神经网络的世界了。

数据限定在某个范围内就是正规化。对神经网络的输入数据称为预处理。

对于输出层的激活函数,回归问题一般使用恒等函数,分类问题使用softmax函数。

对与一个问题如果是人想到的解决办法然后得到答案那就是算法。如果是人得到的抽象出来的特征量然后输入得到答案,那就是机器学习。而直接将问题交给神经网络,这就是深度学习。深度学习又被称为端到端的机器学习,即从原始的数据可以直接得到答案。所以深度学习与机器学习最大的不同处在于,机器学习需要专门的人来从原始的数据中去抽离特征,只有合适的特征机器学习的效果才会很好,而深度学习不需要,只要将数据交给神经网络,那么最终便可以得到想要的答案。

所以深度学习与机器学习的区别主要如下:

1、深度学习更适合处理大数据。

2、硬件上深度学习比较依赖,因为计算量很大

3、深度学习不用人为抽象特征,只需要交给神经网络算法。

4、解决问题:传统的机器学习将问题分块进行解决,然后再将结果组合在一起。深度学习趋向于一次将问题解决。比如在图像物体分类中,机器学习先将物体识别出来,然后再进行分类,而深度学习会一次性将图像物体分类。

神经网络的学习:

1、随机选取出数据

2、计算各个权重的梯度

3、将权重参数的的各个梯度方向进行更新

然后一直重复第二和三步。其实神经网络主要是分为前向传播和后向传播。对于前向传播主要是使用更新好的权重参数来得到预测的值。然后后向传播是使用误差函数计算预测的值和实际给出的正确结果之间的误差,然后利用梯度下降的算法,将权重参数进一步更新,使得误差越来越小。

数值微分直接计算的实现比较简单,但是计算的速度很慢,所以可以使用数值微分的方法来进行检验与误差反向传播的方法是否一致,这就是梯度确认。

然而,对于梯度下降法,由于深度学习中参数较多,当函数的形状不是均匀的时候,梯度下降的速度其实很慢,因为有一个方向的权重比较大,所以迭代的次数也很多,那么我们可以优化下SGD梯度下降算法。

1、momentum算法

使用新的参数v,相当于小球在坡上下滚动,给予小球一个梯度方向上的加速度。其中v前面的参数是当物体不受任何力的时候,速度v不断减少,相当于摩擦力。这样的话,当两个权重一个坡度很大,一个坡度很小的时候,那么坡度小的那个也一直存在一个加速度使得收敛的更快,而坡度大的由于正负相抵,所以变化也不大。可以有效缓解之字情况的出现。

2、AddGrad

 在关于学习率的有效技巧中,有一种被称为学习率衰减(learning ratedecay)的方法,即随着学习的进行,使学习率逐渐减小。实际上,一开始“多”学,然后逐渐“少”学的方法,在神经网络的学习中经常被使用。

 3、ADAM算法

 同时需要注意的是,我们不可以将权重初始化为0,(或者说不能设置成为一样的值),因为这样在误差反向传播法中,所有的权值都会进行相同的更新。

权重初始值的问题:

如果一开始权重的初始值分布并不是很均匀,比如激活层得到的数据偏向0或1,那么在反向传播的过程中,梯度的值会不断减少,最后消失,这就是梯度消失问题。就算不偏,如果激活函数的值不是均匀分布,那么表现力会有问题,因为这样的神经元会输出几乎相同的值。所以为了解决这个问题,我们需要选择好的权重初始值。

在这里又两个选择:

Xavier是以激活函数为线性函数推导出来的,而tah和sigmoid函数左右对称可以模拟为线性函数。

如果激活函数使用Relu函数,那么采用He初始值。

以上是直接提供了初始值,那么我们还可以使权重数据强制其分布均匀。

例如使用Bath Normalization算法来强制其改变。主要有三个优点:1、使得学习快速进行。2、不那么依赖初始值。3、抑制过拟合。我们可以在激活函数层前加入Batch Norm层。

具体实现是以学习的mini——batch为单位。进行数据分布均值为0,方差为一的正规化,然后对正规化后的数据进行缩放和平移的变化。

在深度学习中解决过拟合问题:

1、正则化,加入参数\\lambda来对权重较大的参数进行惩罚,这样使得过拟合的现象有所改变。

2、如果过于复杂,那么正则化也不好使,则使用Dropout:随机删除神经元。在训练的时候,随机删除隐含层中的神经元,被删除的神经元不再进行信号的传递,训练时,每传递一次数据,就会随机选择要删除的神经元。然后,测试时,虽然会传递所有的神经元信号,但是对于各个神经元的输出,要乘上训练时的删除比例后再输出。机器学习中经常使用集成学习。所谓集成学习,就是让多个模型单独进行学习,推理时再取多个模型的输出的平均值。用神经网络的
语境来说,比如,准备 5 个结构相同(或者类似)的网络,分别进行学习,测试时,以这 5 个的输出的平均值作为答案。实验告诉我们,6.5 超参数的验证 195通过进行集成学习,神经网络的识别精度可以提高好几个百分点。这个集成学习与 Dropout 有密切的关系。这是因为可以将 Dropout理解为,通过在学习过程中随机删除神经元,从而每一次都让不同的模型进行学习。并且,推理时,通过对神经元的输出乘以删除比例(比如,0.5 等),可以取得模型的平均值。也就是说,可以理解成,Dropout 将集成学习的效果(模拟地)通过一个网络实现了。

超参数:人为设置的参数,batch大小,各层神经元的数量,学习率。在调整超参数的时候,使用验证集来进行调整。

超参数的优化:

1、从设定的超参数范围中随机采集

2、使用1中的采样中的超参数进行学习,通过验证数据识别精度

3、重复1、2,根据结果不断缩小参数范围。

卷积神经网络:CNN主要用于图像识别、语言识别

和前面的神经网络很相似,但是多了卷积层、池化层。

对于人工神经网络,在激活层前使用的是全连接,即每个输入都和输出进行连接。

全连接的问题:在使用全连接的时候,数据的形状会被忽视,例如在输入图像的时候,图像的高、长、通道方向。是一个三维的数据,但是作为全连接的输入的时候,会被转化成为一维的数据,而CNN可以保持数据的形状不变,使用三维状态来接受数据。

卷积层:

卷积层就是进行卷积运算,运算方式如下:

 在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如 0 等),这称为填充(padding),是卷积运算中经常会用到的处理。比如,在图 7-6 的例子中,对大小为 (4, 4) 的输入数据应用了幅度为 1 的填充。“幅度为 1 的填充”是指用幅度为 1 像素的 0 填充周围。

使用填充主要是为了调整输出的大小。比如,对大小为 (4, 4) 的输入数据应用 (3, 3) 的滤波器时,输出大小变为 (2, 2),相当于输出大小比输入大小缩小了 2 个元素。这在反复进行多次卷积运算的深度网络中会成为问题。为什么呢?因为如果每次进行卷积运算都会缩小空间,那么在某个时刻输出大小就有可能变为 1,导致无法再应用卷积运算。为了避免出现这样的情况,就要使用填充。刚才的例子中,将填充的幅度设为 1,那么相对于输入大小 (4, 4),输出大小也保持为原来的 (4, 4)。因此,卷积运算就可以在保持空间大小不变的情况下将数据传给下一层。

应用滤波器的位置间隔称为步幅(stride)。之前的例子中步幅都是 1,如果将步幅设为 2,则如图 7-7 所示,应用滤波器的窗口的间隔变为 2 个元素。

 

 之前的卷积运算的例子都是以有高、长方向的 2 维形状为对象的。但是,图像是 3 维数据,除了高、长方向之外,还需要处理通道方向。这里,我们按照与之前相同的顺序,看一下对加上了通道方向的3维数据进行卷积运算的例子。

 需要注意的是,在 3 维数据的卷积运算中,输入数据和滤波器的通道数要设为相同的值。

将数据和滤波器结合长方体的方块来考虑,3 维数据的卷积运算会很容易理解。方块是如图 7-10 所示的 3 维长方体。把 3 维数据表示为多维数组时,书 写 顺 序 为(channel, height, width)。比 如,通 道 数 为 C、高 度 为 H、长度为 W 的数据的形状可以写成(C, H, W)。滤波器也一样,要按(channel,height, width)的顺序书写。比如,通道数为 C、滤波器高度为 FH(Filter
Height)、长度为 FW(Filter Width)时,可以写成(C, FH, FW)

 可以一次处理多个数据,即数据的批处理

池化层:

池化是缩小高、长方向上的空间的运算。比如,如图 7-14 所示,进行将2 × 2 的区域集约成 1 个元素的处理,缩小空间大小。

 池化层主要有:

1、没有要学习的参数

2、通道数不发生变化

3、对微小的位置变化具有鲁棒性(健壮)

基于 im2col 的展开:

im2col 是一个函数,将输入数据展开以适合滤波器(权重)。如图 7-17 所示,对 3 维的输入数据应用 im2col 后,数据转换为 2 维矩阵(正确地讲,是把包含批数量的 4 维数据转换成了 2 维数据)。

 im2col 会把输入数据展开以适合滤波器(权重)。具体地说,如图 7-18 所示,对于输入数据,将应用滤波器的区域(3 维方块)横向展开为 1 列。im2col 会在所有应用滤波器的地方进行这个展开处理。im2col 这个名称是“image to column”的缩写。

以下是完整的过程:

 池化层的实现是使用im2col来展开数据,1、展开输入数据。2、各行的最大值3、转化为合适的输出大小。

基于分层结构的特征提取:

第一层提取边缘等低级信息,然后随着层数的加深,提取的信息越来越抽象,也越来越高级,就像人类理解的一样。

关于CNN的常用网络结构有1、LeNet2、AlexNet

LeNet是进行数字识别的网络,它作为20年前的网络,结构主要差异有:1、使用sigmod函数2、使用子采样缩小中间数据。与现在常见的网络结构并没有太大的不同,只是大数据和GPU的发展成为了深度学习的巨大动力。

2、AlexNet:主要的不同:1、激活函数使用Relu2、进行局部正规化的LRN层3、使用Dropout。

ResNet引入了快捷结构,可以随着层的加深而不断提高性能,反向传播的信号进行无衰减传递。

迁移学习:将学习后的参数(一部分)迁移到其他神经网络,进行再学习。

GPU擅长矩阵的乘法运算,cpu更擅长连续复杂的运算。

以上就是深度学习中的CNN部分,主要是针对机器视觉和图像处理,那么在现在的生活中我们需要大量的处理文本和语音,那么针对这些顺序输入的语言,我们应该怎么才能处理,这样就引出了专门针对顺序输入的数据的RNN。

1、RNN

CNN在输入与输出的时候,之间是没有联系的,但是在文本或者语音中,输入的数据之间是有联系的,所以为了专门处理这样的情况RNN应运而生。

RNN的结构也比较简单,只有输入层,隐藏层,输出层。

RNN与传统的神经网络最大的不同就是RNN会将上一层的输入作为下一层的隐藏层进行处理,一起来进行训练。

 这样RNN从开头到结尾,一步步得到想要的输出。

但是RNN 的缺点也很明显,就是受到短期记忆的影响,如果序列足够的长,那么很难讲较早的信息传递至后面的隐藏层中。在RNN中,那些较早的层梯度会不断的较少,最后不会再进行更新这也是梯度消失的问题,由于不再进行更新,RNN会忘记在较长序列中的内容,因此只具有短期的记忆。梯度爆炸是因为计算过于的复杂。所以我们采用LSTM来一定程度上解决RNN中出现的问题。

LSTM算法:

LSTM在结构上与RNN并没有很大的不同。而是使用不同的函数来进行计算。LSTM使用记忆细胞来决定哪些信息留下和删除。可以理解为由于记忆能力有限,所以只记住了重要的内容,而忘记了哪些不重要的内容。

在RNN中隐藏层十分的简单,只有一个激活函数比如tanh。而LSTM中隐含层中有四个相互交互的函数,三个sigomid函数和一个tanh函数。LSTM中主要是通过门来去除或者增加细胞中的信息。

大致的流程如下:

首先通过遗忘门来利用sigmod函数来输出零或者一,以此来判断是否遗忘掉之前保存的数据。然后是通过输入门来确定什么样的数据值得被记录。这里是通过sigmod函数和tanh函数相乘。然后根据遗忘门和输入门中的内容来讲细胞中的信息进行更新。最后要通过输出门,即根据记忆的内容是否将将要输出的内容作出变化。使用sigmoid函数与tanh(ct)相乘得到要输出的值。

改进:GRU算法:与LSTM算法相比结构上做了些微小的变化,将遗忘门与输入门合成了单一的更新门,同时混合了细胞的状态和隐藏的状态。

总结:

写到这里,深度学习的理论部分算是结束了,总得来说学的模模糊糊感觉很多地方并不是很清楚,但是也是简单入了门,起码知道深度学习在讲些什么东西。后面主要是将两篇论文还有机器学习的其他算法看完。然后下个星期再上机和408以及英语部分。如果空闲的话再做一些深度学习的小项目,然后就这样吧,未来怎么样,不太关心哦。