深度学习入门
简介
如果想对深度学习中的部分内容进行深入的学习和了解,推荐阅读 Pattern Recognition and Machine Learning(Bishop, 2006) 和 Deep Learning(Goodfellow et al. , 2016)
大致将深度学习分为两大类:
-
判别模型。用于建模条件概率 p ( y ∣ x ) p(y|x) p(y∣x) ,即在给定输入𝑥的情况下,输出𝑦的概率。基于输入数据,预测对应的标签。大多应用于需要判断的任务,例如:分类任务和回归任务。
很多情况下分类模型并不直接指定目标类别,而是给每一个备选类别计算一个概率。即判别模型可能不会直接给出一个确定的类别,而是为每个可能的类别计算一个概率分布。
这样做主要是为了便于在训练阶段对模型进行优化。这是因为概率提供了一个连续的、可微的损失函数(如交叉熵损失),而直接的类别预测是离散的,不利于梯度下降等优化算法的使用。
回归任务的输出是连续的数值。只要回归模型基于条件概率建模的,即它预测的是给定输入𝑥的输出𝑦的概率分布,我们就认为它是判别模型。
-
生成模型。用于建模联合概率 p ( x , y ) p(x,y) p(x,y) 。即同时考虑输入 𝑥 和输出 𝑦的概率分布。这种模型试图理解数据的整体结构,并能够生成与原始数据分布相似的新数据。
生成的模型通常对可观测数据的分布进行建模,从而达到生成可观测数据的目的。例如生成对抗网络(GANs),它被用于生成图像、重构图像和对图像去噪。然而类似于GANs的深度学习技术与可观测数据的分布之间没有显示的关系,因为深度学习技术更关注生成的样本和可观测的真实样本之间的相似程度。
- 尽管生成模型对数据的分布进行建模,但深度学习技术(如GANs)并不直接显示地与可观测数据的分布建立关系。相反,它们关注的是生成的样本与真实样本之间的相似度,通常通过判别器网络来衡量。
尽管生成模型和判别模型都可以用于解决分类任务,但判别模型关注的是哪一个标签更适合可观测数据,而生成模型尝试建模可观测数据的分布。生成模型先学会创造数据,再去学习如何判别数据。
- 判别模型:直接对输入数据进行分类,关注于找到最适合输入数据的标签。
- 生成模型:首先学习数据的分布,然后使用这个分布来辅助分类。也就是说,生成模型先学会如何生成数据,然后在此基础上学习如何判别数据。
大多数深度神经网络都是判别模型,因为很多生成类任务在具体实现中都可以简化为分类或者回归问题。
感知器
单输出
神经元是深度神经网络的最基本的单元。
在深度神经网络中,每个神经元与上一层神经元的输出进行聚合,再通过激活函数决定其最终的输出。如果聚集的输入信号足够强,那么激活函数将会“激活”这个神经元,然后这个神经元会将一个高数值的信号传递给下一层神经网络,相对地,如果输入信号不够,那么将以一个低数值的信号传下去。
一般神经网络至少有两层,输入层和输出层。这个网络可以用公式描述
z = w 1 x 1 + w 2 x 2 + w 3 x 3 z=w_{1} x_{1}+w_{2} x_{2}+w_{3} x_{3} z=w1x1+w2x2+w3x3
偏差与决策边界
偏差(bias)是神经元附带的一个额外标量,用来偏移神经网络的输出。它允许神经网络在不激活的情况下也能输出非零值。偏差项对于神经网络的学习能力至关重要,因为它使得模型能够更灵活地适应数据。没有偏差项,神经网络可能无法正确地学习某些模式,特别是当输入数据的均值为零时。
z
=
w
1
x
1
+
w
2
x
2
+
w
3
x
3
+
b
z=w_{1} x_{1}+w_{2} x_{2}+w_{3} x_{3}+b
z=w1x1+w2x2+w3x3+b
偏差可以帮助一个神经网络更好地学习数据。我们需要找到最符合这些数据的权重和偏差。将这些样本数据分成两个不同类别的边界定义为 决策边界
如果是多维情况,这个边界也被称为超平面。
多输出
单层网络也可以有多个输出神经元。
每一个输出都和全部输入相连,所以输出层也被称为密集层(Dense Layer)或全连接层(Fully-Connected(FC) Layer)
z
1
=
w
11
x
1
+
w
12
x
2
+
w
13
x
3
+
b
1
z
2
=
w
21
x
1
+
w
22
x
2
+
w
23
x
3
+
b
2
\begin{aligned}z_1&=w_{11}x_1+w_{12}x_2+w_{13}x_3+b_1\\z_2&=w_{21}x_1+w_{22}x_2+w_{23}x_3+b_2\end{aligned}
z1z2=w11x1+w12x2+w13x3+b1=w21x1+w22x2+w23x3+b2
也可以被矩阵乘法实现
z
=
W
x
+
b
\boldsymbol{z}=\boldsymbol{Wx}+\boldsymbol{b}
z=Wx+b
[ z 1 z 2 ] = [ w 11 w 12 w 13 w 21 w 22 w 23 ] [ x 1 x 2 x 3 ] + [ b 1 b 2 ] \begin{bmatrix}z_1\\\\z_2\end{bmatrix}=\begin{bmatrix}w_{11}&w_{12}&w_{13}\\\\w_{21}&w_{22}&w_{23}\end{bmatrix}\begin{bmatrix}x_1\\\\x_2\\\\x_3\end{bmatrix}+\begin{bmatrix}b_1\\\\b_2\end{bmatrix} z1z2 = w11w21w12w22w13w23 x1x2x3 + b1b2
多层感知器
多层感知器(Multi-Layer Perception,MLP)最初指至少有两个全连接层的网络。
这是一个四个全连接层的多层感知器。在输入层和输出层中间的网络层被隐藏(Hidden),因为一般从网络外面是没有办法接触它们的,所以统称为隐藏层。
相比于只有一个全连接层的网络,MLP可以从更复杂的数据中学习。因为它可以通过隐藏层捕捉到数据的非线性关系。
但拥有更多隐藏层并不意味着一个网路有更强的学习能力。
通用近似定理说得是:一个具有单层隐藏层和足够多神经元的神经网络,配合任何可挤压的激活函数,理论上可以近似任何连续函数(博莱尔可测函数)。但这并不意味着这样的网络是实用的,因为可能非常难以训练。这样的网络可能会非常难以训练或者容易过拟合,因为隐藏层非常大,所以一般的深度神经网络都会有几层隐藏层来降低训练难度。
为什么需要多层网络?多层网络可以通过非线性变换将输入数据映射到一个新的空间,在这个空间中,原本复杂或者非线性的问题可能变得线性可分,从而更容易解决。
通过集合逻辑运算的例子来展示一个网络是怎么估算一个方程的。
考虑逻辑运算:与(AND)、或(OR)、同或(XNOR)、异或(XOR)、或非(NOR)、与非(NAND)
XOR或XNOR的决策边界是不可能被找到的。
因为我们不能用一个线性模型像单个感知器那样直接估算XOR。
用一个拥有一层隐藏层的MLP去估算XOR,这个MLP首先将通过估计OR或NAND运算把 x 1 x_1 x1和 x 2 x_2 x2 转换到一个新的空间,然后在这个转换过的空间里,这些点就可以被一条估算AND的平面分开。
- 第一层(隐藏层)可以学习OR或NAND运算,将输入数据映射到一个新的空间。
- 在这个新的特征空间中,原本非线性可分的数据变得线性可分。
- 第二层(输出层)可以在新的特征空间中使用线性模型来区分数据,例如实现AND运算。
这个被转换后的空间也被称为特征空间。在特征空间中,复杂的问题可能变得简单,使得输出层可以更容易地进行分类或回归任务。
激活函数
矩阵的4则运算都是线性运算符,但是一个线性模型的学习能力还是相对有限的。
- 线性模型难以精确地估算非线性函数,如余弦函数。
在深度神经网络中,激活函数用于引入非线性,使得网络能够学习和表示更复杂的函数。
激活函数是针对每一个元素(Element-Wise)运算的。我们需要激活函数帮助模型获得任意数值的概率向量。
4种常见的激活函数:sigmoid, tanh, ReLU和softmax
-
sigmoid 输出控制在0和1之间。可以放在网络最后一层,做一些分类的任务,以代表0%~100%的概率。
f ( z ) = 1 1 + e − z f(\boldsymbol{z})=\frac1{1+\mathrm{e}^{-\boldsymbol{z}}} f(z)=1+e−z1 -
tanh (hyperbolic tangent ) 把输出控制在-1~1之间。tanh可以在隐藏层中使用来提高非线性。也可以在输出层中使用,比如输出像素值在-1~1的图像
f ( z ) = e z − e − z e z + e − z f(\boldsymbol{z})=\frac{\mathrm{e}^{\boldsymbol{z}}-\mathrm{e}^{-\boldsymbol{z}}}{\mathrm{e}^{\boldsymbol{z}}+\mathrm{e}^{-\boldsymbol{z}}} f(z)=ez+e−zez−e−z
-
ReLU(Rectified Linear Unit, 整流线性单元) 在很多层的网络中 ReLU通常比sigmoid和tanh 性能更好
f ( z ) = { 0 当 z ⩽ 0 z 当 z > 0 f(z)=\begin{cases}0&\text{当 }z\leqslant0\\[2ex]z&\text{当 }z>0&\end{cases} f(z)=⎩ ⎨ ⎧0z当 z⩽0当 z>0- 更容易实现和计算。只需要与0比较。sigmoid和tanh 涉及到指数函数,在大型网络中会更难以计算
- 网络更好优化。ReLU更接近于线性,因为它是由两个线性函数组层,使得它更易优化。
然而ReLU把负数变成0,可能导致输出中信息的丧失。这可能是因为一个不合适的学习速率或者负的偏差导致的。带泄露的**(Leaky)ReLU** 则解决了这个问题。标量 α \alpha α 是一个较小的正数来控制斜率,使得负区间的信息也可以被保留。
f ( z ) = { α z 当 z ⩽ 0 z 当 z > 0 f(z)=\begin{cases}\alpha{z}&\text{当 }z\leqslant0\\[2ex]z&\text{当 }z>0&\end{cases} f(z)=⎩ ⎨ ⎧αzz当 z⩽0当 z>0
有参数的ReLU(PReLU) 和Leaky ReLU 很近似,它把 α \alpha α 看作一个可训练的参数。 -
softmax函数不像前面的激活函数,它会根据前一层网络的输出提供归一化。softmax函数首先计算指数函数 e z e^z ez ,然后每一项都除以这个值进行归一。
f ( z ) i = e z i ∑ k = 1 K e z k f(\boldsymbol{z})_i=\frac{\mathrm{e}^{z_i}}{\sum_{k=1}^K\mathrm{e}^{z_k}} f(z)i=∑k=1Kezkezi
实际运用中,sofamax旨在最后的输出层用来归一输出向量 z z z ,使其变成一个概率向量。这个概率向量的每一个值都为非负数,然后它们的和最终会为1。所以softmax在多分类任务中被广泛使用,用以输出不同类别的概率。