4. 多层感知机
- 多层感知机:最简单的深度网络,由多层神经元组成,每一层都与下面一层(从中接收输入)和上面一层(反过来影响当前层的神经元)完全相连
- 训练大容量模型时,面临着过拟合的风险
4.1. 多层感知机
4.1.1. 隐藏层
- 仿射变换:带有偏置项的线性变换(线性变换:线性空间V到其自身的线性映射)
4.1.1.1. 线性模型可能会出错
- 线性意味着单调假设:特征的任何增大都会导致模型输出增大(如果对应的权重为正),或者导致模型输出减少(如果对应的权重为负)
- 对于深度神经网络,使用观测数据来联合学习隐藏层表示和应用于该表示的线性预测器
4.1.1.2. 在网络中加入隐藏层
通过在网络中加入一个或多个隐藏层来克服线性模型的限制,使其能处理更普遍的函数关系类型
多层感知机(MLP):
- 最简单的方法是将许多全连接层堆叠在一起。每一层都输出到上面的层,直到生成最后的输出
- 把前 L−1 层看作表示,把最后一层看作线性预测器
- 输入层不涉及任何计算,因此使用此网络产生输出只需要实现隐藏层和输出层的计算
- 每个输入都会影响隐藏层中的每个神经元,而隐藏层中的每个神经元又会影响输出层中的每个神经元
- 具有全连接层的多层感知机的参数开销可能会高得令人望而却步, 即使在不改变输入或输出大小的情况下,也可能促使在参数节约和模型有效性之间进行权衡
4.1.1.3. 从线性到非线性
-
单隐藏层多层感知机:
H = X W ( 1 ) + b ( 1 ) O = H W ( 2 ) + b ( 2 ) \begin{aligned} H & = XW^{(1)} + b^{(1)} \\ O & = HW^{(2)} + b^{(2)} \end{aligned} HO=XW(1)+b(1)=HW(2)+b(2)
X ∈ R n × d X \in R^{n \times d} X∈Rn×d表示 n n n个样本的小批量,每个样本具有 d d d个输入(特征)
H ∈ R n × d H \in R^{n \times d} H∈Rn×d表示隐藏层的输出(隐藏表示),具有 h h h个隐藏单元的单隐藏层发。在数学或代码中, H H H也称为隐藏层变量或隐藏变量
隐藏层权重 W ( 1 ) ∈ R d × h W^{(1)} \in R^{d \times h} W(1)∈Rd×h,隐藏层偏置 b ( 1 ) ∈ R 1 × h b^{(1)} \in R^{1 \times h} b(1)∈R1×h
输出层权重 W ( 2 ) ∈ R h × q W^{(2)} \in R^{h \times q} W(2)∈Rh×q,输出层偏置 b ( 2 ) ∈ R 1 × q b^{(2)} \in R^{1 \times q} b(2)∈R1×q,输出 O ∈ R n × q O \in R^{n \times q} O∈Rn×q -
隐藏单元由输入的仿射函数本身给出,而输出(softmax操作前)只是隐藏单元的仿射函数,仿射函数的仿射函数本身就是仿射函数(线性模型已经能够表示任何仿射函数)
-
为了发挥多层结构的潜力,在仿射变换之后对每个隐藏单元应用非线性的激活函数,激活函数的输出为激活值。一般来说有了激活值就不会将多层感知机退化成线性模型:
H = σ ( X W ( 1 ) + b ( 1 ) ) O = H W ( 2 ) + b ( 2 ) \begin{aligned} H &= \sigma(XW^{(1)} + b^{(1)}) \\ O &= HW^{(2)} + b^{(2)} \end{aligned} HO=σ(XW(1)+b(1))=HW(2)+b(2) -
由于 X X X中的每一行对应于小批量中的一个样本,出于记号习惯的考量,定义非线性函数 σ \sigma σ也以按行的方式作用于其输入,即一次计算一个样本
-
应用于隐藏层的激活函数通常不仅仅是按行的,而且也是按元素。 在计算每一层的线性部分之后,可以计算每个激活值,而不需要查看其他隐藏单元所取的值
-
为了构建更通用的多层感知机,可以通过堆叠多个隐藏层,从而产生更有表达能力的模型
4.1.1.4. 通用近似定理
- 多层感知机是通用近似器,即使是网络只有一个隐藏层,给定足够的神经元(可能非常多)和正确的权重,可以对任意函数建模,尽管实际中学习该函数是很困难的
- 通过使用更深(而不是更广)的网络,可以更容易地逼近许多函数
4.1.2. 激活函数
激活函数通过计算加权和并加上偏置来确定神经元是否应该被激活。它们是将输入信号转换为输出的可微运算。大多数激活函数都是非线性的
4.1.2.1. ReLU函数
-
线性整流单元,通俗地说,ReLU函数通过将相应的激活值设为0来仅保留正元素并丢弃所有负元素
R e L U ( x ) = m a x ( x , 0 ) ReLU(x) = max(x,0) ReLU(x)=max(x,0) -
当输入为负时,ReLU函数的导数为0,而当输入为正时,ReLU函数的导数为1
-
当输入值精确等于0时,ReLU函数不可导,默认使用左侧的导数,即当输入为0时导数为0,可以忽略这种情况,因为输入可能永远都不会是0
-
ReLU函数图像
-
ReLU函数导数图像
-
使用ReLU的原因是,它求导表现得特别好:要么让参数消失,要么让参数通过。这使得优化表现得更好,并且ReLU减轻了困扰以往神经网络的梯度消失问题
-
参数化ReLU,ReLU添加了一个线性项,因此即使参数是负的,某些信息仍然可以通过: p R e L U ( x ) = m a x ( 0 , x ) + α m i n ( 0 , x ) pReLU(x) = max(0,x) + \alpha min(0,x) pReLU(x)=max(0,x)+αmin(0,x)
4.1.2.2. sigmoid函数
- 对于一个定义域在 R R R中的输入, s i g m o i d sigmoid sigmoid函数将输入变换为区间 ( 0 , 1 ) (0, 1) (0,1)上的输出。因此,&sigmoid%通常称为挤压函数:它将范围 ( − i n f , i n f ) (-inf, inf) (−inf,inf)中的任意输入压缩到区间 ( 0 , 1 ) (0, 1) (0,1)中的某个值
- s i g m o i d ( x ) = 1 1 + exp ( − x ) sigmoid(x) = \frac{1}{1 + \exp(-x)} sigmoid(x)=1+exp(−x)1
- sigmoid函数是一个自然的选择,因为它是一个平滑的、可微的阈值单元近似
- 将输出视作二分类问题的概率时,sigmoid仍然被广泛用作输出单元上的激活函数(你可以将sigmoid视为softmax的特例)
- sigmoid在隐藏层中已经较少使用,它在大部分时候已经被更简单、更容易训练的ReLU所取代
-
s
i
g
m
o
i
d
sigmoid
sigmoid函数图像
当输入接近0时,sigmoid函数接近线性变换
- s i g m o i d sigmoid sigmoid函数的导数公式: d d x s i g m o i d ( x ) = exp ( − x ) ( 1 + exp ( − x ) ) 2 = s i g m o i d ( x ) ( 1 − s i g m o i d ( x ) ) \frac{d}{dx}sigmoid(x) = \frac{\exp(-x)}{(1 + \exp(-x))^2} = sigmoid(x)(1 - sigmoid(x)) dxdsigmoid(x)=(1+exp(−x))2exp(−x)=sigmoid(x)(1−sigmoid(x))
-
s
i
g
m
o
i
d
sigmoid
sigmoid函数导数图像
当输入为0时,sigmoid函数的导数达到最大值0.25。而输入在任一方向上越远离0点,导数越接近0
4.1.2.3. tanh函数
- tanh(双曲正切)函数将其输入压缩转换到区间 ( − 1 , 1 ) (-1, 1) (−1,1)上
- t a n h ( x ) = 1 − exp ( − 2 x ) 1 + exp ( − 2 x ) tanh(x) = \frac {1 - \exp(-2x)}{1 + \exp(-2x)} tanh(x)=1+exp(−2x)1−exp(−2x)
-
t
a
n
h
tanh
tanh函数图像
当输入在0附近时,tanh函数接近线性变换。函数的形状类似于sigmoid函数,不同的是tanh函数关于坐标系原点中心对称
- t a n h tanh tanh函数导数: d d x t a n h ( x ) = 1 − t a n h 2 ( x ) \frac{d}{dx}tanh(x) = 1 - tanh^2(x) dxdtanh(x)=1−tanh2(x)
- 当输入接近0时,tanh函数的导数接近最大值1。与我们在sigmoid函数图像中看到的类似,输入在任一方向上越远离0点,导数越接近0
-
t
a
n
h
tanh
tanh函数导数图像
4.1.3. 小结
- 多层感知机在输出层和输入层之间增加一个或多个全连接的隐藏层,并通过激活函数转换隐藏层的输出
- 常用的激活函数包括ReLU函数、sigmoid函数和tanh函数