李宏毅机器学习Task02
本次任务重点关注机器学习在回归问题中的应用,李老师很接地气的采用预测宝可梦CP值的例子,讲课生动的同时让我上手体验了机器学习的一般步骤。
回归
在统计学中,我们其实已经接触过回归的概念,回归的任务就是找到一个能够针对输入,准确预测出输出值的函数。
回归举例
问题描述
在PokemenGo这款游戏中,有很多不同的宝可梦,我们可以收集材料进化宝可梦,CP值作为衡量宝可梦能力的重要指标也会随着进化而提高,本次的任务就是预测进化之后的宝可梦的CP值。当输入只有一个参数时为一元输入问题,当输入参数变多时为多元输入问题。
- 一元输入:宝可梦进化前CP值。
- 多元输入:宝可梦进化前CP值、物种、血量、重量、高度。
- 输出:宝可梦进化后CP值。
解决问题
按照机器学习解决问题的三个步骤依次解决这一问题:
步骤1.模型假设-线性模型
根据已有数据我们能够看出可以用线性模型来描述:
y
=
f
(
x
i
)
=
b
+
∑
i
w
i
x
i
y=f(x_i)=b+\sum_{i}^{}{w_ix_i}
y=f(xi)=b+i∑wixi
- x i x_i xi:输入的特征
- w i w_i wi:各个特征对应的权重
- b i b_i bi:偏差
- y i y_i yi:最终的预测值
步骤2.模型评估-损失函数
有了这些真实的数据,那我们怎么衡量模型的好坏呢?采用的方法很熟悉,用简单的真实值与模型预测值之差然后平方(消除符号影响)衡量模型的好坏。损失函数L定义如下:
L
(
f
)
=
∑
n
(
y
^
n
−
y
n
)
2
L(f)=\sum_{n}^{}(\widehat{y}^n-y^n)^2
L(f)=n∑(y
n−yn)2
在一元情况下,我们将模型代入,最终的损失函数定义为:
L
(
f
)
=
∑
n
(
y
^
n
−
(
b
+
w
x
c
p
n
)
)
2
L(f)=\sum_{n}^{}(\widehat{y}^n-(b+wx_{cp}^{n}))^2
L(f)=n∑(y
n−(b+wxcpn))2
y ^ \widehat{y} y :已有的宝可梦CP值
步骤3.最佳模型-梯度下降法
模型有了,模型的评估方法有了,我们的任务就是找到损失函数值最小的模型,方法就是梯度下降法。
梯度概念复习
在高等数学以及多门专业课中,我接触过梯度的概念。
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(梯度的方向)变化最快,变化率最大(为该梯度的模)。
g r a d f ( x , y ) = ∇ f ( x , y ) = ∂ f ∂ x i ⃗ + ∂ f ∂ y j ⃗ gradf(x,y)=\nabla f(x,y)=\frac{\partial f}{\partial x}\vec{i}+\frac{\partial f}{\partial y}\vec{j} gradf(x,y)=∇f(x,y)=∂x∂fi+∂y∂fj
梯度下降法解决本问题
梯度下降法的实质就是找出变化最快的方向,问题就是先为w,b随意取一个值,然后通过误差函数的偏微分(梯度)来更新w,b值,这里引入学习率
η
\eta
η的概念,通过不断的迭代,更新w与b的值。
w
1
=
w
0
−
η
∂
L
∂
w
w^1=w^0-\eta\frac{\partial L}{\partial w}
w1=w0−η∂w∂L
b 1 = b 0 − η ∂ L ∂ b b^1=b^0-\eta\frac{\partial L}{\partial b} b1=b0−η∂b∂L
试着运行P4中的代码,尝试调整了一下 η \eta η与迭代步数,发现在较小的 η \eta η可以通过增多迭代步数(笔者为原来10倍)的方式来找到最佳值(图中已做标记)
适当提高 η \eta η值时可以有益于学习,但是当 η \eta η值太大会导致找不到正确结果
猜测这里是lr值太大,乘上偏导导致数据变化速度太快,以致越过了需要拐弯的点,这里告诉我们,如果 η \eta η的值取大了,会导致学习失败,不能一个包子一口搞定,得慢慢来。
梯度下降法的问题
- 问题1:当前最优 一个函数有可能不止一个极值点。
- 问题2:梯度为0 偏导等于0,无法更新。
- 问题3:梯度趋近于0 偏导趋近0,数值更新不动。
在线性模型里面都是一个碗的形状(山谷形状),梯度下降基本上都能找到最优点,但是再其他更复杂的模型里面,就会遇到问题2和问题3了。
结果检验
我们找到了自己认为的最佳 w ∗ w^* w∗与 b ∗ b^* b∗,那么他们的实际效果如何?
我们使用平均误差来验证模型的好坏定义如下
e
=
∑
n
(
y
^
n
−
(
b
∗
+
w
∗
x
c
p
n
)
/
n
e=\sum_{n}^{}(\widehat{y}^n-(b^*+w^*x_{cp}^{n})/n
e=n∑(y
n−(b∗+w∗xcpn)/n
显然,e的值越小,预测的效果越好,按照上述步骤算下来,运用10个数据,最终的平均误差为35。
方法优化
步骤一优化:采用1元n次线性模型
采用二次模型:
y
=
b
+
w
1
x
c
p
+
w
2
x
c
p
2
y=b+w_1x_{cp}+w_2x_{cp}^2
y=b+w1xcp+w2xcp2
最后的平均误差为18.4,效果略好。
- 过拟合问题出现
接着提高模型采用的次数,我们能够发现,并不是次数越高,误差值越小,也许会随着次数的升高,误差值变大,这种现象称为过拟合现象。
步骤一优化:模型改进,引入分类
通过将不同种类宝可梦分组,来改进模型,可以发现,最后的误差减小很多
具体的实施方法就是加入一个信号处理上的阶跃函数。
步骤一优化:引入更多参数
将血量、重量、高度也加入到模型中考虑,变成了一个多元线性模型。
不过最后的误差结果显示引入更多参数之后,误差竟然增大,说明也许这些参数并不需要考虑。
步骤三优化:加入正则化
将最终的损失函数改为
L
(
f
)
=
∑
n
(
y
^
n
−
(
b
+
w
x
c
p
n
)
)
2
+
∑
λ
(
w
i
)
2
L(f)=\sum_{n}^{}(\widehat{y}^n-(b+wx_{cp}^{n}))^2+\sum\lambda(w_i)^2
L(f)=n∑(y
n−(b+wxcpn))2+∑λ(wi)2
-
w 越小,越平滑, 输出值与输入值相差不大。
-
很多应用场景中,并不是 w 越小模型越平滑越好,但是经验值告诉我们 w 越小大部分情况下都是好的。
-
b 的值接近于0 ,对曲线平滑是没有影响。
回归的其它应用
回归的实际应用有很多,除去课上的自动驾驶,股市预测等,还有:
-
钢材需求量预测
- 输入:往年原油产量、生铁产量、原煤产量、发电量。
- 输出:今年钢材的需求量。
-
公司的销售额预测
- 输入:往年销售额,促销活动情况。
- 输出:今年销售额。
回归的其它应用
回归的实际应用有很多,除去课上的自动驾驶,股市预测等,还有:
-
钢材需求量预测
- 输入:往年原油产量、生铁产量、原煤产量、发电量。
- 输出:今年钢材的需求量。
-
公司的销售额预测
- 输入:往年销售额,促销活动情况。
- 输出:今年销售额。
我个人觉得回归是一种很依赖数据的模型,如果说数据本身就没什么规律,回归的应用可能也就比较有限。