当前位置:   article > 正文

机器学习:BP神经网络,CNN卷积神经网络,GAN生成对抗网络_bp神经网络、随机森林以及cnn卷积神经网络三大机器学习算法预警模型

bp神经网络、随机森林以及cnn卷积神经网络三大机器学习算法预警模型

1,基础知识

1.1,概述

机器学习:概念_燕双嘤-CSDN博客1,机器学习概述1.1,机器学习概念机器学习即Machine Learning,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。目的是让计算机模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断完善自身的性能。简单来讲,机器学习就是人们通过提供大量的相关数据来训练机器。DataAnalysis:基本概念,环境介绍,环境搭建,大数据问题_燕双嘤-CSDN博客1,概述1.1,数据的性质所谓数据就是描述事物的符号,是对客观事物的性质、状态和相互关系等进行记载的https://shao12138.blog.csdn.net/article/details/120507206#t1人工神经网络指由大量的神经元互相连接而形成的复杂网络结构。以人的视觉系统为例,人的视觉系统的信息处理是分级的,高层的特征是低层特征的组合,从低层到高层的特征表示越来越抽象,越来越能表达语义或者意图。人工神经网络提出最初的目的是为了模拟生物神经网络传递和处理信息的功能。它按照一定规则将许多神经元连接在一起,并行的处理外接输入信息。人工神经网络的每一层都有若干神经元并用可变权重的有向弧连接,具体训练过程是通过多次迭代对已知信息的反复学习并调整改变神经元的连接权重。人工神经网络主要分为前项神经网络和反馈神经网络:前项神经网络包括:单层感知机、自适应性网络和BP神经网络等;典型的反馈神经网络有:Hopfield网络等。

深度学习来源于人工神经网络,现在是一系列能够用来构建可组合可微分的体系结构的技术和方法,相较于传统机器学习更适合从大量数据中学习复杂特征。其实质上是非常深的人工神经网络,主要的目的是为了学习数据到特征的映射,具有多层表达,高层复杂特征是底层简单特征的抽象的特点。具有实实在在的成效,突破弱人工智能,但强人工智能还远未达到。

当前深度学习技术的优点:

  • 深度多层模型,学习表达能力更强,可以有效学习更复杂的任务。传统的浅层模型视图直接解决复杂问题,求解过程容易失败;深度模型将复杂任务分解多个简单任务,提高求解效率和成功率。
  • 采用灵活的组合方式表达数据特征,特征的泛化性更强。例如:学猫,学狗数据的同时,可能也同时掌握了其他图像模式的表达方式,并记录在未使用的特征组合中。
  • 特征由多层抽象而来,便于任务迁移。
  • 深度学习模型参数空间大,学习空间大,可有效利用大数据。

深度学习技术的缺点:

  • 严重依赖数据:也只有提供大量数据的时候才有效果,而且大量 数据都需要人工标注,代价高昂,成了“先有人工,再有智能”。
  • 严重依赖调参:复杂模型的效果依赖依赖于训练调参效果,调参 效果依赖于开发者的经验,常被戏称为老中医,炼丹,调参成了工 匠技艺。
  • 缺乏知识推理:微小干扰可导致低级错误,且难以纠正。

1.2,基本原理

在生物神经网络中,每个神经元与其他神经元相连,当它兴奋时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个阈值,那么它就会激活,即兴奋起来并向其他神经元发送化学物质。

在深度学习中也借鉴了这样的结构,每一个神经元(上面说到的简单单元)接受输入x,通过带权重w的连接进行传递,将总输入信号与神经元的阈值进行比较,最后通过激活函数处理确定是否激活,并将激活后的计算结果y输出,而我们所说的训练,所训练的就是这里面的权重w。

可以将神经元拼接起来,两层神经元,即输入层+输出层(M-P神经元),构成感知机。 而多层功能神经元相连构成神经网络,输入层与输出层之间的所有层神经元,称为隐藏层:

所示,输入层和输出层只有一个,中间的隐藏层可以有很多层(输出层也可以多个,例如经典的GoogleNet)。 增加神经网络的层数,可能会增加测试数据集的分类错误率。

1.3,万能近似定理

逼近定理:在激活函数满足一定条件的前提下,任意给定输入空间中的一个连续函数和近似精度 \varepsilon,存在自然数 N_\varepsilon 和一个隐含节点数为 N_\varepsilon 单隐层全连接神经网络,对着连续函数的 L_\infty 逼近精度小于 \varepsilon。 

万能近似定理是神经网络理论非常核心的定理,该定理是指如果前馈神经网络具有至少一个非线性输出层,那么只要有足够数量的隐层单元,它就可以以任意精度来近似任何一个有限维空间到另一个有限维空间的函数,换句话说就是只含一层隐藏层的有限神经元网络可以逼近在实数集上紧子空间的连续函数。

1.4,激活函数

