机器学习
一、线性模型
(一)概念
把输入的特征x乘上一个权重,再加上一个偏置得到预测的结果,这样的模型称为线性模型(linear model)。
(二)分段线性曲线(piecewise linear curve)
局限性:Linear models have severe limitation:Model Bias,so we need a more flexible model!
分段线性曲线(下图中的红色线)可以看作是一个常数,再加上一堆蓝色的函数。分段线性曲线可以用常数项加一大堆的蓝色函数组合出来,只是用的蓝色函数不一定一样。要有很多不同的蓝色函数,加上一个常数以后就可以组出这些分段线性曲线。如果分段线性曲线越复杂,转折的点越多,所需的蓝色函数就越多。
同时,我们可以用分段线性曲线去逼近任何的连续的曲线,而每个分段线性曲线都可以用一大堆蓝色的函数组合起来。也就是说,只要有足够的蓝色函数把它加起来,就可以变成任何连续的曲线。
假设 x 跟 y 的关系非常复杂也没关系,就想办法写一个带有未知数的函数。直接写 Hard Sigmoid 不是很容易,但是可以用一条曲线来理解它,用 Sigmoid 函数来逼近 Hard Sigmoid。
二、机器学习三部曲
(一)设定模型
Sigmoid 函数概念:长得有点像是 S 型,所以叫它 Sigmoid 函数。
用 Sigmoid 函数来逼近 Hard Sigmoid,其公式和过程如下:
调整这里的 b、w 和 c 可以制造各种不同形状的 Sigmoid 函数,用各种不同形状的 Sigmoid函数去逼近 Hard Sigmoid 函数。如下图所示,如果改 w,就会改变斜率,就会改变斜坡的坡度。如果改了 b,就可以把这一个 Sigmoid 函数左右移动;如果改 c,就可以改变它的高度。所以只要有不同的 w 不同的 b 不同的 c,就可以制造出不同的 Sigmoid 函数,把不同的Sigmoid 函数叠起来以后就可以去逼近各种不同的分段线性函数;分段线性函数可以拿来近似各种不同的连续的函数。
我们可以用多个特征代入不同的 c, b, w,组合出各种不同的函数,从而得到更有灵活性(flexibility)的函数,如下图所示:
把i和j分别为1,2,3代入等式右边,依次得到r1,r2,r3,然后如下图所示,把各等式中的系数值转化为系数矩阵,此时我们得到了一个矩阵方程。
r1, r2, r3 分别通过 Sigmoid 函数得到 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,即可以让损失变低的函数。
或者,我们也可以使用梯度下降更新参数来计算出梯度为 0 向量,直至无法再更新参数为止,不过由于在实现上几乎不太可能梯度为 0,通常会停下来就是我们不想做了。
但实现上有个细节的问题,实际使用梯度下降的时候,如下图所示,会把N笔数据随机分成一个一个的批量(batch),一组一组的。每个批量里面有B笔数据,所以本来有N笔数据,现在B笔数据一组,一组叫做批量。本来是把所有的数据拿出来算一个损失,现在只拿一个批量里面的数据出来算一个损失,记为L1跟L以示区别。假设B够大,也许L跟L1会很接近。所以实现上每次会先选一个批量,用该批量来算L1,根据L1来算梯度,再用梯度来更新参数,接下来再选下一个批量算出L2,根据L2算出梯度,再更新参数,再取下一个批量算出L3,根据L3算出梯度,再用L3算出来的梯度来更新参数。
所以并不是拿L来算梯度,实际上是拿一个批量算出来的L1,L2,L3来计算梯度。把所有的批量都看过一次,称为一个回合(epoch),每一次更新参数叫做一次更新。
更新跟回合是不同的东西。每次更新一次参数叫做一次更新,把所有的批量都看过一遍,叫做一个回合。
例子1
假设有 10000 笔数据,即 N 等于 10000,批量的大小是 10,也就 B 等于 10。10000 个样本(example)形成了 1000 个批量,在一个回合里面更新了参数 1000 次,所以一个回合并不是更新参数一次,在这个例子里面一个回合,已经更新了参数 1000 次了。
例子2
假设有 1000 个数据,批量大小(batch size)设 100,批量大小和 Sigmoid的个数都是超参数。1000 个样本,批量大小设 100,1 个回合总共更新 10 次参数。所以做了一个回合的训练其实不知道它更新了几次参数,有可能 1000 次,也有可能 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)。
注:还有其他常见的激活函数,但 Sigmoid 跟 ReLU 是最常见的激活函数。
如下图所示,Sigmoid 或 ReLU 称为神经元(neuron),很多的神经元称为神经网络(neural network)。人脑中就是有很多神经元,很多神经元串起来就是一个神经网络,跟人脑是一样的。人工智能就是在模拟人脑。神经网络不是新的技术,80、90 年代就已经用过了,后来为了要重振神经网络的雄风,所以需要新的名字。每一排称为一层,称为隐藏层(hidden layer),很多的隐藏层就“深”,这套技术称为深度学习。
在本实验(视频的点击次数预测)中,使用 3 次 ReLU 的实验结果如下图所示:
注:真实的观看次数在除夕夜当天出现了最低点,但机器学习无法识别,因此会出现了少许偏差。
刚才只做到 3 层,应该要做得更深,现在网络都是叠几百层的,深度学习就要做更深。但4 层在训练数据上,损失是 100,在没有看过 2021 年的数据上,损失是 440。如下图所示,在训练数据上,3 层比 4 层差,但是在没看过的数据(测试数据)上,4 层比较差,3 层比较好。在训练数据和测试数据上的结果是不一致的,这种情况称为过拟合(overfitting)。
四、机器学习框架
训练数据与测试数据的区别:
训练数据既有x又有y,而测试数据只有x没有y。
如下图所示,训练的过程共分为三个步骤: