一、线性模型
在task1中,主要介绍了机器学习的定义与寻找函数的方法,其中,带有未知参数的函数f都为线性函数,y=b+wx。其中,b改变截距,w改变斜率。在训练数据上,误差值是比较小的,在需要预测的数据上,误差值是比较大的。机器几乎就是拿前一天的观看人次来预测隔天的观看人次,所以在预估曲线图中,预测得到的曲线相当于真实数据曲线向右平移
观察真实数据曲线,可以发现以七天作为一个周期,所以要把前 7 天的观看人次都列入考虑,得到损失更小的预估值,新的模型为:
其中,wj为每个列入考虑的训练数据的权重,机器的逻辑是前一天跟要预测的隔天的数值的关系很大,再往前的天数的数值,可能与预测值成反比。将七天的数值扩展为28天、56天,尽管在训练数据中损失能够降低,但继续增加模型中的训练数据,在预估未来数据中损失不再减小,考虑更多天没有办法再更降低损失了。
基础的线性模型具有上述局限性,我们可以对它进行改进。
二、线性模型改进
2.1 分段线性曲线
在实际情况中,可能会出现训练数据在某个范围内时,预测数据与训练数据成正比,训练数据在范围外 ,预测数据反而下降的情况。而线性模型无法实现折线式的模型。线性模型有很大的限制,这一种来自于模型的限制称为模型的偏差,无法模拟真实的情况。
引进Hard Sigmoid 函数
Hard Sigmoid 函数的特性是当输入的值,当 x 轴的值小于某一个阈值(某个定值,同时大于另外一个定值阈值的时候,有一个斜坡。所以它是先水平的,再斜坡,再水平的。有些类似于自动控制原理中的超前校正、滞后校正的数学模型。
红色的曲线实际上可以看作是一个常数再加上一群 Hard Sigmoid 函数。
分段线性曲线越复杂,转折的点越多,所需的蓝色函数就越多。
如果x跟y的关系不是分段线性的关系,而是一段平滑的曲线,可以在这样的曲线上面,先取一些点,再把这些点点起来,变成一个分段线性曲线。而这个分段线性曲线跟原来的曲线,它会非常接近,如果点取的够多或点取的位置适当,分段线性曲线就可以逼近这一个连续的曲线。只要有足够的蓝色函数把它加起来,就可以变成任何连续的曲线。
Hard Sigmoid 函数的近似——Sigmoid 函数
如果直接写 HardSigmoid 不是很容易,但是可以用一条曲线来理解它,则可以用 Sigmoid 函数来逼近 Hard Sigmoid。Sigmoid 函数的表达式为
在Sigmoid函数的三个未知参数中,w改变斜率,b改变与y轴的截距,使函数能够左右平移,c改变最终的高度
Sigmoid函数可以简写为利用sigmoid函数相加,再加上一个参数得到红色的函数,则可以写成:
其中,b为未知的参数,bi为每个sigmoid函数中的参数
除了对模型的改进外,我们可以像线性模型一样增加训练数据的个数,不只用一个特征 x1,可以用多个特征代入不同的 c, b, w,组合出各种不同的函数,从而得到更有灵活性(flexibility)的函数。那么,从线性函数一直到考虑多个数据的分段函数改进过程如下。
考虑多个数据的分段函数
先考虑只有三个数据的情况,每一个蓝色的函数都用一个 Sigmoid 函数来比近似它,1,2,3 代表有个 Sigmoid 函数。如第一个Sigmoid函数可以写为b1 + w11x1 + w12x2 + w13x3。wij 代表在第 i 个 Sigmoid 里面,乘给第 j 个特征的权重,w 的第一个下标代表是现在在考虑的是第一个 Sigmoid 函数,将三个sigmoid函数都写出来则为:
简便写法为:
r1, r2, r3 分别通过 Sigmoid 函数得到 a1, a2, a3,最终的函数可以写为
在这个最终的函数中,x 是特征,绿色的 b 是一个向量,灰色的 b 是一个数值。W, b, cT, b是未知参数。把这些东西通通拉直,“拼”成一个很长的向量,我们把 W 的每一行或者是每一列拿出来。把 W 的每一列或每一行“拼”成一个长的向量,把 b, cT, b” 拼” 上来,这个长的向量直接用 θ 来表示。所有的未知的参数,一律统称 θ。
定义损失
因为此时将所有未知参数都用θ表示了,所以损失函数就变成 L(θ),损失函数跟线性模型中一样能够判断 θ 的好坏。损失计算也跟task1中相同:先给定 θ 的值,即某一组 W, b, cT, b 的值,再把一种特征 x 代进去,得到估测出来的 y,再计算一下跟真实的标签之间的误差 e。把所有的误差通通加起来,就得到损失。
进行优化
要找到 θ 让损失越小越好,可以让损失最小的一组 θ 称为 θ∗。
- 选取初始值
,计算
中每一个未知的参数对 L 的微分,得到向量 g,即可以让损失变低的函数
- 更新参数
代表更新一次的结果,
表示θ中第i个参数
由 θ0 算梯度,根据梯度乘上-η,把 θ0 更新成 θ1,再算一次梯度,再根据梯度把 θ1 再更新成 θ2,直到梯度为零向量或者主动终止。
实际使用梯度下降的时候,如图 1.17 所示,会把 N 笔数据随机分成一个一个的批量,依次计算梯度。把所有的批量都看过一次,称为一个回合(epoch),每一次更新参数叫做一次更新
2.2 模型变形
HardSigmoid 可以看作是两个修正线性单元(Rectified Linear Unit,ReLU)的加总,ReLU 的图像有一个水平的线,走到某个地方有一个转折的点,变成一个斜坡,其对应的公式为
2 个 ReLU 才能够合成一个 Hard Sigmoid。要合成 i 个 Hard Sigmoid,需要 i 个 Sigmoid,如果 ReLU 要做到一样的事情,则需要 2i 个 ReLU。在机器学习里面,Sigmoid 或 ReLU 称为激活函数(activation function)
每次对模型增加函数进行修正,从 x 变成 a,就是把 x 乘上 w 加 b,再通过Sigmoid 函数。可以把 x 做这一连串的运算产生 a,接下来把 a 做这一连串的运算产生 a′
Sigmoid 或 ReLU 称为神经元(neuron),很多的神经元称为神经网络(neural network)。每一排称为一层,称为隐藏层(hiddenlayer),很多的隐藏层就“深”,这套技术称为深度学习。但是随着层数不断增加,可能会出现过拟合的现象。
三、机器学习框架
根据上述的修正过程,我们可以总结出机器学习的基本框架如下:
我们会有一堆训练的数据以及测试数据如式所示,测试集就是只有 x 没有 y。
训练集就要拿来训练模型,训练的过程是 3 个步骤。
1. 先写出一个有未知数 θ 的函数,θ 代表一个模型里面所有的未知参数。
2. 定义损失,损失是一个函数,其输入就是一组参数,去判断这一组参数的好坏;
3. 解一个优化的问题,找一个 θ,该 θ 可以让损失的值越小越好。让损失的值最小的 θ 为θ∗,即
有了 θ∗ 以后,就把它拿来用在测试集上,也就是把 θ∗ 带入这些未知的参数,本来 fθfθ(x)里面有一些未知的参数,现在 θ 用 θ∗ 来取代,输入是测试集,输出的结果存起来上传到Kaggle 就结束了。