关于深度学习入门的一点理解

134 阅读21分钟

1.深度学习的了解

1.1人工智能的影响

随着人工智能的日益发展,其在许多领域已取得非凡的成就。而这其中最大的功臣便是“深度学习”。人工智能的应用前景,极大地刺激了深度学习的发展,深度学习的发展也彻底颠覆了传统代码的编程方法以及局限性,具有划时代的意义。

 

1.2理解深度学习及意义

深度学习与传统编程的区别就在于其规则,深度学习使得编程更带有神秘色彩,赋予了程序类似于大脑神经的活体思维能力——神经网络。同时也变得更加的复杂,难以理解和识别。而深度学习带来的价值无疑是巨大的,它发展于人工智能领域,已经在很多方面达到了比人更高的层次,比如围棋机器人“AlphaDog”、智能翻译系统。还有现代工业制造以及生活中运用的人工智能为我们的生活提供了极大的便利,解放了更多的生产力。让人有更多的时间去认识世界,发展自身。 image.png

1.3划时代的AI

从石器时代人类利用简单的自然资源——石头来达到生存所需的捕食;到青铜器时代,人类通过冶炼工艺制作了原始的冷兵器;而科技的日益进步所带来的人工智能,可以代替人类去做一些危险的事情以及许多耗费大量时间的流水线。可以说,AI的发展为人类带来的意义是划时代的。而深度学习结合了数据时代以及互联网所提供的大量数据,同时依靠强大的计算能力依托GPU来构建神经网络,再通过不断训练以达到人们的目的。训练过程中,模型学习如何正确进行分类,模型自主学习规则,这也是一个根本性的转变。让机器变得智能化,有人类所需要的判断能力。

1.4深度学习平台

(1)TensorFlow 和 Keras (Google)   

(2)Pytorch (Facebook)             

(3)MXNet (AWS)                   

2. 神经网络

2.1认识神经网络

