多层感知机

131 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情


最近在学习李沐大神的动手学深度学习这本书,在学习过后也有一些自己的想法和思考,现在写下这篇文章也是对自己学习内容的一种回顾。如果有任何错误的地方请帮忙指出,谢谢大家了!

单层感知机的局限

相信大家对深度学习的入门第一课就是搭建线性神经网络即单层感知机。单层感知机简单的理解就是模型根据输入的数据利用仿射变换生成输出,这里面的仿射变换是带有偏置项的线性变换。单层感知机可以解决一些问题,比如说随着时间的推移酒会变得越发香醇。在这里模型的输入就是时间,输出是酒的香醇程度。
但是单层感知机有很多的局限性,很有可能会遇到线性不可分性。例如我们想要根据体温预测死亡率。 对于体温高于37摄氏度的人来说,温度越高风险越大。 然而,对于体温低于37摄氏度的人来说,温度越高风险就越低。所以我们就需要一个有更多描述性的模型--多层感知机。 mlp.svg

多层感知机

我们可以通过堆叠多个全连接层来构建一个多层感知机。如图所示除了输出层,每一层的输出都是下一层的输入直到生成最后的输出。这个多层感知机有4个输⼊,3个输出,其隐藏层包含5个隐藏单元。输⼊层不涉及任何计算,因此使⽤此⽹络 产⽣输出只需要实现隐藏层和输出层的计算。因此,这个多层感知机中的层数为2。
我们可以很容易发现这样结构的多层感知机本质上还是线性结构的,因为每一层将输入经过线性变换在投入到下一层线性变换中,这样生成的结果是让人失望的,因此我们引入了激活函数。

激活函数(线性到非线性)

激活函数的引入是为了给模型带来非线性因素。多层感知机+激活函数 可以使的网络更加复杂,画出的曲线更加顺滑,这样可以对类别进行更好的区分。
常见的激活函数有ReLU函数

ReLU函数

最受欢迎的激活函数是修正线性单元(Rectified linear unit,ReLU),因为它实现简单,同时在各种预测任务 中表现良好。ReLU提供了⼀种⾮常简单的⾮线性变换。给定元素x,ReLU函数被定义为该元素与0的最⼤值: ReLU(x) = max(x, 0). ReLU所作的事情就是对于输入x,如果x小于0就将值设为0,如果大于0值就保持不变。

x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True) 
y = torch.relu(x) 
d2l.plot(x.detach(), y.detach(), 'x', 'relu(x)', figsize=(5, 2.5))

output_mlp_76f463_15_0.svg

如图所示ReLU函数是分段线性的,并且它的导数值只有两种要么是0,要么是1,这样会在优化的时候表现得很优异。ReLU的变种还有很多,你可以任意选取,只要可以给模型带来非线性因素就好。

因此多层感知机在输出层和输⼊层之间增加⼀个或多个全连接隐藏层,并通过激活函数转换隐藏层的输出。是对单层感知机局限的一种解决方法。