1.4 线性模型
线性模型(linear model):模型都是把输入的特征 x 乘上一 个权重,再加上一个偏置就得到预测的结果。
上一个task1中,w跟b的值刚才已经找出来的,这组w跟b可以让损失小到 480,这是我们得到的结论,后续我们将需需用到这个。
在已经知道答案的数据上去计算损失,2017 到 2020 年每天的观看次数是已知的。所以假装不知道隔天的观看次数,拿这一个函数来进行预测,发现误差是 480。接下来使用这个函数预测未来的观看次数。
我们的预测:
用2020年的12月31日的观看人次预测 2021年1月1日的观看人次,用2021年1月1 日的观看人次预测1月2日的观看人次,用1月2日的观看人次去预测1月3日的观看人次,一直到做到2月14日。
得到平均的值,在 2021 年没有看过的数据上,误差值用 L′来表示。它是0.58,所以在有看过的数据上,在训练数据上,误差值是比较小的,在没有看过的数据上,在2021 年的数据上,看起来误差值是比较大的,每一天的平均误差有580人左右,600人左右。
横轴是代表的是时间,所以0这个点代表的是2021年1月1日,最右边点代表的是 2021年2月14日,纵轴就是观看的人次,这边是用千人当作单位。红色线是真实的观看人次,蓝色线是机器用这一个函数预测出来的观看人次。
前一天观看人次乘以0.97,加上100加上100,就是隔天的观看人次。机器几乎就是拿前一天的观看人次来预测隔天的观看人次。这个真实的数据有一个很神奇的现象,它是有周期性的,它每隔7天就会有两天特别低(周五和周六),两天观看的人特别少,每隔7天,就是一个循环。
目前的模型不太行,它只能够看前一天。每隔7天它一个循环,如果一个模型参考前7天的数据,把7天前的数据,直接复制到拿来当作预测的结果,也许预测的会更准也说不定,所以我们就要修改一下模型。通常一个模型的修改,往往来自于对这个问题的理解,即领域知识。
但说实话,挺复杂的我感觉,所以遇事不决我们胡乱写一个试试先:
接下来我们观察了真实的数据以后,得到一个结论是,每隔7天有一个 循环。所以要把前7天的观看人次都列入考虑,写了一个新的模型:
xj : 第j天的观看测试,也就是7天前的数据。
wj: 不同的权重wj。
使用该模型预测,其在训练数据上的损失是380,而只考虑1天的模型在训练数据上的损失是480。因为其考虑了7天,所以在训练数据上会得到比较低的损失。考虑了比较多的信息,在训练数据上应该要得到更好的、更低的损失。在没有看到的数据上的损失有比较好是490。只考虑1天的误差是580,考虑7天的误差是490。用梯度下降, 算出w跟b的最优值所示:
PS.
机器的逻辑是前一天跟要预测的隔天的数值的关系很大,所以 w1*是0.79,不过它知道。但是!!!!如果是前两天前四天前五天,它的值会跟未来要预测的,隔天的值是成反比的,所以后面接个都是负数。
(这部分还是不是很明确,暂时记录到这个部分)
1.4.1 分段线性曲线
线性模型的局限性:之前我们可以发现对于线性模型,x1跟y的关系就是一条直线,随着x1越来越高,y就应该越来越大。设定不同的w可以改变这条线的斜率,设定不同的b可以改变这一条蓝色的直线跟y轴的交叉点。
但是无论如何改w跟b,它永远都是一条直线,永远都是x1越大,y就越大,前一天观看的次数越多,隔天的观看次数就越多。不管如何设置w跟b,永远制造不出红色线,永远无法用线性模型制造红色线。一种来自于模型的限制称为模型的偏差,无法模拟真实的情况。
所以我们需要引入一群Hard Sigmoid函数:Hard Sigmoid函数的特性是当输入的值,当x轴的值小于某一个阈值(某个定值)的时候,大于另外一个定值阈值的时候,中间有一个斜坡。所以它是先水平的,再斜坡,再水平的。所以红色的线可以看作是一个常数项加一大堆的蓝色函数。
常数项设成红色的线跟x轴的交点一样大。常数项怎么加上蓝色函数后,变成红色的这一条线。
蓝线1函数斜坡的起点,设在红色函数的起始的地方,第2个斜坡的终点设在第一个转角处,让第1个蓝色函数的斜坡和红色函数的斜坡的斜率是一样的,这个时候把0+1就可以得到红色曲线左侧的线段。
接下来,再加第2个蓝色的函数,所以第2个蓝色函数的斜坡就在红色函数的第一个转折点到第2个转折点之间,让第2个蓝色函数的斜率跟红色函数的斜率一样,这个时候把0+1+2,就可以得到红色函数左侧和中间的线段。
接下来第3个部分,第2个转折点之后的部分,就加第3个蓝色的函数,第3个蓝色的函数 坡度的起始点设的跟红色函数转折点一样,蓝色函数的斜率设的跟红色函数斜率一样,接下来把0+1+2+3全部加起来,就得到完整红色的线。
(这里教材的解释很复杂,需要细细察看,感觉全都很重要啊 = =)
所以红色线,即分段线性曲线(piecewise linear curve)可以看作是一个常数,再加上一堆蓝色的函数。分段线性曲线可以用常数项加一大堆的蓝色函数组合出来,只是用的蓝色函数不一定一样。
这样还是看着太复杂了,所以我们取个巧,选择选择很多的点,把其连成线(要有足够多的蓝色函数):
但如果x和y的关系非常复杂,就只能写一个太有未知数的函数。直接写 Hard Sigmoid不是很容易,但是可以用一条曲线来理解它,用 Sigmoid 函数来逼近 Hard Sigmoid,Sigmoid函数的表达式为:
PS. 其横轴输入是x1,输出是 y,c为常数。
如果x1的值,趋近于无穷大的时候,分母变为1,当x1非常大的时候,这一条就会收敛在高度为c的地方。如果 x1 负的非常大的时候,分母的地方就会非常大,y 的值就会趋近于0。
红色这条线就是0加1+2+3,而 1、2、3 都是蓝色的函数,其都可写成 (b+wx1),Sigmoid 再乘上ci1,只是1、2、3的w、b、c不同,这样我们也就可以得到公式:
假设:b 跟 w 跟 c,它是未知的,我们什么都不知道,所以就可以设定不同的b跟w跟c,就可以制造不同的蓝色的函数,制造不同的蓝色的函数叠起来以后,就可以制造出不同的红色的曲线,就可以制造出不同的分段线性曲线,逼近各式各样不同的连续函数。
同时,我们可以不只用一个特征 x1 ,可以用多个特征代入不同的c,b,w,组合出各种不同的函数,从而得到更有灵活性(flexibility)的函数
接下来就要用到矩阵的知识了(但我已经忘得快差不多了啊= =),先考虑一下 j 就是 1、2、3 的情况,考虑 3 个特征。
例如:只考虑前一天、前两天跟前3天的情况,所以 j 等于1,2,3,所以输入就是 x1 代表前一天的观看的次数,x2 两天前观看次数,x3 3 天前的观看次数,每一个 i 就代表了一个蓝色的函数。每个蓝色函数都用Sigmoid 函数来比近似它。
wij 代表在第 i 个 Sigmoid 里面,乘给第 j 个特征的权重,w 的第一个下标代表是现在在考虑的是第一个 Sigmoid 函数。为了简化起见,括号里面的式子为:
矩阵写法:
r 对应的是 r1 , r2 , r3,然后分别通过 Sig- moid 函数得到 a1 , a2 , a3。
因此蓝色虚线框里面做的事情,是从 x1 , x2 , x3 得到了 a1 , a2 , a3
如果我们用线性表示的话就是:
接下来,如图所示,x 是特征,绿色的 b 是一个向量,灰色的 b 是一个数值。W , b, cT , b 是未知参数。把这些东西通通拉直,“拼”成一个很长的向量,我们把 W 的每一行或者是每一列拿出来。无论是拿行或拿列都可以, 把 W 的每一列或每一行“拼”成一个长的向量,把 b, cT , b ”拼”上来,这个长的向量直接用 θ 来表示。所有的未知的参数,一律统称 θ。
接下来这一步,定义损失:
之前是 L(w, b),因为 w 跟 b 是未知的。现在未知的参数很多了,之前的办法已进行不太通。用 θ 来统设所有的参数,所以损失函数就变成 L(θ)。 损失函数能够判断 θ 的好坏,其计算方法跟刚才只有两个参数的时候是一样的。
先给定 θ 的值,即某一组 W , b, cT , b 的值,再把一种特征 x 代进去,得到估测出来的 y, 再计算一下跟真实的标签之间的误差 e。把所有的误差通通加起来,就得到损失,之后我们再优化。
要找到 θ 让损失越小越好,可以让损失最小的一组 θ 称为 θ *。选一个初始的数值 θ0。接下来计算每一个未知的参数对 L 的微分,得到向量 g,即可以让损失变低的函数。
又到我们的假设环节啦= =,这里教材说得十分详细,假设有 1000 个参数,这个向量的长度就是 1000,这个向量也称为梯度,▽L 代表梯度。 L(θ0) 是指计算梯度的位置,是在 θ 等于θ0的地方。计算出 g 后,接下来跟新参数,以此类推,就可以把 1000 个参数都更新了:
假设参数有 1000 个,θ0 就是 1000 个数值,1000 维的向量,g 是 1000 维的向量,θ 1也是 1000 维的向量。 整个操作就是这样,由 θ0 算梯度,根据梯度去把 θ0 更新成 θ1 ,再算一 次梯度,再根据梯度把 θ1 再更新成 θ2 ,再算一次梯度把θ2 更新成θ3,以此类推,直到不想做。或者计算出梯度为 0 向量。
到这里其实还有问题,但大致差不多了,我已经感觉比较难理解了,这还只是是入门啊啊啊啊= =
1.4.2 模型变形
其实还可以对模型做更多的变形,不一定要把 Hard Sigmoid 换成 Soft Sigmoid。Hard Sigmoid 可以看作是两个修正线性单元(Rectified Linear Unit,ReLU)的加总,ReLU 的图像有一个水平的线,走到某个地方有一个转折的点,变成一个斜坡,其对应的公式为:
max(0, b+wx1) 是指看0跟b+wx1谁比较大,比较大的会被当做输出;如果 b+wx1<0,输出是0;如果b+wx1>0,输出是 b+wx1。通过 w, b, c 可以挪动其位置和斜率。把两个ReLU 叠起来就可以变成Hard的Sigmoid,想要用 ReLU,就把Sigmoid地方,换成 max(0, bi + wij xj )。在机器学习里面,Sigmoid或ReLU称为激活函数(activation function)。
接下来可以继续改模型,从x变成a,就是把x乘上w加 b,再通过Sigmoid函数。不一定要通过Sigmoid函数,通过 ReLU 也可以得到 a,同样的事情再反复地多做几次。
所以可以把 x 做这一连串的运算产生 a,接下来把a 做这一连串的运算产生a′。 反复地多做的次数又是另外一个超参数。注意,w, b和w′,b′不是同一个参数,是增加了更多的未知的参数。
(说实话到这里就已经很头疼了,全是文字密密麻麻,打脑阔啊= =)
每次都加 100 个ReLU,输入特征,就是56天前的数据。如果做两次,损失降低很多,280降到180。如果做3次,损失从180降到140,通过3次ReLU,从280降到140,在训练数据上,在没看过的数据上,从430降到了380。
通过 3 次 ReLU 的实验结果:
另外一个方面,我们不可能只做短短的几次训练或者说是学习,至少要做上百次。
PS. 这里有Sigmoid或ReLU称为神经元,很多神经元称为神经网络(neural network)。每一排称为一层,称为隐藏层(hidden layer),很多的隐藏层就“深”,这套技术称为深度学习。
刚才只做到 3 层,应该要做得更深,现在网络都是叠几百层的,深度学习就要做更深。但 4 层在训练数据上,损失是 100,在没有看过 2021 年的数据上,损失是 440。在训练数据上3 层比 4 层差,但是在没看过的数据上,4 层比较差,3 层比较好。在训练数 据和测试数据上的结果是不一致的,这种情况称为过拟合(overfitting)。
TASK2 END