MP 神经元数学模型
MP 模型是神经网络领域的早期模型,它模仿了神经元的基本结构和工作原理。
人工神经元是一个多输入、单输出的信息处理单元,是对生物神经元的建模。建模方式可以有很多种,不同的建模方式就意味着不同的人工神经元结构。 比较著名的人工神经元模型是 MP 神经元(McCulloch-Pitts Neuron),直到今天,我们仍然在使用这个神经元模型的变形。
数学模型
MP 神经元数学模型是一个包含输入,输出与计算功能的模型。
-
输入 x:模拟生物神经元中其他神经细胞给该细胞的刺激,x 值越大刺激越大。
-
权重 w:模拟该细胞不同来源的刺激的敏感度。每个输入都就有一个权重。
-
阈值 θ:模拟激活该神经元的难易程度,值越大越难激活。
-
sun 函数:加权求和,计算外部输入刺激总量。
-
sgn 激活函数:在 MP 模型中也也叫符号函数或阶梯函数。即:
-
当括号内的值大于 0时,sgn 返回 1;
-
当括号内的值小于 0 时,sgn 返回 -1;
-
当括号内的值等于 0 时,sgn 的返回值可能因具体定义而异。
-
-
偏置项 b:一个与输入无关的常数项,用于调整输出值。在神经网络中,偏置项也是通过训练过程调整的参数之一。
-
输出 y:神经元细胞计算后输出的结果。
MP 模型的计算过程如下,首先完成 x 和 w 的线性加权求和,然后再计算激活函数的结果。
另外,从 MP 模型的 sgn 激活函数可知 MP 神经元的本质是一个 线性分类模型,作用是对输入进行二分类。这符合生物神经元的特点,生物神经元对输入信号所产生的输出就是:兴奋、抑制。那么,我们就可以通过 MP 神经元模型预测出样本的目标。但不能用于非线性分类。
手动调整权重
在一个神经网络的训练过程中,本质就是让权重 w 和偏置项 b 的值调整到预期最佳,以使得整个网络的预测效果符合预期。w 和 b 直接决定了神经网络的预测表现。
在早期的 MP 模型和机器学习中,w 的值都是认为预先设置的,不能够完成自学习。这意味着机器学习用于描述样本的特征需要由专家设计,算法性能依赖于人工设计和抽取这些特征的准确度,以便使模型能够完成特定的任务,因此它的应用受到了很大的限制。这就是手动调整 w 权重的含义。
而在后来的深度学习中,可以通过人工神经网络自动提取对任务重要的特征,自定义提取器并通过训练不断优化已获得更好的效果。
模型的使用者需要根据经验和知识来手动调整这些权重,。由于 MP 模型的权重不能自动调整,
应用例子
假设我们有一个简单的分类任务:根据天气情况(晴天、雨天)来决定是否带伞。
我们可以将这个问题建模为一个 MP 模型,其中:
-
输入:是天气情况(晴天=0,雨天=1)
-
输出:是带不带伞(不带伞=0,带伞=1)
在这个例子中,我们只有一个输入特征(天气情况),因此我们的 MP 模型将只有一个输入节点。我们还需要一个输出节点来表示是否带伞。
为了简化问题,我们假设我们的 MP 模型是一个线性阈值单元,它根据输入和权重的乘积和以及一个 b 偏置值来决定输出。
其中可以手动调整的参数是:权重、偏置值。在 MP 模型中,这些值通常是基于经验和知识来手动设定的。例如,我们可能认为雨天带伞的重要性高于晴天,因此我们可以给雨天的权重分配一个较高的值,实现:只要雨天就一定会带伞。
假设我们设定以下权重和偏置值:
-
天气情况的权重:w = 1(雨天时输入为1,晴天时输入为0)
-
偏置值:b = -0.5(用于调整输出阈值)
我们的MP模型的输出可以表示为:
-
输出 = 1(如果 w * 输入 + b > 0)
-
输出 = 0(如果 w * 输入 + b <= 0)
现在,我们可以根据这些设定来判断是否带伞:
-
如果天气是晴天(输入 = 0),则输出 = 1 * 0 + (-0.5) = -0.5,小于0,所以不带伞。
-
如果天气是雨天(输入 = 1),则输出 = 1 * 1 + (-0.5) = 0.5,大于0,所以带伞。
1949 年心理学家 Hebb 提出了 Hebb 学习率,认为人脑神经细胞的突触(也就是连接区域)上的强度上可以变化的。于是计算科学家们开始考虑用调整 w 权值的方法来让机器进行学习。这为后面的学习算法奠定了基础。
单层神经网络(感知器)
1958 年,计算科学家 Rosenblatt 提出了由两层神经元组成的神经网络。他给它起了一个名字 “感知器”(Perceptron)(有的文献翻译成 “感知机”,下文统一用 “感知器” 来指代)。
感知器是当时首个可以学习的人工神经网络。Rosenblatt 现场演示了其学习识别简单图像的过程,在当时的社会引起了轰动。
感知器类似一个逻辑回归模型,可以做线性分类任务。
线性回归模型
线性回归模型,是一种用于预测**连续型变量(x 轴)**的模型。它假设两个 x、y 变量之间存在线性关系,即目标变量 y(因变量)可以通过输入变量 x(自变量)的线性组合来预测。线性回归模型的基本形式为:
y = β0 + β1x1 + β2x2 + ⋯ + βnxn + ϵ
其中,y 是目标变量,x1, x2, ..., xn 是输入变量,β0, β1, β2, ..., βn 是参数,ϵ 是误差项。线性回归的主要目标是找到最佳的参数,使得 y hat 预测值与 y 实际值之间的差(即均方误差 MSE)最小化。
线性回归被称为 “回归”,是因为它试图找到一个最佳的直线(或平面、超平面等,取决于输入变量的数量),使得这条直线能够最好地 “拟合” 数据集,从而能够预测新的数据点。这个过程类似于 “回归” 到数据的平均或中心趋势。
逻辑回归模型
尽管逻辑回归的名字中包含 “回归”,但它实际上是一种用于解决二分类问题(0?1?)的模型。逻辑回归通过引入一个逻辑函数(Sigmoid 函数)将线性回归的 y 输出转换为一个 p 概率值,从而实现对二分类问题的预测。
逻辑回归模型是在线性回归模型的基础之上,通过引入 Sigmoid 函数计算出 y=0 或 y=1 时的 p 概率(将线性组合的结果转换为概率值),继而扩展了线性回归模型的作用,使其可以用于处理二分类任务。
逻辑回归模型的基本形式为:
P(y=1)=11+e−(β0+β1x1+β2x2+⋯+βnxn)
其中,P(y=1) 是目标变量为1的概率,x1, x2, ..., xn 是输入变量,β0, β1, β2, ..., βn 是参数。逻辑回归的主要目标是找到最佳的参数,使得概率 P(y=1) 最大化,这通常通过最大化对数似然函数来实现。
数学模型
在原来 MP 模型的 “输入” 位置添加神经元节点,标志其为 “输入单元”。
在 “感知器” 中,有 2 个层次。分别是输入层和输出层。输入层里的 “输入单元” 只负责传输数据,并不做计算。输出层里的 “输出单元” 则需要对前面一层的输入进行计算。
我们把需要计算的层次称之为 “计算层”,并把拥有一个计算层的网络称之为 “单层神经网络”。(注:有一些文献会按照网络拥有的层数来命名,例如把 “感知器” 称为两层神经网络。但在本文里,我们根据计算层的数量来命名。)
假如我们要预测的目标不再是一个值,而是一个向量,例如 [2,3]。那么可以在输出层再增加一个 “输出单元”。
-
z1 计算公式
-
z2 计算公式
可以看到,z2 的计算中除了三个新的权值:w4,w5,w6 以外,其他与 z1 是一样的。
参照 Andrew Ng 的标记方式,将以上参数进行标记。
如果我们仔细看输出的计算公式,会发现这两个公式就是线性代数方程组。因此可以用矩阵乘法来表达这两个公式。
-
输入的变量是[a1,a2,a3]T(代表由a1,a2,a3组成的列向量),用向量a来表示。
-
方程的左边是[z1,z2]T,用向量z来表示。
-
系数则是矩阵W(2行3列的矩阵,排列形式与公式中的一样)。
于是,输出公式可以改写成:g(W * a) = z;
这个公式就是神经网络中从前一层计算后一层的矩阵运算。
NOTE:
-
线性代数:指方程中变量的次数都是一次的方程,ax+by=c(其中 a、b、c 为常数,x、y 为变量)。
-
线性代数方程组:由一个或几个包含相同变量(x、y 为变量)的线性方程组成的。
-
矩阵乘法:是一种线性代数运算,它涉及两个矩阵的乘积。只有当第一个矩阵的列数与第二个矩阵的行数相等时,这两个矩阵才能相乘。矩阵乘法的结果是一个新的矩阵,其元素是第一个矩阵的行与第二个矩阵的列对应元素乘积的和。对应到 excel 中的 MMULT 函数。
-
矩阵运算:除了矩阵乘法外,还包括矩阵加法、矩阵减法、矩阵转置、逆矩阵等。
自动调整参数(训练的基础原理)
与 MP 模型不同,感知器(单层神经网络)具有通过学习自动调整权重的能力。感知器是一种基于有监督学习的神经网络模型,它可以根据 “训练样本” 和 “期望输出” 来调整 w 权重(自学习),从而实现对输入数据的分类或预测。
参数(如权重和偏差)的学习过程是通过训练算法实现的,训练算法通过调整参数的值,使得神经网络的预测结果与实际结果之间的误差最小化。这个过程实际上就是在拟合特征与目标之间的真实函数关系。
在感知器的训练过程中,权重是通过误差修正方法来调整的。具体来说:
-
感知器会首先使用随机数来初始化权重,然后逐个加入训练样本进行训练。
-
对于每个训练样本,感知器会计算 “实际输出” 与 “期望输出” 之间的误差。
-
最后根据这个误差来调整权重。
-
上述过程会一直重复进行,直到误差减小到某个特定的阈值以下,或者达到预设的训练次数为止。
由于感知器能够自动调整权重,因此它在实际应用中具有更广泛的适用性。通过训练,感知器可以学习到输入数据中的特征,并根据这些特征来做出准确的分类或预测。
NOTE:
-
有监督学习:模型通过学习已知标签的训练数据集,来预测新数据的标签。有监督学习的核心在于利用标注好的样本来训练模型,使其能够准确地将输入映射到输出。
-
无监督学习:与有监督学习不同,无监督学习的训练数据集中不包含标签信息,因此模型需要自行发现数据的内在结构和模式。
-
误差修正方法:是一种用于提高模型预测准确性的技术。在机器学习中,由于各种因素(如数据噪声、模型复杂度等)的影响,模型的预测结果可能会存在一定的误差。为了减小这些误差,可以采用误差修正方法。
应用例子
感知器的特点是可以通过 “训练(自学习)” 来自动调整 w 权重和 b 偏置量,继而让预测值收敛到真实值。 具体的方法是对数据样本进行标注(有监督学习)。
以下是一个简单的逻辑门(AND门)的感知器模型。
-
数据样本(训练)标注:
训练样本 | 输入 x1 | 输入 x2 | 输出 y(标注) |
---|---|---|---|
1 | 0 | 0 | 0 |
2 | 0 | 1 | 0 |
3 | 1 | 0 | 0 |
4 | 1 | 1 | 1 |
-
初始化 w 权重和 b 偏差:可以将这些参数初始化为任意值,但通常我们会选择小的随机数作为初始值。
-
[w1, w2] = [0.1, 0.2]
-
b = 0.0
-
定义激活函数:使用阶跃函数,如果加权和(w1x1 + w2x2 + b)大于或等于0,则输出为1;否则,输出为0。
-
训练:将训练样本逐个输入到模型中计算输出,并比较 “实际输出” 与 “标注输出”:
-
如果实际与标注不同,则自动调整 w 和 b。根据误差的符号和大小来更新。
-
否则,不再调整,得到训练好的模型。
-
预测:使用训练好的 w 和 b 来进行新数据样本输出结果的预测。
感知器的本质是执行二分类计算。可以用决策分界来形象的表达分类的效果。决策分界就是在二维的数据平面中划出一条直线,当数据的维度是3维的时候,就是划出一个平面,当数据的维度是n维时,就是划出一个n-1维的超平面。
但感知器的问题是只能做简单的线性分类任务。Minsky 在 1969 年出版了一本叫《Perceptron》的书,里面用详细的数学证明了感知器的弱点,尤其是感知器对 XOR(异或)这样的 “非线性简单分类任务” 都无法解决。
Minsky 认为,如果将计算层增加到两层就需要解决 2 个关键问题:
-
计算量过大
-
没有跨计算层级的 w、b 学习算法
所以,他认为研究更深层的网络是没有价值的。
两层神经网络(多层感知器)
单层神经网络无法解决 XOR 异或问题。但是当增加一个计算层以后,两层神经网络不仅可以解决异或问题,而且具有非常好的非线性分类效果。新增的计算层,也被称为隐藏层,用于对输入数据进行非线性变换。
隐藏层中的神经元通过权重和激活函数对输入数据进行处理,形成非线性映射关系。这种非线性映射关系使得两层神经网络能够拟合复杂的连续函数。
但是,两层神经网络的计算依旧是一个需要解决的问题。
1986 年,Rumelhar 和 Hinton 等人提出了反向传播(Backpropagation,BP)算法,解决了两层神经网络所需要的复杂计算量问题。
非线性函数
在多层感知器中,使用非线性函数来作为激活函数,它帮助神经网络学习复杂的模式。
如果没有激活函数,神经网络将只能进行线性变换,无法拟合复杂的非线性函数关系。常见的激活函数包括 ReLU、sigmoid和 tanh 等。这些激活函数为神经元引入了非线性特性,使得神经网络能够学习和表示更复杂的函数。
任意连续函数
任意连续函数是指在数学中,可以连续取值的所有可能的函数。这里的 “连续” 一词具有特定的数学含义,即函数在其定义域内(x 轴)的每一点处都满足极限等于函数值的性质。如果函数在其定义域内的每一点都连续,则称该函数为连续函数,它描述了函数值随自变量变化而平滑过渡的性质。
连续函数的反面是 “离散函数”,即只能取特定值的函数。
基本求导法则
在高等数学中,求导是一个非常重要的概念,它描述了函数值 y 随自变量 x 变化而变化的速率。
对函数进行求导的步骤:
-
识别函数类型:能够进行求导的函数包括:幂函数、指数函数、对数函数、三角函数等。
-
应用相应的求导规则:不同函数有不同的求导规则来计算出倒数。
示例:
-
幂函数的求导:
-
原函数:f(x)=x^3
-
导函数:f'(x) = 3x^2
-
-
指数函数的求导:
-
原函数:f(x) = e^2x
-
导函数:f'(x) = 2e^2x
-
-
对数函数的求导:
-
原函数:f(x) = ln(x^2 + 1)
-
导函数:f'(x) = 2x / (x^2 + 1)
-
复合函数求导的链式法则
链式法则在微积分中非常重要,因为它允许我们处理那些不能直接通过基本导数公式求解的复合函数。
如果一个复合函数 f(g(x)),那么 f'(g(x)) 可写作 df/dx,通过链式法则可得:df/dx = df/dg * dg/dx。其中:
-
df/dg 是函数 f 关于其输入 g(x) 的导数
-
dg/dx 是函数 g 关于其输入 x 的导数
数学模型
两层神经网络除了包含一个输入层,一个输出层以外,还增加了一个中间层,称之为隐藏层。此时,中间层和输出层都是计算层。
使用矩阵运算来表达整个计算公式的话如下:
可见,当我们使用矩阵运算来进行数学表达就会变得非常简洁,而且也不会受到神经元节点数增多的影响(无论有多少节点参与运算,乘法两端都只有一个向量变量)。因此神经网络的教程中大量使用矩阵运算来描述。
在神经网络的每个层次中,除了输出层以外,都会含有这样一个偏置单元。正如线性回归模型与逻辑回归模型中的误差项一样。偏置节点很好认,因为其没有输入(前一层中没有箭头指向它)。有些神经网络的结构图中会把偏置节点明显画出来,有些不会。一般情况下,我们都不会明确画出偏置节点。
当我们把 b 偏置节点(bias unit,它本质上是一个只含有存储功能,且存储值永远为 1 的单元)加入到矩阵运算之后得到的公式是:
隐藏层的非线性变换能力
值得注意的是,在两层神经网络中,我们不再使用线性的 sgn 函数作为激活函数,而是使用平滑函数 sigmoid 等非线性激活函数。
非线性激活函数使得算法具备了非线性预测能力。如下图,为 2 个非线性连续函数,使用线性分类算法显然是无法进行 “一刀切” 分类的。红色的线与蓝色的线代表数据。而红色区域和蓝色区域代表由神经网络划开的区域,两者的分界线就是决策分界。
万能逼近定理(Universal Approximation Theorem)表明,在给定足够的隐藏神经元的数量的情况下,两层神经网络(即包含一个隐藏层的前馈神经网络)能够以任意精度逼近任意连续函数。
而另外一种场景,单层神经网络只能做线性分类任务,而两层神经网络中的后一层也是线性分类层,应该只能做线性分类任务。那么为什么两个线性分类任务结合起来就可以做非线性分类任务呢?
我们可以把输出层的决策分界单独拿出来看一下。就是下图。可见,经过了隐藏层的非线性变换之后,数据发生了空间变换,使其可以被线性分类。而输出层的决策分界仍然是直线,其决策分界划出了一个线性分类分界线,对其进行分类。
我们知道,矩阵和向量相乘,本质上就是对向量的坐标空间进行一个变换。因此,隐藏层的参数矩阵的作用就是使得数据的原始坐标空间从线性不可分,转换成了线性可分。
可见,从数学的角度来看,多层的神经网络的本质就是复杂函数拟合。每一层神经元就是用线性变换跟随着非线性变化,将输入空间投向另一个空间。常用的数学变换手段有:
-
升维/降维
-
放大/缩小
-
旋转
-
平移
-
弯曲
其中 1,2,3 操作由 wTx 完成,4 操作由 +b 完成,5 操作由激活函数 f 完成。
下面来讨论一下隐藏层的节点数设计。在设计一个神经网络时,输入层的节点数需要与特征的维度匹配,输出层的节点数要与目标的维度匹配。而中间层的节点数,却是由设计者指定的。因此,“自由”把握在设计者的手中。但是,节点数设置的多少,却会影响到整个模型的效果。如何决定这个自由层的节点数呢?目前业界没有完善的理论来指导这个决策。一般是根据经验来设置。较好的方法就是预先设定几个可选值,通过切换这几个值来看整个模型的预测效果,选择效果最好的值作为最终选择。这种方法又叫做Grid Search(网格搜索)。
非线性函数选择
-
单层神经网络,使用的激活函数是 sgn 函数;
-
sgn 激活函数只能用于二分类,它把直线一侧变为 0,另一侧变为 1。
-
两层神经网络,使用的激活函数是 sigmoid 函数;
-
定义:是一种将输入值映射到 (0, 1) 区间内的激活函数。常用于二分类问题的输出层,表示概率。
-
梯度消失问题:当输入值很大或很小时,Sigmoid 函数的导数(梯度)接近于 0,这会导致在反向传播过程中梯度消失,从而阻碍网络的学习。
-
非零中心化:Sigmoid 函数的输出值总是正的,这会导致梯度在反向传播时总是同号,从而使权重更新发生“之”字形路径,减缓训练速度。
-
多层神经网络,使用的激活函数是 ReLU(Rectified Linear Unit,修正线性单元)函数。
-
定义:是一种将输入值映射到 [0, +无穷) 区间内的函数。广泛应用于隐藏层,特别是在深度学习模型中,由于其计算简单和梯度消失问题缓解的特性。
-
梯度消失问题缓解:ReLU 函数在输入值大于 0 时,其导数为 1,这避免了梯度消失的问题。但在输入值小于 0 时,其导数为 0,这可能导致“神经元死亡”现象(即神经元永远不会被激活)。
-
非零中心化:ReLU 函数的输出可以是正数也可以是 0,因此其输出值相对更接近于零中心化,有助于梯度在反向传播时保持多样性。
研究表明,多层神经网络中 ReLU 函数更容易收敛,并且预测性能更好。
ReLU 函数不是传统的非线性函数,而是分段线性函数。其表达式非常简单,就是 y=max(x,0)。
-
在 x 大于 0,输出就是输入;
-
在 x 小于 0 时,输出就保持为 0。
这种函数的设计启发来自于生物神经元对于激励的线性响应,以及当低于某个阈值后就不再响应的模拟。
从单层神经网络,到两层神经网络,再到多层神经网络,下图说明了,随着网络层数的增加,以及激活函数的调整,神经网络所能拟合的决策分界平面的能力。可以看出,随着层数增加,其非线性分界拟合能力不断增强。
应用例子
了解了两层神经网络的结构以后,我们就可以看懂其它类似的结构图。例如 EasyPR 字符识别网络架构(下图)。
EasyPR 使用了字符的图像去进行字符文字的识别。输入是 120 维的向量。输出是要预测的文字类别,共有 65 类。根据实验,我们测试了一些隐藏层数目,发现当值为 40 时,整个网络在测试集上的效果较好,因此选择网络的最终结构就是 120,40,65。
多层神经网络(深度学习)
在两层神经网络中尽管使用了 “梯度下降+BP“ 算法,但一次神经网络的训练仍然耗时太久,而且困扰训练优化的一个问题就是局部最优解问题,这使得神经网络的优化较为困难。同时,隐藏层的节点数需要调参,这使得实际应用上不太方便。
2006年,Hinton 在《Science》和相关期刊上发表了论文,提出了 “深度信念网络” 的概念。与传统的机器学习训练方式的核心区别在于:
-
增加了预训练(pre-training)过程,可以方便的让神经网络中的权值找到一个接近最优解的值。
-
增加了微调(fine-tuning)技术,可以对整个网络进行优化训练。
这两个技术的运用大幅度减少了训练多层神经网络的时间。Hinton 也给多层神经网络相关的学习方法赋予了一个新名词 “深度学习”。
深度学习是机器学习的重要分支,通过多层处理逐渐组合低层特征形成更加构想的高层表示,进而能够利用样本的深度特征进行分类或学习,以能够处理复杂的问题。
深度学习的本质是使用大量的数据来近似输入和输出相距很远的复杂函数。这个复杂函数存储于神经网络中,深度学习依赖神经网络进行特征提取和预测。
为什么越深越好?
多层神经网络中的层数越多,越能更深入的表示特征,以及具有更强的函数模拟能力。
-
更深入的表示特征:在神经网络中,每一层神经元学习到的是前一层神经元值的更抽象的表示。通过逐层次抽取出更抽象的特征来对事物(e.g. 图像)进行区分,从而获得更好的区分与分类能力。如下图所示。
-
第一个隐藏层学习到的是 “边缘” 的特征;
-
第二个隐藏层学习到的是由 “边缘” 组成的 “形状” 的特征;
-
第三个隐藏层学习到的是由 “形状” 组成的 “图案” 的特征;
-
最后的隐藏层学习到的是由 “图案” 组成的 “目标” 的特征。
-
-
更强的函数模拟能力:是由于随着层数的增加,整个网络的参数就越多。而神经网络的本质就是模拟特征与目标之间的真实关系函数的方法,更多的参数意味着其模拟的函数可以更加的复杂,可以有更多的容量(capcity)去拟合真正的关系。
基于以上 2 点关键优化,研究发现,在参数数量一样的情况下,更深的网络往往具有比浅层的网络更好的识别效率。
以人脸识别为例,下图展示了 AI 识别人脸的过程:边缘特种 => 局部特征或基本形状 => 人脸。
数学模型
如下图所示,多层神经网络就是在两层神经网络的基础上继续增加隐藏层。
多层神经网络的公式推导也与两层神经网络类似,使用矩阵运算。例如:在已知输入 a(1),参数 W(1),W(2),W(3)的情况下,输出 z 的推导公式如下:
多层神经网络中,输出也是按照一层一层的方式来计算。从输入层开始,算出所有 Node 的值以后,再继续计算更深的一层。只有当前层所有 Nodes 的值都计算完毕以后,才会算下一层。所以这个过程叫做 “正向传播”。
基本工作原理
-
前向传播:网络接受样本输入,通过逐层计算得到最终的预测结果;
-
计算误差:将网络输出与期望比较,计算网络误差和损失 L;
-
误差反向传播:从输出层开始,根据链式法则,逐层计算每个神经元的误差贡献(即:偏导);
-
阐述更新:根据神经元误差贡献计算网络参数的梯度,使用梯度下降法更新网络全部参数(w 和 b),使得下一次前向传播结果更加趋近于期望输出。
-
重复以上过程,直到网络的输出误差达到可接受的范围或达到预定的训练轮数。
损失函数优化问题
从两层神经网络开始,开始使用机器学习技术对模型进行训练。机械学习支持使用大量的数据(1000-10000左右),使得参数尽可能的与真实的模型逼近。
-
首先给所有参数赋上随机值。
-
使用这些随机生成的参数值,来预测训练数据中的样本。
-
样本的预测目标为 yp,真实目标为 y。
-
那么,定义一个值 loss,计算公式如下:
loss = (yp - y)^2
这个值称之为损失(loss),训练的目标就是使对所有训练数据的损失和尽可能的小。如果将先前的神经网络预测的矩阵公式带入到 yp 中(因为 z=yp),那么我们可以把 loss 写作关于参数(parameter)的函数,称之为损失函数(loss function)。
假设有 m 个样本,那么损失函数方程(方差方程)为:
梯度下降算法
经过转换之后,下一步的问题就是求:如何优化参数,使得损失函数的值 loss 最小。
一般来说解决这个优化问题使用的是梯度下降算法(Gradient Descent),是机器学习中的一种重要优化算法,是一种一阶最优化算法,用于最小化一个函数(通常是损失函数或成本函数)。
其核心思想是:沿着函数梯度的负方向逐步调整参数,因为函数的梯度指向了函数值增长最快的方向,那么它的相反方向(即梯度的负方向)则是函数值减少最快的方向。通过连续的小步长(学习率)沿着负梯度方向移动,最终可以到达函数的一个局部最小点(直到梯度接近零时截止),从而实现模型参数的优化。
如上图,最终优化结果(loss 最小)所对应的 x 向量(w 权重向量)就是我们常说的 “梯度“。
BP 反向传播算法
由于梯度下降算法一次只能计算一个 yp(输出节点的输出值),所以在复杂的多层感知器神经网络中,如果一次性计算所有参数(亿量级)的话,每次梯度下降的计算代价很大。因此还需要使用 BP 反向传播算法来解决这一问题。
反向传播算法的核心思想是:不一次性计算所有参数的梯度,而是从后往前。根据 loss 函数的结果,从后往前逐级更新 w 权重参数。
以下图为例。梯度的计算从后往前,一层层反向传播。前缀 E 代表着相对导数的意思。
-
首先计算输出层的梯度 Ez;
-
然后计算第二个参数矩阵的梯度 EW(2);
-
接着是中间层的梯度 Ea(2);
-
再然后是第一个参数矩阵的梯度 EW(1);
-
最后是输入层的梯度 Ea(1)。
计算结束以后,所要的两个 EW(1)、EW(2) 的参数矩阵的梯度就都有了。
反向传播算法的启示是数学中的链式法则(将复合函数拆分为简单函数)。
参数组合方式
下图中可以看出 W(1) 中有 6 个参数,W(2) 中有 4 个参数,W(3) 中有 6 个参数,所以整个神经网络中的参数有 16 个(这里暂不考虑偏置节点,下同)。
假设我们将中间层的节点数做一下调整。例如:第一个中间层改为 3 个单元,第二个中间层改为 4 个单元。经过调整以后,整个网络的参数变成了 33 个。
可见,两个网络的拓扑的层数没变,但是第二个神经网络的参数数量却是第一个的接近两倍之多,从而可以带来更好的表示(represention)能力。
当然,在参数数量一致的情况下,我们也可以设计一个 “更深” 的网络。如下图,参数数量仍然是 33,但设计为了 4 个中间层,是原来层数的接近两倍。这意味着一样的参数数量,可以用更深的层次去表达。继而得到更好的识别效率。
训练技术
除了使用 ReLU 激活函数之外。在多层神经网络中,训练的主题仍然是优化和泛化。当使用足够强的 GPGPU 时,梯度下降算法以及 BP 反向传播算法在多层神经网络中的训练中仍然工作的很好。目前学术界主要的研究既在于开发新的算法,也在于对这两个算法进行不断的优化,例如,增加了一种带动量因子(momentum)的梯度下降算法。
在深度学习中,泛化技术变的比以往更加的重要。这主要是因为神经网络的层数增加了,参数也增加了,表示能力大幅度增强,很容易出现过拟合现象。因此正则化技术就显得十分重要。目前,Dropout 技术,以及数据扩容(Data-Augmentation)技术是目前使用的最多的正则化技术。