人工神经网络,简称神经网络或类神经网络,在机器学习和认知科学领域,是一种模仿生物神经网络(动物的中枢神经系統,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。

2.2回顾

指对刚才运行事项的记忆即发生事件。神经网络就要有回顾能力,能够详细记忆训练时的数据处理,从而产生一定的经验性和后期单独处理事件的依据。

2.3数据准备

包含从原始数据到形成最终数据集(将要被喂给模型工具的数据)的所有操作。数据准备任务可能要进行多次,没有规定的固定顺序。任务包括:表,记录和特征选择以及为了模型工具的数据清洗和转换。而数据本身便有着很大的杂乱性,所以数据准备是要花费大量时间的。通常要经历如下的步骤:

1.   数据清洗,主要作用是防止垃圾数据的流入流出,分为填充数据的缺失值、处理离群点等。

2.   数据归一化就是将数值型的值转化到一个特定的区间上。常有Min-Max归一化、Z-score归一化(标准归一化)、Decimal归一化。

3.   数值变量可能有许多不同的值,对于某些算法,这可能导致非常复杂的模型。可以通过“绑定”将连续属性转换为分类属性,以便于使用某些机器学习方法。离散化是将数据放进一些桶的过程,所以这是有限个可能的状态。即数据离散化

4.   如果你要分析的数据非常庞大,通常比较好用的减少数据量的方法是将数据减少维度而且使得数据变得更加具有代表性和容易处理。这将促进数据的理解,探索和特征工程。大量的数据会导致算法更长的运行时间和更大的计算和内存需求。即数据降维。

5.   在读取/写入文本时不适当的文本编码处理会导致信息的丢失,不经意的引入不可读的字符(如:null)也可能影响文本解析。一些非结构化的文本如:推特,生产评论或者网页访问数据在被分析之前通常需要做一些准备工作。

同时数据的输入以数组形式进行,将目标转换成为类别。

image.png  

image.png

2.4用Keras加载数据

keras是属于tensorflow 2的开放API。keras提供了许多常见的数据集来供调用。

2.5激励函数

也称点火规则,这使它与人脑的工作联系起来。当一个神经元的输入足够大时,就会点火,也就是从它的轴突 (输出连接)发送电信号。同样,在人工神经网络中,只要输入超过一定标准时才会产生输出,这就是点火规则的思想。当只处理二值输出时,输出要么为0要么为1,取决于神经元是否应该点火。

2.6损失函数

    损失函数的意义在于神经网络学习到的模型效果,以及优化的目标是通过损失函数来定义量化的。

2.7过拟合

在进行有监督的机器学习建模时,一般假设数据独立同分布。即样本数据根据通过一个概率分布采样得到,而且这些样本相互之间独立。我们使用历史数据集去训练模型,使得损失函数最小化,然后用训练得到的模型去预测未知数据。如果一味追求让损失函数达到最小,模型就会面临过拟合问题,导致预测未知数据的效果变差。模型在训练数据上表现出色,但对于验证数据表现不佳(表明模型只是在记忆数据)。理想情况下,模型在这两个数据集上表现出的准确性和损失应该相似。

2.8创建模型

主要分为3个部分:输入层、隐藏层、输出层。

1.  输入层。用于构建网络的第一层——输入层,该层会告诉网络我们的输入的尺寸是什么,这一点很重要。

image.png

2.  隐藏层。神经网络的中间层,有L-2层,表示每一层神经元通过前向传播算法计算的结果矩阵。单个隐藏层的意义就是把输入数据的特征,抽象到另一个维度空间,来展现其更抽象化的特征,这些特征能更好的进行线性划分。多个隐藏层的意义是对输入特征多层次的抽象,最终的目的就是为了更好的线性划分不同类型的数据。

3.  输出层。神经网络的最后一层,表示网络最终的输出结果,通常是一列矩阵。

image.png

3.卷积神经网络

卷积神经网络是一种前馈神经网络,它由若干卷积层和池化层以及全连接层组成,尤其在图像处理方面卷积神经网络的表现十分出色。由于其具有局部区域连接、权值共享、降采样的结构特点,使得卷积神经网络在图像处理领域表现出色。卷积神经网络相比于其他神经网络的特殊性主要在于权值共享与局部连接两个方面。权值共享使得卷积神经网络的网络结构更加类似于生物神经网络。局部连接不像传统神经网络那样,第n-1层的每一神经元都与第n层的所有神经元连接,而是第n-1层的神经元与第n层的部分神经元之间连接。这两个特点的作用在于降低了网络模型的复杂度,减少了权值的数目。

image.png

3.1局部区域连接

1962年,Hubel和Wiesel研究生物神经学里面的视觉分层结构而提出感受野的概念,大脑皮层的视觉神经元就是基于局部区域刺激来感知信息的。局部区域连接的思想就是受启发于视觉神经元的结构。在传统的神经网络结构中,神经元之间的连接是全连接的,即n-1层的神经元与n层的所有神经元全部连接。但是在卷积神经网络中,n-1层与n 层的部分神经元连接。

3.2权值共享

权值共享就是整张图片在使用同一个卷积核内的参数。比如一个331的卷积核,这个卷积核内9个的参数被整张图片共享,而不会因为图像内位置的不同而改变卷积核内的权系数。说的再通俗一点,就是用一个卷积核不改变其内权系数的情况下卷积处理整张图片。当然,CNN中每一个卷积层不会只有一个卷积核的,这样说只是为了方便解释。

权值共享的优点一是,权值共享的卷积操作保证了每一个像素都有一个权系数,只是这些系数被整个图片共享,因此大大减少了卷积核中参数量,降低了网络的复杂度。二是,传统的神经网络和机器学习方法需要对图像进行复杂的预处理提取特征,将得到特征再输入到神经网络中。而加入卷积操作就可以利用图片空间上的局部相关性,自动的提取特征。

3.3降采样

降采样是卷积神经网络的另一重要概念,通常也称之为池化(Pooling)。最常见的方式有最大值(Max)池化、最小值(Min)池化、平均值(Average)池化。池化的好处是降低了图像的分辨率,整个网络也不容易过拟合。

3.3卷积层

在卷积层中,通常包含多个可学习的卷积核,上一层输出的特征图与卷积核进行卷积操作,即输入项与卷积核之间进行点积运算,然后将结果送入激活函数,就可以得到输出特征图。每一个输出特征图可能是组合卷积多个输入特征图的值。卷积层l的第j单元的输出值 image.png的计算为公式(1),其中image.png表示选择的输入特征图的集合,k表示可学习的卷积核。image.png 为公式(1)。

通常把卷积核k看作一个滑动窗口,这个滑动窗口以设定的步长向前滑动。这里输入图像的大小是4x4即M=4,卷积核大小为2*2即k=2,步长为1即s=1,根据卷积层输出计算公式(2)可以计算输出图像的大小N=3。image.png 式(2).

过程是44输入图像与33卷积核进行卷积,得到3*3的输出图像。这样的卷积存在两个缺点:(1)每次卷积都会导致图像尺寸的变小,如果图像很小、进行卷积的次数很多,最后可能只会剩下一个像素。(2)输入图像的矩阵边缘像素只被计算过一次,而中间像素被卷积计算多次,这就意味着丢失图像边缘信息。为了解决这两个问题,就需要对输入图像进行填充。

常见的填充方式有Valid和Same填充。

Valid:不使用填充,即使用MM的图像与kk的卷积核相卷积。

Same:通过填充使得输出的卷积特征图尺寸与输入图像尺寸相等,此时填充宽度P=(k-1)/2。

在计算机视觉领域,k通常是奇数,一方面可以保证使用 Same 填充时填充像素数P是整数,对原图片的填充是对称的;另一方面奇数宽度的卷积核具有一个中心像素点,可以表示卷积核的位置。在我的例子中卷积核的宽度是2为偶数,所以填充后再卷积没有达到和原始图像一样的大小。

3.4池化层

池化层通常出现在卷积层之后,二者相互交替出现,并且每个卷积层都与一个池化层一一对应。池化层l中激活值image.png 的计算为公式(4)image.png式(4)。

其中,down(.)表示池化函数,常用的池化函数有Mean-Pooling(均值池化)、Max-Pooling(最大值池化)、Min-Pooling(最小值池化)、Stochastic-Pooling(随机池化)等,image.png为偏置,image.png为乘数残差, image.png 表示第l层所采用的池化框大小为 image.png * image.png 。对于最大值池化来说,是选取输入图像中大小为image.png * image.png的非重叠滑动框内所有像素的最大值,显然,对于非重叠池化来说,输出的特征图在像素上缩小了image.png倍。池化层比卷积层更大幅度的减少了连接个数,也就是说降低了特征的维度,从而避免过拟合,同时还使得池化输出的特征具有平移不变性。三种池化方式各有优缺点,均值池化是对所有特征点求平均值,而最大值池化是对特征点的求最大值。而随机池化则介于两者之间,通过对像素点按数值大小赋予概率,再按照概率进行亚采样,在平均意义上,与均值采样近似,在局部意义上,则服从最大值采样的准则。根据Boureau理论可以得出结论,在进行特征提取的过程中,均值池化可以减少邻域大小受限造成的估计值方差,但更多保留的是图像背景信息;而最大值池化能减少卷积层参数误差造成估计均值误差的偏移,能更多的保留纹理信息。随机池化虽然可以保留均值池化的信息,但是随机概率值确是人为添加的,随机概率的设置对结果影响较大,不可估计。

3.5全连接层

该层位于 CNN 模型架构的尾部。全连接层的输入是使用卷积滤波器提取的丰富特征。然后向前传播直到输出层,在那里我们得到输入图像属于不同类别的概率。预测输出是模型预测的概率最高的类别。

3.6创建卷积模型

1.     导入我们所需要的库,例如Keras:

image.png

2.        加载数据集

(x_train, y_train), (x_test, y_test) = mnist.load_data()

3.        构建卷积神经网络

image.png

4.数据增强与模型部署

数据增强,就是采用在原有数据上随机增加抖动和扰动,从而生成新的训练样本,新样本的标签和原始数据相同。这个也很好理解,对于一张标签为“狗”的图片,做一定的模糊、裁剪、变形等处理,方法包括:翻转、选择、缩放、裁剪、平移等。并不会改变这张图片的类别。

而模型部署一直是深度学习算法走向落地的重要的一环,分为部署实体、部署方式、部署连接三部分。

Keras附带ImageDataGenerator的一个图像增强对象类。可以在batch中对数据进行增强,扩充数据集大小,增强模型的泛化能力。比如进行旋转,变形,归一化等等。

keras.preprocessing.image.ImageDataGenerator(featurewise_center=False, samplewise_center=False, featurewise_std_normalization=False, samplewise_std_normalization=False, zca_whitening=False, zca_epsilon=1e-06, rotation_range=0.0, width_shift_range=0.0, height_shift_range=0.0, brightness_range=None, shear_range=0.0, zoom_range=0.0, channel_shift_range=0.0, fill_mode='nearest', cval=0.0, horizontal_flip=False, vertical_flip=False, rescale=None, preprocessing_function=None, data_format=None, validation_split=0.0)

featurewise_center: Boolean. 对输入的图片每个通道减去每个通道对应均值。

samplewise_center: Boolan. 每张图片减去样本均值, 使得每个样本均值为0。  zca_whitening: Boolean. 去除样本之间的相关性。rotation_range(): 旋转范围。width_shift_range(): 水平平移范围。  height_shift_range(): 垂直平移范围……

5.预训练与微调

5.1什么是预训练

要搭建一个网络模型来完成一个特定的图像分类的任务。首先,需要随机初始化参数,然后开始训练网络,不断调整直到网络的损失越来越小。在训练的过程中,一开始初始化的参数会不断变化。当你觉得结果很满意的时候,你就可以将训练模型的参数保存下来,以便训练好的模型可以在下次执行类似任务时获得较好的结果。这个过程就是预训练。

5.2加载模型

   经过训练的模型,直接加载(以pytorch为例):

# 保存和加载整个模型
torch.save(model_object, 'resnet.pth')

5.3预处理(以图像为例)

一般的图像预处理步骤为:灰度化 ->几何变换->图像增强

1.  灰度化,即在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。一般有分量法,最大值法,平均值法,加权平均法四种方法对彩色图像进行灰度化。

2.  图像几何变换又称为图像空间变换,通过平移、转置、镜像、旋转、缩放等几何变换对采集的图像进行处理,用于改正图像采集系统的系统误差和仪器位置(成像角度、透视关系乃至镜头自身原因)的随机误差。此外,还需要使用灰度插值算法,因为按照这种变换关系进行计算,输出图像的像素可能被映射到输入图像的非整数坐标上。通常采用的方法有最近邻插值、双线性插值和双三次插值。

3.  图像增强。即增强图像中的有用信息,它可以是一个失真的过程,其目的是要改善图像的视觉效果,针对给定图像的应用场合,有目的地强调图像的整体或局部特性,将原来不清晰的图像变得清晰或强调某些感兴趣的特征,扩大图像中不同物体特征之间的差别,抑制不感兴趣的特征,使之改善图像质量、丰富信息量,加强图像判读和识别效果,满足某些特殊分析的需要。图像增强可分成两大类:频率域法和空间域法。

5.4模型微调

用预训练型和自己的数据进行训练,使得参数适应自己的数据,这样一个过程称之为微调。微调可大概分为3种情况:

1.只预测,不训练。 特点:相对快、简单。即拿着已经训练好的模型进行预测,在目标集和训练集差不多的情况下,可以达到不错的效果;

2.训练,但只训练最后分类层,也叫迁移学习。 特点:预训练的模型最终的分类已经符合要求,现在只是在他们的基础上进行类别降维。这里主要改最后的分类层,即fc层。

3.完全训练,分类层+之前卷积层都训练。特点:耗时较大,不过非常适合微调到自己想要的模型里面,预测精度相比情况2也提高不少。

model = torch.load('resnet.pth')
#加载预训练层
net = torchvision.models.resnet18(pretrained=True)
for param in net.parameters():#nn.Module有成员函数parameters()
    param.requires_grad = False  #所有层的所有参数都不变
# Replace the last fully-connected layer
# Parameters of newly constructed modules have requires_grad=True by default
net.fc = nn.Linear(512, 1000)#resnet18中有self.fc,作为前向过程的最后一层,默认可以反向传播。

5.5迁移学习和深度学习

迁移学习将可训练参数的数量减少了100%,使训练更稳定,更容易调试。转移学习使深度学习更容易 。

迁移学习的必要性和价值体现在:

1.复用现有知识域数据,已有的大量工作不至于完全丢弃。

2.不需要再去花费巨大代价去重新采集和标定庞大的新数据集,也有可能数据根本无法获取。

3.对于快速出现的新领域,能够快速迁移和应用,体现时效性优势。

 

image.png

6.高级模型结构

6.1自然语言处理

自然语言处理(Natural Language Processing),简称NLP。可以把它分成“自然语言”和“处理”两部分。区分于计算机语言,自然语言是人类发展过程中形成的一种信息交流的方式,包括口语及书面语,反映了人类的思维,都是以自然语言的形式表达。世界上所有的语种语言,都属于自然语言,包括汉语、英语、法语等。“处理”是指计算机处理。因此自然语言处理,简单来说即是计算机接受用户自然语言形式的输入,并在内部通过人类所定义的算法进行加工、计算等系列操作,以模拟人类对自然语言的理解,并返回用户所期望的结果。自然语言处理的目的在于用计算机代替人工来处理大规模的自然语言信息。它是人工智能、计算机科学、信息工程的交叉领域,涉及统计学、语言学等的知识。由于语言是人类思维的证明,故自然语言处理是人工智能的最高境界,被誉为“人工智能皇冠上的明珠”。

而深度学习在NLP中有着极其重要的意义。通过构建神经网络来让计算机实现对语言的认识及训练。从而使机器的语言更具自然语言的特征。

image.png

6.2循环神经网络

循环神经网络简称RNN。RNN现在已经是NLP任务最常用的方法之一。RNN模型的优势之一就是可以有效利用之前传入网络的信息。如下图:

image.png

输入的x是该词的词向量。每个向量x对应一个隐层的向量h。而image.png与W以及组成一个输入单元。每个单元的隐层向量是当前输入词向量和上一个隐层状态的函数。公式如下:image.png。公式中有两个上标不同的权重矩阵Whx和Whh,分别与输入的词向量和上一次的隐藏状态相乘。这两个权重矩阵是网络的所有单元共享的。具体到某个单元,它的输出值y是h和Ws的乘积,即另一个权值矩阵:

image.png

6.3其他架构

1.    自编码器

自编码器(Auto-Encoder),是一种无监督式学习模型。它基于反向传播算法与最优化方法(如梯度下降法),利用输入数据 X 本身作为监督,来指导神经网络尝试学习一个映射关系,从而得到一个重构输出  image.png。在时间序列异常检测场景下,异常对于正常来说是少数,所以我们认为,如果使用自编码器重构出来的输出 image.png 跟原始输入的差异超出一定阈值(threshold)的话,原始时间序列即存在了异常。

2.    生成式对抗网络(GAN)

生成式对抗网络(GAN, Generative Adversarial Networks)是一种近年来大热的深度学习模型,该模型由两个基础神经网络即生成器神经网络(Generator Neural Network)和判别器神经网络(Discriminator Neural Network)所组成,其中生成器神经网络用于生成内容,判别器神经网络则用于判别生成的内容。图像识别和自然语言处理是目前应用极为广泛的AI技术,这些技术不管是速度还是准确度都已经达到了相当的高度,具体应用例如智能手机的人脸解锁、内置的语音助手。这些技术的实现和发展都离不开神经网络,可是传统的神经网络只能解决关于辨识的问题,并不能够为机器带来自主创造的能力。而随着GAN的出现,这些都成为了可能。