回归应用
概括来说,回归的过程就是向某一函数f(X)输入若干数据X,输出某一标量。回归可用于股票预测、自动驾驶、推荐系统等,如下图所示:
接下来,我们将用大名鼎鼎的宝可梦预测实例梳理回归模型构建的全流程,或者说如何玩转机器学习?
注:我对Pokémon不是很了解,因此,我可能直接用字母代替里面的很多细节,比如特征值的含义。
回归举例:宝可梦预测
实例说明
要求预测宝可梦进化后的CP值。这里我们可以向模型输入不同的特征,包括但不限于
x
s
x_s
xs、
x
h
p
x_{hp}
xhp、
x
w
x_w
xw、
x
h
x_h
xh、
x
c
p
x_{cp}
xcp(进化前的CP值)。
step1.Model(模型选择)
模型中包含许多function,例如
f
1
,
f
2
,
.
.
.
f_1,f_2,...
f1,f2,...。这里我们可以初步设定一个表示输入输出的映射关系:
y
=
b
+
w
⋅
x
c
p
y = b + w · x_{cp}
y=b+w⋅xcp
此时,我们仅仅取
x
c
p
x_{cp}
xcp作为模型的输入特征。
实际上,上述公式就是我们最基本的回归模型——线性回归。个人认为它只是形似一元线性函数,并不是我们所熟知的那个一元函数,又或者说它是一组一元函数,也就是老师课上所讲的a set of function
,所以在使用时不必拘泥于自变量和参数的个数。进一步扩展,显然单一特征
x
c
p
x_{cp}
xcp很难预测进化后的CP值,这样我们可以加入不同的特征集合,并辅以不同的权重比例,构建出一个相对完整的线性回归模型,如下图:
这里的
w
w
w和
b
b
b是可以调整的参数,接下来我们将主要着眼于这两个参数的调整。其实道理很简单,输入特征值x
是数据集给定的,模型输出值y
是因变量,而数据集给定的真实输出值
y
^
\hat{y}
y^也是常量,因此模型可调整的地方就只有
w
w
w和
b
b
b这两个参数了,除非换模型~
step2.goodness of function(模型调优)
模型选定好后,我们如何优化模型以达到准确预测的目标呢?直觉告诉我们要调整
w
w
w和
b
b
b,但是如何调整呢?我们一定要清楚一点,那就是模型输出值
y
y
y和数据集给定的真实输出值
y
^
\hat{y}
y^是截然不同的两个概念。
下图取自宝可梦的训练集的十条数据,注意
y
^
i
\hat{y}^i
y^i是真实数据。
换言之,我们希望模型输出值与数据集给定的真实输出值越接近越好,甚至于一模一样,那么毫无疑问,我们的模型会十分精准的预测未来的进化后cp值(当然,后面会告诉我们,这种情况很可能造成过拟合现象)。因此,我们可以构建一个函数,它可以衡量模型输出值
y
y
y和数据集给定的真实输出值
y
^
\hat{y}
y^的相似程度,这就是loss
函数。
这里我们采用最基本的loss函数——MSE(均方误差)。顾名思义,真实值 - 预测值
的平方求和。初步得到公式(只取一个特征值
x
c
p
x_{cp}
xcp):
L
(
f
)
=
∑
i
=
1
n
(
y
^
i
−
f
(
x
c
p
i
)
)
2
L(f) = \sum_{i=1}^{n}(\hat{y}^i - f(x_{cp}^i))^2
L(f)=i=1∑n(y^i−f(xcpi))2
预测值显然与模型相关联,那么进一步化简:
L
(
w
,
b
)
=
∑
i
=
1
n
(
y
^
i
−
(
b
+
w
⋅
x
c
p
i
)
)
2
L(w,b) = \sum_{i=1}^{n}(\hat{y}^i - (b + w·x_{cp}^i))^2
L(w,b)=i=1∑n(y^i−(b+w⋅xcpi))2
继续以刚才的10条数据举例:
现在我们要找到最佳的
w
w
w和
b
b
b使得loss函数最小(理想状态是0)。下图是loss函数值的分布图:
step3.best function(使用Gradient Descent优化loss函数)
现在得到我们的优化等式:
f
∗
=
a
r
g
min
f
L
(
f
)
w
∗
,
b
∗
=
a
r
g
min
w
,
b
L
(
w
,
b
)
=
a
r
g
min
w
,
b
∑
n
=
1
10
(
y
^
n
−
(
b
+
w
⋅
x
c
p
n
)
)
2
f^* = arg\, \min_{f} L(f) \\ w^*,b^*= arg\, \min_{w,b} L(w,b) = arg\, \min_{w,b} \sum_{n=1}^{10}(\hat{y}^n - (b + w·x_{cp}^n))^2
f∗=argfminL(f)w∗,b∗=argw,bminL(w,b)=argw,bminn=1∑10(y^n−(b+w⋅xcpn))2
此时我们该如何优化它?搬出我们大名鼎鼎的Gradient Descent,又名梯度下降法。关于梯度可以看本人总结的另一篇——机器学习高等数学基础——多元微分总结。这里我们直接阐述优化过程。
Task1:只有一个参数w
此时等式变为:
w
∗
=
a
r
g
min
w
L
(
w
)
w^* = arg\, \min_{w} L(w)
w∗=argwminL(w)
-
随机选取初始点 w 0 w^0 w0
-
计算 d L d w ∣ w = w 0 \frac{\mathrm{d} L}{\mathrm{d} w} |_{w = w^0} dwdL∣w=w0
更新函数点:
w 1 ← w 0 − η d L d w ∣ w = w 0 w^1 \leftarrow \, w^0 - \eta \frac{\mathrm{d} L}{\mathrm{d} w} |_{w = w^0} w1←w0−ηdwdL∣w=w0
-
计算 d L d w ∣ w = w 1 \frac{\mathrm{d} L}{\mathrm{d} w} |_{w = w^1} dwdL∣w=w1
更新函数点:
w 2 ← w 1 − η d L d w ∣ w = w 1 w^2 \leftarrow \, w^1 - \eta \frac{\mathrm{d} L}{\mathrm{d} w} |_{w = w^1} w2←w1−ηdwdL∣w=w1 -
以此类推,迭代。直到找到loss函数最小值处,算法结束。
Task2:有两个参数w和b
- 随机选取初始点 w 0 w^0 w0和 b 0 b^0 b0
- 计算
∂
L
∂
w
∣
w
=
w
0
,
b
=
b
0
\frac{\partial L}{\partial w}|_{w = w^0,b=b^0}
∂w∂L∣w=w0,b=b0和
∂
L
∂
b
∣
w
=
w
0
,
b
=
b
0
\frac{\partial L}{\partial b}|_{w = w^0,b=b^0}
∂b∂L∣w=w0,b=b0
更新函数点:
w 1 ← w 0 − η ∂ L ∂ w ∣ w = w 0 , b = b 0 b 1 ← b 0 − η ∂ L ∂ b ∣ w = w 0 , b = b 0 w^1 \leftarrow \, w^0 - \eta \frac{\partial L}{\partial w}|_{w = w^0,b=b^0} \\ b^1 \leftarrow \, b^0 - \eta \frac{\partial L}{\partial b}|_{w = w^0,b=b^0} w1←w0−η∂w∂L∣w=w0,b=b0b1←b0−η∂b∂L∣w=w0,b=b0 - 以此类推,迭代。直到找到loss函数最小值处,算法结束。
总结
梯度公式:
∇
L
=
[
∂
L
∂
w
∂
L
∂
b
]
\nabla L = \left[ \begin{matrix} \frac{\partial L}{\partial w} \\ \frac{\partial L}{\partial b}\end{matrix} \right]
∇L=[∂w∂L∂b∂L]
优化方向如图所示:
我们要清楚一点的是,使用梯度下降法迭代参数,并不代表loss函数值时刻递减。
此外,使用梯度下降法的loss函数在遇到鞍点或平稳变化的点时,下降速度会明显变慢。
results(分析结果)
现在我们得到了best function(实际是良好的参数w和b),我们再通过模型输出得到的预测值数据集中的真实值做对比,如图所示:
依然有误差存在,我们可以算出这组数据的平均误差。
其实无论这个误差的大小,无论我们用何种方法试图降低该误差,我们都应该清楚,这是我们在训练集training data上得到的误差。而我们更关心的是该模型在新数据上的表现,也就是testing data。这就要求我们的模型要具有泛化能力——generalization。
现在将testing data输入到我们的模型中来,我们发现得到的平均误差大于训练集获得的平均误差。
那么我们如何优化模型呢?
优化模型
model selection
观察图像中分布点的情况,看起来它更像是一个二次函数的分布情况。
所以我们不妨将原模型变成二次函数。当然,我们可以变成三元等多元函数,这个要基于训练结果而定。
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
得到在训练集和测试集的结果如图所示:
我们观察到效果有了明显的提升,那么是否意味着维度越高,我们的模型效果就越好。为了验证这一点,我们继续加维度。
- 三元
- 四元
- 五元
当加到五元时,意外发生了,模型没有按照我们设想的那样在testing data上越变越好,而是出现了断崖式下降,这是我们最不想看到的。下图将training data上的平均误差做了一个总结:
总结:如果我们过于追求在训练集上的效果,那么就有可能造成过拟合(overfitting)。这意味着我们要选择合适的模型,而不是一味追求复杂模型。通过对比,我们发现三元函数的model较为合适,如图:
collect more data(collect more feature)
现在观察原cp–进化后cp的图像,我们发现点的分布有聚集的现象,简而言之,我们是否可以把图像的点分组?
接下来我们换一种思路。截止到目前的实验,我们只考虑了进化前的cp值,也就是
x
c
p
i
x_{cp}^i
xcpi。那么是否存在一些我们之前忽略的隐藏因素?比如,物种!现在让我们回到step one,重新设计model。
back to step1:redesign the model
设物种为
x
s
x_s
xs,在依旧采用线性回归模型的前提下,产生如下表达式:
进一步合并:
y
=
b
1
⋅
δ
(
x
s
=
?
)
+
w
1
⋅
δ
(
x
s
=
?
)
x
c
p
+
b
2
⋅
δ
(
x
s
=
?
)
+
w
2
⋅
δ
(
x
s
=
?
)
x
c
p
+
.
.
.
+
.
.
.
y = b_1 ·\delta(x_s = \ ?) + w_1 · \delta(x_s = \ ?)x_{cp} \\ +b_2 ·\delta(x_s = \ ?) + w_2 · \delta(x_s = \ ?)x_{cp} \\ +... \\ +...
y=b1⋅δ(xs= ?)+w1⋅δ(xs= ?)xcp+b2⋅δ(xs= ?)+w2⋅δ(xs= ?)xcp+...+...
其中,
δ
(
x
s
=
?
)
=
{
1
,
i
f
x
s
=
?
0
,
o
t
h
e
r
w
i
s
e
\delta(x_s = \ ?) = \begin{cases} 1,if \ x_s = \ ?\\ 0,otherwise \end{cases}
δ(xs= ?)={1,if xs= ?0,otherwise
也就是说,现在的模型类似与选择函数,当出现哪个物种时,就选定哪一组w和b。举例说明,如图:
实验结果如图,效果有了明显的提升:
other hidden factor?
这是很自然的想法,模型可能存在其他隐藏因素。比如,我们一开始的这张写满了宝可梦特征的卡片:
观察下图,我们发现单一特征产生的进化后cp值都存在坐标点扎堆出现的情况,那么可以推测这些特征也与隐藏因素物种有关。因此,我们可以融合一下~
现在让我们再次回到step one,重新设计model。先规定模型变为二元函数,之后将物种选择函数设为 y ′ y^{\prime} y′,作为一个项加入到模型中,最后对所有特征进行求和。详细步骤如图:
观察结果,我们发现出现过拟合现象!
back to step2:regularization(正则化)
现在开始着眼于loss函数的修改,当然我们可以把MSE误差函数换成时下流行的交叉熵loss函数,不过这并不是我们今天讨论的重点。回到一开始的step2.goodness of function
,loss函数的本意是帮助我们选择best的w和b,进而选择比较好的function。现在,我们可以在loss函数中加一点料,便于我们能更高效地找到best answer!
原模型和原loss function如下图:
我们发现原来的loss函数只考虑了预测值的error,也就是真实值 - 预测值
的平方。那么regularization就是加上一项额外的项,即
λ
∑
(
w
i
)
2
\lambda \sum (w_i)^2
λ∑(wi)2,其中
λ
\lambda
λ是我们需要tuning的参数,公式如下图。由于loss函数越小越好,因此,当我们加上了这一项,就意味着我们要找到的best function的
w
i
w_i
wi越小越好。为什么说
w
i
w_i
wi越小,function越好呢?
因为参数
w
i
w_i
wi越小,function越平滑(smooth)!什么是平滑?函数平滑意味着当输入有变化时,输出不敏感。假设模型如上图,现在输入有变化,比如某一个
x
i
x_i
xi加上
Δ
x
i
\Delta x_i
Δxi,此时输出变化为
y
i
y_i
yi加上
w
i
Δ
x
i
w_i\Delta x_i
wiΔxi。显然,如果
w
i
w_i
wi越接近0,输出的变化就越小。
那么为什么我们喜欢平滑的function?因为noisy input!如果在测试时,有噪音干扰了输入的
x
i
x_i
xi,那么一个平滑的函数能够降低影响。调整
λ
\lambda
λ,实验结果如图。loss现在有两项,一项考虑error,一项考虑smooth。当
λ
\lambda
λ越大,代表考虑smooth的正则化项的影响力越大,即找到的function越平滑。
我们发现当
λ
\lambda
λ越大时候,训练集的error越大。这是正常的,因为
λ
\lambda
λ越大,我们倾向于考虑w本来的值,而减少考虑error。但很有趣的一点,
λ
\lambda
λ越大,测试集上的error可能越小。这个结果合理,我们喜欢平滑的function,但不喜欢像水平线一样平滑的function。那么如何找到这个smooth?调整
λ
\lambda
λ!
正则化项为什么不考虑b
如题,为什么不考虑bias(b):
调整b的大小并不影响function的平滑程度,这就是很easy的初等数学,我们画一个一元函数图像
y
=
k
x
+
b
y = kx + b
y=kx+b就容易发现b的大小只能影响function上下平移位置,跟functoin的平滑程度并没有关系。