线性模型的优化与应用
1.2 线性模型
在前面的步骤中,已经通过梯度下降法找到了一组参数 ( w ) 和 ( b ),这组参数能够将损失函数的值减少到 480。接下来,在已知的数据上计算损失,并使用这个函数预测未来的观看次数。
假设有从 2017 年到 2020 年的观看次数数据。假装不知道这些年份的隔天观看次数,然后使用之前找到的函数来进行预测,得到了一个误差为 480 的结果。接下来,我们利用这个函数预测未来的数据。
具体地,从 2021 年 1 月 1 日开始:
- 使用 2020 年 12 月 31 日的观看人次预测 2021 年 1 月 1 日的观看人次。
- 使用 2021 年 1 月 1 日的观看人次预测 2021 年 1 月 2 日的观看人次。
- 依此类推,每天使用前一天的数据进行预测,直到 2021 年 2 月 14 日。
在此过程中,计算每一天的平均误差 ( L’ ) ,该误差在未见过的数据上为 0.58。换句话说,在 2021 年的数据上,模型的误差大约为每 600 人左右。下图展示了预测结果:
- 横轴代表时间,0 表示 2021 年 1 月 1 日,最右边的点表示 2021 年 2 月 14 日。
- 纵轴代表观看人次,单位为千人。
红色的线是真实的观看人次,蓝色的线是机器利用模型预测的观看人次。可以观察到,蓝色的线几乎是红色线的平移,仅仅是向右移动了一天。这是合理的,因为模型的特征 ( x1 ) 是前一天的观看人次,它用前一天的观看人次来预测隔天的观看人次。
真实数据的周期性
从数据中可以发现一个周期性现象:每隔 7 天,观看人次就会出现两天的低谷期(通常是周五和周六)。现有模型的局限性在于它只考虑了前一天的观看数据。
为了更好地捕捉这一周期性,我们可以修改模型,考虑前 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
其中,( xj ) 表示第 ( j ) 天的观看次数(即 7 天前的数据),各个数据乘以不同的权重 ( wj ),并加上偏置 ( b ),最终得到预测的结果。
使用这个模型进行预测时:
- 在训练数据上的损失减少到 380。
- 而只考虑 1 天的模型在训练数据上的损失为 480。
由于新模型考虑了前 7 天的历史数据,所以在训练数据上的表现更好,损失更低。在未见过的数据上的表现也有所改善,损失减少到 490(相比之下,原模型的误差是 580)。
通过梯度下降法,我们计算得到了最优的 ( w ) 和 ( b ) 值,如下表所示。
b | ( w1* ) | ( w2* ) | ( w3* ) | ( w4* ) | ( w5* ) | ( w6* ) | ( w7* ) |
---|---|---|---|---|---|---|---|
50 | 0.79 | -0.31 | 0.12 | -0.01 | -0.10 | 0.30 | 0.18 |
从表中可以看出:
- 前一天的观看人次对隔天的预测影响最大,因此 ( w1* ) 的值为 0.79。
- 如果是前两天、前四天、前五天的观看人次,它们与隔天的观看人次呈反比关系,因此 ( w2* )、( w4* ) 和 (w5* ) 是负数。
- 而 ( w1* )、( w3* )、(w6* )、( w7* ) 是正值。
扩展到更多天数
我们还可以进一步扩展模型,考虑更多的历史数据。例如,考虑前 28 天的数据:
y = b + ∑ j = 1 28 w j x j y = b + \sum_{j=1}^{28} w_j x_j y=b+j=1∑28wjxj
在这种情况下:
- 训练数据上的损失减少到 330。
- 在 2021 年的数据上,损失为 460。
如果考虑前 56 天的数据:
y = b + ∑ j = 1 56 w j x j y = b + \sum_{j=1}^{56} w_j x_j y=b+j=1∑56wjxj
在这种情况下:
- 训练数据上的损失减少到 320。
- 在未见过的数据上,损失仍然为 460。
从结果来看,进一步增加考虑的天数并未显著降低损失,这表明考虑天数已经达到一个极限。
这些模型都是通过将输入特征 ( x ) 乘以一个权重,然后加上偏置 ( b ) 来得到预测结果,这类模型称为线性模型(Linear Model)。
总结
通过对模型的观察与改进,逐步提升了预测精度。这一过程展示了线性模型的基本应用以及如何结合数据的周期性特征进行模型优化。下一步,将继续探讨如何进一步优化线性模型,使其能够更好地捕捉数据的复杂模式。
1.2.1 分段线性曲线
在深度学习中,理解特征与目标变量之间的复杂关系至关重要。线性模型虽然简单,但在某些情况下,它可能无法捕捉到输入变量(如 ( x1 ))与输出变量(如 ( y ))之间的复杂关系。为了解决这一问题,可以使用分段线性曲线来更好地拟合数据。
线性模型的局限性
线性模型假设 ( x1 ) 与 ( y ) 之间的关系是一条直线,即随着 ( x1 ) 的增加,( y ) 也会线性地增加。然而,这种简单的假设并不能总是准确地反映实际情况。例如,在实际场景中,可能存在以下情况:
- 当 ( x1 ) 小于某个阈值时,( x1 ) 与 ( y ) 之间成正比关系。
- 当 ( x1 ) 大于某个阈值时,( y ) 的增长会放缓甚至减少。
- 也许 ( x1 ) 跟( y ) 中间,有一个比较复杂的、像下图中红色线一样的关系。
这些非线性的关系显然无法通过简单的线性模型来表达,这种限制被称为模型的偏差。因此,需要一个更复杂、更灵活的函数来模拟这种关系。
分段线性曲线的构建
分段线性曲线是一种能够更好地拟合复杂数据关系的模型。我们可以将其看作是一个常数加上一组 Hard Sigmoid 函数的组合。这种函数的特性如下:
- 在输入值较小时,输出趋于平坦。
- 在特定区间内,函数输出会有一个斜坡。
- 超过某个输入值后,函数输出再次趋于平坦。
为了构建分段线性曲线,可以通过以下步骤实现:
- 常数项:设定与红色曲线(目标曲线)和 ( x ) 轴交点相等的常数项。
- Hard Sigmoid 函数的叠加:通过调节多个 Hard Sigmoid 函数的斜率、起点和终点,使得它们分别匹配红色曲线的各个部分的斜率与形状。
通过这种方法,可以将多个 Hard Sigmoid 函数叠加起来,得到一条能够逼近原始红色曲线的分段线性曲线。如下图中,红色曲线即为蓝色曲线 0+1+2+3 的结果。
用 Sigmoid 函数逼近 Hard Sigmoid 函数
虽然 Hard Sigmoid 函数非常适合构建分段线性曲线,但直接使用可能会带来复杂性。因此,可以使用 Sigmoid 函数来近似 Hard Sigmoid 函数。
Sigmoid 函数的表达式为:
y = c 1 + e − ( b + w x 1 ) y = \frac{c}{1 + e^{-(b + wx_1)}} y=1+e−(b+wx1)c
其中:
- ( x1 ) 为输入变量。
- ( y ) 为输出。
- ( b )、( w )、( c ) 为可调参数。
可以通过调整 Sigmoid 函数的参数 ( b )、( w ) 和 ( c ) 来生成不同形状的 Sigmoid 函数。这些参数的作用分别如下:
- ( w ): 改变斜率,调整 Sigmoid 函数的坡度。
- ( b ): 改变偏移量,左右平移 Sigmoid 函数。
- ( c ): 调整 Sigmoid 函数的高度。
特点:
- 当 ( x1 ) 很大时,( y ) 趋近于 ( c )。
- 当 ( x1 ) 很小时,( y ) 趋近于 0。
通过调整这些参数,可以生成不同的 Sigmoid 函数,并将它们组合起来,从而逼近 Hard Sigmoid 函数或其他分段线性函数。由于分段线性函数可以用来近似各种连续函数,这一组合方法非常有效。
组合多个 Sigmoid 函数逼近复杂函数
设想有一个函数 ( y ) 是多个 Sigmoid 函数的加和,如下式所示:
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)
其中,每一个 σ ( b i + w i x 1 ) \sigma(b_i + w_i x_1) σ(bi+wix1) 代表一个 Sigmoid 函数,且 ( ci )、( bi )、( wi ) 是未知参数。
通过调节这些参数,可以生成不同的 Sigmoid 函数,再将它们相加,构成更复杂的红色曲线,从而逼近各种分段线性函数。这一方法不仅限于单一特征 ( x1 ),还可以扩展至多个特征 ( xj ),从而生成更加灵活的函数,如下图所示。
多特征输入与矩阵表示
对于多个特征 ( xj )(例如前 1 天、2 天和 3 天的观看次数),可以使用矩阵运算来简化表达式:
假设有 3 个特征 ( x1 )、( x2 )、( x3 ),则每个 Sigmoid 函数可以表示为:
r
1
=
b
1
+
w
11
x
1
+
w
12
x
2
+
w
13
x
3
r_1 = b_1 + w_{11}x_1 + w_{12}x_2 + w_{13}x_3
r1=b1+w11x1+w12x2+w13x3
r
2
=
b
2
+
w
21
x
1
+
w
22
x
2
+
w
23
x
3
r_2 = b_2 + w_{21}x_1 + w_{22}x_2 + w_{23}x_3
r2=b2+w21x1+w22x2+w23x3
r
3
=
b
3
+
w
31
x
1
+
w
32
x
2
+
w
33
x
3
r_3 = b_3 + w_{31}x_1 + w_{32}x_2 + w_{33}x_3
r3=b3+w31x1+w32x2+w33x3
将这些表达式用矩阵表示,可以简化为:
r = b + W x \mathbf{r} = \mathbf{b} + \mathbf{W} \mathbf{x} r=b+Wx
其中,r 是结果向量,b 是偏移向量,W 是权重矩阵,x 是输入特征向量。
通过 Sigmoid 函数对 r 进行非线性变换,我们得到:
a = σ ( r ) \mathbf{a} = \sigma(\mathbf{r}) a=σ(r)
最后,函数 ( y ) 可以表示为:
y = b + c T a y = b + \mathbf{c}^T \mathbf{a} y=b+cTa
其中,c 是权重向量,( b ) 是偏移量。通过这种方式,可以将多个 Sigmoid 函数叠加起来,构成更加灵活的逼近函数。
接下来, W , b , cT , b 是未知参数。把这些东西通通拉直,“拼”成一个很长的向量,把 W 的每一行或者是每一列拿出来,把 W 的每一列或每一行“拼”成一个长的向量,把b , cT , b"拼" 上来,这个长的向量用 θ 来表示。所有的未知的参数,一律统称 θ。
参数的优化与梯度下降
定义损失。之前是 L(w, b),现在直接用 θ 来统设所有的参数,所以损失函数就变成 L(θ)。损失函数能够判断 θ 的好坏,其计算方法跟刚才只有两个参数的时候是一样的。
在优化过程中,我们需要找到能够使损失函数最小的参数集合 θ。这些参数可以包括权重矩阵 W、偏移向量 b 以及其他相关的参数。下面是优化的过程:
1.优化参数向量 θ
在前面的步骤中,通过调整 Sigmoid 函数的参数生成了逼近复杂函数的模型。接下来的任务是优化参数向量 θ,使得损失函数 **L(θ)**最小化。最优的参数向量称为 θ*。
参数向量 θ 表示为:
θ = [ θ 1 θ 2 θ 3 ⋮ ] \theta = \begin{bmatrix} \theta_1 \\ \theta_2 \\ \theta_3 \\ \vdots \end{bmatrix} θ= θ1θ2θ3⋮
其中,θ 的维数取决于模型中参数的数量。
2. 初始化参数
优化过程通常从一个随机初始化的参数向量θ0 开始。这个初始向量是优化过程的起点。
3. 计算损失函数的梯度
接下来,需要计算损失函数 L(θ) 对每个参数的梯度,以确定在参数空间中的更新方向。梯度向量 ( g ) 表示为:
g = ∇ L ( θ 0 ) g = \nabla L(\theta_0) g=∇L(θ0)
具体展开为:
g = [ ∂ L ∂ θ 1 ∣ θ = θ 0 ∂ L ∂ θ 2 ∣ θ = θ 0 ⋮ ] g = \begin{bmatrix} \frac{\partial L}{\partial \theta_1} \bigg|_{\theta=\theta_0} \\ \frac{\partial L}{\partial \theta_2} \bigg|_{\theta=\theta_0} \\ \vdots \end{bmatrix} g= ∂θ1∂L θ=θ0∂θ2∂L θ=θ0⋮
梯度向量 ( g ) 的每个分量表示损失函数 ( L ) 对应参数 θi 的偏导数。这些偏导数指示了各参数如何调整才能最大程度地减少损失。
4. 更新参数
通过梯度 ( g ) ,可以更新参数向量。更新规则为:
θ 1 = θ 0 − η g \theta_1 = \theta_0 - \eta g θ1=θ0−ηg
其中,( η ) 是学习率(Learning Rate),用于控制参数更新的步长。学习率过大可能导致无法收敛,过小则可能使收敛速度变慢。
假设有 1000 个参数,那么
θ
0
\theta_0
θ0 是一个 1000 维的向量,梯度 ( g ) 也是一个 1000 维的向量。更新后的参数
θ
1
\theta_1
θ1 也是一个 1000 维的向量。更新过程可用以下矩阵形式表达:
这个更新过程会不断重复,直到参数向量 θ \theta θ 收敛,即参数不再显著变化。
5. 梯度下降的迭代过程
梯度下降法是一个迭代的过程。在每次迭代中,先计算当前参数的梯度,然后使用梯度更新参数。更新公式如下:
θ t + 1 = θ t − η ∇ L ( θ t ) \theta_{t+1} = \theta_t - \eta \nabla L(\theta_t) θt+1=θt−η∇L(θt)
这里的 ( t ) 代表当前的迭代次数。通过不断重复这一过程,参数 θ \theta θ 将逐步趋向最优值 θ ∗ \theta^* θ∗。
6. 停止条件
梯度下降法通常在以下两种情况下停止:
- 达到最大迭代次数:设定一个最大迭代次数,达到该次数后停止优化。
- 梯度足够小:当梯度的范数 ( |g| ) 小于某个预设的阈值时停止。此时,梯度接近 0,意味着参数更新已非常小,模型接近最优解。
7. 超参数选择与调整
梯度下降法中,学习率 η \eta η 是一个关键超参数,直接影响到模型的收敛速度和最终性能。除了学习率,批量大小也是需要调整的超参数。一般来说,这些超参数需要通过实验和验证来选择。
8.小批量梯度下降与训练回合
在实际应用中,我们通常采用小批量梯度下降(Mini-batch Gradient Descent)方法,将数据集分成多个小批量(batch)进行梯度计算与参数更新。这种方法可以提高训练效率,并且能够更快地找到最优解。
每次参数更新称为一次更新(update),而将整个数据集分批处理完一次称为一个回合(epoch)。批量大小(batch size)和 Sigmoid 函数的个数都是超参数,需根据实际情况进行调整。
通过以上方法,使用多个 Sigmoid 函数叠加并优化参数,我们能够逼近各种复杂的连续函数,并应用于实际问题中。
1.2.2 模型变形
在深度学习模型的设计中,激活函数(activation function)的选择和使用至关重要。可以通过改变激活函数或者调整模型结构来优化模型性能。
ReLU 和 Hard Sigmoid 的关系
Hard Sigmoid 可以被看作是两个修正线性单元(Rectified Linear Unit,ReLU)的组合。ReLU 函数的图像可以表示为一条水平线,然后在某个点转折,形成一个斜坡。它的数学表达式如下:
c ⋅ max ( 0 , b + w x 1 ) c \cdot \max(0, b + wx_1) c⋅max(0,b+wx1)
其中,max(0, b + wx_1)
表示比较 0
和 b + wx_1
的大小,取较大者作为输出。当 b + wx_1 < 0
时,输出为 0
;当 b + wx_1 > 0
时,输出为 b + wx_1
。通过调整参数 w
, b
, c
,我们可以改变 ReLU 函数的转折点和斜率。
为了构建 Hard Sigmoid,需要将两个 ReLU 函数叠加。如果我们想要用 ReLU 来代替 Sigmoid 函数,则可以将 Sigmoid 函数替换为:
max ( 0 , b i + w i j x j ) \max(0, b_i + w_{ij}x_j) max(0,bi+wijxj)
如下图所示,两个 ReLU 函数的组合能够形成一个 Hard Sigmoid。因此,表示一个 Hard Sigmoid 不止一种方式。在机器学习中,Sigmoid 和 ReLU 都被称为激活函数。
激活函数的实验与选择
Sigmoid 和 ReLU 是最常见的激活函数。在实际实验中,ReLU 函数往往表现得更好。例如:
- 当使用线性模型时,在 56 天的数据训练上,损失为 320,而在未见过的数据(如 2021 年的数据)上,损失为 460。
- 当连续使用 10 个 ReLU 作为模型,结果与线性模型差不多。
- 当使用 100 个 ReLU 作为模型时,训练数据上的损失从 320 降至 280。这是因为 100 个 ReLU 能生成更复杂的曲线,从而降低损失。在测试数据上的表现也有所改善。
模型变形与优化
在深度学习中,模型的结构设计和激活函数的选择对最终的性能至关重要。我们可以通过对模型的反复变形与调整,来不断优化模型的预测能力。
从输入 x
到中间结果 a
的计算
输入 x
经过一系列运算后产生中间结果 a
。具体步骤如下:
- 加权求和:将输入
x
与权重w
相乘,并加上偏置项b
,得到wx + b
。 - 通过激活函数:对
wx + b
应用激活函数,如 Sigmoid 或 ReLU,得到中间结果a
。
a = Activation ( w x + b ) a = \text{Activation}(wx + b) a=Activation(wx+b)
这个过程可以反复执行多次,每次运算后的结果 a
再次作为输入,继续执行同样的运算。值得注意的是,每次运算中的参数 w
, b
和下一次运算中的参数 w'
, b'
是不同的,它们都是需要学习的未知参数。如下图所示:
实验结果与激活函数的选择
在实验中,使用 ReLU 作为激活函数表现出了良好的效果。以下是实验结果的总结:
- 两次 ReLU 运算:损失从 280 降低到 180。
- 三次 ReLU 运算:损失从 180 降低到 140。在测试数据上,损失从 430 降低到 380。
通过对比实际观看次数和模型预测值,可以发现模型在预测低谷期的表现相对准确。尽管有时机器的预测与实际数据存在偏差,但总体上它能够捕捉到数据的趋势。
过拟合问题
随着模型深度的增加,过拟合(overfitting)可能成为一个问题。过拟合指的是模型在训练数据上表现良好,但在未见过的数据上表现较差。以下是与过拟合相关的实验观察:
- 三层网络:在训练数据上的损失较高,但在未见过的数据上表现较好。
- 四层网络:在训练数据上的损失较低,但在未见过的数据上表现较差。
这种现象表明,深度学习模型的层数增加并不一定总是带来更好的泛化能力。相反,可能会导致模型在训练数据上过拟合,而在测试数据上表现不佳。
深度学习中的层数选择
在选择模型时,需要权衡训练数据和测试数据的表现。尽管较深的网络在训练数据上可能表现更好,但从泛化能力的角度来看,选择在测试数据上表现更好的模型更为重要。因此,在预测未知数据时,通常选择较浅的网络(如三层网络),因为它在未见过的数据上表现更为稳健。
深度学习训练中的反向传播
在深度学习的训练过程中,反向传播(BackPropagation,BP)是关键的优化算法。反向传播通过计算损失函数相对于每个参数的梯度,并反向传播这些梯度,从而有效地更新模型参数。通过这种方式,模型能够逐步收敛到一个较优的解,最终提升其预测性能。
总结
通过合理选择和调整激活函数、层数以及模型结构,可以有效提升深度学习模型的表现。理解模型的变形与优化过程有助于应对不同的数据分布和任务需求。在实际应用中,平衡训练数据和测试数据的表现,避免过拟合,才能构建出更为鲁棒的深度学习模型。
1.2.3 机器学习框架
机器学习数据集的构成
在机器学习中,我们通常会将数据分为两部分:训练集和测试集。每个数据集的作用如下:
- 训练集:包含特征
x
和对应的目标标签y
。用来训练模型,学习输入和输出之间的关系。 - 测试集:仅包含特征
x
,没有目标标签y
。用来评估训练好的模型的泛化能力。
训练数据和测试数据的表示形式如下:
训练数据: { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } \text{训练数据:} \quad \{(x_1, y_1), (x_2, y_2), \dots, (x_N, y_N)\} 训练数据:{(x1,y1),(x2,y2),…,(xN,yN)}
测试数据: { x N + 1 , x N + 2 , … , x N + M } \text{测试数据:} \quad \{x_{N+1}, x_{N+2}, \dots, x_{N+M}\} 测试数据:{xN+1,xN+2,…,xN+M}
机器学习模型训练的三个步骤
训练机器学习模型的过程可以分为以下三个关键步骤:
1. 构建模型
首先,需要定义一个包含未知参数
θ
\theta
θ 的函数 fθ(x)
。这个函数代表了我们要学习的模型,其中:
- θ \theta θ 表示模型中的所有未知参数。
fθ(x)
表示模型的输入为特征x
,输出为模型的预测结果。
模型的构建通常涉及选择合适的函数形式,如线性模型、神经网络等,并初始化参数 θ \theta θ。
2. 定义损失函数
接下来,需要定义一个损失函数 L
。损失函数用于衡量模型在训练集上的表现,通过计算模型预测值与真实标签之间的差距,来判断模型参数的优劣。常见的损失函数包括均方误差(MSE)、交叉熵损失等。
损失函数的定义如下:
L ( θ ) = 损失函数的形式 L(\theta) = \text{损失函数的形式} L(θ)=损失函数的形式
损失函数的输入是模型的参数 θ \theta θ,输出是一个标量值,表示当前参数下模型的误差。
3. 优化模型参数
最后,通过解一个优化问题,找到能够使损失函数最小化的参数 θ \theta θ,记为 θ ∗ \theta^* θ∗。优化的目标是通过调整参数 θ \theta θ,使得损失函数的值尽可能小。
优化问题的数学表示如下:
θ ∗ = argmin θ L ( θ ) \theta^* = \underset{\theta}{\text{argmin}} \ L(\theta) θ∗=θargmin L(θ)
常用的优化方法包括梯度下降法、随机梯度下降法(SGD)等。优化过程通常是一个迭代的过程,不断更新参数 θ \theta θ 直到损失函数收敛到一个最小值。
模型的应用
训练完成后,得到最优参数 θ ∗ \theta^* θ∗,接下来将其应用到测试集上。具体步骤:
- 将最优参数
θ
∗
\theta^*
θ∗ 代入模型
fθ(x)
中,使得模型中原本的未知参数都由 θ ∗ \theta^* θ∗ 替代。 - 将测试集的特征 x N + 1 , x N + 2 , … , x N + M x_{N+1}, x_{N+2}, \dots, x_{N+M} xN+1,xN+2,…,xN+M 作为输入,利用训练好的模型进行预测。
- 将预测结果存储起来,最终可以将这些结果上传到平台如 Kaggle,进行评估。
总结
在机器学习中,模型的训练过程是一个系统化的流程,涉及数据集的准备、模型的构建、损失函数的定义以及参数的优化。通过这个过程,我们可以从数据中学习出最佳的模型参数,并利用该模型进行预测。在实际应用中,需要根据任务的不同,选择合适的模型和优化方法,以达到最佳的预测效果。