作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。
在之前的文章中介绍了深度学习中用到的数学基础和强化学习的概念,本文将开始介绍现代深度学习中用于解决实际应用的实践。
【一文读懂】深度学习技术谱系:探索生成式AI的核心模型(一) 基础技术图谱
【生成式AI】理解深度学习和机器学习的数学基础:线性代数
【万字长文】理解深度学习和机器学习的数学基础:概率论和信息论
【学习笔记】理解深度学习和机器学习的数学基础:数值计算
【学习笔记】理解深度学习和机器学习的关系
深度前馈网络(Deep Feedforward Networks):简介与核心概念
深度前馈网络(Deep Feedforward Networks),也称为前馈神经网络(Feedforward Neural Networks)或多层感知机(Multilayer Perceptrons, MLPs),是深度学习中最基础且最重要的模型之一。它们被广泛应用于图像识别、自然语言处理、语音识别等领域。本文将基于《深度学习》(Deep Learning)一书中的相关内容,介绍深度前馈网络的基本概念、结构和工作原理。
1. 什么是深度前馈网络?
深度前馈网络是一种人工神经网络,其核心特点是信息单向流动:从输入层经过若干隐藏层,最终到达输出层。与循环神经网络(RNN)不同,前馈网络没有反馈回路,数据不会在网络中循环流动。它的“深度”体现在网络包含多个隐藏层,这些隐藏层使得网络能够学习到数据中的多层次抽象特征。
-
前馈(Feedforward):信息从输入层流向输出层,没有反馈或循环。
-
深度(Deep):网络包含多个隐藏层,能够学习复杂的非线性映射。
2. 深度前馈网络的结构
深度前馈网络通常由以下几部分组成:
(1)输入层(Input Layer)
输入层接收原始数据(如图像像素、文本向量等),并将其传递给第一个隐藏层。输入层的神经元数量通常由数据的维度决定。
(2)隐藏层(Hidden Layers)
隐藏层是网络的核心部分,负责从输入数据中提取特征。每个隐藏层包含若干神经元,神经元之间通过权重连接。隐藏层的数量和每层的神经元数量是超参数,需要根据任务和数据的特点进行调整。
-
深度:隐藏层的数量决定了网络的深度。深度网络可以学习到更复杂的特征,但也更难训练。
-
宽度:每层神经元的数量决定了网络的宽度。宽度网络可以捕捉更多的特征,但计算复杂度较高。
(3)输出层(Output Layer)
输出层生成最终的预测结果。输出层的神经元数量通常由任务的类型决定:
-
二分类问题:1个神经元(使用Sigmoid激活函数)。
-
多分类问题:多个神经元(使用Softmax激活函数)。
-
回归问题:1个或多个神经元(通常不使用激活函数)。
3. 深度前馈网络的工作原理
深度前馈网络的工作原理可以分为以下几个步骤:
(1)前向传播(Forward Propagation)
输入数据通过网络逐层传递,直到输出层生成预测结果。每一层的计算包括线性变换和激活函数:
其中,是权重矩阵, 是输入向量,是偏置向量, 是线性变换的结果,是激活函数,是激活后的输出。
(2)损失计算(Loss Calculation)
使用损失函数衡量预测结果与真实标签之间的差距。常见的损失函数包括:
-
均方误差(MSE):用于回归任务。
-
交叉熵(Cross-Entropy):用于分类任务。
(3)反向传播(Backpropagation)
反向传播算法通过链式法则计算损失函数对每个权重的梯度,并利用梯度下降法更新权重,逐步减少预测误差。
(4)参数更新(Parameter Update)
使用优化算法(如梯度下降、Adam)更新网络参数:
其中, 是学习率, 和 分别是损失函数对权重和偏置的梯度。
实例:使用深度前馈网络学习XOR函数
XOR(异或)问题是一个经典的例子,用于展示单层感知机(Perceptron)的局限性以及多层感知机(MLP)的强大能力。XOR问题简单但具有代表性,能够很好地说明为什么我们需要深度前馈网络。
1. 什么是XOR问题?
XOR(异或)是一个逻辑运算,其真值表如下:
输入 A | 输入 B | 输出 A XOR B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
XOR问题的目标是训练一个模型,使其能够根据输入A和B正确预测A XOR B的结果。
2. 单层感知机的局限性
单层感知机(没有隐藏层)只能解决线性可分的问题。然而,XOR问题是非线性可分的,这意味着无法用一条直线将输出为0和1的样本分开。
-
尝试用单层感知机解决XOR:
单层感知机的形式为:
其中,是激活函数(如阶跃函数), 是权重,是偏置。
无论怎么调整权重和偏置,单层感知机都无法正确分类XOR问题。这是因为XOR问题的输出在二维平面上形成了一个非线性分布(四个点分布在正方形的对角线上)。
3. 使用多层感知机(MLP)解决XOR问题
通过引入一个隐藏层,多层感知机可以解决XOR问题。以下是一个简单的MLP结构:
-
输入层:2个神经元(对应输入A和B)。
-
隐藏层:2个神经元(使用非线性激活函数,如ReLU或Sigmoid)。
-
输出层:1个神经元(使用Sigmoid激活函数,输出0或1)。
4. 具体实现步骤
以下是一个简单的Python实现,使用NumPy库构建一个两层的MLP来解决XOR问题:
import numpy as np
# 定义激活函数(Sigmoid)
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义激活函数的导数
def sigmoid_derivative(x):
return x * (1 - x)
# 输入数据(XOR问题的输入和输出)
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])
# 初始化权重和偏置
np.random.seed(1)
weights0 = 2 * np.random.random((2, 2)) - 1 # 输入层到隐藏层的权重
weights1 = 2 * np.random.random((2, 1)) - 1 # 隐藏层到输出层的权重
bias0 = np.zeros((1, 2)) # 隐藏层的偏置
bias1 = np.zeros((1, 1)) # 输出层的偏置
# 训练参数
learning_rate = 0.1
epochs = 10000
# 训练过程
for epoch in range(epochs):
# 前向传播
hidden_input = np.dot(X, weights0) + bias0
hidden_output = sigmoid(hidden_input)
output_input = np.dot(hidden_output, weights1) + bias1
output = sigmoid(output_input)
# 计算误差
error = y - output
# 反向传播
d_output = error * sigmoid_derivative(output)
error_hidden = d_output.dot(weights1.T)
d_hidden = error_hidden * sigmoid_derivative(hidden_output)
# 更新权重和偏置
weights1 += hidden_output.T.dot(d_output) * learning_rate
weights0 += X.T.dot(d_hidden) * learning_rate
bias1 += np.sum(d_output, axis=0, keepdims=True) * learning_rate
bias0 += np.sum(d_hidden, axis=0, keepdims=True) * learning_rate
# 测试模型
hidden_input = np.dot(X, weights0) + bias0
hidden_output = sigmoid(hidden_input)
output_input = np.dot(hidden_output, weights1) + bias1
output = sigmoid(output_input)
print("Predicted Output:")
print(output)
5. 代码解释
-
前向传播:
输入数据通过隐藏层和输出层,生成预测结果。每一层的计算包括线性变换和激活函数。 -
误差计算:
使用均方误差衡量预测结果与真实标签之间的差距。 -
反向传播:
通过链式法则计算损失函数对每个权重的梯度,并使用梯度下降法更新权重和偏置。 -
训练结果:
经过训练后,模型能够正确预测XOR问题的输出。
6. 运行结果
运行上述代码后,输出结果应该接近XOR问题的真实值:
Predicted Output:
[[0.01]
[0.99]
[0.99]
[0.01]]
这表明模型已经学会了XOR问题的规律。
通过XOR问题,我们可以看到单层感知机的局限性以及多层感知机的强大能力。深度前馈网络通过引入隐藏层和非线性激活函数,能够解决复杂的非线性问题。XOR问题虽然简单,但它很好地展示了深度学习的基本原理和训练过程。
基于梯度的学习:深度学习的核心优化方法
基于梯度的学习是深度学习的核心优化方法,它通过计算损失函数对模型参数的梯度,并利用梯度下降法逐步更新参数,从而使模型能够从数据中学习。
1. 什么是基于梯度的学习?
基于梯度的学习是一种优化方法,其目标是通过最小化损失函数来调整模型参数。损失函数衡量模型预测值与真实值之间的差距,而梯度则指示了损失函数在参数空间中的变化方向。
-
损失函数(Loss Function):
损失函数用于量化模型的预测误差。常见的损失函数包括:-
均方误差(MSE):用于回归任务。
-
交叉熵(Cross-Entropy):用于分类任务。
-
-
梯度(Gradient):
梯度是损失函数对模型参数的偏导数向量。它指示了损失函数在参数空间中的变化方向,即损失函数增加最快的方向。 -
梯度下降法(Gradient Descent):
梯度下降法通过沿着梯度的反方向更新参数,逐步减少损失函数的值。更新公式为:其中,是模型参数, 是学习率, 是损失函数对参数的梯度。
2. 梯度下降法的变体
梯度下降法有多种变体,适用于不同的场景和需求。以下是几种常见的变体:
-
批量梯度下降(Batch Gradient Descent):
使用整个训练集计算梯度,更新参数。优点是梯度计算准确,缺点是计算量大,不适合大规模数据集。 -
随机梯度下降(Stochastic Gradient Descent, SGD):
每次随机选择一个样本计算梯度,更新参数。优点是计算速度快,缺点是梯度波动大,收敛不稳定。 -
小批量梯度下降(Mini-batch Gradient Descent):
每次使用一个小批量样本计算梯度,更新参数。这是深度学习中常用的方法,兼顾了计算效率和梯度稳定性。
3. 梯度下降法的优化技巧
为了提高梯度下降法的性能,研究者提出了许多优化技巧:
-
动量(Momentum):
动量方法通过引入动量项加速梯度下降,减少震荡。更新公式为:
其中, 是动量系数,是动量项。
-
自适应学习率方法:
自适应学习率方法根据参数的梯度动态调整学习率。常见的方法包括:-
AdaGrad:根据历史梯度调整学习率。
-
RMSProp:使用指数加权平均调整学习率。
-
Adam:结合动量和自适应学习率,是目前最常用的优化方法。
-
4. 基于梯度的学习在深度学习中的应用
基于梯度的学习是深度学习的核心优化方法,广泛应用于各种任务和模型。以下是一些典型应用:
-
图像分类:
使用卷积神经网络(CNN)和交叉熵损失函数,通过梯度下降法训练模型,实现图像分类。 -
自然语言处理:
使用循环神经网络(RNN)或Transformer模型,通过梯度下降法训练模型,实现机器翻译、文本生成等任务。 -
强化学习:
使用策略梯度方法,通过梯度下降法优化策略网络,实现智能体在环境中的学习。
5. 基于梯度的学习的挑战
尽管基于梯度的学习在深度学习中取得了巨大成功,但仍面临一些挑战:
-
局部最优:
损失函数可能存在多个局部最优,梯度下降法可能陷入局部最优而无法找到全局最优。 -
梯度消失和梯度爆炸:
在深层网络中,梯度可能在反向传播过程中逐渐消失或爆炸,导致训练困难。 -
超参数调优:
学习率、动量系数等超参数的选择对模型性能有重要影响,但调优过程耗时且复杂。
深度前馈网络中的隐藏单元:关键设计与选择
在深度前馈网络(Multilayer Perceptrons, MLPs)中,隐藏单元(Hidden Units)是网络的核心组成部分。隐藏单元的设计和选择直接影响模型的表达能力、训练效率和最终性能。
1. 隐藏单元的作用
隐藏单元是隐藏层中的神经元,负责接收输入数据并生成输出。它们通过非线性激活函数引入非线性变换,使得网络能够学习复杂的函数映射。隐藏单元的设计决定了网络的表达能力、训练难度和泛化性能。
2. 常见的隐藏单元类型
以下是几种常见的隐藏单元类型及其特点:
(1)ReLU(Rectified Linear Unit)
ReLU是目前最常用的隐藏单元类型,其定义为:
-
优点:
-
计算简单,梯度计算高效。
-
在正区间梯度恒定,缓解了梯度消失问题。
-
在实践中表现良好,广泛应用于各种任务。
-
-
缺点:
-
在负区间梯度为零,可能导致“神经元死亡”问题。
-
(2)Sigmoid
Sigmoid函数将输入映射到0到1之间,其定义为:
-
优点:
-
输出范围有限,适合作为概率输出。
-
-
缺点:
-
梯度在两端接近于零,容易导致梯度消失问题。
-
计算复杂度较高。
-
(3)Tanh
Tanh函数将输入映射到-1到1之间,其定义为:
-
优点:
-
输出以零为中心,有助于加速训练。
-
-
缺点:
-
梯度在两端接近于零,容易导致梯度消失问题。
-
(4)Leaky ReLU
Leaky ReLU是对ReLU的改进,定义为:
其中, 是一个小的正数(如0.01)。
-
优点:
-
在负区间也有梯度,缓解了“神经元死亡”问题。
-
-
缺点:
-
需要手动设置 的值。
-
(5)ELU(Exponential Linear Unit)
ELU是对ReLU的另一种改进,定义为:
-
优点:
-
在负区间有非零梯度,且输出接近零均值,有助于加速训练。
-
-
缺点:
-
计算复杂度较高。
-
(6)Softplus
Softplus函数是ReLU的平滑版本,定义为:
-
优点:
-
处处可导,适合理论研究。
-
-
缺点:
-
计算复杂度较高,实践中较少使用。
-
3. 隐藏单元的选择
隐藏单元的选择取决于任务的特点和数据的分布。以下是一些选择隐藏单元的指导原则:
-
ReLU:大多数情况下,ReLU是默认选择,因其计算高效且表现良好。
-
Leaky ReLU/ELU:如果担心“神经元死亡”问题,可以尝试Leaky ReLU或ELU。
-
Sigmoid/Tanh:在需要输出范围有限的情况下(如概率输出),可以考虑Sigmoid或Tanh,但需注意梯度消失问题。
-
Softplus:适合理论研究,但在实践中较少使用。
4. 隐藏单元的设计技巧
为了提高隐藏单元的性能,研究者提出了许多设计技巧:
-
批量归一化(Batch Normalization):
通过对每一层的输入进行归一化,加速训练过程并提高模型的稳定性。 -
Dropout:
在训练过程中随机丢弃一部分神经元,防止网络过度依赖某些神经元,提高泛化能力。 -
权重初始化:
合适的权重初始化方法(如Xavier初始化、He初始化)可以加速训练并提高模型性能。
深度前馈网络的架构设计:关键原则与实践
在深度前馈网络(Multilayer Perceptrons, MLPs)中,架构设计是决定模型性能的重要因素。合理的架构设计可以提高模型的表达能力、训练效率和泛化能力。
1. 架构设计的基本原则
深度前馈网络的架构设计需要考虑以下几个基本原则:
-
表达能力:
网络的深度和宽度决定了其表达能力。深度网络可以学习到更复杂的函数映射,而宽度网络可以捕捉更多的特征。 -
计算效率:
网络的层数和每层的神经元数量直接影响计算复杂度。需要在表达能力和计算效率之间找到平衡。 -
泛化能力:
网络的复杂度应与任务的复杂度相匹配。过于复杂的网络可能导致过拟合,而过于简单的网络可能导致欠拟合。 -
训练稳定性:
网络的架构设计应有利于梯度传播,避免梯度消失或梯度爆炸问题。
2. 常见的架构设计
以下是几种常见的深度前馈网络架构设计:
(1)全连接网络(Fully Connected Network)
全连接网络是最基本的深度前馈网络架构,每一层的神经元与下一层的所有神经元相连。
-
优点:
-
结构简单,易于实现。
-
适合处理结构化数据(如表格数据)。
-
-
缺点:
-
参数量大,计算复杂度高。
-
对高维数据(如图像、文本)处理效率低。
-
(2)卷积神经网络(Convolutional Neural Network, CNN)
卷积神经网络通过卷积层和池化层提取局部特征,适合处理图像数据。
-
优点:
-
参数共享,计算效率高。
-
能够捕捉局部特征,适合处理高维数据。
-
-
缺点:
-
对非图像数据的处理效果有限。
-
(3)循环神经网络(Recurrent Neural Network, RNN)
循环神经网络通过时间步展开处理序列数据,适合处理文本、语音等序列数据。
-
优点:
-
能够捕捉时间依赖关系。
-
适合处理变长序列数据。
-
-
缺点:
-
训练过程中容易出现梯度消失或梯度爆炸问题。
-
(4)Transformer
Transformer通过自注意力机制处理序列数据,适合处理长序列数据。
-
优点:
-
能够捕捉长距离依赖关系。
-
并行计算效率高。
-
-
缺点:
-
参数量大,计算复杂度高。
-
3. 架构设计的实践技巧
为了提高深度前馈网络的性能,研究者提出了许多实践技巧:
-
深度与宽度的平衡:
深度网络可以学习到更复杂的函数映射,但训练难度较大;宽度网络可以捕捉更多的特征,但计算复杂度较高。需要在深度与宽度之间找到平衡。 -
残差连接(Residual Connection):
残差连接通过跨层连接缓解梯度消失问题,加速训练过程。其定义为:其中,是网络层的输出, 是输入。
-
批量归一化(Batch Normalization):
批量归一化通过对每一层的输入进行归一化,加速训练过程并提高模型的稳定性。 -
Dropout:
Dropout在训练过程中随机丢弃一部分神经元,防止网络过度依赖某些神经元,提高泛化能力。 -
权重初始化:
合适的权重初始化方法(如Xavier初始化、He初始化)可以加速训练并提高模型性能。
反向传播算法:深度学习的核心优化方法
反向传播(Backpropagation)是深度学习中最重要的算法之一,用于训练深度前馈网络(Multilayer Perceptrons, MLPs)。它通过计算损失函数对模型参数的梯度,并利用梯度下降法逐步更新参数,从而使模型能够从数据中学习。
1. 反向传播的基本原理
反向传播的核心思想是利用链式法则(Chain Rule)计算损失函数对模型参数的梯度。具体来说,反向传播包括以下两个阶段:
-
前向传播(Forward Propagation):
输入数据通过网络逐层传递,直到输出层生成预测结果。每一层的计算包括线性变换和激活函数。 -
反向传播(Backward Propagation):
从输出层开始,逐层计算损失函数对每一层参数的梯度,并利用梯度下降法更新参数。
2. 反向传播的详细步骤
以下是反向传播的详细步骤:
(1)前向传播
在前向传播阶段,输入数据通过网络逐层传递,生成预测结果。具体步骤如下:
-
输入数据通过输入层传递到第一个隐藏层。
-
每一层的输出通过线性变换和激活函数生成下一层的输入。
-
最终输出层的输出即为模型的预测结果。
(2)损失计算
使用损失函数衡量预测结果与真实标签之间的差距。常见的损失函数包括:
-
均方误差(MSE):用于回归任务。
-
交叉熵(Cross-Entropy):用于分类任务。
(3)反向传播
在反向传播阶段,从输出层开始,逐层计算损失函数对每一层参数的梯度。具体步骤如下:
-
计算输出层的误差:
其中, 是输出层的误差, 是损失函数, 是输出层的激活值, 是输出层的线性变换结果,是激活函数的导数, 表示逐元素相乘。
-
逐层反向传播误差:
其中,是第层的误差,是第层的权重矩阵,是第层的线性变换结果。
-
计算每一层参数的梯度:
其中, 和 分别是第层的权重矩阵和偏置向量, 是第层的激活值。
(4)参数更新
使用梯度下降法更新每一层的参数:
其中, 是学习率。
深度前馈网络的发展历史
深度前馈网络(Multilayer Perceptrons, MLPs)是深度学习的核心组成部分,其发展历史与神经网络和人工智能的演进密不可分。从早期的理论探索到现代深度学习的繁荣,深度前馈网络经历了多次起伏和突破。以下是深度前馈网络发展历史的关键节点和重要里程碑。
1. 早期探索:神经网络的萌芽(1940s-1960s)
深度前馈网络的起源可以追溯到20世纪40年代,当时的研究者开始尝试用数学模型模拟生物神经元的行为。
-
1943年:McCulloch-Pitts神经元模型
Warren McCulloch和Walter Pitts提出了第一个神经元的数学模型,称为McCulloch-Pitts神经元。这一模型展示了如何用简单的计算单元模拟逻辑运算,为神经网络的理论奠定了基础。 -
1958年:感知机的提出
Frank Rosenblatt提出了感知机(Perceptron),这是第一个可以学习的神经网络模型。感知机通过调整权重来分类输入数据,但其只能解决线性可分的问题。感知机的提出引发了神经网络研究的第一次热潮。
2. 低谷期:感知机的局限性(1970s-1980s)
尽管感知机在早期取得了一些成功,但其局限性很快显现出来。1969年,Marvin Minsky和Seymour Papert在《Perceptrons》一书中指出,感知机无法解决非线性问题(如XOR问题)。这一批评导致神经网络研究进入了低谷期。
-
1974年:反向传播的初步提出
Paul Werbos在他的博士论文中首次提出了反向传播算法(Backpropagation),但当时这一方法并未引起广泛关注。 -
1980年代:Hopfield网络和Boltzmann机
John Hopfield提出了Hopfield网络,这是一种基于能量的模型,能够存储和检索信息。此外,Geoffrey Hinton和Terry Sejnowski提出了Boltzmann机,这是一种基于概率的神经网络模型。这些工作为神经网络的复兴奠定了基础。
3. 复兴期:反向传播的普及(1980s-1990s)
1980年代,反向传播算法被重新发现并广泛应用于神经网络的训练,推动了神经网络研究的复兴。
-
1986年:反向传播的普及
David Rumelhart、Geoffrey Hinton和Ronald Williams在《Parallel Distributed Processing》一书中详细描述了反向传播算法,并将其应用于多层感知机的训练。这一工作使得反向传播成为神经网络训练的标准方法。 -
1989年:万能近似定理
George Cybenko和Kurt Hornik等人证明了万能近似定理(Universal Approximation Theorem),指出具有单隐藏层的神经网络可以近似任何连续函数。这一理论为神经网络的表达能力提供了数学基础。
4. 深度学习的崛起:深层网络的突破(2000s-2010s)
尽管神经网络在1980年代和1990年代取得了一些进展,但由于计算资源的限制和数据集的不足,其应用仍然有限。直到2000年代,随着计算能力的提升和大规模数据集的出现,深度学习开始崛起。
-
2006年:深度信念网络的提出
Geoffrey Hinton提出了深度信念网络(Deep Belief Networks, DBNs),通过无监督预训练和有监督微调的方法,成功训练了深层神经网络。这一工作被认为是深度学习复兴的标志。 -
2012年:AlexNet的突破
Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton提出了AlexNet,在ImageNet图像分类竞赛中取得了显著优势。AlexNet的成功标志着深度学习在计算机视觉领域的突破,并引发了深度学习的热潮。
5. 繁荣期:深度学习的广泛应用(2010s至今)
自2012年以来,深度学习在学术界和工业界取得了巨大成功,广泛应用于图像识别、自然语言处理、语音识别等领域。
-
2014年:生成对抗网络(GANs)
Ian Goodfellow提出了生成对抗网络(Generative Adversarial Networks, GANs),这是一种能够生成高质量数据的神经网络模型。 -
2017年:Transformer模型
Vaswani等人提出了Transformer模型,通过自注意力机制处理序列数据,成为自然语言处理领域的主流模型。