购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第2章
神经网络原理

2-1 必备的数学与统计知识

现在每天几乎都会看到几则有关AI的新闻,介绍AI的各种研发成果,一般人也许会基于好奇想一窥究竟,了解背后运用的技术与原理,但会发现涉及一堆数学符号及统计公式,可能就会产生疑问:要从事AI系统开发,非要搞定数学、统计不可吗?答案是肯定的,我们都知道机器学习是从数据中学习到知识(Knowledge Discovery from Data, KDD),而算法就是从数据中提取出知识,它必须以数学及统计为理论基础,才能证明其解法具有公信力与精准度。然而数学/统计理论都有局限,只有在假设成立的情况下,算法才是有效的,因此,如果不了解算法各个假设,随意套用公式,就好像无视交通规则,在马路上任意飚车一样危险。

因此,对于深度学习而言,我们至少需要熟悉以下学科:

(1)线性代数(Linear Algebra);

(2)微积分(Calculus);

(3)统计与概率(Statistics and Probability);

(4)线性规划(Linear Programming)。

以神经网络权重求解的过程为例,四门学科就全部用上了,如下图所示。

图2.1 神经网络权重求解过程

(1)正向传导:由“线性代数”计算误差及损失函数。

(2)反向传导:通过“偏微分”计算梯度,同时,利用“线性规划”优化技巧寻找最优解。

(3)“统计”则串联整个环节,例如数据的探索与分析、损失函数定义、效能衡量指标,通通都基于统计的理论架构而成。

(4)深度学习的推论以“概率”为基础,预测目标值。

四项学科相互为用,贯穿整个求解过程,因此,要通晓深度学习的运作原理,并且正确选用各种算法,甚至能够修改或创新算法,都必须对其背后的数学和统计有一定的基础认识,以免误用或滥用。

相关的数理基础可参考拙作《深度学习全书:公式+推导+代码+TensorFlow全程案例》第2章的介绍,本书直接切入主题,针对张量(Tensor)运算进行较详尽的说明。 /qjZYAj6GDzujfIuPbfKZRjdnpG0W1tlUYmuWAqurMTm66ZJUzOnpKlwXAYPQ4sv



2-2 万般皆自“回归”起

要探究神经网络优化的过程,要先了解简单线性回归求解,线性回归方程式如下:

y = wx + b

已知样本( x , y ),要求解方程式中的参数权重( w )、偏差( b )。

图2.2 简单线性回归

一般求解方法有两种:

(1)最小平方法(Ordinary Least Square, OLS);

(2)最大似然估计法(Maximum Likelihood Estimation, MLE)。

以最小平方法为例,首先定义目标函数(Object Function)或称损失函数(Loss Function)为均方误差(MSE),即预测值与实际值差距的平方和,MSE当然越小越好,所以它是一个最小化的问题,我们可以利用偏微分推导出公式,过程如下。

(1)

其中 ε :误差,即实际值( y )与预测值 之差;

n :样本个数。

(2) MSE = SSE / n n 为常数,不影响求解,可忽略。

(3)分别对 w b 偏微分,并且令一阶导数=0,可以得到两个联立方程式,进而求得 w b

(4)先对 b 偏微分,又因

f ′( x )= g ( x ) g ( x )= g ′( x ) g ( x )+ g ( x ) g ′( x )=2 g ( x ) g ′( x )

两边同除以2

分解

除以 n x y 的平均数

移项

(5)对 w 偏微分:

两边同除以-2

分解

代入步骤(4)的计算结果

化简

结论:

范例1.现有一个世界人口统计数据集,以年度(year)为 x ,人口数为 y ,按上述公式计算回归系数 w b

下列程序代码请参考【02_01_线性回归.ipynb】。

(1)使用Pandas相关函数计算,程序如下:

执行结果:

w =0.061159358661557375, b =-116.35631056117687

(2)改用NumPy的现成函数polyfit验算:

执行结果:答案相差不大。

w =0.061159358661554586, b =-116.35631056117121

(3)上面公式, x 只限一个,若以矩阵计算则更具通用性,多元回归亦可适用,即模型可以有多个特征( x ),为简化模型,将 b 视为 w 的一环:

一样对 SSE 偏微分,一阶导数=0有最小值,公式推导如下:

