我的AI进坑之路---深度学习和机器学习的一些基本概念

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_20073741/article/details/82228579

  此文章只是用于个人总结,方便理解,引用不少别人的内容,如果侵犯到原作者的利益,请联系我删掉。如果有什么内容不对或者漏了什么重要内容,接受批评,会一直持续更新自己在深度学习遇到的概念问题,尽量让自己和其他人看懂

人工智能、机器学习,深度学习的关系

深度学习有监督学习、半监督学习和非监督学习的区分

          监督学习:从给定的训练数据集中学习出一个函数(模型参数),当新的数据到来时,可以根据这个函数预测结果。监督学习的训练集要求包括输入输出,也可以说是特征和目标。训练集中的目标是由人标注的。监督学习就是最常见的分类(注意和聚类区分)问题,通过已有的训练样本(即已知数据及其对应的输出)去训练得到一个最优模型(这个模型属于某个函数的集合,最优表示某个评价准则下是最佳的),再利用这个模型将所有的输入映射为相应的输出,对输出进行简单的判断从而实现分类的目的。也就具有了对未知数据分类的能力。监督学习的目标往往是让计算机去学习我们已经创建好的分类系统(模型)

常见的有监督学习算法:回归分析和统计分类。最典型的算法是KNN和SVM。

有监督学习最常见的就是:regression&classification

    无监督学习:输入数据没有被标记,也没有确定的结果。样本数据类别未知,需要根据样本间的相似性对样本集进行分类(聚类,clustering)试图使类内差距最小化,类间差距最大化。通俗点将就是实际应用中,不少情况下无法预先知道样本的标签,也就是说没有训练样本对应的类别,因而只能从原先没有样本标签的样本集开始学习分类器设计。非监督学习目标不是告诉计算机怎么做,而是让它(计算机)自己去学习怎样做事情。非监督学习有两种思路。第一种思路是在指导Agent时不为其指定明确分类,而是在成功时,采用某种形式的激励制度。需要注意的是,这类训练通常会置于决策问题的框架里,因为它的目标不是为了产生一个分类系统,而是做出最大回报的决定,这种思路很好的概括了现实世界,agent可以对正确的行为做出激励,而对错误行为做出惩罚。

无监督学习的方法分为两大类:

(1)    一类为基于概率密度函数估计的直接方法:指设法找到各类别在特征空间的分布参数,再进行分类。

(2)    另一类是称为基于样本间相似性度量的简洁聚类方法:其原理是设法定出不同类别的核心或初始内核,然后依据样本与核心之间的相似性度量将样本聚集成不同的类别。

利用聚类结果,可以提取数据集中隐藏信息,对未来数据进行分类和预测。应用于数据挖掘,模式识别,图像处理等。

  PCA和很多deep learning算法都属于无监督学习

 半监督学习:

无监督学习只利用未标记的样本集,而监督学习则只利用标记的样本集进行学习。

但在很多实际问题中,只有少量的带有标记的数据,因为对数据进行标记的代价有时很高,比如在生物学中,对某种蛋白质的结构分析或者功能鉴定,可能会花上生物学家很多年的工作,而大量的未标记的数据却很容易得到。

这就促使能同时利用标记样本和未标记样本的半监督学习技术迅速发展起来。

半监督学习算法分类:

1.      self-training(自训练算法)

2.      generative models生成模型

3.      SVMs半监督支持向量机

4.      graph-basedmethods图论方法

5.      multiview learing多视角算法

6.      其他方法

区别

1.      有监督学习方法必须要有训练集与测试样本。在训练集中找规律,而对测试样本使用这种规律。而非监督学习没有训练集,只有一组数据,在该组数据集内寻找规律。

2.      有监督学习的方法就是识别事物,识别的结果表现在给待识别数据加上了标签。因此训练样本集必须由带标签的样本组成。而非监督学习方法只有要分析的数据集的本身,预先没有什么标签。如果发现数据集呈现某种聚集性,则可按自然的聚集性分类,但不予以某种预先分类标签对上号为目的。

3.      非监督学习方法在寻找数据集中的规律性,这种规律性并不一定要达到划分数据集的目的,也就是说不一定要“分类”。

这一点是比有监督学习方法的用途要广。譬如分析一堆数据的主分量,或分析数据集有什么特点都可以归于非监督学习方法的范畴。

4.      用非监督学习方法分析数据集的主分量与用K-L变换计算数据集的主分量又有区别。后者从方法上讲不是学习方法。因此用K-L变换找主分量不属于无监督学习方法,即方法上不是。而通过学习逐渐找到规律性这体现了学习方法这一点。在人工神经元网络中寻找主分量的方法属于无监督学习方法。

  比如我们在教孩子认知世界时,会拿出一些关于鸟、鱼、飞机和轮船等的图片告诉他(她)们这些分别是什么,等他(她)们以后再次见到时则能准确地认出,这就叫监督学习。无监督学习,则是我们并不会告知孩子们这些图片分别是什么,而是由他(她)们自己认知这些图片。他(她)们中或许有的将鸟和飞机归为一类,将鱼和轮船归为一类,因为这分别代表了天上飞的和水中游的;又或许有的能将鸟、鱼、飞机、轮船等分别归为一类;但是,他(她)们都不知道这些分别是什么。

对于计算机而言,这些鸟、鱼、飞机和轮船等的图片相当于数据,我们告诉孩子们这些图片分别是什么则相当于对这些数据打上了标签,监督学习就是通过这些打上标签的数据去训练得到一个最优模型,而无监督学习则是仅仅利用这些数据而不利用标签去训练得到一个最优模型,最后它们再利用这个模型对未来的数据进行一个判断输出,达到认知能力。

不难看出,在监督学习情况下,计算机学习到的模型性能更优(泛化能力更强)。但是,在大数据时代对海量数据都打上标签是不太现实的。例如,如今我们能轻易地收集到几十万或上百万张关于鸟、鱼、飞机和轮船等的图片,但要对每一张图片都打上标签的代价非常高,是一项耗时耗力的工作。在大数据时代,更多的情况则是海量未带标签数据伴随着少量带标签数据存在于人们的现实生产生活中。

半监督学习(Semi-SupervisedLearning)就是为解决上述问题所产生的,其目的在于利用海量未带标签数据辅助少量带标签数据进行学习训练,以增强计算机的学习能力。

何时采用哪种方法

  简单的方法就是从定义入手,有训练样本则考虑采用监督学习方法;无训练样本,则一定不能用监督学习方法。但是,现实问题中,即使没有训练样本,我们也能够凭借自己的双眼,从待分类的数据中,人工标注一些样本,并把它们作为训练样本,这样的话,可以把条件改善,用监督学习方法来做。对于不同的场景,正负样本的分布如果会存在偏移(可能大的偏移,可能比较小),这样的话,监督学习的效果可能就不如用非监督学习了。

如何获得训练数据的标签:https://blog.csdn.net/zongzhiyuan/article/details/48765289 

我们得到图片的时候进行图片预处理获得 标签信息(.txt)

