![深度学习详解:基于李宏毅老师“机器学习”课程](https://wfqqreader-1252317822.image.myqcloud.com/cover/19/51893019/b_51893019.jpg)
1.2.2 模型变形
其实还可以对模型做更多的变形,不一定要把 hard sigmoid 函数换成 soft sigmoid函数. hard sigmoid 函数可以看作两个ReLU(Rectified Linear Unit,修正线性单元)的叠加,ReLU先是一条水平的线,到了某个地方经过一个转折点,变成一个斜坡,对应的公式为
![](https://epubservercos.yuewen.com/91F3C0/30654405004700006/epubprivate/OEBPS/Images/tx4035.jpg?sign=1739282009-W9dyoS7TY8mSnlCnaHQngU4m2xeV3GNI-0-8dcca12d4e4964521ce5cd68425d8cd8)
(1.29)
旨在看 0 和
哪个比较大,比较大的值会被当作输出:如果
,输出是0;如果
,输出是
. 如图1.18 所示,通过
、
、
可以挪动ReLU的位置和斜率. 把两个 ReLU 叠起来,就可以变成 hard sigmoid函数. 想要用 ReLU,就把前文用到 sigmoid 函数的地方换成
.
![](https://epubservercos.yuewen.com/91F3C0/30654405004700006/epubprivate/OEBPS/Images/tx4121.jpg?sign=1739282009-PGFNsHFotMVGSmcHYD5M3FZ43NS8sgYK-0-61412135a7867d3e411e5a7e38643b63)
图1.18 ReLU
如图1.19 所示,两个 ReLU才能够合成一个 hard sigmoid函数.要合成 个 hard sigmoid函数,需要
个 sigmoid函数. 如果要用 ReLU 做到一样的事情,则需要
个 ReLU,因为两个 ReLU 合起来才是一个 hard sigmoid函数.表示一个 hard sigmoid 函数不是只有一种做法. 在机器学习里面,sigmoid 函数或 ReLU 称为激活函数(activation function).
![](https://epubservercos.yuewen.com/91F3C0/30654405004700006/epubprivate/OEBPS/Images/tx4155.jpg?sign=1739282009-NuvVsA3PWoTl286HA06l15WxNn5fBRV9-0-1b381a10d60b7bb03f9e355bfa425b14)
图1.19 激活函数
当然还有其他常见的激活函数,但 sigmoid 函数和 ReLU 是最为常见的激活函数. 接下来的实验都选择用了 ReLU,显然 ReLU 比较好. 对于使用前56天数据的情况,实验结果如图1.20 所示.
![](https://epubservercos.yuewen.com/91F3C0/30654405004700006/epubprivate/OEBPS/Images/tx4163.jpg?sign=1739282009-r74gvFC4aIMIXzn7WWc7DMf558o7ZRiC-0-b1e1764ae1816e42896f1bf5e58e92c4)
图1.20 激活函数实验结果
连续使用 10个ReLU作为模型,跟使用线性模型的结果差不多.但连续使用 100 个 ReLU作为模型,结果就有显著差别了. 100 个 ReLU 在训练数据上的损失就可以从 320 降到 280,在测试数据上的损失也低了一些.接下来使用 1000 个 ReLU 作为模型,在训练数据上 损失 更低了一些,但是在模型没看过的数据上,损失没有变化.
接下来可以继续改进模型,如图1.21 所示,从 变成
,就是把
乘上
再加
,最后通过 sigmoid函数(不一定要通过 sigmoid函数,通过 ReLU 也可以得到
). 可以增加网络的层数,将同样的事情再反复多做几次:把
做这一连串的运算产生
,接下来把
做这一连串的运算产生
,等等.反复的次数是另一个超参数.注意,
、
和
、
不是同一组参数,这里增加了更多的未知参数.
![](https://epubservercos.yuewen.com/91F3C0/30654405004700006/epubprivate/OEBPS/Images/tx4300.jpg?sign=1739282009-hmA7MqFklAwcgFRBeWMVNKhuibb166Hf-0-58dc771feeb333ee831447e7958d8efb)
图1.21 改进模型
每多做一次上述的事情,我们就添加了 100 个 ReLU. 依然考虑前 56 天的数据,实验结果如图1.22 所示,对于2017年~ 2020年的数据,如果做两次(2层),损失降低很多,从280 降到 180.如果做3次(3层),损失从 180 降到 140. 而在2021年的数据上,通过3次ReLU,损失从 430 降到了 380.
![](https://epubservercos.yuewen.com/91F3C0/30654405004700006/epubprivate/OEBPS/Images/tx4308.jpg?sign=1739282009-ehTOjbH76a4bgUAEN0gPFuYS1atPAkGG-0-2801f3877b4ab2261b33d6a646417c8d)
图1.22 使用 ReLU 的实验结果
通过3次 ReLU 的实验结果如图1.23 所示,其中红色线是真实数据,蓝色线是预测出来的数据. 看红色线,每隔一段时间,就会有低点,在低点的地方,机器的预测还是很准确的.机器高估了真实的观看次数,尤其是红圈标注的这一天. 这一天有一个很明显的低谷,但是机器没有预测到这一天有明显的低谷,它晚一天才预测出低谷.
![](https://epubservercos.yuewen.com/91F3C0/30654405004700006/epubprivate/OEBPS/Images/tx4315.jpg?sign=1739282009-JarGSKDLuoR4kH9kCK1OrhIn5fzWFRil-0-f1f4afc33b3a62df4f1311c81e0a39ed)
图1.23 使用3次 ReLU 的实验结果
如图1.24 所示,sigmoid 函数或 ReLU 称为神经元(neuron),神经网络(neural network)就是由神经元组成的.这些术语来自真实的人脑,人脑中有很多真实的神经元,很多神经元组成神经网络.图1.24 中的每一列神经元称为神经网络的一层,又称为隐藏层(hidden layer),隐藏层多的神经网络就“深”,称为深度神经网络.
![](https://epubservercos.yuewen.com/91F3C0/30654405004700006/epubprivate/OEBPS/Images/tx4323.jpg?sign=1739282009-pq1yQQTepoU5CyApKZOWx2cBhvNHVVS9-0-12d624cdc674495ffeb6a4e659f67443)
图1.24 神经网络的结构
神经网络正向越来越深的方向发展,2012 年的 AlexNet有 8 层,在图像识别上的错误率为 16.4%. 两年之后的 VGG 有19层,错误率降至 7.3 %.后来的 GoogleNet 有 22 层,错误率降至 6.7%. 残差网络(Residual Network,ResNet)有 152 层,错误率降至3.57%.
刚才只做到 3 层,我们应该做得更深,现在的神经网络都是几百层的,深度神经网络还要更深.但 4 层的网络在训练数据上的损失 是 100,在2021年的数据上的损失是440. 在训练数据上,3 层的网络表现比较差;但是在2021年的数据上,则是4 层的网络表现比较差,如图1.25 所示.模型在训练数据和测试数据上的结果不一致,这种情况称为过拟合(overfitting).
![](https://epubservercos.yuewen.com/91F3C0/30654405004700006/epubprivate/OEBPS/Images/tx4331.jpg?sign=1739282009-z6pACaCGQ38pRjg4GN4sRKxfBOCIOReV-0-b43538b5eddcc019493292cf66da3d78)
图1.25 模型有过拟合问题
到目前为止,我们还没有真正发挥这个模型的力量,2021年 2 月 14日之前的数据是已知的.要预测未知的数据,选 3 层的 网络还是 4 层的 网络 呢?假设今天是 2 月 26 日,今天的观看次数是未知的. 如果用已经训练出来的神经网络预测今天的观看次数,就要选 3 层的网络,虽然 4 层的网络在训练数据上的结果比较好,但模型对于它没看过的数据的预测结果更重要.
深度神经网络的训练会用到残差网络(Residual Network,ResNet),这是一种比较有效率的梯度计算方法.