移项、整理

( xx ′) w = xy

移项

w =( xx ′) −1 xy

(4)使用NumPy相关函数计算,程序如下:

执行结果与上一段相同。

范例2.再以Scikit-Learn的房价数据集为例,求解线性回归,该数据集有多个特征( x )。

(1)以矩阵计算的方式,完全不变。

执行结果如下:

(2)以Scikit-Learn的线性回归类别验证答案。

执行结果与采用矩阵计算的结果完全相同。

(3)PyTorch自v1.9起提供线性代数函数库 [1] ,可直接调用,程序改写如下:

执行结果与NumPy计算完全相同。 /qjZYAj6GDzujfIuPbfKZRjdnpG0W1tlUYmuWAqurMTm66ZJUzOnpKlwXAYPQ4sv



2-3 神经网络

有了以上的基础后,我们就可以进一步探讨神经网络(Neural Network)如何求解,这是进入深度学习领域非常重要的概念。

2-3-1 神经网络概念

神经网络是深度学习最重要的算法,它主要是模仿生物神经网络的传导系统,希望通过层层解析,归纳出预测的结果。

图2.3 生物神经网络的传导系统

生物神经网络中表层的神经元接收到外界信号,归纳分析后,再通过神经末梢,将分析结果传给下一层的每个神经元,下一层神经元进行相同的动作,再往后传导,最后传至大脑,大脑做出最后的判断与反应。

图2.4 神经元结构

于是,AI科学家将上述生物神经网络简化成下列的网络结构。

图2.5 AI神经网络

AI神经网络最简单的连接方式称为完全连接(Full Connected, FC),亦即每个一神经元均连接至下一层的每个神经元,因此,我们可以把第二层以后的神经元均视为一条回归线的 y ,它的特征变量( x )就是前一层的每一个神经元,例如下面的 y 1 z 1 两条回归线。

y 1 = w 1 x 1 + w 2 x 2 + w 3 x 3 + b

z 1 = w 1 y 1 + w 2 y 2 + w 3 y 3 + b

所以,简单讲,一个神经网络可视为多条回归线组合而成的模型。

图2.6 一个神经网络可视为多条回归线组合而成的模型

以上的回归线是线性的,为了支持更通用性的解决方案(Generic Solution),模型还会乘上一个非线性的函数,称为激励函数(Activation Function),期望也能解决非线性的问题,如下图所示。由于中译名称“激励函数”并不能明确表达其原意,故以下直接以英文Activation Function表示。

图2.7 激励函数(Activation Function)

如果不考虑Activation Function,每一条线性回归线的权重(Weight)及偏差(Bias)可以通过最小平方法(OLS)求解,但乘上非线性的Activation Function,就比较难用单纯的数学公式求解了,因此,学者就利用优化(Optimization)理论,针对权重、偏差各参数分别偏微分,沿着切线(即梯度)逐步逼近,找到最佳解,这种算法就称为“梯度下降法”(Gradient Descent)。

有一个很好的比喻来形容这个求解过程:当我们在山顶时,不知道下山的路,于是,就沿路往下走,遇到叉路时,就选择坡度最大的叉路走,直到抵达平地为止。所以梯度下降法利用偏微分(Partial Differential)求解斜率,沿斜率的方向,一步步往下走,逼近最佳解,直到损失函数没有显著改善为止,这时我们就认为已经找到最佳解了。

图2.8 梯度下降法(Gradient Descent)示意图

2-3-2 梯度下降法

梯度其实就是斜率,单变量回归线的权重称为斜率,对于多变量回归线,须个别作偏微分求取权重值,就称为梯度。以下,先针对单变量求解,示范如何使用梯度下降法(Gradient Descent)求最小值。

范例1.假定损失函数 f ( x )= x 2 ,而非MSE,请使用梯度下降法求最小值。

注意,损失函数又称为目标函数或成本函数,在神经网络相关文献中大多称为损失函数,本书将统一以“损失函数”取代“目标函数”。

下列程序代码请参考【02_02_梯度下降法.ipynb】。

(1)定义函数(func)及其导数(dfunc)。

(2)定义梯度下降法函数,反复更新 x ,更新的公式如下,后面章节我们会推算公式的由来。