神经网络基础

       1 神经元 (Neuron)

         在神经网络的情况下,神经元接收输入,处理它并产生输出,而这个输出被发送到其他神经元用于进一步处理,或者作为最终输出进行输出。神经元还分为人工神经网络神经元、卷积神经元,解卷积神经元。。。。等具体请看这里

       2 权重 (Weights)

              当输入进入神经元时,它会乘以一个权重。例如,如果一个神经元有两个输入,则每个输入将具有分配给它的一个关联权重。我们随机初始化权重,并在模型训练过程中更新这些权重。训练后的神经网络对其输入赋予较高的权重,这是它认为与不那么重要的输入相比更为重要的输入。为零的权重则表示特定的特征是微不足道的。传统的初始化方法从高斯分布中随机初始化参数。甚至直接全初始化为1或者0。这样的方法暴力直接,但是往往效果一般。高斯初始化,给权重较小的值。这种更新方式在小网络中很常见,然而当网络deep的时候,会出现梯度弥散的情况 ,神经网络权重初始化的方法

         3  偏差(Bias)和方差

              除了权重之外,另一个被应用于输入的线性分量被称为偏差。它被加到权重与输入相乘的结果中。基本上添加偏差的目的是来改变权重与输入相乘所得结果的范围的。添加偏差后,结果将看起来像a* W1 +偏差。这是输入变换的最终线性分量。偏差可以理解为训练集的表现,方差可以理解为验证集的表现。训练集的误差大(欠拟合)则偏差高,训练集的误差低但验证集误差大(欠拟合)则方差高。详情

           4 激活函数(Activation Function)

                   一旦将线性分量应用于输入,将会需要应用一个非线性函数。这通过将激活函数应用于线性组合来完成。激活函数将输入信号转换为输出信号。应用激活函数后的输出看起来像f(a * W1 + b),其中f()就是激活函数。激活函数特点:非线性、可微性、单调性、输出值的范围。详情代码

  神经网络

      神经网络构成了深度学习的支柱。神经网络的目标是找到一个未知函数的近似值。它由相互联系的神经元形成。这些神经元具有权重和在网络训练期间根据错误来进行更新的偏差。激活函数将非线性变换置于线性组合,而这个线性组合稍后会生成输出。激活的神经元的组合会给出输出值。神经网络常见的有:多层感知机、深度神经网络DNN、卷积神经网络CNN、循环神经网络RNN、长短时间记忆单元LSTM。。。详情    “神经网络由许多相互关联的概念化的人造神经元组成,它们之间传递相互数据,并且具有根据网络”经验“调整的相关权重。神经元具有激活阈值,如果通过其相关权重的组合和传递给他们的数据满足这个阈值的话,其将被解雇;发射神经元的组合导致“学习”。

           5   输入/输出/隐藏层(Input / Output / Hidden Layer)

                     什么是输入层呢?和单级网络一样,该层只起到输入信号的扇出作用.所以在计算网络的层数时不被记入。该层负责接收来自网络外部的信息,被记作第0层。

                     什么是输出层?它是网络的最后一层,具有该网络的最大层号,负责输出网络的计算结果。

                    隐藏层的定义是:除输入层和输出层以外的其他各层叫做隐藏层。隐藏层不直接接受外界的信号,也不直接向外界发送信号。

      讲解:

              隐藏层:让我们从一个问题开始,假如区分三张图片(袋鼠、人,星空)哪个是人脸,也就是人脸识别,神经网络模型应该怎么建立呢?为了简单起见,输入层的每个节点代表图片的某个像素,个数为像素点的个数,输出层简单地定义为一个节点,标示是还是不是。

  那么隐含层怎么分析呢? 我们先从感性地角度认识这个人脸识别问题,试着将这个问题分解为一些列的子问题,比如,

  • 在上方有头发吗?

  • 在左上、右上各有一个眼睛吗?

  • 在中间有鼻子吗?

  • 在下方中间位置有嘴巴吗?

  • 在左、右两侧有耳朵吗?

 假如对以上这些问题的回答,都是“yes”,或者大部分都是“yes”,那么可以判定是人脸,否则不是人脸。但是,这种判断忽略了某些特殊情况,比如某个人没有长头发,某个人的左半边脸被花丛遮挡了等等,等处在这些环境中时,这种方法的判断可能会有问题。详情

6 正向传播,反向传播

            正向传播就是根据输入,经过权值、激活函数、隐藏层,最终获得输出;

              反向传播就是根据输出,经过和期望值的比较,再经过各种算法、权值,最终来修改权值使输出和期望值的差距变到最小。

    下面来看正向传播,是怎么计算的。
初步理解神经网络正向传播和反向传播算法的推导(一)

假设例子中期望的最终输出是0.5
左边是输入,圆圈是神经元,每个神经元是一个函数,称为激活函数,这里我们选用Sigmoid 函数,
初步理解神经网络正向传播和反向传播算法的推导(一)
它处处可导,可用于梯度下降算法。而且y范围在-1到+1之间,可控。图形如下:
初步理解神经网络正向传播和反向传播算法的推导(一)
另外可以看到每根线上都有个数字,那个是权重。就是神经网络最终要不断调整的东西。就像炒菜放盐一样,多了不行,少了不行,要刚刚好。最初始时候我们给个随机0-1之间的值,假设初始值如图所示。我们给他们设个变量标记下,第一层分别为W1_AP=0.1, W1_BP=0.8, W1_AQ=0.4, W1_BQ=0.6; 第二层W2_PO=0.3, W2_QO=0.9

