Lesson5 part5 交叉熵、softmax

查看Tabular models笔记

该数据是用来预测谁的收入会更高。这是一个分类模型。我们有一系列类别变量(categorical variables)和一些连续变量,首先我意识到的是我们还不知道如何预测类别变量,目前为止我们还徘徊在一个简单的事实,即lesson5中的损失函数为nn.CrossEntropyLoss().这个函数式是什么?让我们来看看。当然,我们通过excel来找出答案。

交叉熵损失只是另一种损失函数,你已经学过一种损失函数了,也就是均方误差MSE,.但这不是一个适合这里使用的损失函数,因为在我们的例子里,对于MNIST数据,我们有10个可能的数字,10个激活值,每个激活值都对应要预测数字的概率。所以我们需要一个函数,能自信得预测出正确结果。并且又很低的损失值。而如果自信得预测成了错误结果,应该有很高的损失值,这是我们想要的,所以这里有一个例子,这里是cat vs dog,经过了one-hot编码。

image.png

这是猫狗的激活值

image.png

这是猫的概率和是狗的概率。0.5说明确定是猫还是狗,0.5的值对应的损失值为0.3,而预测为猫的概率为0.98对应的损失值为0.01。对于非常确定地预测出了错误的结果,所以损失值为1,我们该如何做呢?交叉熵损失就可以实现。


image.png

公式为:是否是猫乘以log(是猫的概率)【也就是乘以log(猫的激活值)】- 是否是狗乘以log(是狗的概率),也就是说,猫狗矩阵就是所有的one-hot矩阵,乘上你的所有的激活值,在求和。有趣的是,G列的数值和F列的数值是一样的,但它们的生成方法不同。(G列)我使用了if函数,因为这就是当取0时实际上没有加任何东西进来,所以函数内容实际上一样,也就是说,如果是猫,那就对是猫的概率去对数,如果它是一条狗,则反之。对(1-是猫的概率)取对数,换句话说就是log(是狗的概率)。所以这个one-hot编码乘以激活值再求和,在if函数里是一样的。你想想看,因为这实际上是一个矩阵乘法,从我们在嵌入矩阵学习中我们知道,这和索引查找法是一样的。所以你可以做交叉熵,也可以对应真实值,查找激活值的对数,这种方法的前提是,每行猫和狗的概率之后为1,这也是为什么你可以得到像这样奇怪的交叉熵数值,这也是为什么我之前说你按了“错误的按钮”,因为如果它们加起来不等于1,就麻烦了。所以你怎么确保它们加起来是1呢?确保和是1的方法是对最后一层使用正确的激活函数,而这里正确的激活函数是softmax。

image.png

softmax是一种激活函数,它的激活值的和为1,而且每个激活值都大于0,而且所有激活值都小于1,这就是我们想要的,也是我们所需要的。那怎么做到呢?比如说我们现在要预测5种事物中的一种,cat,dog,plane,fish,building,而outpot是我们的神经网络产生的,一组预测值,如果我把这组数变成e的指数会怎么样?这是一个对的方向,因为这会使结果大于0,所以我们有了一组大于0的数。对这些值求和,softmax列就是e(神经网络输出值)除以e(输出值)的求和,得到的softmax值总会小于1。

image.png

所以当我们要给多个类别做单一标记分类的时候,我们通常需要用softmax作为我们的激活函数,以及用交叉熵作为损失函数,因为它们通常都是一起使用,而且用起来也好用,pytorch让我们能够轻松地使用它们。你可能注意到在MNISTl例子里,我从没在里面添加softmax函数。因为如果你要求交叉熵损失的话,softmax实际上已经在损失函数里面了,所以它其实不仅仅是交叉熵损失,它实际上是先做了softmax然后在再算交叉熵损失。所以你可能已经注意到了这一点,有时你的模型预测值会看起来更像这些output列的数值,非常大的数值且有负号,而不是这些大于0小于1,且和为1的数值。原因是pytorch模型里并没有softmax函数,因为我们直接使用了交叉熵损失,所以你可能得自己写softmax函数。fastai已经越来越擅长了解什么时候回发生这类事情。一般情况下,如果我们能识别你用的损失函数,当你做预测时,我们会自动为你添加softmax函数,但如果你使用自定义的损失函数,比如你可能在后台调用了交叉熵损失或者类似的操作,那么你可能会生成像这样output列的预测值。

我们还有3分钟,我还要讲一个问题。下周,我们会在最初10分钟,结束表格数据部分,这个是表格模块里的forward:

image.png

它遍历了一组embedding。每个嵌入矩阵被赋值为e,你可以把它作为一个函数来使用,所以它会将每一个类别变量传给对应的嵌入矩阵,它会将它们连接在一起成为一个矩阵,然后执行一系列层计算,它们基本上都是线性层。然后会做sigmoid函数变换。这里只有两个知识点要学了。一个是dropout(随机失活),另一个是bn_cont,batch norm(批量归一化处理)。这是另外两个的正则化策略(regularization strategies)。Batch Norm做的不只是正则化,还做了其他事情,但主要是用来正则化。做正则化的基本方式是权重衰减、batch norm和dropout。你也可以用数据增强(data augmentation)来避免过拟合。下周课程开始的时候,我们会接触batch norm和dropout。我们也会学数据增强。然后,我们会学习什么是卷积。我们要学习一些新的计算机视觉架构和一些新的计算机视觉应用。但基本上,我们差不多了。你们已经知道了整个collab.py(fastai.collab)是怎么运行的。你们知道了为什么会有它、它是怎样的,也快要知道整个表格数据模型的主要功能。表格数据模型,如果你把它用在Rossmann的数据上,你会得到和我给你看的论文里一样的结果。你会得到第二名的结果。事实上,我们的结果会更好一点。下周,我会演示给你们看我做了哪些额外的实验,并找到了一些提升效果的小技巧。

你可能感兴趣的:(Lesson5 part5 交叉熵、softmax)