type
status
date
slug
summary
tags
category
icon
password
一、深度学习概述
深度学习(Deep Learning, DL)是机器学习(Machine Learning, ML)的子集,而机器学习又是人工智能(Artificial Intelligence, AI)的实现途径。其核心是通过深层神经网络(Deep Neural Networks, DNNs)从大量数据中自动提取特征,模仿人类大脑的信息处理方式,解决复杂的模式识别问题。
1. 深度学习的核心定位
- 层级关系:AI > ML > DL(人工智能是目标,机器学习是手段,深度学习是机器学习的高级形式)。
- 与传统机器学习的关键区别:
- 传统机器学习:依赖人工设计特征(如图像的边缘、纹理),模型仅负责分类/预测(如SVM、决策树)。
- 深度学习:自动提取特征(从原始数据中学习逐层抽象的特征,如从像素到边缘、到物体部件、再到完整物体),模型端到端(End-to-End)处理任务(如CNN处理图像、Transformer处理文本)。
- “黑盒”原因:自动特征提取过程不可解释(无法明确模型“为什么”做出某个预测),但效果远超传统方法。
2. 深度学习的应用领域
深度学习擅长处理高维复杂数据(图像、文本、音频、视频),主要应用包括:
- 图像处理:图像分类(如ImageNet)、目标检测(如YOLO)、图像分割(如U-Net)。
- 自然语言处理(NLP):大语言模型(LLM,如GPT-4)、机器翻译(如Transformer)、情感分析。
- 语音识别:智能客服(如科大讯飞)、语音转文本(如Google Speech-to-Text)。
- 自动驾驶:语义分割(识别行人、车辆、道路标线)、目标跟踪。
- 机器人:视觉导航、抓取任务(如Boston Dynamics的Atlas机器人)。
3. 深度学习的发展历史
深度学习的发展并非一蹴而就,关键节点包括:
- 1950s:感知机(Perceptron)提出,模拟生物神经元,只能处理线性可分问题(如AND、OR)。
- 1969年:Marvin Minsky在《Perceptrons》一书中指出:① 单层感知机无法解决线性不可分问题(如XOR);② 多层感知机缺乏有效训练算法。导致神经网络研究陷入停滞。
- 1980s:反向传播(Back Propagation, BP)算法提出,解决了多层感知机的训练问题,神经网络重新兴起,但受限于算力,模型较浅(仅1-2层隐藏层)。
- 2006年:Geoffrey Hinton提出深度学习概念,通过预训练(Pre-training)和微调(Fine-tuning)解决深层网络的训练问题。
- 2012年:AlexNet(8层CNN)在ImageNet大赛中夺冠(错误率从26%降至15%),标志着深度学习进入实用阶段。其创新包括:① 使用ReLU激活函数(解决梯度消失);② 使用GPU加速(算力提升)。
- 2016年:AlphaGo(深度强化学习)击败人类围棋冠军李世石,证明深度学习在复杂决策任务中的优势。
- 2017年:Transformer模型提出(基于自注意力机制),彻底改变NLP领域,成为LLM的基础。
- 2020年至今:大模型(如GPT-3、PaLM)崛起,通过海量数据和超大规模参数(千亿级)实现通用人工智能(AGI)的突破。
4. 深度学习的优势
- 处理复杂数据:无需人工特征工程,直接从原始数据(如像素、文本)中学习。
- 泛化能力强:深层网络通过逐层抽象,能捕捉数据的本质规律,适应不同场景(如大模型可处理文本、图像、音频)。
- 算力依赖:随着GPU/TPU的普及,深度学习模型的训练效率大幅提升。
二、神经网络
神经网络(Neural Networks)是深度学习的核心模型,模仿生物神经元网络的结构,由大量人工神经元(Artificial Neuron)按层次连接而成。
1. 生物神经元的启发
人类大脑由约1000亿个神经元组成,每个神经元的结构和信息处理过程如下:
- 树突(Dendrite):接收其他神经元的输入信号。
- 细胞核(Cell Body):整合输入信号(加权求和)。
- 轴突(Axon):传递输出信号。
- 突触(Synapse):轴突与其他神经元树突的连接,传递信号的强度由突触权重决定。
信息处理过程:多个信号通过树突传入,细胞核整合信号(若超过阈值),则激活神经元,通过轴突传递输出信号。
2. 人工神经元的结构与数学表示
人工神经元是神经网络的基本构建单元,其核心功能是接收输入→加权求和→非线性激活→输出。
2.1 组成部分
- 输入(Inputs):表示输入数据的特征向量,记为 ( 为特征数)。
- 权重(Weights):表示每个输入对输出的重要性,记为 ( 越大,对应输入 的影响越大)。
- 偏置(Bias):调整输出的截距,记为 b(类似线性方程 中的 ,避免模型仅能拟合过原点的直线)。
- 加权求和(Weighted Sum):将输入与权重相乘后求和,再加上偏置,记为 (向量形式为 )。
- 激活函数(Activation Function):将加权求和的结果 转换为输出 ,引入非线性(否则多层线性网络等价于单层线性网络,无法处理复杂问题)。常见激活函数包括:
- Sigmoid: ,将输入映射到 ,用于二分类输出层。
- ReLU:,解决梯度消失问题,用于隐藏层。
- Tanh: ,将输入映射到 ,用于隐藏层。
- Softmax:,将输入映射到概率分布(和为1),用于多分类输出层。
2.2 数学表达式
人工神经元的输出 可表示为:
其中, 为激活函数。
3. 神经网络的层次结构
神经网络由输入层、隐藏层、输出层组成,层与层之间的神经元全连接(Full Connection)。
3.1 层次定义
- 输入层(Input Layer):接收原始数据(如图像的像素、文本的词向量),不进行计算,神经元数量等于输入特征数(如28×28的图像输入层有784个神经元)。
- 隐藏层(Hidden Layer):位于输入层与输出层之间,负责提取特征(如从像素到边缘、到物体部件)。隐藏层的数量和神经元数量决定了模型的复杂度(隐藏层越多、神经元越多,模型能力越强,但越容易过拟合)。
- 输出层(Output Layer):产生最终预测结果,神经元数量等于任务类别数(如二分类有1个神经元,多分类有C个神经元)。输出层的激活函数由任务类型决定:
- 二分类:Sigmoid(输出概率)。
- 多分类:Softmax(输出概率分布)。
- 回归:线性激活(输出连续值)。
3.2 全连接神经网络(Fully Connected Neural Network, FCNN)
全连接神经网络是最基本的神经网络结构,其特点是每层的神经元与上一层的所有神经元连接(即“全连接”)。
例子:假设输入层有2个神经元 (),隐藏层有3个神经元,输出层有1个神经元。
- 输入层到隐藏层:权重矩阵 (3个神经元,每个神经元有2个权重),偏置 (每个神经元有1个偏置)。隐藏层的输出 ,经过激活函数 得到 。
- 隐藏层到输出层:权重矩阵 ,偏置 。输出层的输出 ,经过激活函数 得到最终输出
向量表示:全连接层的计算可通过矩阵乘法高效实现(利用GPU的并行计算能力)。例如,输入层 ,隐藏层 ,则 (1个样本,3个隐藏神经元)。
4. 神经网络的非线性能力
关键结论:若神经网络中没有激活函数(即线性激活),则多层神经网络等价于单层线性神经网络(无法处理复杂的非线性问题)。
例子:假设有2层线性网络(输入层→隐藏层→输出层),隐藏层无激活函数。则输出 ,等价于单层线性网络 (其中 ,)。
激活函数的作用:引入非线性,使神经网络能够学习复杂的非线性函数(如XOR问题、图像分类)。例如,ReLU激活函数 ( )将负输入置为0,正输入保持不变,从而使神经网络能够学习非线性边界。
5. PyTorch中的神经网络实现
PyTorch是深度学习常用的框架,提供了nn.Linear(线性层,实现全连接)、nn.Sequential(顺序容器,简化模型定义)等工具。
5.1 定义全连接神经网络
方法1:继承nn.Module(灵活,适合复杂模型):
方法2:使用nn.Sequential(简化,适合顺序模型):
5.2 激活函数的使用
PyTorch提供了多种激活函数,可通过nn.Module或torch.nn.functional调用:
- ReLU:
nn.ReLU()
或F.relu()
。
- Sigmoid:
nn.Sigmoid()
或F.sigmoid()
。
- Softmax:
nn.Softmax(dim=1)
(dim=1表示对行归一化)或F.softmax()
。
三、数据准备
数据是深度学习的基石,其质量、多样性及预处理方式直接决定了模型的训练效果与泛化能力。即使拥有最先进的模型架构,若数据存在噪声、分布不均或预处理不当,也无法得到理想的结果。数据准备的核心目标是将原始数据转换为模型可高效处理的张量形式,并通过合理的流程(如划分数据集、数据增强)优化模型的学习过程。
1. 数据准备的一般流程
深度学习中的数据准备通常遵循以下步骤:
- 数据收集:从公开数据集(如ImageNet、MNIST)、自有数据库或爬虫获取数据。
- 数据清洗:处理缺失值(如均值填充、删除)、异常值(如截断、删除)及重复数据,确保数据的完整性与一致性。
- 数据集划分:将数据分为训练集(用于模型训练,占比70%-80%)、验证集(用于调整超参数、监控过拟合,占比10%-15%)、测试集(用于评估模型最终性能,占比10%-15%)。
- 数据预处理:将原始数据转换为张量(Tensor),并进行归一化、标准化等操作,使数据分布更符合模型要求。
- 数据加载:通过数据加载器(DataLoader)批量加载数据,支持多线程加速,适配模型的批量训练需求。
2. PyTorch中的核心数据组件
PyTorch提供了
Dataset
与DataLoader
两个核心组件,用于高效管理与加载数据。2.1 Dataset
:数据集抽象类
Dataset
是PyTorch中所有数据集的基类,定义了数据集的基本接口。自定义数据集时,必须实现以下两个方法:__len__()
:返回数据集的样本数量。
__getitem__(index)
:根据索引index
返回对应的样本(特征张量+标签张量)。
2.2 DataLoader
:批量数据加载器
DataLoader
是迭代器,负责从Dataset
中批量加载数据,支持以下关键参数:dataset
:要加载的数据集(必须是Dataset
实例)。
batch_size
:每次加载的样本数量(如32
、64
,通常取2的幂次以优化GPU计算)。
shuffle
:是否打乱数据顺序(训练时设为True
,避免模型学习数据顺序;测试时设为False
,保持结果可重复)。
num_workers
:用于加载数据的线程数(设为>0
时,用多线程加速数据加载;0
表示主线程加载)。
drop_last
:是否丢弃最后一个不完整的批次(如数据集大小为100,batch_size=32
,则最后一个批次有4个样本,drop_last=True
会丢弃该批次)。
示例:使用
DataLoader
加载数据集3. 数据预处理与增强
数据预处理是将原始数据转换为模型可处理形式的关键步骤,而数据增强则是通过人工生成新样本来增加数据多样性,防止模型过拟合。
3.1 数据预处理
- 归一化(Normalization):将数据缩放到
[0,1]
或[-1,1]
区间,公式为:
- 或使用标准归一化(Z-score):
其中,
μ
为数据均值,σ
为数据标准差。归一化可加速模型收敛,避免特征尺度差异导致的训练不稳定。
- 数据类型转换:将数据转换为
torch.Tensor
(PyTorch模型仅能处理张量)。例如,用torch.tensor()
将numpy
数组转换为张量:
3.2 数据增强
数据增强主要用于图像任务(如分类、检测),通过随机变换生成新样本,提高模型的泛化能力。常见的图像增强方法包括:
- 随机翻转(
RandomHorizontalFlip
/RandomVerticalFlip
):随机水平/垂直翻转图像。
- 随机裁剪(
RandomCrop
):随机裁剪图像的一部分(如从256x256图像中裁剪224x224区域)。
- 随机旋转(
RandomRotation
):随机旋转图像(如±30度)。
- 颜色调整(
ColorJitter
):随机调整图像的亮度、对比度、饱和度与色调。
- 高斯噪声(
GaussianNoise
):向图像中添加高斯噪声,模拟真实场景中的噪声。
PyTorch的
torchvision.transforms
模块提供了上述增强方法,可通过Compose
组合多个变换:4. 常见数据集加载
PyTorch的
torchvision.datasets
模块提供了多种经典数据集的加载接口,如MNIST(手写数字)、CIFAR-10(10类图像)、ImageNet(大规模图像)等,无需手动下载与预处理。4.1 加载MNIST数据集(手写数字分类)
4.2 加载CIFAR-10数据集(10类图像分类)
4.3 加载图片数据集
5. 数据准备的注意事项
- 数据类型:确保特征与标签的张量类型正确(如分类任务的标签用
torch.long
,回归任务的标签用torch.float
)。
- 内存管理:对于大规模数据集(如ImageNet),避免一次性加载所有数据到内存,可使用
Dataset
的延迟加载(Lazy Loading),即__getitem__
方法中动态读取数据(如每次读取一个图片文件)。
- 数据平衡:若数据集存在类别不平衡(如某类样本数量远多于其他类),可通过过采样(增加少数类样本)或欠采样(减少多数类样本)调整数据分布。
- 可重复性:设置随机种子(如
torch.manual_seed(42)
),确保数据划分与增强的结果可重复,便于调试模型。
总结
数据准备是深度学习 workflow 中不可或缺的环节,其核心是将原始数据转换为模型可处理的张量形式,并通过
Dataset
与DataLoader
高效加载。合理的预处理与数据增强能显著提高模型的泛化能力,而正确使用PyTorch的工具能简化数据准备流程,让开发者更专注于模型设计与训练。- 作者:sisui
- 链接:https://www.sisui.me//article/python-deeplearn-Fully-connected
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章