正向传播计算方法:
每个神经元的输入由它上一层的所有输入分别乘以对应权值,然后将结果求和。
公式为:(其中y表示神经元的输出,x表示神经元的输入,j表示当前层,i表示上一层,Wji表示ji之间的权重,)
初步理解神经网络正向传播和反向传播算法的推导(一)
看到公式别害怕,其实就是个求和。
1. 首先计算第一层, P和Q神经元得到的值
P=A*W1_AP+B*W1_BP=0.35*0.1+0.9*0.8=0.755
Q=A*W1_AQ+B*W1_BQ=0.35*0.4+0.9*0.6=0.68

P和Q本身都是sigmoid函数,将0.755和0.68作为x输入,分别得到0.68和0.6637. 怎么得到的?以P为例

2. 现在计算第二层
从上一步我们知道P,Q的输出分别为0.68和0.6637. 同理,那么到了O这里,O所得到的输入就是P,Q和权值的乘积相加。也就是:
O=P*W2_PO+Q*W2_QO=0.68*0.3+0.6637*0.9=0.80133.
因为O也是神经元,也是个sigmoid函数,把0.80133作为x代入,得到O的输出,也就是这个神经网络的最终输出,是O(P,Q)=0.69

现在我们得到结果是0.69. 但是和期望值一比,不对啊,期望值是0.5,差值有0.19,太大了,不能接受。那怎么办,看来需要调整权重啊,使输出尽可能靠近0.5,但是这怎么调整呢?下一篇文章就来说说怎么用反向传播,梯度下降法来调整每一层的权重

   一 损失函数(loss function)

以目前的权重我们得到最终输出是0.69,而期望值是0.5. 差距 太大,说明权重不太好,那么0.69为什么不好,怎么个不好法,你可能说相差0.19,太多了不好。但是如果还有个模型,他的期望值是5,得到输出是5.2,相差0.2. 那么我问这两个模型哪个好点,你怎么回答?换句话说,对于结果怎么个不好法,我们需要需要一个机制去评估我们结果是否比较好,一般这个机制称为损失函数(loss function)或者错误函数(error function),描述结果不好的程度,公式如下:
http://images.cnblogs.com/cnblogs_com/LeftNotEasy/WindowsLiveWriter/1_1270E/image_16.png
我承认,公式就是拿出来吓你们的。实际上就是:
假设最终输出是O,期望值是D,那么最终输出的损失函数为f=1/2(O-D)^2. 也就是1/2(0.69-0.5)^2=0.01805
因为O的结果受权重、激活函数和原始输入影响。而激活函数和原始输入都是固定的,不能改变的,那么变量就只有权重,那么我们现在的目的是通过改变权重来使这个损失函数达到最小。如果这是个函数,那么权重就是自变量x,损失函数就是f(x)。
另外损失函数不止这么一个,你们可以看看这篇文章
http://blog.csdn.net/xmdxcsj/article/details/50210451

二 梯度下降及反向传播
那么怎么来达到这个结果呢,因为整个模型中,我们保证了处处可导,也就是处处连续,也就是说你现在在一座岩石山上,这是个没有断崖的山,也没有树木,虽然山势会起伏但不陡,天很黑,你伸手不见五指,只好摸索着下山。你要下山,而方法就是,用脚往四周探探,哪里低就往拿走,最终你会走下山的。

而我们这里也是,每次把自变量x减少一点点,看f(x)是不是也在减少,如果在减少,下次x再减少一点点。如此循环,直到f(x)不减少或者反而增加就停下。我们就认为损失函数不能再小了,也就是达到了最小(这里会有个局部最优,也就是局部最小的问题,但这里不考虑)。 而减少一点点,在数学中就是微分。

以下为了描述方便,将每个神经元的输入设为X,输出为Y,如下(Xp代表P神经元的输入,也就是A*W1_AP+B*W1BP;Yp代表P神经元的输出,也就是Xp经过Sigmoid函数的输出,Yp=1/(1+e^(-Xp)); 其他同理)。同时给损失函数f(x)一个代号E,也就是E=f(x). 期望值为D。
初步理解神经网络正向传播和反向传播算法的推导(二)
现在我们要算E对每个权重的微分,也就是要使E变小一点点,每个权重应该分别变小多少。警告:前方高能,用到公式推导。其实也不难,学下求导,求偏导就行。
现在我们以W2_PO为例子,看看W2_PO应该取什么新值;首先要求W2_PO的微小变化,也就是对W2_PO求微
初步理解神经网络正向传播和反向传播算法的推导(二)
最左边是根据E对W2_PO求微,然后逐步推导为右边的。现在对右边的三个东西(专业名词是什么?)分别计算:
初步理解神经网络正向传播和反向传播算法的推导(二)

