目录
摘要
本周继续学习了深度学习的反向传播,同时还通过两个案例(pokemon进化后PC值预测与pokemon属性分类)学习了机器学习中三大任务中的回归任务与分类任务,了解了这两大任务的基本概念并且掌握了其基本解决步骤以及所用到的Model。
ABSTRACT
This week, I continued to learn the backpropagation of deep learning, and also learned the regression task and classification task among the three major tasks in machine learning through two cases (PC value prediction after pokemon evolution and pokemon type classification), understood the basic concepts of these two tasks, and mastered the basic solution steps and the Model used.
一、反向传播
反向传播(Backpropagation)的本质和梯度下降算法区别不大,就是计算神经网络中损失函数对各参数的梯度,配合优化方法更新参数,降低损失函数的值。
1.反向传播的步骤
①前向计算网络,得到最终输出结果。
②计算最终输出结果与真实标签之间的误差。
③从输出层开始,根据链式法则计算每个层的输入与该层的损失函数的梯度。
④利用梯度信息更新网络中每个层的参数,使得损失函数最小。
⑤重复步骤1-4,直到满足停止条件。
2.反向传播的计算过程
首先定义loss函数:,其中代表计算与之间的距离的函数,即真实值与预测值之间的误差。需要计算的值来求解梯度,而,因此想要求解梯度就必须求解。
设,即激活函数的输入值,则,计算的值被称之为Forward Pass,只需要对参数求偏导即可,,,。对于w参数求偏导,看它对应的输入是多少就是多少。
主要难点在于计算,这个计算被称之为Backward Pass。上图中z输入sigmoid函数计算得到:,a作为下一层的输入产生了和(假设a的下一层连接两个神经元),则因此,而可直接计算出来,故而将计算的目标转化为计算,展开得:,其中,,,,如此又转化为计算和的问题。
假设已知了和,则,该式可表示为一个新的神经元。
case1:和的结果已经是网络的最终输出,即,,则,,其中,,,,都可直接计算出来。
case2:不是最终输出的结果而是下一层的输入,即,则下一层sigmoid函数的输入为:,(同样假设的下一层连接两个神经元),假设和已知,又可以计算出,也是同理计算出。因此类推可知,只要一直展开到case1的情况,就能反回去求解出所有的待解微分。
实际处理过程并不是如上述步骤般展开计算的,而是先计算输出层前一层的微分,从后向前计算,最终计算出每一层的梯度然后更新参数。
二、回归问题
回归问题是机器学习三大基本模型中很重要的一环,其功能是建模和分析变量之间的关系,多用来预测一个具体的数值,如预测房价、未来的天气情况等等。例如根据一个地区的若干年的PM2.5数值变化来估计某一天该地区的PM2.5值大小,预测值与当天实际数值大小越接近,回归分析算法的可信度越高。
1.预测Pokemon进化后的CP值
此案例以预测Pokemon进化后的CP值为目标来阐明回归问题的解决步骤,其中模型输入的特征为(Pokemon的战力值),(Pokemon的种族),(Pokemon的生命值),(Pokemon的重量),(Pokemon的高度)。
Step1:Model(Linear Model)
第一步,确定预测模型,此处采用经典的Linear Model作为示例。所谓的模型实际上是一系列函数的集合,因为参数w和b都可被任意取值,以此便可以定义无数多个预测函数,这无数多个预测函数又组成了一个集合,这个集合就被称之为Model。其中表示输入x的一个属性,被称之为特征,参数表示权重,参数表示偏移量。
Step2:Goodness of Function
第二步,判断预测函数的好坏。首先需要定义一个损失函数,的输入是预测函数,输出是预测函数的好坏程度,因为预测函数与参数和参数有关,故。此处以最小二乘法定义损失函数,训练集Pokemon样本数量为10,其中为训练集Pokemon样本进化后CP的真实值,为训练集Pokemon样本CP的真实值,为训练集Pokemon样本进化后CP的预测值。
Step3:Best Function
第三步,找到最好的预测函数。评判一个 预测函数的好坏与否主要看它在输入损失函数后,损失函数输出的值的大小,值越大,表明预测函数越差,值越小,表明预测函数越好。要求最好的预测函数就要使损失函数的输出值最低,而预测函数又由参数和参数所决定,所以调节参数和参数使损失函数的输出值最低时,有最好的预测函数。调节参数和参数主要用到的方法是梯度下降(Gradient Descent)。
梯度下降的过程是针对所有参数的,需要将每一个参数都对求偏导,这里将所有的偏导放到一个向量中,定义为。
最小二乘法
此模型的损失函数是由最小二乘法所定义,即。因为对真实值和预测值的差值做了平方,所以的因变量范围为,函数是一个凸函数。因此该损失函数能找到全局最优的参数和参数,而不是局部最优解。下图是最小二乘法定义损失函数时,的等高线图,越靠近红色部分越大,越靠近蓝色部分越小。
当用最小二乘法时,损失函数对参数的偏导计算过程如下:
Results
最终,通过梯度下降运算结果可以得出的最优参数,参数,在训练集上的平均误差为。
然而,模型在训练集上的表现结果并不是真正需要关心的事情,真正需要关心的事情是模型在测试集上的表现。另取10只Pokemon作为测试集,输入预测函数后可以得到如下图像,此时的平均误差为。可以明显看出,在CP值小和CP值大的Pokemon区域内的预测误差较大,而在CP值中等的Pokemon区域内的预测结果比较准确,因此该模型还可以进一步优化。
2.优化模型
采用Linear Model时误差比较大,考虑换另一种Model可能会有更好的表现。例如将Model改为二次式,此时的最优参数,参数,参数,在训练集上的平均误差为15.4,在测试集上的平均误差为18.4,明显比Linear Model的误差更低。
由此可能考虑到再换一种更复杂的Model是不是误差还能进一步减小,例如三次式、四次式等。实际结果是,当Model为三次式时,误差能进一步减小,而当Model为四次式时,在测试集上的误差反而更大了,这就发生了过拟合(Overfitting)的现象。所以实际应用中,并不是越复杂的Model越好,而是要根据实际的数据合理选择。
Other factors
实际运用中,模型的预测准确度大多都不仅仅只受单一因素的影响,而是多因素综合起作用。例如本例中,对于Pokemon进化后CP值的预测还受到Pokemon种族的影响,不同种族的Pokemon用同一个预测模型预测出来的平均误差可能会不同。
Re.step1:Redesign the Model
因此,要想更加准确的进行预测就需要为每一个种族的Pokemon都单独定义一个Model。
可以用Linear Model来综合上面所有的预测函数为一个Model。判断语句用替代。
预测的结果还可能和Pokemon的身高体重等因素有关,对于所有可能产生影响的因素,如果全部放入Model中加以考虑,会创建出一个最复杂的Model,极大概率下会发生过拟合现象。
Re.step2:Regularization
通过优化第二步参数更新的过程,可以较为明显地减轻上述过拟合现象。这个优化方式就是使用正则化(Regularization),在现有特征不变情况下,降低部分不重要特征的影响力。这个方法有助于有很多特征且每个特征都有贡献的神经网络避免过拟合,可以看做是一种“约束”。加入了正则项之后使得函数更加平滑,测试时输入noises会对函数输出的结果产生更小的影响。
正则化的本质实际上就是在提高模型在训练集上的误差的同时减小其在测试集上的误差。通过调节参数可以调节函数的平滑程度,越大函数越平滑,反之则越不平滑。当然并不是越平滑的函数,在测试集上的误差就会越小,当函数平滑到一定程度后,这个误差反而会增大,所以要想找到合适的模型还需要找到合适的参数。
三、分类问题
分类问题是我们日常生活中最常遇到的一类问题,比如垃圾邮件的分类,识别人眼所看到的是汽车还是火车抑或是别的物体,再或者去医院医生诊断病人身体里的肿瘤是否是恶性的,这些问题全部都属于分类问题的范畴。
1.按属性分类pokemon
此案例以按属性分类pokemon为目标来阐明分类问题的解决步骤。当输入Pikachu时,输出ELECTRIC,输入Squirtle,输出WATER,输入Bulbasaur,则输出GRASS。
可以将一只pokemon按照如下各种各样的数值表述出来,通过输入这些数值(一个数值表示一个特征)则表示输入了一只对应的pokemon,输出就是这只pokemon属性的预测值。
Ideal Model
分类任务的一个理想方案如下,在函数中再嵌套一个函数,例如在做一个二元分类时可以令输出class1,其他情况下输出class2。损失函数也不再采用回归问题的损失函数计算方式,而是采用计算在训练集上得到错误预测结果的次数来定义,因此参数的更新也无法使用梯度下降的方法。
假设有两个盒子Box1和Box2,每个盒子各5球,从Box1中抽球的概率为2/3,记为P(B1),从Box2中抽球的概率为1/3,记为P(B2)。若Box1中的5球中有4球为蓝球,1球为绿球,则在Box1中抽中蓝球的概率为4/5,记为P(Blue | B1),抽中绿球的概率为1/5,记为P(Green | B1)。若Box2中的5球中有2球为蓝球,3球为绿球,则在Box2中抽中蓝球的概率为2/5,记为P(Blue | B2),抽中绿球的概率为3/5,记为P(Green | B2)。由此可以计算出蓝球、绿球从某个盒子中抽出的概率。
上述方法可以运用至分类任务中,Box1和Box2相当于两个类别Class1和Class2,篮球和绿球相当于输入的数据x。只要知道了P(C1)、P(C2)、P(x | C1)和P(x | C2)这四个值,就能计算出x属于Class1或Class2的可能性有多大,从而将x归为可能性最大的那一个分类中。由此定义一个Generative Model,P(x)=P(x | C1)P(C1)+P(x | C2)P(C2),即x出现的几率。
假设Class1表示Water系的Pokemon,Class2表示Normal系的Pokemon,取ID<400的Water系和Normal系的pokemon为训练集,其余的pokemon为测试集。已知训练集中有79只为Water系,61只为Normal系,则P(C1)=79/(79+61)=0.56,P(C2)=61/(79+61)=0.44。接下来就只需要计算出从Water系或Normal系中选中某一只pokemon的概率。
Gaussian Distribution
通过输入pokemon的各个特征,可以用高斯分布(Gaussian Distribution)来计算从某一属性中取到该pokemon的概率。高斯分布的函数形状主要由均值和协方差矩阵所决定的,其输入为向量x,输出为样本中取到x的概率。
因此,只要计算出高斯分布的和,就能够计算出从某一属性分类中取出某一个未知pokemon的概率。注意这里输入的x向量只包含Defense和SP Defense两个特征。
任何一个高斯分布都能选出79个点并计算出这些点被选出的概率,只是这些点在不同参数和的高斯分布中被选出的概率不同。已知Water系的pokemon有79只,则可以根据这79只pokemon构造出一个高斯分布,使得这79只pokemon在该高斯分布中被选出的概率最大。值得一提的是,即使不是Water系的pokemon在高斯分布中也是有概率被选出的,只是这个概率特别小但不是为零。
这个高斯分布的均值记为,协方差矩阵记为,接下来通过对和微分来找到和。实际可以通过下图公式直接计算出和。
通过上述步骤计算出的Water系pokemon和Normal系pokemon的高斯分布如下图所示。
Do Classification
接下来可以通过上面构造出的两个属性分类的高斯分布继续进行分类任务。
然而经过计算,测试集的分类准确率只有47%,当考虑pokemon所有的数值时,高斯分布的向量空间变成了7维,即使如此准确率也只有54%。
2.优化模型
对于Water系和Normal系的高斯分布可以使用相同的协方差矩阵来减小参数量,只计算、以及。
因为使用了共用的协方差矩阵,所以Class1和Class2的边界就变成了一条直线,用这种方法构造出来的Model也叫Linear Model。可以明显看出,在考虑pokemon的所有数值的前提下,此时的准确率提高到了73%。
Three Steps
事实上,计算几率分布的方法不一定非要使用高斯分布,对于具体的分类问题和具体的训练数据,要合理的选择几率分布的方法。例如,在做二元分类任务时,可以选择伯努利分布(Bernoulli Distributions),如果所有的维度都是独立的,则可以选择朴素贝叶斯分类器(Naive Bayes Classifier)。
Posterior Probability
总结
本周学习的主要难点在于反向传播的计算过程,理解分类任务模型的数学含义以及从Box到Class再到高斯分布这一连串的引出深入的推导过程,最终顺利掌握了这部分所学知识。下一周我将学习逻辑回归的内容。