2020-02-14摘要

训练集与验证集
模型训练的过程其实就是在求【参数】的过程,我们先假定某类【模型】(比如决策树模型),然后用【训练集】来训练,学习到对应的最优的【参数】。但是问题在于,我们没有办法保证我们假设的那个【模型】是最优的,我们极有可能假设错误对吧。那怎么办呢?有一个简单的解决方案就是我们假设一堆的模型,然后用【训练集】分别对这些模型来进行训练,学习到每一个【模型】中分别对应的参数——这是第一步,也就是【训练集】的任务。
那么我们已经学习到了一堆的模型了,哪一个模型是最好的呢?这其实就是要来考察不同结构的模型在这些data上的优劣程度了。通常来说,我们用【超参数】来控制模型的结构(例如正则项系数、神经网络中隐层的节点个数,k值等)。那这个时候,我们就可以找一些数据来训练和学习我们具体的超参数了。用什么样的数据呢?直接用【训练集】肯定是不行的,因为我们现在的每一个模型都是用【训练集】来学习出来的,他们在【训练集】上的效果已经很好了,继续用它们来训练超参数不会有太大的效果,所以说我们就选择了使用【验证集】来选择这些超参数。这是第二步,也就是【验证集】的任务,我们也通常称之为【调参】。
最后,当我们学习到了【参数】和【非参数】后,我们就确定了我们具体的模型结构,这个时候我们再用一些数据来测试这个模型在新的数据上的效果。因此,我们就不能够使用之前已经使用过的数据了,而要选择一个全新的数据集,这既是【测试集】。这个时候我们就要来看最后的结果怎么样,如果结果很好,那么说明一切顺利,但是如果结果很差,那问题出在哪里呢?其中可能的一个原因就是我们事先假定的那一类的【模型】(比如我们最先选择的决策树模型)并不是适合来分析这些数据,因此哪怕我们选择出了这一堆决策树模型中最好的一个(超参数的选择过程),它的效果依旧不怎么样。

softmax函数
softmax公式的得出方法大概解释可以解释为:
首先假设样本与理论标准函数的误差(类似于线性回归那一章中生成数据时叠加上的高斯误差)服从正态分布(高斯分布),并且不同样本之间独立同分布,
通过贝叶斯公式计算各个分类的概率,将高斯分布的公式带入公式之后化简得到。
在一些地方softmax函数又被称为归一化指数(normalized exponential)

image.png

关于softmax函数选择
看完代码,明显softmax和其他模型最与众不同的特点就是softmax函数了,那么为什么选择softmax函数呢?
softmax函数是来自于sigmoid函数在多分类情况下的推广,他们的相同之处:
1.都具有良好的数据压缩能力是实数域R→[ 0 , 1 ]的映射函数,可以将杂乱无序没有实际含义的数字直接转化为每个分类的可能性概率。
2.都具有非常漂亮的导数形式,便于反向传播计算。
3.它们都是 soft version of max ,都可以将数据的差异明显化。
相同的,他们具有着不同的特点,sigmoid函数可以看成softmax函数的特例,softmax函数也可以看作sigmoid函数的推广。
1.sigmoid函数前提假设是样本服从伯努利 (Bernoulli) 分布的假设,而softmax则是基于多项式分布。首先证明多项分布属于指数分布族,这样就可以使用广义线性模型来拟合这个多项分布,由广义线性模型推导出的目标函数即为Softmax回归的分类模型。
2.sigmoid函数用于分辨每一种情况的可能性,所以用sigmoid函数实现多分类问题的时候,概率并不是归一的,反映的是每个情况的发生概率,因此非互斥的问题使用sigmoid函数可以获得比较漂亮的结果;softmax函数最初的设计思路适用于首先数字识别这样的互斥的多分类问题,因此进行了归一化操作,使得最后预测的结果是唯一的。

为什么选择的激活函数普遍具有梯度消失的特点?
开始的时候我一直好奇为什么选择的激活函数普遍具有梯度消失的特点,这样不就让部分神经元失活使最后结果出问题吗?后来看到一篇文章的描述才发现,正是因为模拟人脑的生物神经网络的方法。在2001年有研究表明生物脑的神经元工作具有稀疏性,这样可以节约尽可能多的能量,据研究,只有大约1%-4%的神经元被激活参与,绝大多数情况下,神经元是处于抑制状态的,因此ReLu函数反而是更加优秀的近似生物激活函数。
所以第一个问题,抑制现象是必须发生的,这样能更好的拟合特征。
那么自然也引申出了第二个问题,为什么sigmoid函数这类函数不行?
1.中间部分梯度值过小(最大只有0.25)因此即使在中间部分也没有办法明显的激活,反而会在多层中失活,表现非常不好。
2.指数运算在计算中过于复杂,不利于运算,反而ReLu函数用最简单的梯度
在第二条解决之后,我们来看看ReLu函数所遇到的问题,
1.在负向部分完全失活,如果选择的超参数不好等情况,可能会出现过多神经元失活,从而整个网络死亡。
2.ReLu函数不是zero-centered,即激活函数输出的总是非负值,而gradient也是非负值,在back propagate情况下总会得到与输入x相同的结果,同正或者同负,因此收敛会显著受到影响,一些要减小的参数和要增加的参数会受到捆绑限制。
这两个问题的解决方法分别是
1.如果出现神经元失活的情况,可以选择调整超参数或者换成Leaky ReLu 但是,没有证据证明任何情况下都是Leaky-ReLu好
2.针对非zero-centered情况,可以选择用minibatch gradient decent 通过batch里面的正负调整,或者使用ELU(Exponential Linear Units)但是同样具有计算量过大的情况,同样没有证据ELU总是优于ReLU。
所以绝大多数情况下建议使用ReLu。

训练误差和泛化误差

在解释上述现象之前,我们需要区分训练误差(training error)和泛化误差(generalization error)。通俗来讲,前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。计算训练误差和泛化误差可以使用之前介绍过的损失函数,例如线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数。

机器学习模型应关注降低泛化误差。

你可能感兴趣的:(2020-02-14摘要)