文章目录
一、神经网络
1、背景
人工神经网络(artificial neural network,ANN),简称神经网络(neural network,NN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。现代神经网络是一种非线性统计性数据建模工具,常用来对输入和输出间复杂的关系进行建模,或用来探索数据的模式。
神经网络是一种运算模型,由大量的节点(或称“神经元”)和之间相互的联接构成。每个节点代表一种特定的输出函数,称为激励函数、激活函数(activation function)。每两个节点间的联接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。
2、神经元和感知机
在理解神经元之前,需要先介绍一下感知机这个算法。感知机是由美国学者Frank Rosenblatt在1975年提出来的。感知机是作为神经网络(深度学习)起源的算法。因此在理解神经元的时候引入感知机是有必要的。
感知机会接受多个输入信号,输出一个信号,这里的输入输出信号就像电路中的信号一样,分为0/1。如下图所示。输入和输出的信号分别会与权重(w1、w2)相乘,最后通过加和的运算,在经过加和的运算之后,会根据之前设定好的界限值进行比较计算。输出0/1,这个界限值一般称之为阈值。
很容易便可以想到,单层感知机的运算只能计算线性的问题。当问题是非线性时,便无法使用单层感知机进行表示,比如类似于电路中的异或门(即当且仅当x1或x2中的一方为1时输出为1)。
那么是不是可以将两种单层感知机进行组合来达到异或门的效果。事实上是可以的,比如下图中是异或门电路的组成,可以看出是由与非门和或门组合得到的。
那么我们是否可以使用单层感知机中的与非门和或门组合得到异或门感知机呢,答案是肯定的。效果图如下图。这时的感知机是一个2层的感知机,也被称之为多层感知机。此时便可以引入神经元的概念了,比如下图中每一个变量(例如x1、x2等)在一个O中,这个O便被称之为神经元。
3、从感知机到神经网络
通过上面的描述,对感知机和神经元已经有了一个大概的认识了,感知机可以表示出生活中的大部分的线性问题以及非线性问题,但是很麻烦的一点便是需要人为的去设定权重,神经网络的出现便是为了解决这一点。神经网络可以自动的从数据中学习,寻找合适的权重。
3.1 偏置(偏移)
在感知机中它是神经元的额外输入,它始终为1,并具有自己的连接权重。这确保即使所有的输入都为空(全部为0),神经元也会激活。但是在神经网络中,偏置不一定为1.
3.2 激活函数(传递函数)
激活函数用于将非线性引入神经网络。它会将值缩小到较小的范围内。Sigmoid激活函数的压缩范围为0到1之间。在深度学习中有许多激活函数可用,ReLU,SeLU和TanH均优于Sigmoid激活函数。关于激活函数,为什么要引入激活函数呢?其实,上面的z已经是一个计算结果了,但是呢它不是我们最终想要的结果!!!上面的z有可能是0到1的一个数字,也可以是任意一个可能大于0或者小于0的整数,但是呢我们一般用神经网络是想解决分类问题,大多数时候,我们需要输出一个0或者1,代表是或者否,那么如何处理呢?如果大于0,我们就把它作为1,如果小于0,我们就把它输出为0,这是最简单的传递函数的一种用法,我们可以把它看作格式化输出结果,将结果变成我们可以使用的一种符号或者数字。
3.3 输入层
神经网络中的第一层。它需要输入信号(值)并将它们传递到下一层。它不对输入信号(值)做任何操作,并且没有关联的权重和偏置值。在我们的网络中,我们有4个输入信号x1,x2,x3,x4。
它是我们传递给输入层的输入矩阵形状。我们网络的输入层有4个神经元,它期望1个样本的4个值。如果我们一次只提供一个样本,我们网络的期望输入形状是(1,4,1)。如果我们提供100个样品,则输入形状将为(100,4,1)。不同的库期望形状的格式是不同的。
3.4 隐藏层
隐藏层具有对输入数据应用不同变换的神经元(节点)。一个隐藏层是垂直排列的神经元的集合(Representation)。在我们给出的图像中有5个隐藏层。在我们的网络中,第一隐层有4个神经元(节点),第2层有5个神经元,第3层有6个神经元,第4层有4个,第5层有3个神经元。最后一个隐藏层将值传递给输出层。隐藏层中的每个神经元都与下一层的每一个神经元有连接,是一个完全连接的隐藏层,因此又被称之为全连接层加粗样式。
3.5 输出层
当神经网络运算到这一步的时候,便可以输出我们想要得到的值或者是值的范围。针对与不同的问题,在输出层进行设计的时候所使用的激活函数也有不同,一般来说,回归问题一般会选择使用恒等函数,而分类函数会使用softmax函数。特别注意的是:对于分类问题来说,输出层的神经元的数量一般设计为结果类别的数量,比如一个10分类的问题,我们会选择将输出层神经元的数量设计为10个。
3.6感知机和神经网络的不同
感知机的隐藏层使用的激活函数一般为信号急剧变化的阶跃函数,神经网络隐藏层使用的激活函数一般为比较平滑的sigmoid函数。
4、前向传播和后向传播
4.1 前向传播
前向传播的过程是向神经网络馈送输入值并得到我们称为预测值的输出。当我们将输入值提供给神经网络的第一层时,它没有进行任何操作。第二层从第一层获取值并进行乘法,加法和激活操作,然后将得到的值传递给下一层。在后面的层中执行相同的操作,最后我们在最后一层得到一个输出值。简单来说就是一层一层的从输入层向输出层传播。
4.2后向传播
4.2.1损失函数
简单来说,损失函数就是使用神经网络对数据进行预测或者分类时,输出层输出的值与标签的值的差异性,差异越大损失函数越大。损失函数可以使用任意的函数来对输出层的结果进行评估,但是一般采用的是均方误差和交叉熵误差作为损失函数。
4.2.2学习率
当我们训练神经网络时,学习率是你每一次更新权重的步长大小,因此学习率在设置的时候不可以过大也不可以过小。当学习率过大的时候,会让参数一直在极小值点进行反复的震荡,但是并不会收敛到极小值点,如果参数设置过小,则会让参数更新很细微,以至于程序运行到最后的极小值点需要花费大量的时间。
新的权重 = 现在的权重 - 学习率 X 反向传播算出来的梯度
4.2.3 反向传播
前向传播后,我们得到一个被称为预测值的输出值。为了计算误差,我们将预测值与实际输出值进行比较。我们使用损失函数来计算误差值。然后我们计算神经网络中每一个误差值的导数和每一个权重。反向传播使用微分学的链式法则。在链条法则中,首先我们计算对应最后一层权值的误差值的导数。我们称这些导数为:梯度,然后使用这些梯度值来计算倒数第二层的梯度。重复此过程,直到我们得到神经网络中每个权重的梯度。然后从权值中减去该梯度值,以减少误差值。这样,我们就更接近(下降)局部最小值(也就是说最小的损失)。