Datawhale X 李宏毅苹果书 AI夏令营 Task2

1.4 线性模型

线性模型(linear model):模型都是把输入的特征 x 乘上一 个权重,再加上一个偏置就得到预测的结果。

上一个task1中,wb的值刚才已经找出来的,这组wb可以让损失小到 480,这是我们得到的结论,后续我们将需需用到这个。

在已经知道答案的数据上去计算损失,2017 2020 年每天的观看次数是已知的。所以假装不知道隔天的观看次数,拿这一个函数来进行预测,发现误差是 480。接下来使用这个函数预测未来的观看次数。

我们的预测:

2020年的1231日的观看人次预测 202111日的观看人次,用202111 日的观看人次预测12的观看人次,用12日的观看人次去预测13日的观看人次,一直到做到2月14日。

得到平均的值,在 2021 年没有看过的数据上,误差值用 L来表示它是0.58,所以在有看过的数据上,在训练数据上,误差值是比较小的,在没有看过的数据上,在2021 年的数据上,看起来误差值是比较大的,每一天的平均误差有580人左右,600人左右。

横轴是代表的是时间,所以0这个点代表的是202111日,最右边点代表的是 2021214日,纵轴就是观看的人次,这边是用千人当作单位。红色线是真实的观看人次,蓝色线是机器用这一个函数预测出来的观看人次。

前一天观看人次乘以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。用梯度下降, 算出wb的最优值所示:

PS.

机器的逻辑是前一天跟要预测的隔天的数值的关系很大,所以 w1*0.79,不过它知道。但是!!!!如果是前两天前四天前五天,它的值会跟未来要预测的,隔天的值是成反比的,所以后面接个都是负数。

(这部分还是不是很明确,暂时记录到这个部分)

1.4.1 分段线性曲线

线性模型的局限性:之前我们可以发现对于线性模型,x1y的关系就是一条直线,随着x1越来越高,y就应该越来越大。设定不同的w可以改变这条线的斜率,设定不同的b可以改变这一条蓝色的直线跟y轴的交叉点。

但是无论如何改wb,它永远都是一条直线,永远都是x1越大,y就越大,前一天观看的次数越多,隔天的观看次数就越多。不管如何设置wb,永远制造不出红色线,永远无法用线性模型制造红色线。一种来自于模型的限制称为模型的偏差,无法模拟真实的情况。

所以我们需要引入一群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 SigmoidSigmoid函数的表达式为:

PS. 其横轴输入是x1,输出是 yc为常数。

如果x1的值,趋近于无穷大的时候,分母变为1,当x1常大的时候,这一条就会收敛在高度为c的地方。如果 x1 负的非常大的时候,分母的地方就会非常大,y 的值就会趋近于0

所以可以用这样子的一个函数逼近这一个蓝色的函数,即 Sigmoid 函数 Sigmoid 函数就是 S 型的函数。因为它长得是有点像是 S ,所以叫它 Sigmoid 函数。

蓝色函数的表达式:

Sigmoid 函数逼近 Hard Sigmoid 函数

制造不同的 Sigmoid 函数,调整这里的 bw  c 可以制造各种不同形状的Sigmoid 函数,用各种不同形状的 Sigmoid 函数去逼近 Hard Sigmoid 函数。
(这里就需要很多的数学思维了,有点麻烦= =)

红色这条线就是01+2+3,而 123 都是蓝色的函数,其都可写(b+wx1),Sigmoid 再乘上ci1,只是123wbc不同,这样我们也就可以得到公式:

PS. 所以这边每一个式子都代表了一个不同蓝色的函数,求和就是把不同的蓝色的函数相加,
再加一个常数 b

假设:b w c,它是未知的,我们什么都不知道,所以就可以设定不同的bwc,就可以制造不同的蓝色的函数,制造不同的蓝色的函数叠起来以后,就可以制造出不同的红色的曲线,就可以制造出不同的分段线性曲线,逼近各式各样不同的连续函数。

同时,我们可以不只用一个特征 x1 ,可以用多个特征代入不同的c,b,w,组合出各种不同的函数,从而得到更有灵活性(flexibility的函数

接下来就要用到矩阵的知识了(但我已经忘得快差不多了啊= =),先考虑一下 j 就是 123 的情况,考虑 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 维的向量,θ 11000 维的向量。 整个操作就是这样,由 θ0  算梯度,根据梯度去把 θ0 更新成 θ1 ,再算一 次梯度,再根据梯度把 θ1  再更新成 θ2 ,再算一次梯度把θ2   更新成θ3,以此类推,直到不想做。或者计算出梯度为 0 向量。

到这里其实还有问题,但大致差不多了,我已经感觉比较难理解了,这还只是是入门啊啊啊啊= =

1.4.2 模型变形

其实还可以对模型做更多的变形,不一定要把 Hard Sigmoid 换成 Soft Sigmoid。Hard Sigmoid 可以看作是两个修正线性单元(Rectified Linear UnitReLU的加总,ReLU 图像有一个水平的线,走到某个地方有一个转折的点,变成一个斜坡,其对应的公式为:

max(0, b+wx1) 是指看0b+wx1谁比较大,比较大的会被当做输出;如果 b+wx1<0输出是0;如果b+wx1>0,输出是 b+wx1。通过 w, b, c 可以挪动其位置和斜率。把两ReLU 叠起来就可以变成HardSigmoid,想要用 ReLU,就把Sigmoid地方,换成 max(0, bi  + wij xj )。在机器学习里面,SigmoidReLU称为激活函数(activation function

接下来可以继续改模型,从x变成a,就是把x乘上wb,再通过Sigmoid函数。不一定要通过Sigmoid函数,通过 ReLU 也可以得到 a,同样的事情再反复地多做几次。 

所以可以把 x 做这一连串的运算产生 a,接下来把a 做这一连串的运算产生a 反复地多做的次数又是另外一个超参数。注意,w, bw,b不是同一个参数,是增加了更多的未知的参数。

(说实话到这里就已经很头疼了,全是文字密密麻麻,打脑阔啊= =)

每次都加 100 ReLU,输入特征,就56天前的数据。如果做两次,损失降低很多,280降到180。如果做3次,损失从180降到140,通过3ReLU,从280降到140,在训练数据上,在没看过的数据上,从430降到了380

通过 3  ReLU 的实验结果:

另外一个方面,我们不可能只做短短的几次训练或者说是学习,至少要做上百次。

PS. 这里有SigmoidReLU称为神经元很多神经元称为神经网络neural network)。每一排称为一层,称为隐藏层(hidden layer很多的隐藏层就“深”,这套技术称为深度学习。

刚才只做到 3 层,应该要做得更深,现在网络都是叠几百层的,深度学习就要做更深。但 4 层在训练数据上,损失是 100,在没有看过 2021 年的数据上,损失是 440。在训练数据上3 层比 4 层差,但是在没看过的数据上,4 层比较差,3 层比较好。在训练数 据和测试数据上的结果是不一致的,这种情况称为拟合(overfitting

TASK2    END

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值