一、分段线性曲线
线性模型也许过于简单,x1 跟 y 可能中间有比较复杂的关系,比如下图例子,蓝色线不管如何设置 w 跟 b,永远制造不出红色线,永远无法用线性模型制造红色线。显然线性模型有很大的限制,这一种来自于模型的限制称为模型的偏差,无法模拟真实的情况。
为此,我们想出了一个办法,蓝线 1 函数斜坡的起点,设在红色函数的起始的地方,第 2 个斜坡的终点设在第一个转角处,让第 1 个蓝色函数的斜坡和红色函数的斜坡的斜率是一样的,这个时候把 0+1 就可以得到红色曲线左侧的线段。
所以红色线,即分段线性曲线(piecewise linear curve)可以看作是一个常数,再加上一堆蓝色的函数。分段线性曲线可以用常数项加一大堆的蓝色函数组合出来,只是用的蓝色函数不一定一样。要有很多不同的蓝色函数,加上一个常数以后就可以组出这些分段线性曲线。如果分段线性曲线越复杂,转折的点越多,所需的蓝色函数就越多。
二、Sigmoid函数
假设 x 跟 y 的关系非常复杂也没关系,就想办法写一个带有未知数的函数。直接写 HardSigmoid 不是很容易,但是可以用一条曲线来理解它,这就涉及到Sigmoid函数,表达式:
调整这里的 b、w 和 c 可以制造各种不同形状的 Sigmoid 函数,用各种不同形状的 Sigmoid函数去逼近 Hard Sigmoid 函数。如果改 w,就会改变斜率。如果改了 b,就可以把这一个 Sigmoid 函数左右移动;如果改 c,就可以改变它的高度。所以只要有不同的 w 不同的 b 不同的 c,就可以制造出不同的 Sigmoid 函数,把不同的Sigmoid 函数叠起来以后就可以去逼近各种不同的分段线性函数;分段线性函数可以拿来近似各种不同的连续的函数。
此外,我们可以不只用一个特征 x1,可以用多个特征代入不同的 c, b, w,组合出各种不同的函数,从而得到更有灵活性(flexibility)的函数。
wij 代表在第 i 个 Sigmoid 里面,乘给第 j 个特征的权重,w 的第一个下标代表是现在在考虑的是第一个 Sigmoid 函数。为了简化起见,括号里面的式子为(转为矩阵形式)
将其改成线性代数比较常用的表示方式为r = b + W x ,Sigmoid 函数得到 a1, a2, a3,即a = σ(r) 上面这个比较有灵活性的函数,如果用线性代数来表示,即y = b + cTa
三、计算Loss(深度学习)
如同我们Task1上计算Loss的办法,这里对向量θ的Loss的计算也是类似的。
之前是 L(w, b),因为 w 跟 b 是未知的。现在未知的参数很多了,再把它一个一个列出来太累了,所以直接用 θ 来统设所有的参数,所以损失函数就变成 L(θ)。损失函数能够判断 θ 的好坏,其计算方法跟刚才只有两个参数的时候是一样的。先给定 θ 的值,即某一组 W, b, cT, b 的值,再把一种特征 x 代进去,得到估测出来的 y,再计算一下跟真实的标签之间的误差 e。把所有的误差通通加起来,就得到损失。
实际使用梯度下降的时候,会把 N 笔数据随机分成一个一个的批量(batch),batchSize的大小也是由我们自己决定的,一次数据处理完后就叫一个epoch。
接下来可以继续改模型,从 x 变成 a,就是把 x 乘上 w 加 b,再通过Sigmoid 函数。不一定要通过 Sigmoid 函数,通过 ReLU 也可以得到 a,同样的事情再反复地多做几次。 所以可以把 x 做这一连串的运算产生 a,接下来把 a 做这一连串的运算产生 a′。反复地多做的次数又是另外一个超参数(深度学习)。注意,w, b 和 w′, b′ 不是同一个参数,是增加了更多的未知的参数。
从下图的实验数据上看,用这种方式进行深度学习确实能够显著降低Loss,在看过的数据上,3 层比 4 层差,但是在没看过的数据上,4 层比较差,3 层比较好,如图 1.25 所示。在训练数据和测试数据上的结果是不一致的,这种情况称为过拟合(overfitting)。
如果用已经训练出来的神经网络预测未知数据。要选 3层的,虽然 4 层在训练数据上的结果比较好,但在没有看过的数据的结果更重要。应该选一个在训练的时候,没有看过的数据上表现会好的模型,所以应该选 3 层的网络。