【Datawhale X 李宏毅苹果书 AI夏令营】[深度学习 入门] Task2 《深度学习详解》- 1.2 线性模型
内容来自李宏毅老师的机器学习/深度学习:
github:李宏毅深度学习教程LeeDL-Tutorial(苹果书)
bilibili课程视频:李宏毅《机器学习/深度学习》2021课程(P3)
Datawhale:Datawhale AI 夏令营(第五期)
1.2 线性模型
先前,我们已经通过2017-2020年的播放数据得到一个误差
L
=
480
L = 480
L=480 的模型,即平均每天有480人次播放量的误差。接下来,我们用2021年的数据对该模型进行回测,结果发现
L
=
580
L = 580
L=580,模型表现并没有那么好,预测的数据有强烈的滞后性。
通过观察真实数据,我们不难发现一个现象:播放量似乎有周期性,7天一个周期,每周五周六的新增播放量尤其少。那么,我们可以试着修改模型,让它的预测值与前7天的值相关,而非只与前1天的相关,或许就能达到更加准确的预测效果。通常一个模型的修改,往往来自于对这个问题的理解,即领域知识,以上便是领域知识的一个例子。
于是,我们修改模型,让它考虑前7天的播放数据 (也可以让它考虑前更多天):
y
=
b
+
∑
j
=
1
7
w
j
x
j
y = b + \sum_{j=1}^7 w_j x_j
y=b+j=1∑7wjxj通过梯度下降得到参数的最优值,并回测:
参数: | b b b | w 1 ∗ w_1^* w1∗ | w 2 ∗ w_2^* w2∗ | w 3 ∗ w_3^* w3∗ | w 4 ∗ w_4^* w4∗ | w 5 ∗ w_5^* w5∗ | w 6 ∗ w_6^* w6∗ | w 7 ∗ w_7^* w7∗ |
---|---|---|---|---|---|---|---|---|
最优值: | 50 50 50 | 0.79 0.79 0.79 | − 0.31 -0.31 −0.31 | 0.12 0.12 0.12 | − 0.01 -0.01 −0.01 | − 0.10 -0.10 −0.10 | − 0.30 -0.30 −0.30 | 0.18 0.18 0.18 |
模型 | 2017-2020训练数据上的损失 | 2021回测数据上的损失 |
---|---|---|
y = b + w x 1 y = b + w x_1 y=b+wx1 | 480 480 480 | 580 580 580 |
y = b + ∑ j = 1 7 w j x j y = b + \sum_{j=1}^7 w_j x_j y=b+∑j=17wjxj | 380 380 380 | 490 490 490 |
y = b + ∑ j = 1 2 8 w j x j y = b + \sum_{j=1}^28 w_j x_j y=b+∑j=128wjxj | 330 330 330 | 460 460 460 |
y = b + ∑ j = 1 5 6 w j x j y = b + \sum_{j=1}^56 w_j x_j y=b+∑j=156wjxj | 320 320 320 | 460 460 460 |
可见,改进后的模型效果更好了。对于7天模型,机器的逻辑是,前1天跟要预测的那天数值关系很大,故
w
1
∗
=
0.79
w_1^* = 0.79
w1∗=0.79,而之前的第2, 4, 5天则与预测值呈反比,故
w
2
,
w
4
,
w
5
w_2, w_4, w_5
w2,w4,w5 的最优值为负。
相比7天模型,28天、56天模型通过考虑更多历史数据达到了更低的损失。这样的模型成为线性模型 linear model。然而,进一步增加天数已经无法再降低损失了。接下来,我们将学习如何将线性模型做得更好。
1.2.1 分段线性曲线
上述线性模型或许过于简单,
x
,
y
x, y
x,y 之间的关系或许比单纯一条直线的线性关系更加复杂,比如,或许
y
y
y 在
x
x
x 上先递增、再递减?但无论如何改变
w
,
b
w, b
w,b,线性模型还是只能给出一条直线,如图1.7,假设这样一条红线表示了
x
,
y
x, y
x,y 之间的关系,我们无法用蓝线 (线性模型) 来合成红线。
因此,我们需要更复杂、灵活、有未知参数的函数。我们采用Hard Sigmoid 函数——“硬限制线性单元”:
KaTeX parse error: Expected 'EOF', got '&' at position 139: … n \end{cases} &̲emsp; 如图1.7,我们可以用 Hard Sigmoid 函数 + 常数项 (都是蓝线) 来合成红线:
0
◯
+
1
◯
+
2
◯
+
3
◯
=
\textcircled{0} + \textcircled{1} + \textcircled{2} + \textcircled{3} =
0◯+1◯+2◯+3◯= 红线。
上图中的红线称为 分段线性曲线 (piecewise linear curve)。通过合适的常数项与合适斜率的 Hard Sigmoid 函数组合,我们能够合成任意的分段线性曲线。分段线性曲线越复杂、转折的点越多,所需的 Hard Sigmoid 函数就越多。
分段线性曲线模型比线性模型更复杂,往往具有更好的效果。即使
x
,
y
x, y
x,y 之间的关系是如图1.9的黑色曲线,我们也把它分割近似成分段线性曲线,再用 Hard Sigmoid 函数去合成。
如果说直接写 Hard Sigmoid 函数不是很容易,我们也可以用别的函数来达到相同的效果。比如 (Soft) Sigmoid 函数 (如图1.10) 就可以用一根曲线来逼近 Hard Sigmoid 函数:
y
=
c
⋅
1
1
+
e
−
(
b
+
w
x
1
)
=
c
⋅
σ
(
b
+
w
x
1
)
,
lim
x
1
→
−
∞
y
=
0
,
lim
x
1
→
+
∞
y
=
c
y = c \cdot \frac{1}{1 + e^{-(b + wx_1)}} = c \cdot \sigma(b + wx_1), \\~ \\ \lim_{x_1 \to -\infty} y = 0, ~~ \lim_{x_1 \to +\infty} y = c
y=c⋅1+e−(b+wx1)1=c⋅σ(b+wx1), x1→−∞limy=0, x1→+∞limy=c
通过调整参数
b
,
w
,
c
b, w, c
b,w,c,我们可以得到不同形状的 Sigmoid 函数 (如图1.11),从而逼近不同的 Hard Sigmoid 函数,从而再合成我们所需的分段线性曲线 (如图1.12)。
y
=
b
+
∑
i
c
i
σ
(
b
i
+
w
i
x
1
)
y = b + \sum_{i} c_i \sigma(b_i + w_i x_1)
y=b+i∑ciσ(bi+wix1)
此外,我们可以用不止一个特征
x
1
x_1
x1,而是用多个特征
x
1
,
x
2
,
x
3
,
⋯
x_1, x_2, x_3, \cdots
x1,x2,x3,⋯,代入不同的
c
,
b
,
w
c, b, w
c,b,w,组合出不同的 Sigmoid 函数,从而合成更有灵活性 (flexibility) 的函数,如图1.13蓝框内所示。在我们的案例中,如果要考虑前28天,那么特征编号
j
j
j 就是 1 至 28。