😁大家好,我是CuddleSabe,目前大四在读,深圳准入职算法工程师,研究主要方向为多模态(VQA、ImageCaptioning等),欢迎各位佬来讨论!
🍭我最近在有序地计划整理CV入门实战系列及NLP入门实战系列。在这两个专栏中,我将会带领大家一步步进行经典网络算法的实现,欢迎各位读者(da lao)订阅🍀
给定点集points(x,y),假定我们要求的回归方程为形如f(x) = w*x+b的一元一次方程形式,那么在w及b确定的情况下每一个x会对应一个估计值f(x),线性回归即为求出最合适的w和b,使得可以根据求出来的回归方程预测函数走势。
先捋一下思路:
假设一个变量为LOSS(损失的意思),LOSS=f(x)-y=w*x+b-y 。那么LOSS的含义便是在你求出来的回归方程下与真实方程的区别。LOSS越小,则回归方程越接近真实方程。
思路分为大体两步:
1.求出每一对w,b下的LOSS的值
2.求出来LOSS值最小的w0,b0
此时的w0,b0便是回归方程的最合适的w,b
我们现在已经知道如何在已知w和b的情况下求出来LOSS,故第一步已经解决,接下来便是如何求出来什么时候LOSS最小。
这时候不得不介绍梯度的概念,梯度意为指向函数升高的方向。
如果我们取反梯度,那么便可找到最小值。
如下图
图中这些红色的点的梯度指向旁边下降的方向
那么如果利用梯度来找到最小值呢?
假如上图是y关于x的函数
那么我们知道,如果f '(x)<0,就让x向右,如果f '(x)>0,就让x向左
这样便能找到y=f(x)的最小值
同理,如果我们要找到LOSS关于w,b的最小值
那么就分别对w和对b求导
导数分别为∂LOSS/∂w和∂LOSS/∂b
其中∂LOSS/∂w = ∑2(wxi+b-yi)xi
∂LOSS/∂b = ∑2(wxi+b-yi)
并使w和b进行如下运算便可使w和b向LOSS最小的方向移动
w’ = w - (∂LOSS/∂w)
b’ = b - (∂LOSS/∂b)
但此时还有一个问题,那便是w和b再进行如上运算时有可能变化范围会很大,那样的话很有可能会使得方程很不准确。
以此,我们便将方程变化为如下格式:
w’ = w - lr * (∂LOSS/∂w)
b’ = b - lr * (∂LOSS/∂b)
其中lr的含义为**(learn rate)学习比例**,一般初始设为0.001或者0.005,之后自己调试看怎么样将LOSS下降到满意的数值为止。
代码如下:
最后输出结果为
其中第一次输出为假设w和b都为0的初始的LOSS值为5565
第二次输出为回归之后的w为0.7037和b为37的LOSS的大小
此时LOSS已经由5565下降到147左右,偏差值缩小了40倍!