神经网络是一种模拟人脑的神经网络,以期能够实现类人工智能的机器学习技术。"深度学习"是为了让层数较多的多层神经网络可以训练,能够work而演化出来的一系列的新的结构和新的方法。希望通过以下十个概念,为你打开进入神经网络/深度学习的大门。(如果遇到某个概念不能理解,没关系,继续往下看。)
1.学习率
学习速率是指导我们该如何通过损失函数的梯度调整网络权重的超参数。学习率越低,损失函数的变化速度就越慢。虽然使用低学习率可以确保我们不会错过任何局部极小值,但也意味着我们将花费更长的时间来进行收敛,特别是在处于较大损失函数值情况下。
2.激活函数
在计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到开(1)或关(0)输出的数字电路激活函数。这与神经网络中的线性感知机的行为类似。然而,只有非线性激活函数才允许这种网络仅使用少量节点来计算非平凡问题。 在人工神经网络中,这个功能也被称为传递函数。
激活函数只是简单地应用阈值, 使反应变得更像是在生物神经元中观察到的行为。
下表列出了几个激活函数,它们的输入为一个变量。
3.节点(神经元)
在网络理论或图论中,术语节点表示网络拓扑中,线相交或分支的点。
每个节点使用激活函数,将输入转变为输出。
4.链接权重
每个节点(神经元)都与其前后层的每个节点(神经元)相互连接,存在链接权重,每个节点激活函数的输入由该节点的上一层各连接节点的输出和权重的乘积之和来决定。
神经网络的第一层是输入层,输入节点不对输入值应用激活函数,这层所做的所有事情就是表示输入,仅此而已。
以上神经网络的激活函数为:
y(x) = 1/(1+e^(-x)), 被称为S函数
我们在两件事情上使用了权重。 第一件事情, 在神经网络中, 我们使用权重, 将信号从输入向前传播到输出层。第二件事情, 我们使用权重, 将误差从输出向后传播到网络中。 我们称这种方法为反向传播。
5.前向传播
前向传播通过输入层,隐藏层,输出层;包括神经元(节点),链接权重,激活函数等:
神经网络的前向传播过程如下:
(1)组合输入信号: X=W·I
(2)应用激活函数:
如,对矩阵X的每个单独元素应用S函数 y = 1 / (1 + e^(-x))。
(3)生成输出信号:
即应用激活函数后得到的输出结果。
不管有多少层神经网络,都“一视同仁”,即组合输入信号,应用链接权重调节这些输入信号,应用激活函数,生成这些层的输出信号;上一层的输出信号应用激活函数后,作为下一层的输入信号,再组合输入信号,应用激活函数,直至得到输出层的输出信号。
6.反向传播
反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。该方法对网络中所有权重计算损失函数的梯度。这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。
反向传播要求有对每个输入值想得到的已知输出,来计算损失函数梯度。因此,它通常被认为是一种监督式学习方法,虽然它也用在一些无监督网络(如自动编码器)中。它是多层前馈网络的Delta规则的推广,可以用链式法则对每层迭代计算梯度。反向传播要求人工神经元(或“节点”)的激励函数可微。
使用误差来指导如何调整链接权重,从而改进神经网络输出的总体答案。
这种相对简单的误差信号反馈方式, 与我们先前相对复杂的方式一样有效。
即使反馈的误差过大或过小, 在下一轮的学习迭代中, 网络也可以自行纠正。 重要的是, 由于链接权重的强度给出了共享误差的最好指示, 因此反馈的误差应该遵循链接权重的强度。
7.梯度
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
在向量微积分中,梯度(gradient)是导数的多元(多变量)推广。平常的一元(单变量)函数的导数是标量值函数,而多元函数的梯度是向量值函数。多元可微函数 f 在点 P 上的梯度,是以 f 在 P 上的偏导数为分量的向量。
就像一元函数的导数表示这个函数图形的切线的斜率,如果多元函数在点 P 上的梯度不是零向量,它的方向是这个函数在 P 上最大增长的方向,而它的量是在这个方向上的增长率。
8.梯度下降
梯度下降法是求解函数最小值的一种很好的办法, 当函数非常复杂困难, 并且不能轻易使用数学代数求解函数时, 这种方法却发挥了很好的作用。更重要的是, 当函数有很多参数, 一些其他方法不切实际, 或者会得出错误答案, 这种方法依然可以适用。这种方法也具有弹性, 可以容忍不完善的数据, 如果我们不能完美地描述函数, 或我们偶尔意外地走错了一步, 也不会错得离谱。
在你迈出一步之后, 再次观察周围的地形, 看看你下一步往哪个方向走, 才能更接近目标, 然后, 你就往那个方向走出一步。 你一直保持这种方式, 直到非常欣喜地到达了山底。 梯度是指地面的坡度。 你走的方向是最陡的坡度向下的方向。
如果我们将复杂困难的函数当作网络误差, 那么下山找到最小值就意味着最小化误差。当函数梯度变得较小时调节步长:
如果我们调节步长, 与梯度的大小成比例, 那么在接近最小值时, 我们就可以采用小步长。 这一假设的基础是, 当我们接近最小值时, 斜率也变得平缓了。
当函数有很多参数时, 这种方法才真正地显现出它的亮点。神经网络的误差函数取决于许多的权重参数, 这些参数通常有数百个呢!
由于复杂的函数有众多的山谷, 梯度下降有时会卡在错误的山谷。
为了避免终止于错误的山谷或错误的函数最小值, 我们从山上的不同点开始, 多次训练神经网络, 确保并不总是终止于错误的山谷。 不同的起始点意味着选择不同的起始参数, 在神经网络的情况下, 这意味着选择不同的起始链接权重。
9.代价函数
代价函数,又叫损失函数或成本函数,它是将一个或多个变量的事件阈值映射到直观地表示与该事件。 一个优化问题是试图最小化损失函数。 目标函数是损失函数或其负值,在这种情况下它将被最大化。
大多数深度学习算法都涉及某种形式的优化。优化指的是改变 x 以最小化或最大化某个函数 f(x) 的任务。通常以最小化 f(x) 指代大多数最优化问题。最大化可经由最小化算法最小化 −f(x) 来实现。把要最小化或最大化的函数称为目标函数(objective function)或准则(criterion)。当对其进行最小化时,也把它称为代价函数(cost function)、损失函数(loss function)或误差函数(error function)。
神经网络的目的就是改变权重,以最小化误差函数。
10.误差函数(斜率)
误差函数E,斜率
神经网络的误差是内部链接权重的函数;改进神经网络,意味着通过改变权重减少这种误差。希望最小化的是神经网络的误差函数,试图优化的参数是网络链接权重。
神经网络误差二维解释如下:
三维解释如下:
实际上,构成神经网络的误差应该是一个多维结构,因为有成百上千的网络链接权重影响着神经网络误差。努力最小化误差, 这有点像在多山的地形中寻找一个山谷。
当函数具有多个参数时, 要画出误差曲面相对较难, 但是使用梯度下降寻找最小值的思想是相同的。通过误差函数的梯度下降,采取小步长,迭代地改进权重。所迈出的每一步的方向都是在当前位置向下斜率最大的方向,这就是所谓的梯度下降。
假设神经网络只有三层,记误差为E。
则,①隐藏层和输出层之间的误差函数斜率为:
②输入层和隐藏层之间的误差函数斜率为:
其中,Oj, Oi为前一层的输出。
推导过程如下:(②同理于①)
最终得到更新后的链接权重参数为:☆☆☆
更新后的权重wj,k 是由刚刚得到误差斜率取反来调整旧的权重而得到的。正如我们先前所看到的,如果斜率为正,我们希望减小权重,如果斜率为负,我们希望增加权重,因此,我们要对斜率取反。 符号α是一个因子, 这个因子可以调节这些变化的强度,确保不会超调。 我们通常称这个因子为学习率。
这个表达式不仅适用于隐藏层和输出层之间的权重, 而且适用于输入层和隐藏层之间的权重。
差值
就是误差梯度, 我们可以使用上述①和②两个表达式来计算这个误差梯度。
权重更新矩阵有如下的矩阵形式,这种形式可以让我们通过计算机编程语言高效地实现矩阵运算:
一个利用神经网络误差函数(斜率)更新权重的简单例子如下:
我们要更新隐藏层和输出层之间的权重w1,1 。 当前, 这个值为2.0。
让我们再次写出误差斜率。
让我们一项一项地进行运算:
- 第一项(tk -ok ) 得到误差e1 = 0.8。
- S函数内的求和Σj wj,k oj 为(2.0×0.4) +(3.0 * 0.5) = 2.3。
- sigmoid 1/(1 + e -2.3 ) 为0.909。 中间的表达式为0.909 *(1-0.909)= 0.083。
- 由于我们感兴趣的是权重w1,1 , 其中j=1, 因此最后一项oj 也很简单,也就是oj = 1 。 此处, oj 值就是0.4。
将这三项相乘, 同时不要忘记表达式前的负号, 最后我们得到-0.0265。
如果学习率为0.1, 那么得出的改变量为-(0.1 * (-0.02650)) = + 0.002650。 因此, 新的w1,1 就是原来的2.0加上0.00265等于2.00265。
虽然这是一个相当小的变化量, 但权重经过成百上千次的迭代, 最终会确定下来, 达到一种布局, 这样训练有素的神经网络就会生成与训练样本中相同的输出。
其它概念
batch是批。深度学习每一次参数的更新所需要的损失函数并不是由一个{data:label}获得的,而是由一组数据加权得到的。
batch的思想,至少有两个作用,一是更好的处理非凸的损失函数,非凸的情况下, 全样本就算工程上算的动, 也会卡在局部优上, 批表示了全样本的部分抽样实现, 相当于人为引入修正梯度上的采样噪声,使“一路不通找别路”更有可能搜索最优值;二是合理利用内存容量。
如果数据集较小,可以采用全数据集(Full batch learning)的形式,这样有两个显然的好处:1.由全数据集计算的梯度能够更好的代表样本总体,从而更准确的朝向极值所在的方向;2.不同权重的梯度值差别很大,因此选取一个全局的学习率会比较困难。
上面提到的加权的一组数据的数量就是 batch size。batch size最大是样本总数N,此时就是Full batch learning;最小是1,即每次只训练一个样本,这就是在线学习(Online Learning)。
当我们分批学习时,每次使用过全部训练数据完成一次Forword运算以及一次BP运算,称为完成了一次epoch。