Are you sure you want to delete this access key?
章节
一开始挑好模型集合之后,接着定义出一个损失函数,那么机器学习就变成优化问题,找出一组参数,使得Loss最小。
在这个例子,我们以PM2.5值预测为例,选的是Linear Regression模型。
我们选的Loss Function是RMSE(Root Mean Square Error)
def BGD(T,lr):
#initialize
w = 0
for i in range(T):
w = w - lr * gradient(w)
return w
参数解释
BGD其实就是原始的梯度下降算法,Learning Rate(lr) 决定了参数更新的速度。e.g.假如你在山顶上,现在你要跑到山谷处,Learning Rate 就相对于你迈出多大步(i.e.Step Size)。
梯度是所有的w微分之后所组成的一个向量
有人会问为什么是w减,而不是w加呢?
斜率若为正,按照直觉知道左边函数值小,那应该往左走,就是w减去一个正数。
斜率若为负,函数值是左大右小,那么应该往右走,就是w加上一个正数。
迭代次数的设定其实没什么好说的。我们来讨论一下Learning Rate。
A. 若lr稍微大点会如何呢?
我们会发现上面四步我们两步就到了,是不是很激动?那我们更大一点会如何呢?
直接烂掉,如果太大,会发生大幅度的偏离 ,如果是实操,输出会是nan
B. 若lr稍微小一点呢?
这里就不画图了。不过是走的时间多一点,更新参数次数多一点。只要不是小碎步,你最终还是可以走到全局最优的。
注意
它走的方向只是在图像上往左还是往右,本质上是横坐标的加减变化,而不是按照斜率去走的。梯度可以想象成你走之前往旁边看一眼,看看是不是更低一点。然后你再决定往左还是往右走。
w没有必要设成零向量,还得看看维度,直接设成0,第一次迭代结束就是一个向量了
不同人的Loss Function的设定可能不一样,因为可以是预测值减去真实值,也可以是真实值减去预测值,因为是均方偏差。你看别人的代码需要注意这一点,因为微分后不同的写法决定梯度是否差一个负号
所优化的函数一定要可微!可微!可微!,那遇到不可微的怎么办呢?
比如说 ReLu,既然在原点处不可微,那就直接不看好了,因为输入很小机率是0
细心的读者会发现图中有一个 Convex ,意思是凸函数。类如f(x) = (x - 2) ^ 2
理想总是很丰满,那是因为你没有经历过社会(数据)的毒打,如果不是 Convex ,会是如何呢?
问题探讨
从上图中不难发现我们卡在Local Minimum了,我们想要到达Global Minimum,有人可能会想,卡住了没关系,我迭代次数多一点,让他慢慢走出来不就行了?细心观察就会明白,小步伐的时候,严格按照Gradient 指引的方向走,左右两边是相反方向。i.e. 你会一直往返直到结束
那么,如何解决这个问题呢?
1.依靠惯性
假如他卡在那个Local的地方了,他如果具有惯性,能够自己滚出来,会不会有机会到达Global?
Momentum
def momentum(T,lr,k):
w = 0
v = 0
for i in range(T):
v = k * v - lr * gradient(w)
w = w + v
return w
当然,这个方法还是比较看人品的,参数k是需要你自己调的。是时候表演真正的技术(人品)了,一般在[0.5,0.9]的范围调,来决定惯性对整个式子的影响程度。
像我一直脸黑,当然不能靠这种。
2.Adagrad
可以将缩写理解为Adaptive Gradient Descent,意思就是lr会随着参数的更新一起对应更新
与BGD相比,这个不一样罢了
里面还加了一个极小的数,防止分母为0,一般取1.0e-7
Press p or to see the previous file or, n or to see the next file
Are you sure you want to delete this access key?
Are you sure you want to delete this access key?
Are you sure you want to delete this access key?
Are you sure you want to delete this access key?