初步理解神经网络正向传播和反向传播算法的推导(二)
(这个Sigmoid函数求导可以参考http://tieba.baidu.com/p/3526239227

初步理解神经网络正向传播和反向传播算法的推导(二)

从以上所有可得W2_PO的微分。
初步理解神经网络正向传播和反向传播算法的推导(二)

再与原值相减就得到新的W2_PO值,加个星号代表新值。(这里0.02763一般会乘以个0到1之间的系数,我例子中当取1)
初步理解神经网络正向传播和反向传播算法的推导(二)

以此计算所有的新权重值,然后根据新权重值重新计算误差,发现误差为0.18,比老误差0.19小,则继续迭代,得神经元的计算结果更加逼近目标值0.5。

文章结束
需要注意的是损失函数和激活函数都是可以变的,但一般就那么几个。但激活函数和损失函数变化时,求导的结果当然也有变化。不过作为程序员的我们来说,可以开始不要那么深入了解,会用就行;但最终是要了解的,慢慢来,其实也不是那么难。

这点转载至http://blog.sina.com.cn/s/blog_53dd83fd0102x2iq.html,如有侵权,请联系

       7 损失函数

                 损失函数(loss function)是用来估量你模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构风险函数重要组成部分

                   损失函数的作用:衡量模型模型预测的好坏

                 损失函数可以很好得反映模型与实际数据差距的工具,理解损失函数能够更好得对后续优化工具(梯度下降等)进行分析与理解。很多时候遇到复杂的问题,其实最难的一关是如何写出损失函数。          损失函数主要有:log对数损失函数(逻辑回归)、平方损失函数(最小二乘法)、指数损失函数、Hinge损失函数(SVN)详情

       8  交叉熵

                       交叉熵(cross entropy)是深度学习中常用的一个概念,一般用来求目标与预测值之间的差距。详情

        9 梯度下降

 梯度下降法的基本思想可以类比为一个下山的过程。假设这样一个场景:一个人被困在山上,需要从山上下来(i.e. 找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低。因此,下山的路径就无法确定,他必须利用自己周围的信息去找到下山的路径。这个时候,他就可以利用梯度下降算法来帮助自己下山。具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走,同理,如果我们的目标是上山,也就是爬到山顶,那么此时应该是朝着最陡峭的方向往上走。然后每走一段距离,都反复采用同一个方法,最后就能成功的抵达山谷。

image.png

转载至https://www.jianshu.com/p/c7e642877b0e

我们同时可以假设这座山最陡峭的地方是无法通过肉眼立马观察出来的,而是需要一个复杂的工具来测量,同时,这个人此时正好拥有测量出最陡峭方向的能力。所以,此人每走一段距离,都需要一段时间来测量所在位置最陡峭的方向,这是比较耗时的。那么为了在太阳下山之前到达山底,就要尽可能的减少测量方向的次数。这是一个两难的选择,如果测量的频繁,可以保证下山的方向是绝对正确的,但又非常耗时,如果测量的过少,又有偏离轨道的风险。所以需要找到一个合适的测量方向的频率,来确保下山的方向不错误,同时又不至于耗时太多!

                 在详细了解梯度下降的算法之前,我们先看看相关的一些概念。

    1. 步长(Learning rate):步长决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度。用上面下山的例子,步长就是在当前这一步所在位置沿着最陡峭最易下山的位置走的那一步的长度。

    2.特征(feature):指的是样本中输入部分,比如2个单特征的样本(x(0),y(0)),(x(1),y(1))(x(0),y(0)),(x(1),y(1)),则第一个样本特征为x(0)x(0),第一个样本输出为y(0)y(0)。

    3. 假设函数(hypothesis function):在监督学习中,为了拟合输入样本,而使用的假设函数,记为hθ(x)hθ(x)。比如对于单个特征的m个样本(x(i),y(i))(i=1,2,...m)(x(i),y(i))(i=1,2,...m),可以采用拟合函数如下: hθ(x)=θ0+θ1xhθ(x)=θ0+θ1x。

    4. 损失函数(loss function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。比如对于m个样本(xi,yi)(i=1,2,...m)(xi,yi)(i=1,2,...m),采用线性回归,损失函数为:

             J(θ0,θ1)=∑i=1m(hθ(xi)−yi)2J(θ0,θ1)=∑i=1m(hθ(xi)−yi)2

     其中xixi表示第i个样本特征,yiyi表示第i个样本对应的输出,hθ(xi)hθ(xi)为假设函数。

          梯度下降法是一个一阶最优化算法,通常也称为最速下降法。要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对于梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。所以梯度下降法可以帮助我们求解某个函数的极小值或者最小值。对于n维问题就最优解,梯度下降法是最常用的方法之一,详情

    10 学习率

       学习率是一个重要的超参数,它控制着我们基于损失梯度调整神经网络权值的速度,大多数优化算法(如SGD、RMSprop、Adam)对它都有涉及。学习率越小,我们沿着损失梯度下降的速度越慢。从长远来看,这种谨慎慢行的选择可能还不错,因为可以避免错过任何局部最优解,但它也意味着我们要花更多时间来收敛,尤其是如果我们处于曲线的至高点。

以下等式显示了这种关系:

新权值 = 当前权值 - 学习率 × 梯度

    11 Epoch batchsize 

                  在训练模型时,如果训练数据过多,无法一次性将所有数据送入计算,那么我们就会遇到epoch,batchsize,这些概念。为了克服数据量多的问题,我们会选择将数据分成几个部分,即batch,进行训练,从而使得每个批次的数据量是可以负载的。将这些batch的数据逐一送入计算训练,更新神经网络的权值,使得网络收敛。

   一个epoch指代所有的数据送入网络中完成一次前向计算及反向传播的过程。由于一个epoch常常太大,计算机无法负荷,我们会将它分成几个较小的batches。那么,为什么我们需要多个epoch呢?我们都知道,在训练时,将所有数据迭代训练一次是不够的,需要反复多次才能拟合收敛。在实际训练时,我们将所有数据分成几个batch,每次送入一部分数据,梯度下降本身就是一个迭代过程,所以单个epoch更新权重是不够的。简单点就是epoch多少次他就重复训练多少次

   所谓Batch就是每次送入网络中训练的一部分数据,而Batch Size就是每个batch中训练样本的数量,Batch size大小的选择也至关重要。为了在内存效率和内存容量之间寻求最佳平衡,batch size应该精心设置,从而最优化网络模型的性能及速度。

     12 过拟合 欠拟合

   所谓过拟合(over-fitting)其实就是所建的机器学习模型或者是深度学习模型在训练样本中表现得过于优越,导致在验证数据集以及测试数据集中表现不佳。打个比喻就是当我需要建立好一个模型之后,比如是识别一只狗狗的模型,我需要对这个模型进行训练。恰好,我训练样本中的所有训练图片都是二哈,那么经过多次迭代训练之后,模型训练好了,并且在训练集中表现得很好。基本上二哈身上的所有特点都涵括进去,那么问题来了!假如我的测试样本是一只金毛呢?将一只金毛的测试样本放进这个识别狗狗的模型中,很有可能模型最后输出的结果就是金毛不是一条狗(因为这个模型基本上是按照二哈的特征去打造的)。所以这样就造成了模型过拟合,虽然在训练集上表现得很好,但是在测试集中表现得恰好相反,在性能的角度上讲就是协方差过大(variance is large),同样在测试集上的损失函数(cost function)会表现得很大。

所谓欠拟合呢(under-fitting)?相对过拟合欠拟合还是比较容易理解。还是拿刚才的模型来说,可能二哈被提取的特征比较少,导致训练出来的模型不能很好地匹配,表现得很差,甚至二哈都无法识别。

 那么如何防止过拟合呢?一般的方法有early stopping、数据集扩增(Data augmentation)、正则化(Regularization)、Dropout等。

     13 dropout         

      首先,想象我们现在只训练一个特定的网络,当迭代次数增多的时候,可能出现网络对训练集拟合的很好(在训练集上loss很小),但是对验证集的拟合程度很差的情况。所以,我们有了这样的想法:可不可以让每次跌代随机的去更新网络参数(weights),引入这样的随机性就可以增加网络generalize 的能力。所以就有了dropout 。    Dropout是指在模型训练时随机让网络某些隐含层节点的权重不工作,不工作的那些节点可以暂时认为不是网络结构的一部分,但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了 ,详情

     卷积神经网络(CNN)

 概念:受Hubel和Wiesel对猫视觉皮层电生理研究启发,有人提出卷积神经网络(CNN),Yann Lecun 最早将CNN用于手写数字识别并一直保持了其在该问题的霸主地位。近年来卷积神经网络在多个方向持续发力,在语音识别、人脸识别、通用物体识别、运动分析、自然语言处理甚至脑电波分析方面均有突破。

  卷积神经网络与普通神经网络的区别在于,卷积神经网络包含了一个由卷积层和子采样层构成的特征抽取器。在卷积神经网络的卷积层中,一个神经元只与部分邻层神经元连接。在CNN的一个卷积层中,通常包含若干个特征平面(featureMap),每个特征平面由一些矩形排列的的神经元组成,同一特征平面的神经元共享权值,这里共享的权值就是卷积核。卷积核一般以随机小数矩阵的形式初始化,在网络的训练过程中卷积核将学习得到合理的权值。共享权值(卷积核)带来的直接好处是减少网络各层之间的连接,同时又降低了过拟合的风险。子采样也叫做池化(pooling),通常有均值子采样(mean pooling)和最大值子采样(max pooling)两种形式。子采样可以看作一种特殊的卷积过程。卷积和子采样大大简化了模型复杂度,减少了模型的参数。

 卷积神经网络(CNN)由输入层、卷积层、激活函数、池化层、全连接层组成,即INPUT-CONV-RELU-POOL-FC

      14卷积层(CONV)

卷积是一个漏斗去筛选数据,漏斗(卷积核)可以用各种形状,还可以对数据运算变化。比如,用个梅花状的漏斗筛选像素, 那出来的就是一个个完整或残缺的梅花形状。

          卷积层实在做特称提取和降维,“不全连接,参数共享”的特点大大降低了网络参数,保证了网络的稀疏性,防止过拟合。之所以可以“参数共享”,是因为样本存在局部相关的特性。

         

       15池化层(pool)

      一副24*24的图像。用5*5卷积核卷积,结果是20*20(四周各-2),经过2*2池化,变成10*10

     池化的话,举个例子,一个班学生成绩的池化,假如看教室的俯视图,若教室里学生座位是9*9的,那么可以这样池化,从左上角,每3*3区域的学生,选出一个最高分代表整个区域,以此类推,整个教室池化完剩下9个区域的最大值成绩,这就是所谓的“最大值池化”,当然,还有平均值池化,不用多说。

 

        16 卷积核

                    做卷积处理的关键是卷积算子也就是系数矩阵的选择,这个系数矩阵就是卷积核(Kernal)

         17全连接层

              在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。在实际使用中,全连接层可由卷积操作实现:对前层是全连接的全连接层可以转化为卷积核为1x1的卷积;而前层是卷积层的全连接层可以转化为卷积核为hxw的全局卷积,h和w分别为前层卷积结果的高和宽。全连接层会把卷积输出的二维特征图(featureMap)转化成一个一维的向量

    卷积神经网络为什么最后接一个全连接层:在基本的CNN网络中,全连接层的作用是将经过多个卷积层和池化层的图像特征图中的特征进行整合,获取图像特征具有的高层含义,之后用于图像分类。在CNN网络中,全连接层将卷积层产生的特征图映射成一个固定长度(一般为输入图像数据集中的图像类别数)的特征向量。这个特征向量包含了输入图像所有特征的组合信息,虽然丢失了图像的位置信息,但是该向量将图像中含有最具有特点的图像特征保留了下来以此完成图像分类任务。从图像分类任务的角度来看,计算机只需要对图像内容进行判定,计算输入图像具体所属类别数值(所属类别概率),将最有可能的类别输出即可完成分类任务。

         18填充(Padding)

          填充是指在图像之间添加额外的零层,以使输出图像的大小与输入相同。这被称为相同的填充。 

            

感谢:https://www.zhihu.com/question/49376084(如何理解卷积神经网络(CNN)中的卷积和池化?)

          https://blog.csdn.net/pangjiuzala/article/details/72630166(深度学习入门必须理解这25个概念)

猜你喜欢

转载自blog.csdn.net/qq_20073741/article/details/82228579