李宏毅机器学习-----Regression
Regression 的一些应用:
-
预测股票市场走向
找到一个function,input = 过去十年的股票资料,output = 可以预测明天股票指数 -
自动驾驶
找到一个function,Input = 无人车感测周围物体和人,output=方向盘的角度 -
推荐系统
找到一个function,Input=使用者A看某个商品B ,output= A买B的可能性
宝可梦的战斗力值预测
简单介绍一下,我们希望预测到宝可梦的CP值,这样就可以知道这只宝可梦是否值得去进化,如果不值得,就拿去”喂“了吧,哈哈哈!我们会创建一个function,这只宝可梦的属性是输入,进化后的CP值是输出, X c p X_{cp} Xcp代表这只宝可梦的进化前的CP值, X s X_{s} Xs代表种类,例如这只妙蛙种子, X w X_{w} Xw代表重量, X h X_{h} Xh代表身高。这里我们使用下标来表示component
Step 1:建立模型
第一步就是建立model,我们要选择合理的model,因为宝可梦进化是提升战斗力的,所以显然f3就不是一个合理的model function。选择好一个function后,我们输入一些属性值
x
i
x_{i}
xi,因为不同的属性可能对个体的影响不一样,所以每个属性值带有权重
w
i
w_{i}
wi,bias是一个偏差值。这是一个线性的模型。
Step2:函数的评估标准
有了function set之后,我们要判断哪个function才是最适合拿去预测,即选择最优的function。我们这里使用上标表示一个object,如
y
^
1
\widehat{y}^ {1}
y
1。这里的output是个标量,所以我们使用widehat,即
y
^
\widehat{y}
y
,如果涉及到structured learning,那么output的object可能会是structure,所以要表示清楚。
这里有10个真实的数据,每个点代表其宝可梦的CP值和进化后的CP值。有了这些training data后,我们可以判断一个function的好坏。在这里我们需要定义一个loss function(损失函数),它的input是我们的model function,output是一个数值,告诉我们这个model function有多不好。
loss function可以很复杂,这里我们用比较直观的loss function,就是用真实值
y
^
\widehat{y}
y
减去预测的数值,再取平方,这个就是估测的误差,把所有object的误差都加起来,就得到这个loss function的结果
下图使用等高线图表示哪些function表现得更好,颜色代表好坏的程度,红色说明很糟糕(误差大),深蓝色是最优的(误差小)。
Step3:最优函数
我们要从这个function set中挑选最好的函数出来,找一个function让L(f)最小,那就是最优函数,同理,就是找出w和b可以使得loss function计算出来的值最小,那就是最优的w和b值。
符号arg min解释:代表求当后面这个函数达到最小值时,w和b的取值
求最优解问题有两个思路:一个是解析解,一个是使用梯度下降,这里李宏毅老师介绍了梯度下降法。其实是使用了微分的数学原理。
微分是指函数图像在某一点处的切线在横坐标取得增量Δx以后,纵坐标取得的增量,一般表示为dy。
导数是函数图像在某一点处的斜率,也就是纵坐标增量(Δy)和横坐标增量(Δx)在Δx–>0时的比值。
导数和微分的区别是,导数的结果是比值,微分是纵坐标的增量。
梯度下降法
首先随机选取一个·初始点
w
0
w_{0}
w0,计算
w
0
w_{0}
w0对Loss function的微分,如果求出来是负的,线就是左边高右边低,因为我们要找loss比较低的function,所以要增大w值;如果是正的,线就是左边低右边高,显然就是减小w。
而w的变化取决于两个条件,第一个是现在的微分值有多大,如果微分值越大,即线越陡峭,移动距离就越大;第二个是事先定好的learning rate的值,如果
η
\eta
η数值越大,学习速率就会很快
为什么是用
w
0
w_{0}
w0减去
η
\eta
η乘以w对L的微分,因为w算出来是正的,就要减少它,如果是负的就要增加它。重复这个步骤,直到最低值。Local optimal 局部的最优点,还有个global optimal全局最优,但是对于线性回归来说,不存在这个问题 ,因为它只有一个最高点。
如果不止一个参数呢?推广到多个参数,其中
∇
L
\nabla L
∇L指代的是梯度函数。下图只是分别对w和b进行偏微分。下图有个错误,就是最后两条公式,应该是w=w1,b=b1
上图是这个过程的可视化,颜色代表Loss function的数值,第一个红色点是随机抽取的值,接下来就是计算在红色点的w和b对L的偏微分,其实就是找等高线的法线方向。
Gradient decent 的缺点:如上图,随机取值会影响去哪个高峰,导数为0,无法继续迭代,停留在当前点。但是在线性回归中,损失函数凸函数,是凸面的(convex),不存在局部最优点。
线性回归对应的偏导数,如下图:
当我们训练出来了model出来以后,其实最关心的是它是否真的这么优秀?所以我们要看看它在测试集中的表现。
我们已经计算出来,在训练集中,平均误差是31.9,而在测试集中平均误差是35。表现不是特别的好,所以我们希望找到更好的函数,使得误差更小。根据泰勒公式,任何形式的函数都可以近似表示为若干个多项式函数之和。而我们现在使用的是线性函数,尝试使用多项式函数降低数据误差。
多次函数的表现与比较:
二次函数:
三次函数:
四次函数:
五次函数:
从上面这5幅图中,我们可以看到当model在训练集中表现得越来越好,由折线图我们可以看出,在训练集上平均误差是一直在减小的,所以当model越复杂,包含越多的function,理论上就可以找出一个function在训练集上的error rate越来越低。
但是在测试集上,结果是不一样的,到了第四个函数的时候,error就暴增,
越复杂的model在训练集中表现得越好,但是并不一定在测试集表现得好,这就是Overfitting。
多个特征
前面我们都只是考虑pokemon进化前得CP值,可是实际上还有很多特征影响着预测结果,现在我们添加第二个特征,pokemon的种类。
我们需要重新设计function set,不同的物种运行不同的linear function
这里我们使用开关函数,将他们串联在一起,起到if的作用。若种类对应则δ
δ
\delta
δ为1反之为0。这样波波鸟就得到
y
=
b
1
+
w
1
⋅
x
c
p
y=b_{1}+w_{1}⋅x_{cp}
y=b1+w1⋅xcp
然后,我们现在看一下它们在训练集和测试集中的平均误差,下图可看,都表现得挺好的。
会不会有更多的参数我们可以考虑呢?
我们尝试考虑全部特征进去,下图是老师设计的一个非常复杂的model,可以看到,又一次overfitting了。我们不知道哪个feature才是真实有用,所以无法在feature上优化,但是我们可以从其他方面入手,就是Regularization正则化,重新设计loss function。
正则化
之前我们计算loss function只考虑了真实结果减去预测结果的error,正则化就是加上一个额外的正则化项,正则化项是不会包含偏置项(指的是前面的b),因为偏置项不会改变曲线的平滑程度。
加上这个正则化项之后,参数值w比较接近零的function是比较平滑的,平滑指的是当有新的input值,output对其不太敏感。为什么会平滑呢?
假设 y = b + ∑ w i x i y = b + \sum w _ { i } x _ { i } y=b+∑wixi是model,然后input有变化,加上 Δ x i \Delta x _ { i } Δxi,那么output的变化就是 w i Δ x i w _ { i }\Delta x _ { i } wiΔxi,如果 w i w _ { i } wi越接近零,那么output的改变就越小
正则化公式中的λ取值越大,会使得smooth的影响力越大。这是由于λ 的值越大,在尽量使损失函数变小的前提下,就会使得w越小,w越小就会使得函数越平滑。
λ本质上表示的是惩罚项,惩罚项过大可能就会影响学习的效果,因为惩罚项过大,就会导致参数空间变的比较小,最终结果没什么变化。
一个平滑的函数对noise不那么敏感,但是太平滑也不行,会在test set得到糟糕的结果。
对正则化的一点详解:
正则化的意义: 在规则化参数的同时最小化误差,最小化误差是为了让我们的模型拟合我们的训练数据,而规则化参数是防止模型过拟合我们的训练数据。
我在理解正则化的时候,一直在思考 λ \lambda λ是如何改变w的值,因为增大了 λ \lambda λ就可以减少w。为什么呢?其实我们可以先举个例子。
假设λ无限大,那么正则化后的损失函数可近似认为只有正则项,那最小化损失函数时,就是让w变小,趋近于零,而w越小,模型越平滑
添加正则项后,应用梯度下降算法迭代优化计算时,如果参数 θ \theta θ比较大,则此时的正则项数值也比较大,那么在下一次更新参数时,参数削减的也比较大。可以使拟合结果看起来更平滑,不至于过拟合。
下面是对惩罚因子
λ
\lambda
λ的介绍:
线性回归介绍:
我现在理解得还不算透彻,如果有新的想法,会在这里更新一下。
拓展阅读:线性回归的正则化
正则化的理解(这个解释的不错,如果不理解什么是正则化,可以看看)