第 2 章 模型评估与选择
2.1 经验误差与过拟合
- 精度:精度=1-错误率。如果在 mmm 个样本中有 aaa 个样本分类错误,则错误率 E=a/mE=a/mE=a/m,精度 = 1−a/m1-a/m1−a/m。
- 误差:一般我们把学习器的实际预测输出与样本的真实输出之间的差异称为“误差”(
error
)。学习器在训练集上的误差称为“训练误差”(training error
),在新样本上的误差称为“泛化误差”(generalization error
)。 - “过拟合:学习器把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质,从而导致泛化性能下降,这种现象称为”过拟合“(
overfitting
)。过拟合是机器学习算法面临的一个关键问题。 - 欠拟合:和过拟合想法,指的是学习器对训练样本的一般性质都未学号。欠拟合比较容器解决,在决策树中增加分治、在神经网络学习中学习训练轮数(
Epoch
)等方法都是有效的。
好的学习器应该尽可能学出适用于所有潜在样本的”普遍规律“。由于事先无法知道新样本是什么样子,所以无法直接获得泛化误差,同时训练误差又由于过拟合现象的存在而不适合作为标准,那么现实中如何进行模型评估与选择就是一个重要的问题了。
2.2 评估方法
通常使用一个测试集来评估学习器对新样本的判别能力,把测试集上的”测试误差“(testing error
)作为泛化误差的近似。值得注意的是,测试集应该尽可能与训练集互斥,即测试样本尽量不在训练集中出现(学习器之前没有见到过)。
对于一个包含 mmm 个样本的数据集 D=(x1,y1),(x2,y2),...,(xm,ym)D = {(x_1, y_1)}, (x_2, y_2),...,(x_m, y_m)D=(x1,y1),(x2,y2),...,(xm,ym),将其划分为训练集 SSS 和测试集 TTT,有两种常见的方法:留出法和交叉验证法。
2.2.1 留出法
”留出法“(hold-out
) 直接将数据集 DDD 划分为两个户次互斥的集合,一个集合作为训练集 SSS,另一个作为测试集 TTT,即 D=S∪TD = S \cup TD=S∪T,S∩T=∅S \cap T = \varnothingS∩T=∅。值得注意的是,训练/测试集的划分应该尽可能保持数据分布的一致性,避免数据划分过程引入额外的偏差而对最终结果产生影响。从采样(sampling
)的角度来看数据集的划分过程,则保留类别比例的采样方式称为”分层采样“(stratified sampling
)。例如数据集 DDD 有 1000
个样本,800
个正样本,200
个负样本,将 70%
的样本作为训练集,30%
的样本作为测试集。考虑分层采样,则训练 SSS 集的构成为:正样本 =1000×70%×(800/1000)=560= 1000\times 70\% \times (800/1000) = 560=1000×70%×(800/1000)=560,负样本 =1000×70%×(200/1000)=140=1000\times 70\% \times (200/1000) = 140=1000×70%×(200/1000)=140,同理可得测试集 T
包含 240
个正样本,60
个负样本。
另一个问题是即使在给定训练集/测试集样本比例后,依然存在多种划分方式对样本 DDD 进行分割,例如前 280
个正样本和后 280
个正样本构建的训练集是不一样的。因此,单次使用留出法得到的的估计结果往往不可靠,在使用留出法时,一般采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。
2.2.2 交查验证法
”交叉验证法“(cross validation
)先将数据集 DDD 划分为 kkk 个大小相似的互斥子集,即 D=D1∪D2∪...∪Dk,Di∩Dj=∅D = D_1\cup D_2\cup...\cup D_k,D_i \cap D_j = \varnothingD=D1∪D2∪...∪Dk,Di∩Dj=∅。同时每个子集都应该尽可能保持数据分布的一致性,即类别比例相等,从 DDD 中通过分层采样得到。然后,每次用 k−1k-1k−1 个子集的并集作为训练集,剩下的一个子集作为测试集,这样可获得 kkk 组训练集/测试集,从而可进行 kkk 组训练和测试,把 kkk 次测试结果取平均后返回。交叉验证法评估结果的稳定性和保真性在很大程度上取决于 kkk 的取值,为了强调这一点,通常把交叉验证法称为“kkk 折交叉验证”(k-fold cross validation
)。kkk 的常用取值分别是 10、5、20
等。图 2.2
给出了 10
折交叉验证的示意图。
“10 次 10 折交叉验证法”与 “100 次留出法“都是进行了 100
次训练/测试。
交叉验证法的一个特例是留一法(Leave-One-Out
,简称 LDO
),留一法不受随机样本划分方式的影响,因为 mmm 个样本只有唯一的划分方式划分为 mmm 个子集-每个子集包含一个样本。虽然留一法的评估结果往往被认为比较准确,但是训练开销简直太大了,真实项目中很少见到有人这样用,而且留一法的估计结果未必永远比其他评估方法准确,毕竟“天下没有免费的午餐”。
2.2.3 自助法
“自助法”(bootstrapping
) :给定包含 mmm 个样本的数据集 DDD,对它进行采样产生数据集 D′{D}'D′:每次随机从 DDD 中挑选一个样本,将其拷贝放入 D′{D}'D′,然后再将其放回 DDD 中,下次采样依然可能被采样到;这个过程重复 mmm 次,就得到了包含 mmm 个样本的数据集 D′{D}'D′。显然,DDD 中有一部分样本会在 D′{D}'D′ 中多次出现,另外一部分样本不出现。做一个简单估计,样本在 mmm 次采样中始终不被采到的概率是 (1−1m)m(1-\frac{1}{m})^m(1−m1)m,取极限得到(1−1m)m→1e≈0.368(1-\frac{1}{m})^m \rightarrow \frac{1}{e}\approx 0.368(1−m1)m→e1≈0.368
即通过自助采样,初始数据集 DDD 中约有 36.8%
的样本未出现在采样数据集 D′{D}'D′ 中。
自助法只适用于数据集较小、难以有效划分训练/测试集的情况。值得注意的是,自助法产生的数据集改变了初始数据集的分布,这回引入估计偏差。
2.2.4 调参与最终模型
需要认为设定的参数称为超参数,模型训练无法优化它的。现实当中常对每个参数选定一个范围和变化补偿,例如在 [0,0.2]
范围内以 0.05
为补偿,要评估的的候选参数有 5
个最终选定的参数从这 5
个候选值中产生,结果也许不是最佳值,但这是计算开销和性能估计之间进行折中的结果。
在模型评估与选择过程中由于需要流出一部分数据进行评估测试,事实上我们只使用了一部分数据训练模型。因此,在模型选择完成后,学习算法和参数配置已定,此使应该用数据集 DDD 重新训练模型。这个模型在训练过程中使用了所有 mmm 个训练样本,这个模型也是最终提交给用户的模型。
另外,值得注意的是,我们通常把学得模型在实际使用过程中遇到的数据集称为测试数据,为了加以区分,前面讲到的模型评估与选择中用于评估测试的数据常称为“验证集(validation set
)”。
在研究对比不同算法的泛化性能时,我们用测试集上的判别效果来估计模型在实际使用时的泛化能力,而把训练数据另外划分为训练集和验证集,基于验证集上的性能来进行模型选择和调参。
2.3 性能度量
对学习器的泛化性能进行评估,不仅需要有效可行的实验估计方法,还需要衡量模型泛化能力的评价标准,这就是性能度量(performance measure
)。
在预测任务中,给定样本集 D=(x1,y1),(x2,y2),...,(xm,ym)D={(x_1,y_1),(x_2,y_2),...,(x_m,y_m)}D=(x1,y1),(x2,y2),...,(xm,ym),其中 yiy_iyi 是示例 xix_ixi 的真实标签。要评估学习器 fff 的性能,需要把学习器预测结果 f(x)f(x)f(x) 与真实标签 yyy 进行比较。
回归任务最常用的性能度量是“均方误差”(mean squared error
)。E(f;D)=1m∑i=1m(f(xi)−yi)2E(f;D) = \frac{1}{m}\sum_{i=1}^{m}(f(x_i)-y_i)^2E(f;D)=m1∑i=1m(f(xi)−yi)2
2.3.1 错误率与精度
- 错误率:分类错误的样本数占样本总数的比例;
- 精度:分类正确样本的样本数占样本总数的比例。
错误率和精度是分类任务中最常用的两种性能度量,适用于二分类,也适用于多分类任务。分类错误率和精度的定义如下:
E(f;D)=1m∑i=1m(f(xi)≠yi)2E(f;D) = \frac{1}{m}\sum_{i=1}^{m}(f(x_i) \neq y_i)^2E(f;D)=m1∑i=1m(f(xi)=yi)2
acc(f;D)=1m∑i=1m(f(xi)=yi)2=1−E(f;D)acc(f;D) = \frac{1}{m}\sum_{i=1}^{m}(f(x_i) = y_i)^2 = 1 - E(f;D)acc(f;D)=m1∑i=1m(f(xi)=yi)2=1−E(f;D)
2.3.2 查准率、查全率与F1
错误率和精度虽然常用,但是并不能满足所有任务需求。比如以西瓜问题为例,假设瓜农拉来一车西瓜,我们用训练好的模型对西瓜进行判别,现如精度只能衡量有多少比例的西瓜被我们判断类别正确(两类:好瓜、坏瓜)。但是若我们更加关心的是“挑出的西瓜中有多少比例是好瓜”,或者”所有好瓜中有多少比例被挑出来“,那么精度和错误率这个指标显然是不够用的。
对于二分类问题,可将样例根据真实类别与学习器预测类别的组合划分为真正例(true positive
)、假正例(false positive
)、真反例(true negative
)、假反例(false negative
)四种情况,令 TP、FP、TN、FNTP、FP、TN、FNTP、FP、TN、FN 分别表示其对应的样例数,显然有 TP+FP+TN+FN=TP+FP+TN+FN = TP+FP+TN+FN= 样例总数。分类结果的”混淆矩阵“(confusion matrix
)如下表所示。
查准率(精确率) PPP 与查全率(召回率) RRR 分别定义为:
P=TPTP+FPP = \frac{TP}{TP+FP}P=TP+FPTPR=TPTP+FNR = \frac{TP}{TP+FN}R=TP+FNTP
查准率和查全率是一对矛盾的的度量。一般来说,查全率高时,查准率往往偏低;而查全率高时,查准率往往偏低。通常只有在一些简单任务中,才可能使查全率和查准率都很好高。
精准率和召回率的关系可以用一个 P-R
图来展示,以查准率 P
为纵轴、查全率 R
为横轴作图,就得到了查准率-查全率曲线,简称 P-R 曲线,PR
曲线下的面积定义为 AP
。
为了绘图方便和美观,示意图显示出单调平滑曲线,但现实任务中的
P-R
曲线是非单调、不平滑的,且在很多局部有上下波动。
如何理解 P-R 曲线呢?
可以从排序型模型或者分类模型理解。以逻辑回归举例,逻辑回归的输出是一个
0
到1
之间的概率数字,因此,如果我们想要根据这个概率判断用户好坏的话,我们就必须定义一个阈值 。通常来讲,逻辑回归的概率越大说明越接近1
,也就可以说他是坏用户的可能性更大。比如,我们定义了阈值为0.5
,即概率小于0.5
的我们都认为是好用户,而大于0.5
都认为是坏用户。因此,对于阈值为0.5
的情况下,我们可以得到相应的一对查准率和查全率。 但问题是:这个阈值是我们随便定义的,我们并不知道这个阈值是否符合我们的要求。 因此,为了找到一个最合适的阈值满足我们的要求,我们就必须遍历0
到1
之间所有的阈值,而每个阈值下都对应着一对查准率和查全率,从而我们就得到了PR
曲线。 最后如何找到最好的阈值点呢? 首先,需要说明的是我们对于这两个指标的要求:我们希望查准率和查全率同时都非常高。 但实际上这两个指标是一对矛盾体,无法做到双高。图中明显看到,如果其中一个非常高,另一个肯定会非常低。选取合适的阈值点要根据实际需求,比如我们想要高的查全率,那么我们就会牺牲一些查准率,在保证查全率最高的情况下,查准率也不那么低。
在进行性能比较时,如果一个学习器的曲线被另一个学习器的曲线完全包住,则可断言后者性能优于前者,如图 2.3,学习器 A
性能优于学习器 C
。比较 P-R
曲线下面积的大小,也可判别学习器的优劣,它在一定程度上表征了学习器在查准率和查全率上取得”双高“的比例,但这个值不容易估算,因此人们又设计了一些综合考虑查准率、查全率的性能度量,如”平衡点(Break-Event Point
,简称 BEP
)“。
BEP
是”查准率=查全率“时的取值,基于学习器的比较,可以认为学习器 A
优于 B
。但 BEP
过于简单了,更为常用的是 F1F1F1 度量。
F1=2×P×RP+R=2×TP样例总数+TP−TNF1 = \frac{2\times P\times R}{P+R} = \frac{2\times TP}{样例总数+TP-TN}F1=P+R2×P×R=样例总数+TP−TN2×TP
F1F1F1 度量的一般形式:FβF_{\beta}Fβ,能让我们表达出对查准率/查全率的偏见,FβF_{\beta}Fβ 计算公式如下:
Fβ=1+β2×P×R(β2×P)+RF_{\beta} = \frac{1+\beta^{2}\times P\times R}{(\beta^{2}\times P)+R}Fβ=(β2×P)+R1+β2×P×R
其中 β>1\beta > 1β>1 对查全率有更大影响,β<1\beta < 1β<1 对查准率有更大影响。
很多时候我们会有多个混淆矩阵,例如进行多次训练/测试,每次都能得到一个混淆矩阵;或者是在多个数据集上进行训练/测试,希望估计算法的”全局“性能;又或者是执行多分类任务,每两两类别的组合都对应一个混淆矩阵;....总而来说,我们希望能在 nnn 个二分类混淆矩阵上综合考虑查准率和查全率。
一种直接的做法是先在各混淆矩阵上分别计算出查准率和查全率,记为(P1,R1),(P2,R2),...,(Pn,Rn)(P_1,R_1),(P_2,R_2),...,(P_n,R_n)(P1,R1),(P2,R2),...,(Pn,Rn)然后取平均,这样得到的是”宏查准率(Macro-P
)“、”宏查准率(Macro-R
)“及对应的”宏F1F1F1(Macro-F1
)“:
Macro P=1n∑i=1nPiMacro\ P = \frac{1}{n}\sum_{i=1}^{n}P_iMacroP=n1∑i=1nPi
Macro R=1n∑i=1nRiMacro\ R = \frac{1}{n}\sum_{i=1}^{n}R_iMacroR=n1∑i=1nRi
Macro F1=2×Macro P×Macro RMacro P+Macro RMacro\ F1 = \frac{2 \times Macro\ P\times Macro\ R}{Macro\ P + Macro\ R}MacroF1=MacroP+MacroR2×MacroP×MacroR
另一种做法是将各混淆矩阵对应元素进行平均,得到 TP、FP、TN、FNTP、FP、TN、FNTP、FP、TN、FN 的平均值,再基于这些平均值计算出”微查准率“(Micro-P
)、”微查全率“(Micro-R
)和”微F1F1F1“(Mairo-F1
)
Micro P=TP‾TP‾+FP‾Micro\ P = \frac{\overline{TP}}{\overline{TP}+\overline{FP}}MicroP=TP+FPTP
Micro R=TP‾TP‾+FN‾Micro\ R = \frac{\overline{TP}}{\overline{TP}+\overline{FN}}MicroR=TP+FNTP
Micro F1=2×Micro P×Micro RMacroP+Micro RMicro\ F1 = \frac{2 \times Micro\ P\times Micro\ R}{MacroP+Micro\ R}MicroF1=MacroP+MicroR2×MicroP×MicroR
2.3.3 ROC 与 AUC
ROC
曲线示意图如下。
2.5 偏差与方差
通过前面的学习,我们已经知道如何设计实验(训练集、验证集的划分)来对学习器的泛化误差进行评估,并且也了解了诸如精度、查准率、查全率及 F1
等性能度量指标。但这不够,我们还希望了解”为什么“具有这样的性能。”偏差-方差分解“(bias-variance decomposition
)是解释学习算法泛化性能的一种重要工具。
假设对于测试样本 xxx,令 yDy_DyD 为 xxx 在数据集中的标记(即标签,可能会存在噪声),yyy 才是 xxx 的真实标记,f(x;D)f(x;D)f(x;D) 为训练集 DDD 上学得模型 fff 在 xxx 上的预测输出。以回归任务为例,算法的泛化误差计算如下:
E(f;D)=ED[(f(x;D)−yD)2]E(f;D) = \mathbb{E}_{D} [(f(x;D) - y_{D})^2]E(f;D)=ED[(f(x;D)−yD)2]
直接计算上式是不行的,我们得进行分解,分解之前需要先知道方差、偏差、噪声的定义。学习算法的期望预测为
fˉ(x)=ED[(f(x;D)]\bar{f}(x) = \mathbb{E}_{D} [(f(x;D)]fˉ(x)=ED[(f(x;D)]
方差定义: 模型预测的期望值与预测值之差的平方的期望值,使用样本数相同的不同训练集产生的方差为
D(x)=var(x)=ED[(f(x;D)−ED[(f(x;D)])2]=ED[(f(x;D)−fˉ(x))2]D(x) = var(x) = \mathbb{E}_{D}[(f(x;D) - \mathbb{E}_{D}[(f(x;D)])^2] = \mathbb{E}_{D}[(f(x;D) - \bar{f}(x))^2]D(x)=var(x)=ED[(f(x;D)−ED[(f(x;D)])2]=ED[(f(x;D)−fˉ(x))2]
方差在统计描述和概率分布中各有不同的定义,并有不同的公式。
噪声为
ε2=ED[(yD−y)2]\varepsilon^2 = \mathbb{E}_{D}[(y_{D} - y)^2]ε2=ED[(yD−y)2]
模型预测的期望值与真实值的差称为偏差(bias
),即bias2(x)=(fˉ(x)−y)2bias^2(x) = (\bar{f}(x)-y)^2bias2(x)=(fˉ(x)−y)2
假定噪声为 0
,即 ED[(yD−y)]=0\mathbb{E}_{D}[(y_{D}-y)]=0ED[(yD−y)]=0,有了
以上定义,通过多项式展开合并,并利用恒等变形、期望的运算性质可将期望泛化误差公式进行分解得到:
公式推理证明,可参考这里。
E(f;D)=ED[(f(x;D)−fˉ(x))2]+(fˉ(x)−y)2+ED[(yD−y)2]E(f;D) = \mathbb{E}_{D}[(f(x;D)-\bar{f}(x))^2] + (\bar{f}(x)-y)^2 + \mathbb{E}_{D}[(y_{D}-y)^2]E(f;D)=ED[(f(x;D)−fˉ(x))2]+(fˉ(x)−y)2+ED[(yD−y)2]
于是,
E(f;D)=var(x)+bias2(x)+ε2 E(f;D) = var(x) + bias^2(x) + \varepsilon^2E(f;D)=var(x)+bias2(x)+ε2
通过上式,可知泛化误差可分解为方差、偏差与噪声之和。回顾偏差、方差、噪声的定义:
- 偏差:度量了学习算法的期望预测与真实结果的偏离程度,刻画了学习算法本身的拟合能力。
- 方差:度量了同样大小的训练集的变动导致的学习性能的变化,刻画了数据扰动所造成的影响,或者说刻画了模型的稳定性和泛化能力。
- 噪声:表达了当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。
通过对泛化误差进行分解说明,模型泛化性能是由学习算法的能力、数据的充分性以及任务本身的难度所共同决定的。模型欠拟合表现为偏差较大, 此时偏差主导了泛化错误率;模型过拟合表现为偏差小但是方差很大,方差主导了泛化错误率。
一般来说,偏差与方差是有冲突的,这称为偏差-方差窘境(bias-variane dilemma
)。
第 3 章 线性模型
3.5 多分类学习
3.6 类别不平衡问题
y′1−y′=y1−y×m−m+\frac{y'}{1-y'} = \frac{y}{1-y}\times \frac{m^-}{m^+}1−y′y′=1−yy×m+m−
公式中,yyy 是预测值,分类器决策规则为:若 y1−y\frac{y}{1-y}1−yy 则预测为正例。令 m+m^+m+ 表示正例数目, m−m^-m− 表示反例数目,则观测几率是 m−m+\frac{m^-}{m^+}m+m−。
类别不平衡学习的一个基本策略是 “再缩放”(rescaling)。再缩放技术主要有三种方法实现:
- 对训练集的反类样例进行“欠采样”(undersampling),即去除一些反例使得正负样例数目接近,然后再进行学习。
- 对训练集的正类样例进行“过采样”(oversampling),即增加一些正例使得正、负样例数目接近,然后再进行学习(或者叫模型训练)。
- 直接对原始训练集进行学习,但是在对训练好的分类器进行预测时,将式(3.48)嵌入到分类器推理过程中,称为“阈值移动”(threshold-moving)。
值得注意的是过采样的方法不能简单地对初始正例样本进行重复采样,否则会招致严重的过拟合;过采样方法的代表性算法 SMOTE 是通过对训练集的正例进行插值来产生额外的正例(图像数据就进行数据增强)。
第 5 章 神经网络
5.1 神经元模型
神经网络有很多种定义,一种较为广泛的定义是,其是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。
神经网络中最基本的成分是神经元(neuron
)模型,即上述定义中的简单单元。经典的"M-P神经元模型”如下所示,其中的 fff 表示激活函数,www 表示神经元权重。
5.2 感知机与多层网络
感知机(perception
)由两层神经元组成,如下图所示,输入层接收外界输入信号后传递给输出层,输出层是 M-P 神经元,也称“阈值逻辑单元”(threshold logic unit
)。感知机能容易地实现逻辑与、或、非运算,只需要设置合理的 www、θ\thetaθ 参数。感知机模型的公式可表示为:
yj=f(∑iwixi−θj)y_j = f(\sum_{i}w_ix_i - \theta_j)yj=f(∑iwixi−θj)
给定训练数据集,感知机的 www 和 θ\thetaθ 参数可通过学习得到。其学习规则很简单,对于训练样本(x,y)(x,y)(x,y),如果感知机输出为 y^\hat{y}y^,则感知机的参数将做如下调整:
wi←wi+ΔwiΔwi=η(y−y^)xw_{i} \leftarrow w_{i} + \Delta w_i \\ \Delta w_i = \eta(y - \hat{y})xwi←wi+ΔwiΔwi=η(y−y^)x
其中 η\etaη 称为学习率,从上式可以看出当感知机预测输出 y^\hat{y}y^ 和样本标签 yyy 相等时,参数不改变;否则将根据偏差的严重程度进行相应调整。
需要注意的是,感知机只能解决与、或、非这样的线性可分(即存在一个线性超平面将它们分开)问题,但是甚至不能解决异或这样简单的非线性可分问题。
要解决非线性可分问题,可以使用多功能神经元。如下图所示的就是一种常见的“多层前馈神经网络”(multi-layer feedforward neural
),每层神经元与下一层神经元全互连,同层神经元之间不连接,也不存在跨层连接。
“前馈” 并不意味着网络中信号不能反向传播,而单纯是指网络拓扑结构上不存在环或回路。
5.3 误差反向传播算法
很明显多层神经网络的学习能力比单层网络(单层感知机)强得多。感知机参数的学习规则很简单,因此其对于多层神经网络是不够用的,由此,诞生了强大的误差反向传播(error BackPropagation
,简称 BP
)算法,并使用至今,现阶段的所有深度神经网络的参数都是由 BP
算法训练得到的。
反向传播指的是计算神经⽹络参数梯度的⽅法。总的来说,反向传播依据微积分中的链式法则,沿着从输出层到输⼊层的顺序,依次计算并存储⽬标函数有关神经⽹络各层的中间变量以及参数的梯度。
前向传播:输入层-->输出层;反向传播:输出层-->输入层。
下面通过前馈神经网络的 BP
算法来深入理解 BP
过程。
给定训练集 D=(x1,y1),(x2,y2),...,(xm,ym),x∈Rd,yi∈RlD = {(x_1, y_1), (x_2, y_2),...,(x_m, y_m)}, x \in \mathbb{R}^d, y_i \in \mathbb{R}^lD=(x1,y1),(x2,y2),...,(xm,ym),x∈Rd,yi∈Rl,即每个输入样本都由 ddd 个属性表征,模型输出的是 lll 维实值向量。为了便于 BP
算法的推导,下图给出了一个拥有 ddd 个输入神经元、lll 个输出神经元、qqq 个隐层神经元的多层前馈神经网络,其中输出层第 jjj 个神经元的阈值用 θj\theta_jθj 表示,隐层第 hhh 个神经元的阈值用 γh\gamma_hγh 表示。输入层第 iii 个神经元与隐层第 hhh 个神经元之间的连接权重参数为 vihv_{ih}vih,隐层第 hhh 个神经元与输出层第 jjj 个神经元之间的连接权为 whjw_{hj}whj。记隐层第 hhh 个神经元接收到的输入为 αh=∑i=1dvihxi\alpha_h = \sum_{i=1}^{d}v_{ih}x_iαh=∑i=1dvihxi,输出层第 jjj 个神经元接收到的输入为 βj=∑h=1qwhjbh\beta_j = \sum_{h=1}^{q}w_{hj}b_hβj=∑h=1qwhjbh,其中 bhb_hbh 为隐层第 hhh 个神经元的输出。这里假设隐层和输出层神经元的激活函数都为 Sigmoid
函数。
对训练样本 (xk,yk)(x_k,y_k)(xk,yk),假设神经网络的输出为 y^k=(y^1k,y^2k,...,y^lk)\hat{y}_k =(\hat{y}_1^k,\hat{y}_2^k,...,\hat{y}_l^k)y^k=(y^1k,y^2k,...,y^lk),即
y^jk=f(βj−θj),(5.3)\hat{y}_j^k = f(\beta_j - \theta_j)\tag{5.3},y^jk=f(βj−θj),(5.3)
则网络在 (xk,yk)(x_k,y_k)(xk,yk) 上的均方误差损失为
Ek=12∑j=1l(y^jk−yk)2,(5.4)E_k = \frac{1}{2}\sum_{j=1}^{l}(\hat{y}_j^k - y_k)^2\tag{5.4},Ek=21j=1∑l(y^jk−yk)2,(5.4)
输入层到隐层需要 d×qd \times qd×q 个权重参数、隐层到输出层需要需要 q×lq \times lq×l 个权重参数,以及 qqq 个隐层的神经元阈值、lll 个输出层的神经元阈值。BP
是一个迭代学习算法,在迭代的每一轮中采用广义的感知机学习规则对参数进行更新估计,因此任意参数 vvv 的更新估计表达式都可为
v←v+Δv(5.5)v\leftarrow v + \Delta v\tag{5.5}v←v+Δv(5.5)
下面我会首先推导出隐层到输出层的权重 whjw_{hj}whj 更新公式,而后类别推导 θj\theta_{j}θj、vihv_{ih}vih、γh\gamma_{h}γh。
BP
算法是基于梯度下降(gradient desent
)策略,以目标的负梯度方向对参数进行调整,对式(5.4)(5.4)(5.4)的误差 EkE_kEk,给定学习率 η\etaη,可得权重参数更新公式如下:
w←w+−η∂Ek∂ww \leftarrow w + -\eta \frac{\partial E_k}{\partial w}w←w+−η∂w∂Ek
同时,
Δwhj=−∂Ek∂whj(5.6)\Delta w_{hj} = -\frac{\partial E_k}{\partial w_{hj}}\tag{5.6}Δwhj=−∂whj∂Ek(5.6)
注意到 whjw_{hj}whj 先影响到第 jjj 个输出层神经元的输入值 βj\beta_jβj,再影响到其输出值 y^jk\hat{y}_j^ky^jk,最后才影响到损失 EkE_kEk,根据梯度的链式传播法则,有
∂Ek∂whj=∂Ek∂y^jk∂y^jk∂βj∂βj∂whj(5.7)\frac{\partial E_k}{\partial w_{hj}} = \frac{\partial E_k}{\partial \hat{y}_j^k}\frac{\partial \hat{y}_j^k}{\partial \beta_j}\frac{\partial \beta_j}{\partial w_{hj}} \tag{5.7}∂whj∂Ek=∂y^jk∂Ek∂βj∂y^jk∂whj∂βj(5.7)
根据前面 βj\beta_jβj 的定义,显然有
∂βj∂whj=bh(5.8)\frac{\partial \beta_j}{\partial w_{hj}} = b_h \tag{5.8}∂whj∂βj=bh(5.8)
再因为 Sigmoid
函数的一个很好的性质:
f′(x)=f(x)(1−f(x))(5.9){f}'(x) = f(x)(1-f(x)) \tag{5.9}f′(x)=f(x)(1−f(x))(5.9)
再联合式(5.3)(5.3)(5.3)和(5.4)(5.4)(5.4),有: