感知器其实可以理解为一个黑盒函数,接收若干个输入,产生一个输出的结果,这个结果就代表了感知器所做出的决策。
如图,圆圈表示一个感知器,它可以接收多个输入,产出一个结果,结果只有两种情况,“是”与“否”。
感知器内部决策的原理,其实就是给不同的因素赋予不同的权重(重要性)。然后设置一个阈值,如果加权计算之后的结果大于等于这个阈值,就说明可以判断为是,否则就是否。所以感知器本质上就是一个通过加权计算函数进行决策的工具。
单层感知器是一个只有一层的神经元。感知器有多个二进制输入x1、x2、…、xn,每个输入有对应的权值(或权重)w1、w2、…、wn,将每个输入值乘以对应的权值再求和(∑xjwj),然后与一个阈值比较,大于阈值则输出1,小于阈值则输出0。
如果把公式写成矩阵形式,再用b来表示负数的阈值(即b= ‒threshold),则进一步简化为:
感知器加权计算之后,再输入到激活函数中进行计算,得到一个输出。类比生物学上的神经元信号从人工神经网络中的上一个神经元传递到下一个神经元的过程,并不是任何强度的信号都可以传递下去,信号必须足够强,才能激发下一个神经元的动作电位,使其产生兴奋,激活函数的作用与之是类似的。
单层感知器的激活函数为阶跃函数,是以阈值0(界限值)为界的,若小于等于0,则输出0(对应神经元抑制),否则输出1(对应神经元兴奋)。
单层感知器无法解决线性不可分的问题,只能用于二元分类,且无法学习比较复杂的非线性模型。将多个单层感知器进行组合,得到一个多层感知器。
网络的最左边的层被称为输入层,其中的神经元被称为输入神经元。
最右边的输出层包含输出神经元,图中只有一个单一的输出神经元,但一般情况下输出层也会有多个输出神经元。MLP对输出层神经元的个数没有限制。
中间层被称为隐藏层,因为里面的神经元既不是输入也不是输出。隐藏层是整个神经网络最为重要的部分,它可以是一层,也可以是N层,隐藏层的每个神经元都会对数据进行处理。MLP没有规定隐藏层数量。隐藏层的层数越多,其复杂度也越大。
通常把具有超过一个隐藏层的神经网络叫作深度神经网络。
每个感知器都对输出结果有一定比重的贡献,单个感知器权重或偏移的变化应该对输出结果产生微小影响,这里需要使用非线性的激活函数(sigmoid、softmax和ReLU等),可解决线性不可分的问题。
激活函数,就是在神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。
以0为界,输出从0切换为1(或从1切换0),其值呈阶梯式变化,所以称之为阶跃函数。
但是这个函数是由两段水平线组成,具有不连续、不光滑等不太好的性质,所以它无法用于神经网络的结构。因为如果使用它作激活函数的话,参数的微小变化所引起的输出的变化就会直接被阶跃函数抹杀掉,在输出端完全体现不出来,无法为权重的学习提供指引,这是不利于训练过程的参数更新的。
在神经网络中较常用的激活函数包括sigmoid、tanh、ReLu以及softmax函数。它们都是非线性的函数。激活函数给神经元引入了非线性因素,它应用在隐藏层的每一个神经元上,使得神经网络能够用于表示非线性函数,这样神经网络就可以应用到众多的非线性模型中。
函数的特点是左端趋近于0,右端趋近于1,两端都趋于饱和
相对于阶跃函数只能返回0或1,sigmoid函数可以返回0.731…、0.880…等实数。感知器中神经元之间流动的是0或1的二元信号,而神经网络中流动的是连续的实数值信号。
当输入小于0时,输出为0;当输入大于0时,输出与输入相等。ReLU函数是分段线性函数,把所有的负值都变为0,而正值不变。
相比于其他激活函数来说,ReLU函数有以下优势:
梯度消失:当梯度小于1时,预测值与真实值之间的误差每传播一层会衰减一次。如果在深层模型中使用sigmoid作为激活函数,这种梯度消失现象尤为明显,将导致模型收敛停滞不前。
局限性:只能在神经网络模型的隐藏层中使用。
多分类:softmax函数(它与sigmoid函数类似,唯一的区别是在softmax函数中,输出被归一化,总和变为1,可以认为其为概率分布。)
二分类:sigmoid函数
损失函数(Loss Function)用来度量真实值和预测值之间的差距,在统计学中损失函数是一种衡量损失和错误(这种损失与“错误地”估计有关)程度的函数。
神经网络模型的训练是指通过输入大量训练数据,使得神经网络中的各参数(如权重系数w)不断调整,从而“学习”到一个合适的值,使得损失函数最小。
分类问题损失函数:交叉熵(Cross Entropy)
交叉熵在神经网络中作为损失函数,p为真实标记分布,q则为训练后模型的预测标记分布,交叉熵损失函数可以衡量p与q的相似性。
交叉熵在分类问题中常常与softmax函数搭配使用,softmax函数将输出的结果进行处理,使其多个分类的预测值的和为1,再通过交叉熵来计算损失。
应该如何训练,采用什么方式一点点地调整参数,找出损失函数的极小值(最小值)?
梯度衡量的是,如果我们稍微改变一下输入值,函数的输出值会发生多大的变化。
就比如下山,此时山上的雾很大,什么也看不见。那么可以以当前所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着下降方向走一步,然后又继续以当前位置为基准,再找最陡峭的地方往下走,直到最后到达最低处。
步长大小称为学习率。在下降过程中步长越大,梯度影响越大。我们可以通过步长来控制每一步走的距离。
学习率是深度学习中的一个重要的超参数,决定着目标函数能否收敛到局部最小值以及何时收敛到最小值。
优化器(Optimizer)算法:会根据训练算法的过程而自适应地修正学习率。例如SGD(Stochastic Gradient Descent,随机梯度下降算法)、Adam算法(自适应时刻估计算法)
随着迭代次数的增加,训练损失(Train Loss)越来越好,但测试损失(Test Loss)的结果确越来越差。训练损失和测试损失的差距越来越大,模型开始过拟合(Overfit)。
过拟合会导致模型在训练集上的表现很好,但针对验证集或测试集,表现则大打折扣。
Dropout是指在深度学习网络的训练过程中,按照一定的概率将一部分神经网络单元暂时从网络中丢弃,相当于从原始的网络中找到一个更“瘦”的网络,从而解决过拟合的问题。
这样经过几轮训练,这些神经元的个体表现力大大增强,同时也减弱了神经元节点间的联合适应性,增强了泛化能力。
通常是在训练神经网络的时候使用Dropout,这样会降低神经网络的拟合能力,而在预测的时候关闭Dropout。
可以理解为一个人在练轻功的时候会在脚上绑着很多重物,但是在真正和别人打斗的时候会把重物全拿走。
神经网络可以理解为一个输入 x 到输出 y 的映射函数,即 f(x) = y。 f 就是我们所要训练的网络参数 w 。对于任何输入 x ,可得到一个与之对应的输出 y。
训练最符合真实数据 f 的过程,就是神经网络的训练过程。神经网络的训练可以分为两个步骤:一个是前向传播,另外一个是反向传播。
前向传播是从输入层到输出层:从输入层(Layer1)开始,经过一层层的层,不断计算每一层的神经网络得到的结果以及通过激活函数处理的本层输出结果,最后得到输出y^,计算出了y^,就可以根据它和真实值y的差别来计算损失值。
反向传播(BackProp)就是根据损失函数L(y^ , y)来反方向地计算每一层,由最后一层逐层向前去改变每一层的权重,也就是更新参数,即得到损失值之后,反过去调整每个变量以及每层的权重。
反向传播,就是对比预测值和真实值,继而返回去修改网络参数的过程。
对于反向传播算法,最初所有的边权重(Edge Weight)都是随机分配的。对于所有训练数据集中的输入,人工神经网络都被激活,并且观察其输出。这些输出会和我们已知的、期望的输出进行比较,误差会“传播”回上一层。该误差会被标注,权重也会被相应地调整。重复该流程,直到输出误差低于制定的标准。
http://playground.tensorflow.org/
● Epoch:训练次数。
● Learning rate:学习率,在梯度下降算法中会用到。学习率是人为根据实际情况来设定的,学习率越低,损失函数的变化速度就越慢。
● Activation:激活函数,默认为非线性函数Tanh。
● Regularization:正则化,提高泛化能力,防止过拟合。如果参数过多,模型过于复杂,容易造成过拟合。即模型在训练样本数据上表现得很好,但在实际测试样本上表现得较差,不具备良好的泛化能力。为了避免过拟合,最常用的一种方法是使用正则化。
● Regularization rate:正则率,这里是正则化加上权重参数。
● Problem type:问题类型。分类/回归