如何优雅的拟合非线性曲线( 二 )


非线性导致深度学习在处理深层次的信息上,性能非常优异,在图像识别、图文理解这些领域,都得到了超越人类的特性;我们现在看到的各种商品、图文、短视频,最终也是靠深度学习,计算出这些单品的向量,再和我们自身的兴趣向量做运算,影响了搜索、推荐时的排序 。
(深度学习..jpg)
小洛这次仅仅只要拟合这个非线性函数,但如果下次是其他曲线的函数的话,就又要经过其他的手工的表达式变化与复杂的构造,这样不行!
在这里,我们可以使用深度学习里的优化原理,找到一个针对非线性模型拟合的通用解决方法,这里使用torch进行优化 。
首先我们对函数进行少量的改动,其中包含了我们前面说的平移、缩放的内容,因此带来了4个参数:
所有深度学习优化的原理都是一样,其中核心规则很简单:
1、对计算进行求(偏)导
例如y=a+bx 我们要知道每个参数对于最终输入的y产生了多大的作用,就是求参数a对于y的偏导(理解为此处的a的变化,会带来多大的y的变化)
2.使用链式法则进行导数的传递

如何优雅的拟合非线性曲线

文章插图
例如复合函数:
是复合函数:
的传递,链式法则告诉我们,这样的复合函数求导遵循规则:
参数a对于y的导数,等于复合函数g对y的导数乘以 a对函数g的导数;以此类推,嵌套的复合函数就这样依次传递下来即可;
3.知道真值和预测值的差异
(小洛此处定义为mse),我们平常意义上也即定义为损失 。可以由此计算各个参数的导数,那么参数们沿着最小化损失的方向迈进,就可以让损失降低 。这在深度学习里通过优化器的方式来进行 。
这几个规则组合到一起,也就是传说中的SGD梯度下降法:
【如何优雅的拟合非线性曲线】当然实际的算法中使用的是改进的一个优化器Adam,我们加一点点细节,写出如下代码(其中用来优化函数参数的代码甚至也就10行):
输出效果非常美好,完美回答了小洛的问题:
四、为什么效果还差一点?
虽然目前已经完美的回答了小洛的拟合问题 。但实际使用上,可能大家还是会遇到一些不完美的情况 。一种情况是前置没有设计好需要拟合的函数,导致函数的作用域和定义域出现问题,与实际的数据不匹配;另一种则是代码中涉及的超参了;
这里有几个比较魔法的数字,我们来讲一下这些魔法的原理:
1、为什么有个参数
因为x和y的范围都很小,尤其是y,在0.01范围内,这个范围假如一个函数的预测始终输出0.012,最后的mse一平方,会直接落到1e-7范围以内,这个数字太小了,以至于低于了许多计算中eps的范畴(一个例子是为了避免除以0,除法会成为1/(x+eps)),这会导致函数难以进行有效的优化 。
2、 rate为什么是0.002
这个叫做学习率的参数,在实际的应用场景中也需要在一定的范围内进行调整 。前面我们说到,这个是优化器根据参数的梯度,往前前进的步长,因此这个步长跟实际的非线性函数的特点相关;举个例子:我们知道x^2函数的导数是x,所以在x=2处导数是2,步长决定了我要往最小化损失的地方迈多远,比如此时如果学习率是2,下一次我会迈往x=2-2*2=-2 的位置,这样就很难迈向函数的最小值部分了 。
3、起到一个什么作用?为什么是0.8
一般来说,优化到了后面,需要一个更保守的步长,这个可以通过观察loss的下降情况来进行调整 。
比如小洛遇到的另一个案例问题:(和上面的案例不同,这次是要拟合log函数曲线)