1. Linear Model
设计一个线性的Model来完成宝可梦的进化后的cp值的预测。
- 这里的xcp代表一个对象的部分,如果是x上标则代表一整个对象。
选择了xcp这一个属性作为所有的输入。那么总体的线性模型如下所示,但我们仅仅使用了xcp这一个特征。
2. Goodness of Function
如何来评价一个函式的好坏呢,通过构建Loss function 的方式可以达到这一目的。我们将数据和已知标签做散点图的表示,估计大概的数据分布。
设计的Loss function 的作用便是输入一个function 输出这个函式有多不好的值。这里将10个样本值的估计值和准确值做差值,而后对所有的error求和。写成Loss function: L(w, b)
3. Best Function
对定义的Loss function,现在需要考虑的问题是如何找到一组参数使得Loss值最小。当Loss越小那我们可以认为我们找到了最优的函式。Gradient Descent的方法是完成这一部分功能的常用手段,当然它不仅仅可以应用于我们此处的Loss function。公式如下图所示
公式说明了对w这一参数进行梯度计算,这里由于是单个参数于是就是单值求导。为了完成参数的update,还需将导数乘于一个学习率(learning rate)。
但是在做gradient descent的过程中,我们需要面对一个问题,上图可以明显的看出使用梯度下降会陷入Local minima,而不是真正的全局最小值。
两个参数的情况如下图所示,在我们上面定义的Loss Function式一个凸面函数,所以最后一定会到达最小值。每一次update的值并不能使得Loss 始终做单调的减少
总结一下,使用Gradient Descent会出现如下的问题:
- 一个式在十分缓的坡度中停下
- 在鞍点会停下
- 会陷入局部最小值
4. 结果分析和讨论
对估计值和准确值做平均误差的计算,来评估函数的数据描述能力。现在发现结果似乎并不如人意,那我们该如何去使得结果变得更好呢?
考虑几种方式:
(1)选择其他模型
或许我们的线性模型太过简单了,那么我们重新选择model。一次选择二次、三次或者更高次。
由上图的折线图可以看到,我们的方式似乎得到了效果,在Train data中 Error在逐渐的下降。越复杂的模型对数据有更加强的描述能力,同时复杂模型对简单模型式包含关系。但是如果仅仅追求在Training data 上的表现并没有什么实际的意义。我们更看重在testing data 的结果。
从上图可以看到,在4,5次的模型下已经出现了Overfitting。现在我们大概说一线原因,的确高阶的函数往往包含低阶的函数模型,但是你如何能确定在做梯度下降的时候能够找到那个全局的最优点呢?往往不能。
(2)添加更多的Features(复杂化model)
(还可以从哪个角度去出改善我们的结果,我们会想到说,可能影响进化后的cp值不仅仅只有进化前的cp值这一个影响因素。我们可以加入各种其他的features。下图的结果烂掉了。
(2)规则化(Regularization)
回到设计Loss function 的步骤,我们考虑一个问题,最后选出来的函式,我们更倾向它有什么特点?我想大家都会更加希望这个函式能更加的平滑。问什么这么说,平滑和函式对数据的噪声往往有更好的抵制作用。更加平滑的函式,往往说明函式的参数更加贴近0。现在我们通过在原有的Loss function添加一个规则化项。如下图所示。
这里的增加项是如何起作用的呢?当增加λ会使得loss function 的评价更加偏重于参数本身,也就是说会使得越贴近0的参数,越有优势。同时需要注意的是,这里并不需要bias的加入,因为对于函式的形状而言bias不起任何作用。但可以预见的是过分平滑的函式也是不符合期望的,结果如下图