新的 x =目前的 x -学习率(learning_rate)*梯度(gradient)

(3)设定起始点、学习率(lr)、执行周期数(epochs)等参数后,调用梯度下降法求解。

执行结果:

每一执行周期的损失函数如下,随着 x 变化,损失函数逐渐收敛,即前后周期的损失函数差异逐渐缩小,最后当 x =0时,损失函数 f ( x )等于0,为函数的最小值,与最小平方法(OLS)的计算结果相同。

[5.2, 0.8, 0.32, 0.13, 0.05, 0.02, 0.01, 0, 0, 0, 0, 0, 0, 0, 0]

如果改变起始点(x_start)为其他值,例如-5,依然可以找到相同的最小值。

范例2.假定损失函数 f ( x )=2 x 4 −3 x 2 ++2 x −20,请使用梯度下降法求取最小值。

(1)定义函数及其微分。

(2)绘制损失函数。

执行结果:

梯度下降法函数(GD)不变,执行程序,如果学习率不变(lr=0.3),会出现错误信息:Result too large,原因是学习率过大,梯度下降过程错过最小值,往函数左方逼近,造成损失函数值越来越大,最后导致溢出。

修改学习率(lr=0.001),同时增加执行周期数(epochs=15000),避免还未逼近到最小值,就提早结束。

执行结果:当x=0.51时,函数有最小值。

观察上述范例,不管函数为何,我们以相同的梯度下降法(GD函数)都能够找到函数最小值,最重要的关键是“ x 的更新公式”:

新的 x =目前的 x -学习率(learning_rate)*梯度(gradient)

接着我们会说明此公式的由来,也就是神经网络求解的精华所在。

2-3-3 神经网络权重求解

神经网络权重求解是一个正向传导与反向传导反复执行的过程,如下图所示。

图2.9 神经网络权重求解过程

(1)由于神经网络是多条回归线的组合,建立模型的主要任务就是计算出每条回归线的权重( w )与偏差( b )。

(2)依上述范例的逻辑,一开始我们指定 w b 为任意值,建立回归方程式 y = wx + b ,将特征值( x )代入方程式,可以求得预测值 ,进而计算出损失函数,例如MSE,这个过程称为正向传导(Forward Propagation)。

(3)通过最小化MSE的目标和偏微分,可以找到更好的 w b ,并依学习率来更新每一层神经网络的 w b ,此过程称为反向传导(Back Propagation)。这部分可以由微分的连锁率(Chain Rule),一次逆算出每一层神经元对应的 w b ,公式为:

W t +1 = W t -学习率(learning rate)*梯度(gradient)

其中:

学习率是优化器事先设定的固定值或动能函数。

(4)重复(2)、(3)步骤,一直到损失函数不再有明显改善为止。

梯度(gradient)公式证明如下:

(1)损失函数 ,因 n 为常数,故仅考虑分子,即 SSE

(2)

(3)以矩阵表示, SSE = y 2 −2 ywx + w 2 x 2

(4)

(5)同理,

(6)为了简化公式,常把系数2拿掉。

(7)最后公式为:

调整后权重=原权重 + (学习率*梯度)

(8)有些文章将梯度负号拿掉,公式就修正为:

调整后权重=原权重 - (学习率*梯度)。

以上是以MSE为损失函数时的梯度计算公式,若使用其他损失函数,梯度计算结果也会有所不同,如果再加上Activation Function,梯度公式计算就更加复杂了。还好,深度学习框架均提供自动微分(Automatic Differentiation)、计算梯度的功能,我们就不用烦恼了。后续有些算法会自定义损失函数,因而产生意想不到的功能,例如风格转换(Style Transfer)可以合成两张图像,生成对抗网络(Generative Adversarial Network, GAN),产生几可乱真的图像。也因为如此关键,我们才花费了这么多的篇幅铺陈“梯度下降法”。

基础原理介绍到此,下一章,我们就以PyTorch实现自动微分、梯度下降、神经网络层,进而构建各种算法及相关的应用。 /qjZYAj6GDzujfIuPbfKZRjdnpG0W1tlUYmuWAqurMTm66ZJUzOnpKlwXAYPQ4sv

点击中间区域
呼出菜单
上一章
目录
下一章
×