Datawhale X 李宏毅苹果书AI夏令营 学习笔记2
本节新概念较多,建议多RTFM,STFW
(待完善)
线性模型
滞后性。对于已知的数据拟合较好,对于未知的数据误差却比较大。
因此,需要修改模型。这主要取决于我们如何理解这个问题。
![![[Pasted image 20240831173753.png]](https://i-blog.csdnimg.cn/direct/c1a1b0343bb846afb43b7a290021f9e7.png)
观察数据发现有七天循环的周期性。为了把前七天的数据都考虑到,提出下面这个新的模型。
也就是对于前七天的数据,分别赋予不同的权重。并且还可以考虑28天、56天。但边际效益递减,考虑天数会有极限。
二、分段线性曲线
线性模型也许过于简单,x1 跟 y 可能中间有比较复杂的关系。可能是折线,更可能是复杂的曲线。因此,我们需要找到泛用性更高的模型。首先我们想到可以像傅里叶变换一样,把一个函数拆解为一群简单的函数相加。
即分段线性曲线(piecewise linear curve)可以看作是一个常数,再加上一堆蓝色的函数。
虽然足够的直线相加也可以拟合出任意的曲线,但要是有更加光滑的曲线,也许效果更好。
为此,更复杂的、更有灵活性的Sigmoid 函数登场了。
如果 x1 的值,趋近于无穷大的时候,e−(b+wx1) 这一项就会消失,当 x1 非常大的时候,这一条就会收敛在高度为 c 的地方。如果 x1 负的非常大的时候,分母的地方就会非常大,y的值就会趋近于 0。
所以可以用这样子的一个函数逼近这一个蓝色的S 型的函数,因此得名 Sigmoid 函数。
为了简洁,去掉了指数的部分,蓝色函数的表达式为
y = cσ(b + wx1)
所以可以用 Sigmoid 函数逼近 Hard Sigmoid 函数。
此外,我们可以不只用一个特征 x1,可以用多个特征代入不同的 c, b, w,组合出各种不同的函数,从而得到更有灵活性(flexibility)的函数。
以 3 个 Sigmoid为例。直观来讲,先考虑一下 j 就是 1、2、3 的情况,就是只考虑 3 个特征。举个例子,只考虑前一天、前两天跟前 3 天的情况,所以 j 等于 1,2,3,所以输入就是 x1 代表前一天的观看次数,x2 两天前观看次数,x3 3 天前的观看次数,每一个 i 就代表了一个蓝色的函数。每一个蓝色的函数都用一个 Sigmoid 函数来比近似它,1,2,3 代表有个 Sigmoid 函数。
接下来要定义损失。之前是 L(w, b),因为 w 跟 b 是未知的。现在未知的参数很多了,再把它一个一个列出来太累了,所以直接用 θ 来统设所有的参数,所以损失函数就变成 L(θ)。
损失函数能够判断 θ 的好坏,其计算方法跟刚才只有两个参数的时候是一样的。
先给定 θ 的值,即某一组 W, b, c,T, b 的值,再把一种特征 x 代进去,得到估测出来的 y,
再计算一下跟真实的标签之间的误差 e。把所有的误差通通加起来,就得到损失。
假设有 1000 个参数,这个向量的长度就是 1000,这个向量也称为梯度,∇L 代表梯度。
当我们实际操作梯度下降这种方法时,有个小技巧。想象一下,我们有一堆数据,我们会把这些数据随机分成一个个小组,每个小组叫做一个“批量”,每个批量里面有B笔数据。以前我们是拿所有数据来计算一个总的损失,现在我们只拿一个批量里的数据来计算损失,这个损失我们叫做L1,以区别于原来的总损失L。如果批量足够大,L1和L就会比较接近。
我们先挑一个批量,用这批数据算出L1,然后根据L1来计算梯度,用这个梯度去更新我们的参数。接着,我们再挑下一个批量,算出L2,再根据L2更新参数,以此类推,直到所有的批量都算过一遍。
注意,我们不是直接用总损失L来计算梯度,而是用每个批量算出的L1、L2、L3等来计算。把所有批量都过一遍,这个过程叫做一个“回合”。每次更新参数,我们叫做一次“更新”。更新和回合是两个不同的概念。比如,如果有10000笔数据,批量大小是10,那么一个回合里我们会更新参数1000次。
举个例子,如果数据有1000个,批量大小设为100,那么一个回合里总共会更新10次参数。所以,一个回合并不是只更新一次参数,具体更新多少次,取决于批量的大小。
变形
其实还可以对模型做更多的变形,不一定要把 Hard Sigmoid 换成 Soft Sigmoid。Hard Sigmoid 可以看作是两个修正线性单元(Rectified Linear Unit,ReLU)的加总,ReLU 的图像有一个水平的线,走到某个地方有一个转折的点,变成一个斜坡,其对应的公式为
c ∗ max(0, b + wx1)
2 个 ReLU 才能够合成一个 Hard Sigmoid。要合成 i 个 Hard Sigmoid,需要 i 个 Sigmoid,如果 ReLU 要做到一样的事情,则需要 2i 个 ReLU,因为 2 个 ReLU 合起来才是一个 Hard Sigmoid。因此表示一个 Hard 的 Sigmoid 不是只有一种做法。在机器学习里面,Sigmoid 或 ReLU 称为激活函数(activation function)。
但连续使用 100 个 ReLU 作为模型,结果就有显著差别了,100 个 ReLU 在训练数据上的损失就可以从 320 降到 280,有 100 个 ReLU 就可以制造比较复杂的曲线,本来线性就是一直线,但 100 个 ReLU 就可以产生 100 个折线的函数,在测试数据上也好了一些.
Sigmoid 或 ReLU 称为神经元(neuron),很多的神经元称为神经网络(neural network)。
每一排称为一层,称为隐藏层(hiddenlayer),很多的隐藏层就“深”,这套技术称为深度学习。
但是在没看过的数据上,4 层比较差,3 层比较好,如图 1.25 所示。在训练数据和测试数据上的结果是不一致的,这种情况称为过拟合(overfitting)。
虽然 4 层在训练数据上的结果比较好,但在没有看过的数据的结果更重要。应该选一个在训练的时候,没有看过的数据上表现会好的模型,所以应该选 3 层的网络。深度学习的训练会用到反向传播(BackPropagation,BP),其实它就是比较有效率、算梯度的方法。