深度学习实战
上QQ阅读APP看书,第一时间看更新

2.2 代价函数

机器学习中绝大多数任务都是优化任务,也就是去寻找最优解。对应到函数中,就是寻找函数极值。但这其中就存在一个很困难的问题,局部最优解。传统的机器学习大多是针对凸优化问题,也就是函数可以找到最大值或最小值,但很不幸,由于深度学习构造的函数非常复杂(模型容量大),因此深度学习会存在很多局部最优解(数据高维时鞍点更普遍),这也是深度学习所面临的最困难的挑战之一,为此我们也将在第5章中专门地介绍深度学习的优化技术。

绝大多数机器学习算法学习的过程,其实就是在调整数据特征的重要性,我们将这种刻画重要性的量称之为参数或权重,参数控制着机器学习系统的行为,而我们要做的其实就是找到一组最优的参数。我们可以把机器学习算法简单地想成一个函数fω(x),ω表示函数的参数,x表示我们输入的数据,fω(x)可以是简单的线性回归算法,如式(2.3)所示。

也可以是层层嵌套的深度学习算法,如式(2.4)所示。

暂不考虑其内部结构,我们的目的就是尽可能地让我们设计的函数尽可能的“好”。而所谓的“好”就是机器学习算法的预测值与实际值之间的误差尽可能的低,我们也将衡量这种误差的函数称之为代价函数(Cost Function)或者损失函数(Loss Function)。

2.2.1 均方误差函数

假设需要完成一个房屋价格预测任务,我们需要输入房屋面积、户型、位置等特征,输出为房屋价格预测。我们用集合X={x(1),x(2),x(m)}表示已有的m条房屋信息(数据),用集合Y={y(1),y(2),…y(m)}表示对应的实际售出价格。并且我们也设计好了机器学习算法f(x;w),而你需要做的是,思考一下如何设计我们的代价函数。你能想到最简单的代价函数会是什么呢?比如式(2.5)这样一个简单的代价函数。

你能看出式(2.5)表示什么意思吗?其实很简单,就是把每一个预测的房屋价格与真实的房屋价格相减,因为我们只关心两者的误差于是就加了一个绝对值,然后将所得的误差累加起来就得到上面的公式了。

假如你去预测房屋的价格,你又怎样评价自己误差呢?你会不会这样想“有些预测非常准确,有些预测比较差,但平均下来还是挺不错的。”自然而然,我们去估算一堆事物的好坏,也总是使用平均值,用统计学的术语就叫期望值,我们再稍稍修改式(2.5)中的代价函数就得到了式(2.6)。

式(2.6)已经足够优秀了,但有一个缺点,那就是有绝对值,因为绝对值不连续也不能处处可导,那么怎样既不破坏我们近乎完美的设计,又可以去掉绝对值呢?我猜你5秒钟内就会想到,可以对其求平方,如式(2.7)所示。

就是如此简单,我们轻松地设计出了第一个代价函数,但请你不要误会,式(2.7)代价函数可是大名鼎鼎的均方误差(Mean Squared Error)[5]

看完以上式的推导,不知道你有何感想,其实这些式只是我们各种想法的简化描述,看到式(2.7)会不会有一种豁然开朗的感觉,我们需要用一堆文字描述的思想,只需一行表达式就可以完成。开始时希望你不要急躁,如果对这一过程有些不懂,再折回去慢慢体会这一过程也是个不错的选择。请记住这些式来帮助你记忆并理解上文中的内容,不是你的负担。这些式并不重要,重要的是其所表示的含义。

2.2.2 极大似然估计

“阳光正热,才过午后,学徒小飞沏了一杯下午茶,准备躺在竹摇椅上享受一番。不料杨师傅一记闷拳敲在了头上,小飞顿时头晕眼花,抱头嚎叫。‘劣徒,你还有没有梦想?快和为师上山打猎。’两人走到半山腰,发现了一只小兔子,于是两人同时举起了枪,小白兔就倒在了血泊中。”那么问题来了,是谁残忍地杀害了小白兔?

如果大侠没开脑洞,正常情况下应该会选择杨师傅吧,也许你觉得你的选择很正常没什么奇怪的,但其实你已经用到了极大似然的思想。那“似然”又具体指什么呢?似然(likelihood)是一种较为文言文的翻译,我们脱去其外衣可能看得比较清楚。“似然”用现代的中文来说就是“可能性”,所以极大似然,通俗点就是最大的可能性。我们选择杨师傅的原因是因为杨师傅帅吗?当然不是,那是因为杨师傅是“老炮”,他的枪法准,射中的可能性更大。

回到生活中,我们几乎处处都在使用“极大似然”,很多时候我们没机会,也没能力去探究事物的真相,我们最简单也是最高效的方法就是去估计。当你去找工作时,别人很有可能会问你,你来自哪所学校?你的文凭如何?你得过什么奖?记住,任何指标都不能确认你是一个多么优秀的人,指标只能确定你是优秀人才的可能性。

在继续讨论“极大似然”之前,我们要补充机器学习中非常重要的一个假设,那就是数据独立同分布(independent and identically distributed,i.i.d.)条件。独立同分布假设数据与数据是独立的,就比如信用卡发放任务中,每一张用户填写的表格是相互独立的,但该任务的所有数据又都来自于同一个概率分布函数,这就使得我们模拟出已知数据的概率分布模型,同样也可以运用在未来的任务中。有了i.i.d.条件,就可以构造极大似然估计。

我们依然给出一个概率函数P(y|x;w),为了方便,概率函数只进行了二分类,也就是输出“0”或“1”。那么如何去判断P(y|x;w)的好坏呢?很简单,那就是该概率函数在已有的数据上发生的概率最高,考虑到数据是相互独立的,因此可以对每一条数据对应的概率函数进行求积,就得到了式(2.8)。

这个函数就称为似然函数,而我们求出该函数取得最大值时所对应的参数,也就是极大似然估计(Maximum Likelihood Estimate)[6]

但问题在于,求连积是很困难的,不但耗费计算资源,令人头疼的是还非常容易造成内存下溢出。那我们能不能将乘法改成加法呢?可以使用对数函数将乘法转换为加法。如式(2.9)就是对数运算的基本公式之一。

根据式(2.8)和(2.9),我们对似然函数取自然对数就得到了式(2.10)。

在习惯上,我们比较喜欢求最小值、平均值,因此式(2.10)就变成了式(2.11)。

假设机器学习算法f(x)就是概率函数P(y|x),需要注意的是如果真实的标记y是“0”,那么预测的f(x)也应该接近于“0”,但公式又不允许“0”出现,因此在真实值为“0”时,预测值用1-f(x)代替。最后代价函数就如式(2.12)所示。

也许一眼看上去式(2.12)会比较复杂,但其含义也很简单,当真实值为“1”时,我们就使用f(x),将右边式子的第二项去掉;当真实值为“0”时,我们就使用1-f(x),将右边式子的第一项去掉。式(2.12)也被称为交叉熵(Cross-entropy)[7]