![深度学习详解:基于李宏毅老师“机器学习”课程](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=1739304956-55MtioDGpeBcAKTclll9FW7Y22dhiIMq-0-2dafcb9513363513419947b2bfb7506d)
(1.29)
旨在看 0 和
哪个比较大,比较大的值会被当作输出:如果
,输出是0;如果
,输出是
. 如图1.18 所示,通过
、
、
可以挪动ReLU的位置和斜率. 把两个 ReLU 叠起来,就可以变成 hard sigmoid函数. 想要用 ReLU,就把前文用到 sigmoid 函数的地方换成
.
![](https://epubservercos.yuewen.com/91F3C0/30654405004700006/epubprivate/OEBPS/Images/tx4121.jpg?sign=1739304956-FL8txzv01JYDqkohcXK89TCWNmbJ8y1I-0-b6dfde9cf06d820514b3d244ae84e754)
图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=1739304956-JIjL8V2kxLBF2TTSDcVGEdEbTBpneD4y-0-c357930087a1d68dff0af553e567e24b)
图1.19 激活函数
当然还有其他常见的激活函数,但 sigmoid 函数和 ReLU 是最为常见的激活函数. 接下来的实验都选择用了 ReLU,显然 ReLU 比较好. 对于使用前56天数据的情况,实验结果如图1.20 所示.
![](https://epubservercos.yuewen.com/91F3C0/30654405004700006/epubprivate/OEBPS/Images/tx4163.jpg?sign=1739304956-qYhQVVWe3AoivWTRJPp0k6NHUWnrEf5z-0-e416674e06c720bcaa06c5997d7311aa)
图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=1739304956-bgztP2nFdfkfXA06cY2kBMUbKoNa9hRo-0-3553e0d76162e49fc09422b67d29bfd5)
图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=1739304956-TpBUHQtGqUMUA1uVqHaNULr4zPE5gyHx-0-c3f7732c1811a27546052bedbc205e25)
图1.22 使用 ReLU 的实验结果
通过3次 ReLU 的实验结果如图1.23 所示,其中红色线是真实数据,蓝色线是预测出来的数据. 看红色线,每隔一段时间,就会有低点,在低点的地方,机器的预测还是很准确的.机器高估了真实的观看次数,尤其是红圈标注的这一天. 这一天有一个很明显的低谷,但是机器没有预测到这一天有明显的低谷,它晚一天才预测出低谷.
![](https://epubservercos.yuewen.com/91F3C0/30654405004700006/epubprivate/OEBPS/Images/tx4315.jpg?sign=1739304956-FOFpwJCTnurnHSHxHNosKvgi9LHq0Gta-0-970ae4142636136f2b91dd520e70d3b7)
图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=1739304956-RPL7UvdEq5sOC59PLmHT9D1J4lX3jKUG-0-75c1392724dfaebec7f07045cf8e26f1)
图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=1739304956-asTSwJGTBfRSv3iU05V9DMdYisFFHNNw-0-d0579e7abd67a49572e2b412e49e5e50)
图1.25 模型有过拟合问题
到目前为止,我们还没有真正发挥这个模型的力量,2021年 2 月 14日之前的数据是已知的.要预测未知的数据,选 3 层的 网络还是 4 层的 网络 呢?假设今天是 2 月 26 日,今天的观看次数是未知的. 如果用已经训练出来的神经网络预测今天的观看次数,就要选 3 层的网络,虽然 4 层的网络在训练数据上的结果比较好,但模型对于它没看过的数据的预测结果更重要.
深度神经网络的训练会用到残差网络(Residual Network,ResNet),这是一种比较有效率的梯度计算方法.