神经元会对化学物质的刺激进行,当达到一定程度的时候,神经元才会兴奋,并向其他神经元发送信息。神经网络中的激活函数就是用来判断我们所计算的信息是否达到了往后面传输的条件。

早期研究神经网络主要采用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。 近些年Relu函数及其改进型(如Leaky-ReLU、P-ReLU、R-ReLU等),由于计算简单、效果好所以在多层神经网络中应用比较多。

激活函数的目的主要是为了在神经网络中加入非线性因素,这样就加强了网络的表示能力,获得强大的学习能力和拟合能力。神经网络解决问题的能力与网络所采用的激活函数关系很大。

0-1激活函数:将任意输入转化成0或1的输出:

Y=f(W*X+b)=\left\{\begin{matrix} 1,(W*X+b>0)\\ 0,(W*X+b\leqslant 0) \end{matrix}\right.

sigmoid函数:sigmod函数的输出是在 (0,1) 开区间,丛神经科学角度来看,中间斜率较大部分即为神经元敏感区,两边斜率较平缓的地方即为抑制区。

  • sigmoid函数的优点:(1)函数处处连续,便于求导。(2)可将函数值的范围压缩至[0,1],可用于压缩数据,且幅度不变。(3)便于向前传输。
  • sigmoid函数的缺点:(1)在趋近于无穷的地方,函数值变化很小,容易出现梯度消失,不利于深层次神经的反馈传输。(2)幂函数的梯度计算复杂。(3)收敛速度比较慢。

\sigma (x)=\frac{1}{1+e^{-x}}

sigmod由于需要进行指数运算(这个对于计算机来说是比较慢,相比relu),再加上函数输出不是以0为中心的(这样会使权重更新效率降低),当输入稍微远离了坐标原点,函数的梯度就变得很小了(几乎为零)。在神经网络反向传播的过程中不利于权重的优化,这个问题叫做梯度饱和,也可以叫梯度消失。这些不足,所以现在使用到sigmod基本很少了,基本上只有在做二分类(0,1)时的输出层才会使用。

tanh函数:tanh是双曲正切函数,tanh的输出区间是在 (-1,1) 之间,而整个函数是以0为中心。

tanh(x)=\frac{e^x-e^{-x}}{e^x-e^{-x}}

tanh 函数具有良好的求导性质:tanh^{'}(x)=1-\left ( \frac{e^x-e^{-x}}{e^x+e^{-x}} \right )^2=1-tanh^{2}(x)

sigmoid和tanh都有个问题就是容易导致梯度消失的现象发生,这是由于两者的导数在x很大或很小的时候,都容易趋近于0,从而导致梯度消失的现象发生。但是好在tanh是以0为中心点,如果使用tanh作为激活函数,还能起到归一化(均值为0)的效果。

一般二分类问题中,隐藏层用tanh函数,输出层用sigmod函数,但是随着Relu的出现所有的隐藏层基本上都使用relu来作为激活函数了。

ReLU函数:

ReLU函数相比于sigmod函数和tanh函数有两个优点:

  • 一方面在输入为正数的时候,不存在梯度饱和的问题。
  • 另一方面计算速度要快的很多,这是由于ReLU函数只有线性关系,不管是向前传播还是向后传播,都比sigmod和tanh要快。

不过ReLU函数也有缺点:当输入是负数的时,ReLU是完全不被激活的,会丢失一部分信息,这就意味着在传播过程中,输入负数则梯度为0,这个和sigmod函数、tanh函数有一样的问题。 但是实际的运用中,该缺陷的影响不是很大。

f(x)=max(0,x)

ReLU在0处不可导也可以用于梯度学习,这是因为实际情况中在0处的导数通常会返回左导数或右导数的其中一个,从而避免这个问题。

Leaky Relu 函数:为了解决relu函数z<0时的问题出现了 Leaky ReLU函数,该函数保证在z<0的时候,梯度仍然不为0。 

理论上来讲,Leaky ReLU有ReLU的所有优点,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。ReLU目前仍是最常用的activation function,在隐藏层中推荐优先尝试!

\small f(x)=\left\{\begin{matrix} x& (x>0) \\ \alpha x& (x\leqslant 0) \end{matrix}\right.

ELU函数:ELU函数是专门针对ReLU函数的一个改进型,即使输入为负数也是有输出的,不过还有梯度饱和和指数运算的问题。

f(x)=\left\{\begin{matrix} x& (x>0) \\ \alpha (e^x-1) & (x\leqslant 0) \end{matrix}\right.

1.5,MP模型与感知机

机器学习:感知机算法(PLA)_燕双嘤-CSDN博客1,概述1.1,定义感知机(Perceptron):二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1;感知机对应于输入空间中将实例划分为正负两类的分离超平面,属于判别模型;感知机学习旨在求出将训练数据进行现行划分的分离超平面,为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。感知机学习算法具有简单而易于实现的优点,分为原始形式和对偶形式;感知机的缺点:我们在不知道数据的情况下(是否线性可分)PLA就不会停下来,这个时候https://shao12138.blog.csdn.net/article/details/121188041生物学原理:神经元之间相互连接,当某一神经元处于“兴奋”状态时,其相连神经元的电位将发生改变,若神经元电位该变量超过某一定的数值(阈值),则被激活处于“兴奋状态”,向下一级连接的神经元继续传递点位改变信息。信息从上一个神经元以电传导的方式跨过细胞之间的突触,传给另一个神经元,最终使肌肉收缩或腺体分泌。

神经元通过突触的连接使数目众多的神经元组成比其他系统复杂得多的神经系统。从神经元的构造特性和生物功能可以得出街路怒:神经元是一个输入单输出的信息处理单元,并且对信息处理是非线性的。

MP模型:MP模型是一种基于阈值逻辑的算法创造的神经网络计算模型,由固定的结构和权重组成。在MP模型中,某个神经元接受来自其余多个神经元的传递信号,多个输入与对应连接权重相乘后输入该神经元进行求和,再与神经元预设的阈值进行比较,最后通过激活函数产生神经元输出。每一个神经元均为多输入单输出的信息处理单元,具有空间整合特性和阈值特性。

MP与PLA的关系:其实MP模型就已经是感知器的原型了,只是没有真正在计算机上实现而已。感知机结构与MP模型类似,一般被视为最简单的人工神经网络,也作为二元线性分类器被广泛使用。通常情况下指单层的人工神经网络,以区别于多层感知机。尽管感知机结构简单,但能够学习并解决复杂问题。

算法表达式:

假设有一个 n 维输入的单层感知机,x_1 至 x_n 为 n 维输入向量的各个分量,w_1 至 w_n 为各个输入分量连接到感知机的权重,\theta 为阈值,f 为激活函数(激励函数或传递函数),y 为标量输出。理想的激活函数 f 通常为阶跃函数或sigmoid函数。感知机的输出是输入向量 X 与权重向量 W 求得内积后,经激活函数 f 所得到的的标量:

 y=f(\sum_{i=1}^{n}w_ix_i-\theta )

单层感知机类似于一个逻辑回归模型,可以做线性分类任务,但是不能做更复杂的任务。

多层感知机是由单层感知机推广而来,最主要的特点是有多个神经元层。一般将MLP的第一次称为输入层,中间的层次为隐藏层,最后一层为输出层。MLP并没有规定隐藏层的数量,因此可以根据实际处理需求选择合适的隐层层数,且对于隐藏层和输出层中每层神经元的个数也没有限制。

多层感知机的关键问题在于如何训练其中各层间的连接权重,一个常见的算法是反向传播BP算法。

2,BP神经网络算法

2.1,算法概述

BP神经网络的原理:BP神经网络各层神经元之间互相连接。BP神经网络从外界接到输入向量后,经由隐藏层的非线性变换,最终产生一个输出。在训练过程中,主要采用的反向传播的方式,即在训练时的正向传播,通过模型的输出和真实值之间的误差建立误差函数,然后从输出端反向沿着损失函数的梯度下降方向,并通过求偏导的方式调整权重参数、偏置量等,使得经过训练的模型的输出和期望值相比达到最优。

BP神经网络算法的核心是反向传播算法。主要方法过程是通过对连接权值不断调整,使输出结果逐步逼近期望值,其过程包括信号的正向传播过程和误差的反向传播过程。反向传播是在求解损失函数对参数求到时候用到的方法,目的是通过链式法则对参数进行一层一层的求导。需要注意的是要对参数进行随机初始化而不是全部置为0,否则所有隐藏层的数值都会与输入相关,这种情况称为对称失效。

在信号向前传播的过程中,输入样本从输入层进入网络,经隐含层逐层传递至输出层,如果输出层的实际输出与期望输出不同,则转至误差反向传播过程;如果如果输出层的实际输出与期望输出相同或网络不再收敛,结束学习算法。

在误差反向传播的过程中,输出误差(期望输出与实际输出之差)将按原路反传计算,通过隐含层反向传播至输入层。在该过程中,误差将会被分配给各层神经元,获得各层神经元的误差信号,并将其作为修正各单元权值的根据。整个过程基于梯度下降法实现,不停地调整各层神经元的权值和阈值,是误差信号降低最低。

2.2,BP网络模型的优缺点

BP神经网络的优点:

  • 能够自适应、自主学习。BP可以根据预设参数更新规则,通过不断调整神经网络中的参数,已达到最符合期望的输出。
  • 拥有很强的非线性映射能力。
  • 误差的反向传播采用的是成熟的链式法则,推导过程严谨且科学。
  • 算法泛化能力很强。

虽然BP神经网络在处理许多种大规模的非线性数据表现良好,但还是存在一些不足,主要有:

  • 梯度消失问题:由于BP神经网络一般会设置较多层数,而在反向传播算法中,每一层残差都需要向前一层积累,当层数较多时,很有可能到了某一层出现梯度消失的现象,会导致这一层之前的层无法更新参数。
  • 收敛速度慢:BP神经网络参数众多,每次迭代需要更新较多数量的阈值和权值,故收敛速度比较慢。
  • 隐含层神经元不好直接确定:网络中隐层含有的节点数目没有明确的准则,需要不断设置节点数字试凑,根据网络误差结果最终确定隐层节点个数。
  • 合适超参数的选择只有依靠经验值或者不断调试:尚无数学理论严格证明某些超参数一定会表现得更好,更多时候,超参数的选择是随着问题的改变而改变的,目前为止,虽然一些文献中会给出一些参数的选择,但是不一定适合所有情况,最好的超参数也仍然不停地超时对比才能获得,但神经网络的训练通常比较耗时。
  • 局部最小值的问题:BP算法是一种速度较快的梯度下降算法,容易陷入局部极小值的问题。BP神经网络的训练非常依赖超参数的初始选择,如果超参数的初始选择不合适,很可能会导致该模型在训练时陷入局部最小值而非全局最小值。
  • 没有时间序列概念:BP神经网络并没有设置记忆单元,也没有表示方向和时间的传递方式。由于股价数据是个典型的时间序列数据,因此理论上BP神经网络并不适用。

传统神经网络的训练方式为不能用在深度神经网络:BP算法作为传统训练多层网络的典型算法,网络稍微一深,训练结果就会很不理想,主要问题有梯度越来越稀疏:从顶层越往下,误差校正信号越小;容易收敛到局部最小值,深度结构非凸目标代价函数中普遍存在的局部最小会导致利用BP神经网络训练非常困难。

2.3,梯度消失问题

假设激活函数为:sigmoid函数

\sigma (x)=\frac{1}{1+e^{-x}}

求导可得:{\sigma }'(x)=\frac{e^{-x}}{(1+e^{-x})^2}=\frac{e^{-x}}{1+e^{-x}}\cdot \frac{1}{1+e^{-x}}=(1-\sigma (x))\cdot \sigma(x)< 1

二阶导:{\sigma }''(x)={\sigma }'(x)(1-\sigma(x))-{\sigma }'(x)\cdot {\sigma }(x)={\sigma }'(1-2\sigma(x))=(1-2\sigma(x))(1-\sigma(x))\sigma(x)< 1

可以看出导数越求越小,最后接近于0,梯度消失。

w^{t+1}\leftarrow w^t+\bigtriangledown w^t

w^{t+1}= w^t

2.4,正向传播算法

给定一个前馈神经网络,我们用下面的记号来描述这样网络:

  • L :表示神经网络的层数。
  • n^l:表示第 l 层神经元的个数。
  • f_l():表示第 l 层的激活函数。
  • W^{(l)}\in R^{n^l\times n^{l-1}}:表示第 l-1 层到第 l 层的权重矩阵。
  • b^{(l)}\in R^{l}:表示第 l-1 层到第 l 层的偏置。
  • z^{(l)}\in R^{n^l}:表示第 l 层神经元的状态。
  • a^{(l)}\in R^{(l)}:表示第 l 层神经元的活性值。

前馈神经网络通过下面公式进行信息传播:

z^{(l)}=(W^{(t)})^{T}a^{(l-1)}+b^{(l)}

a^{(l)}=f_l(z^{(l)})

合并两式:z^{(l)}=(W^{(l)})^Tf_{(t-1)}(z^{(l-1)})+b^{(l)}

这样,前馈神经网络可以通过逐层的信息传递,得到网络最后的输出:

x=a^{(0)}\rightarrow z^{(1)}\rightarrow a^{(1)}\rightarrow z^{(2)}\rightarrow ...\rightarrow a^{(L-1)}\rightarrow z^{L}\rightarrow a^{(L)}=y

2.5,反向传播

例如,求解 q=x+y,f=qz

上面的数字表示数值,下面的数字表示梯度。从 f 开始计算,梯度为 1,\frac{\partial f}{\partial q}=z=-4,同理 \frac{\partial f}{\partial z}=q=3\frac{\partial f}{\partial x}=\frac{\partial f}{\partial q}*\frac{\partial q}{\partial x}=-4*1=-4\frac{\partial f}{\partial y}=\frac{\partial f}{\partial q}*\frac{\partial q}{\partial y}=-4*1=-4,类似这样一步一步求出结果。

给定一组样本 \left \{ (x_i,y_i) \right \}^n_{i=1},用前馈神经网络的输出为 f(x|W,B),待优化目标函数为;

J(W,b)=\sum_{i=1}^{n}\rho (f(x_i|W,b),y_i)+\frac{\lambda }{2}||W||^2_F

=\sum_{i=1}^{n}J(W,b;x_i,y_i)+\frac{\lambda }{2}||W||^2_F

其中 \rho 为损失函数, W 和 b 包含了每一层的权重矩阵和偏置向量:||W||^2_F=\sum_{l=1}^{L}\sum_{i=1}^{n^{l+1}}\sum_{j=1}^{n^l}(W^{(l)}_{ij})^2\frac{\lambda }{2}||W||^2_F 的作用使得 W 取最小值,避免误差放大或使得分类更加精确(正则化学习)。

学习的目标是最小化 J(W,b) 。如果采用梯度下降方法,可以用如下方法更新参数:

W^{(l)}=W^{(l)}-\alpha \frac{\partial J(W,b)}{\partial W^{(l)}}=W^{(l)}-\alpha(\sum_{i=1}^{n}(\frac{\partial J(W,b;x_i,y_i)}{\partial W^{(l)}})+\lambda W^{(l)})

b^{(l)}=b^{(l)}-\alpha \frac{\partial J(W,b)}{\partial b^{(l)}}=b^{(l)}-\alpha\sum_{i=1}^{n}(\frac{\partial J(W,b;x_i,y_i)}{\partial b^{(l)}})

其中,\alpha 是参数的更新(学习)率。

计算 \frac{\partial J(W,b;x_i,y_i)}{\partial W^{(l)}},根据链式法则:

\frac{\partial J(W,b;x_i,y_i)}{\partial W_{ij}^{(l)}}=(\frac{\partial J(W,b;x_i,y_i)}{\partial z^{(l)}})^T\frac{\partial z^{(l)}}{\partial W_{ij}^{(l)}}

对于第 l 层,定义一个误差项 \delta^{(l)}=\frac{\partial J(W,b;x_i,y_i)}{\partial z^{(l)}}\in R^{(n^l)} 为目标函数关于第 l 层的神经元 z^{(l)} 的偏导数,表示第 l 层神经元对最终误差的影响。

因为 z^{(l)}=(W^{(l)})^Ta^{(l-1)}+b^{(l)}

\frac{\partial z^{(l)}}{\partial W^{l}_{ij}}=\frac{\partial(W^{(l)}\cdot a^{(l-1)}+b^{(l)})}{\partial W^{(l)}_{ij}}=\begin{bmatrix} 0\\ ...\\ a^{(l-1)}_{j}\\ ...\\ 0 \end{bmatrix}

 因此:

\frac{\partial J(W,b;x,y)}{\partial W^{l}_{ij}}=\delta^{(l)}_ia_j^{(l-1)} (单独一项)

\frac{\partial J(W,b;x,y)}{\partial W^{l}}=\delta^{(l)}(a^{(l-1)})^T(整体)

同理:\frac{\partial J(W,b;x,y)}{\partial b^{l}}=\delta^{(l)}

计算第 l 层的误差项 \delta^{(l)}

\delta^{(l)}=\frac{\partial J(W,b;x_i,y_i)}{\partial z^{(l)}

=\frac{\partial a^{(l)}}{\partial z^{(l)}}\cdot \frac{\partial z^{(l+1)}}{\partial a^{(l)}}\cdot \frac{\partial J(W,b;x,y)}{\partial z^{(l+1)}}

=diag({f}'_l(z^{(l)}))\cdot (W^{(l+1)})^T\cdot \delta^{(l+1)}

={f}'_l(z^{(l)}) \odot ((W^{(l+1)})^T\cdot \delta^{(l+1)})

其中 ⨀︀ 是向量的点积运算符,表示每个元素相乘。

从上式可以看出,第 l 层的误差项可以通过第 l + 1 层的误差项计算得到。这就是误差的反向传播(Backpropagation,BP)。

反向传播算法的含义:第 l 层每个神经元的误差项是所有与该神经元相连的第 l + 1 层的神经元的误差项的权重之和,再乘上该神经元激活函数的梯度。

在计算出每一层的误差项之后,就可以得到每一层参数的梯度。因此,前馈神经网络的训练过程可以分为以下三步:

  • 先前馈计算每一层的状态和激活值,直到最后一层。
  • 反向传播计算每一层的误差。
  • 计算每一层参数的偏导数,并更新参数。该训练过程被称为反向传播算法。

2.6,算法整体流程

2.7,实际案例

残差(表示误差的偏导数):

  • 输出层→隐藏层:残差 = -(输出值-样本值) * 激活函数的导数。
  • 隐藏层→隐藏层:残差 = (右层每个节点的残差加权求和)* 激活函数的导数。
  • 输出层→隐藏层:残差 = -(输出值-样本值) * Sigmoid*(1-Sigmoid) = -(输出值-样本值)输出值(1-输出值)。
  • 隐藏层→隐藏层:残差 = (右层每个节点的残差加权求和)* 当前节点的Sigmoid*(1-当前节点的Sigmoid)。

更新权重:

  • 输入层:权重增加 = 输入值* 右层对应节点的残差 * 学习率

  • 隐藏层:权重增加 = 当前节点的Sigmoid* 右层对应节点的残差 * 学习率

  • 偏移值的权重增加 = 右层对应节点的残差 * 学习率

3,卷积神经网络

3.1,基本概念

卷积:用一个固定大小的矩形区去席卷原始数据,将原始数据分成一个个和卷积核大小相同的小块,然后将这些小块和卷积核相乘输出一个卷积值。

卷积计算:一个权重矩阵,也就是 W(一般对于卷积来说,称作卷积的核kernel也有有人称做过滤器filter),这个权重矩阵的大小一般为 3 * 3 或者 5 * 5,但是在LeNet里面还用到了比较大的7 * 7,现在已经很少见了,因为根据经验的验证,3和5是最佳的大小。 以图上所示的方式,在输入矩阵上使用权重矩阵进行滑动,每滑动一步,将所覆盖的值与矩阵对应的值相乘,并将结果求和并作为输出矩阵的一项,依次类推直到全部计算完成。

卷积核一般都为3*3,5*5,而并不是更大的,主要有两点原因:

  • 相对于用较大的卷积核,使用多个较小的卷积核可以获得相同的感受野和能获得更多的特征信息,同时使用小的卷积核参数更小,计算量更小。
  • 用户可以使用更多的激活函数,有更多的非线性,使得在用户的CNN模型中的判决函数有更有判决性。

工作原理:通过卷积手段,使得上层神经元都只和它下一层神经元一个局部窗口内的神经元相连,构成一个局部连接网络,显著地减少了神经网络中的连接个数。对于每一个卷积层,都包含若干个特征平面,每个特征平面由一些矩阵排列的神经元组成,同一个特征平面实现神经元的权值共享,即卷积核。

感受野:感受野就是视觉感受区域的大小。计算方法:

  • 最后一层(卷积层或池化层)输出特征图感受野的大小等于卷积核的大小。
  • 第i层卷积层的感受野大小和第 i 层的卷积核大小和步长有关系,同时也与第 (i+1) 层感受野大小有关。
  • 计算感受野的大小时忽略了图像边缘的影响,即不考虑padding的大小。

关于感受野大小的计算方式是采用从最后一层往下计算的方法,即先计算最深层在前一层上的感受野,然后逐层传递到第一层,使用的公式可以表示如下:

RF_i=(RF_{i+1}-1)\cdot stride_i+Ksize_i

其中,RF_i 是第 i 层卷积层的感受野,RF_{i+1} 是 (i+1) 层上的感受野,stride是卷积的步长,Ksize是本层卷积核的大小。 

第三层感受野为卷积核大小为 2*2,第二层感受野为 (2-1)\cdot 1+2=3,第一层感受野为 (3-1)\cdot 1+3=5,即该网络的感受野为 5*5

池化(子采样):池化是将相临的多个特征用一个特征来代替压缩数据和参数的数量,减小过拟合,同时提高模型的容错性。上图中,每一层就相当于一次降采样,这就是池化。

工作原理:池化也叫子采样,通过包括均值子采样和最大值子采样两种形式。通过子采样,取一定区域内最大值或均值取代该区域内所有神经元的特征,降低各层输入维度,即能够保留神经元的基本特征,又可以避免输入维度过高而导致过拟合。

池化可以通过不长不为1的卷积实现,也可以通过pool直接插值采样实现,本质上没有区别,只是权重不同。常用方法有:最大值和平均值。

最大值:pool_{max}(R_k)=max_{i \in R_k}\, \, \, a_i

平均值:pool_{avg}(R_k)=\frac{1}{|R_k|}\sum_{i \in R_k}a_i

dropout层:dropout是2014年 Hinton 提出防止过拟合而采用的trick,增强了模型的泛化能力 Dropout(随机失活)是指在深度学习网络的训练过程中,按照一定的概率将一部分神经网络单元暂时从网络中丢弃,相当于从原始的网络中找到一个更瘦的网络,说的通俗一点,就是随机将一部分网络的传播掐断,听起来好像不靠谱,但是通过实际测试效果非常好。

全连接层:全链接层一般是作为最后的输出层使用,卷积的作用是提取图像的特征,最后的全连接层就是要通过这些特征来进行计算,输出所要的结果了,无论是分类,还是回归。特征都是使用矩阵表示的,所以再传入全连接层之前还需要对特征进行压扁,将他这些特征变成一维的向量,如果要进行分类的话,就是用sofmax作为输出,如果要是回归的话就直接使用linear即可。

3.2,卷积神经网络的优点

为什不使用全连接神经网络,而使用卷积神经网络:最重要的原因是结构上的缺陷,参数很多,丢失空间信息。全连接神经网络从BP算法提出开始,发展于20世纪90年代,那时候的计算机属于CPU时代,根本就无法撑起海量参数的计算。如果一个隐藏层特征图像大小为100*100,输入层的特征图像大小为100*100,这意味着学习这一层需要100*100*100*100=10^8的参数。如果以32位浮点数进行存储,就需要4*108的字节的存储量,约等于400MB的参数量。仅仅这样的一个网络层,其模型参数量已经超过了AlexNet网络的参数量,而100*100的特征图像分辨率,已经低于很多任务能够解决的下限。除了计算机过程中需要存储的海量的参数,还有海量的计算,这些都超过了当时硬件的计算能力,因此大大限制了网络的大小,尤其对于一些大的图像输入。

首先是学习原理上的改进,卷积神经网络不再是有监督学习,不需要从图像中提取特征,而是直接从原始图像数据进行学习,这样可以最大程度防止信息在还没有进入网络之前就丢失。

另一方面是学习方式改进。全连接神经网络一层的结果与上一层的结点全部连接,如100*100像素的图像,如果隐藏层也是同样的小的神经元,光是一层网络就需要10^8个参数。要优化和存储这样的参数量,是无法想象的,所以经典神经网络,基本上隐藏层在一两层左右。而卷积神经网络某一层的结点,只与上层的一个图像块相连。而用于产生同一个图像中各个空间位置像素的卷积核是同一个,这就是所谓的权值共享。对于与全连接同样多的隐藏层,假如每个神经元只和输入10*10的局部path相连接,且卷积核移动步长为10,则参数为:100*100*10*10,降低了两个数量级。

【例子】对于计算机视觉来说,每一个图像是由一个个像素点构成,每个像素点有三个通道,分别代表RGB三种颜色(不计算透明度),我们以手写识别的数据集MNIST举例,每个图像的是一个长宽均为28,通道为1的单色图像,如果使用全连接的网络结构,即,网络中的神经与相邻层上的每个神经元均连接,那就意味着我们的网络有28 * 28 =784个神经元(RGB3色的话还要*3),隐藏层如果使用了15个神经元,需要的参数个数(w和b)就有:28 * 28 * 15 * 10 + 15 + 10=117625个,这个数量级到现在为止也是一个很恐怖的数量级,一次反向传播计算量都是巨大的,这还展示一个单色的28像素大小的图片,如果我们使用更大的像素,计算量可想而知。

局部感知就是感受野,实际上就是卷积核和图像卷积的时候,每次卷积核所覆盖的像素只是一小部分,是局部特征,所以说是局部感知。CNN是一个从局部到整体的过程,而传统的神经网络是整体的过程。

【例子】传统的网络需要大量的参数,但是这些参数是否重复了呢,例如,我们识别一个人,只要看到他的眼睛,鼻子,嘴,还有脸基本上就知道这个人是谁了,只是用这些局部的特征就能做做判断了,并不需要所有的特征。 另外一点就是上面说的可以有效提取了输入图像的平移不变特征,就好像我们看到了这是个眼睛,这个眼镜在左边还是在右边他都是眼睛,这就是平移不变性。 我们通过卷积的计算操作来提取图像局部的特征,每一层都会计算出一些局部特征,这些局部特征再汇总到下一层,这样一层一层的传递下去,特征由小变大,最后在通过这些局部的特征对图片进行处理,这样大大提高了计算效率,也提高了准确度。

3.3,二维卷积层

在图像处理中,图像是以二维矩阵的形式输入到神经网络中,因此我们需要二维卷积。假设 X^{(l)} \in R^{w_l\times h_l} 和 X^{(l-1)}\in R^{w_{l-1}\times h_{l-1}} 分别是第 l 层和第 l-1 层的神经元活性值。X^{(l)} 的每一个元素为:

X_{s,t}^{(l)}=f_l(\sum_{i=1}^{u}\sum_{j=1}^{v}W_{ij}^{(l)\cdot X_{s-i+u,t-j+v}^{(l-1)}}+b^{(l)})

其中 W^{(l)}\in R^{u\times v} 为二维滤波器,b^{l} 为第 l 层偏执。第 l 层的神经元个数为 w_l \times h_l ,并且 w_l=w_{l-1}-u+1h_l=h_{l-1}-v+1

 上式可改写为:X^{(l)}=f_l(W^{(l)}\otimes X^{(l-1)}+b^{(l)})

连接表:第 l 层的每一组特征映射都依赖于第 l-1 层的所有特征映射,即不同层的特征映射之间是全连接的关系。事实上,这种全连接关系不是必须的。可以让第 l 层的每一组特征映射都依赖于前一层的少数几组特征映射。

定义一个连接表 T 来描述不同层的特征映射之间的连接关系。如果第 l 层的第 k 组特征映射依赖于前一层的第 p 组特征映射,则 T_{p,k},否则为0。

X^{(l,k)}=f_l(\sum_{p=1,T_{p,k}=1}^{n_l-1}(W^{(l,k,p)}\otimes X^{(l-1,p)})+b^{(l,k)})

假如连接表 T 的非零个数为 K,每个滤波器的大小为 u\times w,那么共需要K\times (u\times v)+n_l 参数。

3.4,卷积神经网络:LeNet-5

LeNet-5有2个卷积层,2个池化层,2个全连接层。卷积层卷积核都是5*5,步长stride=1,池化方法都是Max pooling,激活函数为Sigmoid。

已知:输入层:输入图像大小为32 ×32 = 1024。

过程:

  • C1卷积层:经过(5*5*1)*6卷积核,6为滤波器的数量,stride=1,生成特征图为28*28*6。输入的图像是一个单通道的图像,所以这里特征图的数量,就等于卷积核的数量,每一个输入通道都与输入通道相连。C1层包含了156个可训练的参数,122304个连接。
  • S2池化层:这是一个(2*2)的采样核,stride=2,生成特征图为(14*14*6),这里的池化层虽然没有卷积核,但是也有训练参数,即偏移量。所以包含12个训练参数,5880个连接。
  • C3卷积层:经过(5*5*6)*16卷积核,stride=1,生成特征图为10*10*16.输入是6个通道,输出是16个通道。编码表如上面连接表所示。C3层总共包含了1516个可训练数据,151600个连接。
  • S4池化层:经过(2*2)采样核,stride=2,生成特征图为5*5*16。S4有32个可训练参数,2000个连接。
  • C5全连接层:经过(5*5*16)*120卷积核,stride=1,生成特征图为1*1*120,这就是一个全连接层了,所以输出的每一个通道都会跟输入的所有通道相连。C5层有48120个可训练数据。
  • F6全连接层:输入为1*1*120,输出为1*1*84,总参数量为120*84。
  1. import torch.nn as nn
  2. class LeNet5(nn.Module):
  3. def __init__(self):
  4. super(LeNet5, self).__init__()
  5. # 1 input image channel, 6 output channels, 5x5 square convolution
  6. # kernel
  7. self.conv1 = nn.Conv2d(1, 6, 5)
  8. self.conv2 = nn.Conv2d(6, 16, 5)
  9. # an affine operation: y = Wx + b
  10. self.fc1 = nn.Linear(16 * 5 * 5, 120) # 这里论文上写的是conv,官方教程用了线性层
  11. self.fc2 = nn.Linear(120, 84)
  12. self.fc3 = nn.Linear(84, 10)
  13. def forward(self, x):
  14. # Max pooling over a (2, 2) window
  15. x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
  16. # If the size is a square you can only specify a single number
  17. x = F.max_pool2d(F.relu(self.conv2(x)), 2)
  18. x = x.view(-1, self.num_flat_features(x))
  19. x = F.relu(self.fc1(x))
  20. x = F.relu(self.fc2(x))
  21. x = self.fc3(x)
  22. return x
  23. def num_flat_features(self, x):
  24. size = x.size()[1:] # all dimensions except the batch dimension
  25. num_features = 1
  26. for s in size:
  27. num_features *= s
  28. return num_features
  29. net = LeNet5()
  30. print(net)
  31. ===========================================================
  32. LeNet5(
  33. (conv1): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))
  34. (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
  35. (fc1): Linear(in_features=400, out_features=120, bias=True)
  36. (fc2): Linear(in_features=120, out_features=84, bias=True)
  37. (fc3): Linear(in_features=84, out_features=10, bias=True)
  38. )

3.5,避免过拟合

(1)增加训练集。

(2)采取范数正则化操作,以获取更系数的参数,减少模型复杂度。

(3)提前终止。随着模型能力的提升,训练集误差会先减小后增大,通过提前终止可以减缓过拟合现象。

(4)通过不断的卷积和池化作用,一方面降低网络中神经元链接个数,另一方面降低各层的输入维度,通过多个军阿基he池化的操作,降低过拟合风险。

4,生成对抗网络(GAN)

GAN的核心思想来源于博弈论的纳什均衡,框架中包含两个模块:生产模型和判别模型。在一般情况称生成器G和判别器D。

  • 判别网络的目的:就是能判别出来属于的一张图它是来自真实样本集还是假样本集。假如输入的是真样本,网络输出就接近1,输入的是假样本,网络输出接近0,那么很完美,达到了很好判别的目的。
  • 生成网络的目的:生成网络是造样本的,它的目的就是使得自己造样本的能力尽可能强,强到什么程度呢,你判别网络没法判断我是真样本还是假样本。

GAN最大的缺点就是难以训练,在训练过程中很难区分是否正在取得进展,很容易发生崩溃,也就是生成器开始退化,无法继续学习。

目标函数:\underset{G}{min} \cdot \underset{D}{max}V(D,G)=E_{x\sim p_{data}(x)}[logD(x)]+E_{z\sim p_z(z)}[log(1-D(G(z)))]

 目标(终止条件):让判别器输出概率 D(G(z))) 趋近于0.5

首先固定生成器 G,训练判别器 D 来最大化判别数据来源于真实数据或者伪数据分布 G(z) 的准确率,然后固定判别器D,训练模型 G 来最小化 log(1-D(G(z))) 。一般情况下对D的参数更新若干次后再对G的参数更新一次。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/94384
推荐阅读
相关标签
  

闽ICP备14008679号