
DL深度学习
更新: 2025/2/24 字数: 0 字 时长: 0 分钟
在本章中,我们将从零开始学习深度学习,并在适当的地方简要介绍与之相关的机器学习概念,毕竟它们都有相通的地方。
初始介绍
在介绍深度学习之前,了解人类学习机制有助于理解深度学习中的概念,如特征提取、模型训练、泛化等。
小孩识图
我们用小孩识图的例子来说明人类的学习机制,以教小孩认识猫咪为例,一个比较好的方法就是给小孩看许多猫咪的图片,以下是小孩一个大致的学习过程:
感知输入:小孩通过视觉接收外界的信息,例如看到猫咪的图片或实物。这一步对应的是人类感官对信息的接收,如视觉、听觉等。
特征提取:通过反复观察,小孩逐渐识别和提取出猫咪的独特特征。这些特征可能包括猫的毛发、四足行走的姿态、尖耳朵、长尾巴等。
模式识别:随着看到的图片和实例逐渐增多,小孩会通过大脑中的记忆和认知系统逐渐建立对“猫咪”这一概念的认知框架。这个过程类似于模式识别,即识别出不同图片中的共性。
反馈与修正:在此过程中,家长或老师给予反馈,帮助小孩纠正认知错误。例如,小孩可能会错误地把狗识别为猫,这时需要家长指正,帮助孩子逐步明确猫咪的独特性。
泛化能力:通过不断的观察和学习,小孩能够在不同的场景和背景下识别出猫咪,甚至在未曾见过的猫咪品种中找到相似特征。这一能力是人类学习中的泛化能力,在深度学习中也称为模型的泛化性。
相似区别
上述小孩识图的学习过程与深度学习的训练过程有很多相似之处,为什么这么讲呢?具体看下面分析:
- 人类学习:人类从出生时大脑就自带神经网络结构,通过与外界的感知和互动,不断调整和优化神经连接,以形成对事物的理解。反应到小孩识图的例子中,小孩通过反复观察和经验积累,逐渐学习如何识别猫咪。
- 深度学习:与人类大脑一样,深度学习也是依靠神经网络进行学习。通过大量的样本数据训练以及不断优化神经网络的权重参数来“学习”数据中的特征,直到能够准确分类或预测,这个过程类似于人类大脑通过经验不断增强对事物的认知能力。
可见,人类学习和深度学习之间有许多相似之处,它们都是通过样本数据进行感知、提取特征和修正错误来提高识别能力。这是因为深度学习的神经网络结构就是受人类大脑神经元系统的启发设计的,可以说深度学习是对人类学习机制的简单模拟,不过当前阶段的深度学习仍然远不如人类大脑的复杂与高效,因此需要依赖大量数据和计算资源来模拟这一过程。
四大步骤
通过小孩识图的类比,我们对深度学习的核心过程有了初步理解。接下来,我们将更详细地探讨深度学习的四个关键步骤。
准备数据集(DataSet)
- 数据收集:从多种来源(如传感器、数据库、网络等)获取数据,数据形式包括图片、文本、音频等。
- 数据清洗:预处理数据,去除噪声,处理缺失值。
- 数据标注:为数据添加标签,以便用于监督学习。
- 数据划分:将数据集分为训练集、验证集和测试集。
- 数据增强:通过旋转、裁剪等方式增加数据多样性。
选择合适的模型(Model)
- 模型选择:根据任务类型选择适合的模型架构,如 CNN 用于图像处理,RNN 用于序列数据。
- 模型设计:定义模型结构,包括输入层、隐藏层、输出层及激活函数。
- 模型初始化:采用合适的权重初始化方法,帮助模型更快收敛。
选择训练方法(Training)
- 定义损失函数:选择适合任务的损失函数,如均方误差或交叉熵。
- 选择优化算法:如梯度下降、Adam 等,用于更新模型权重。
- 设置超参数:确定学习率、批量大小等超参数。
- 模型训练:通过训练集对模型进行训练,不断调整权重。
- 验证与调整:通过验证集监控模型表现,调整超参数避免过拟合或欠拟合。
推理与应用(Inferring)
- 模型评估:使用测试集评估模型性能。
- 模型部署:将训练好的模型部署到实际应用中。
- 推理与预测:使用模型对新数据进行预测。
- 模型监控与维护:定期更新模型,确保其适应新数据需求。
深度学习的整个流程自数据收集开始,通过模型选择、训练再到最终推理与应用,每一步都相互关联。数据的质量、模型的选择、训练的方法都将直接影响模型的推理结果和应用效果,持续监控和调整模型则是确保其在实际应用中保持良好表现的关键。
可能问题
另外,在深度学习的过程中有两个非常重要的概念,它们直接关联到模型的性能和实际应用效果。让我们更深入地探讨一下这两个问题及其解决方案。
过拟合(Overfitting):指模型在训练集上表现得非常好,但在未见过的数据(如测试集或实际应用中的数据)上表现不佳的现象。这通常是因为模型过于复杂,以至于它“记住了”训练数据的噪声和异常,而不是学习到了数据背后的真实规律。解决方案如下:
- 增加数据量:增加训练集的数据量可以帮助模型学习到更多的一般性规律,而不是仅仅记住训练数据的细节。
- 简化模型:减少模型的复杂度,如减少神经网络的层数或节点数,可以减少过拟合的风险。
- 正则化:包括 L1 正则化、L2 正则化(也称为权重衰减)和 Dropout 等技术,它们通过限制模型参数的复杂度来防止过拟合。
- 提前停止:在训练过程中监控验证集(或开发集)上的性能,一旦性能开始下降就停止训练,避免在训练集上过拟合。
- 数据增强:通过对训练数据进行变换(如旋转、缩放、裁剪等)来增加数据的多样性,从而提高模型的泛化能力。
泛化能力(Generalization):指模型对未见过的数据(即与训练集不同的数据)进行准确预测的能力。一个具有良好泛化能力的模型能够在各种情况下都表现良好。解决方案(针对训练集与推理集差别过大的情况):
- 使用与推理集相近的训练集:尽可能收集与实际应用场景相似的数据作为训练集,这可以显著提高模型的泛化能力。
- 领域自适应(Domain Adaptation):当无法直接获得与推理集相似的数据时,可以使用领域自适应技术,通过调整模型或数据来减小训练集和推理集之间的差异。
- 迁移学习(Transfer Learning):利用在相关领域(即与推理集相似但不完全相同的领域)上预训练的模型,并通过在目标领域上进行微调来适应新的任务。
- 集成学习(Ensemble Learning):通过组合多个模型的预测结果来提高整体的泛化能力。每个模型可能在不同的数据子集上表现良好,集成它们可以综合各自的优点。
重要
解决过拟合问题和提高泛化能力是深度学习中至关重要的任务。通过合理的数据处理、模型选择和训练策略,我们可以构建出既准确又泛化能力强的深度学习模型。
主流框架
目前深度学习的算法已经非常复杂了,我们在进行程序编程的时候,不可能从零开始编写,必须得有一些算法已经编写好放在这,这就是所谓的“框架”。在人工智能时代,你拥有了框架,就像你在通信领域你拥有了行业标准一样,你会占有全行业基础性优势。目前,在深度学习领域里已经有几种流行的框架,下面我们会简单介绍这几种框架,以便我们能根据自身业务的实际需求进行选择。
TensorFlow
TensorFlow 是 2015 年由 Google Brain(谷歌大脑)团队开发的开源机器学习框架,支持各种机器学习任务的实现,其高效的计算框架适合大规模构建、训练和部署复杂的神经网络模型,特别是需要跨平台和嵌入式的环境下。TensorFlow 的发布促进了机器学习和深度学习技术的普及和发展,使得更多的个人和企业能够利用这些技术解决实际问题。如今 TensorFlow 已经成为最受欢迎的深度学习框架之一,并且对人工智能领域产生了深远的影响。
Pytorch
Pytorch 是 2016 年由 Facebook 发布的一个开源的基于 Torch 的 Python 机器学习框架,支持 GPU、带有高级功能,可以用来搭建和训练深度神经网络。如果你熟悉 Numpy、Python 以及常见的深度学习概念(卷积层、循环层、SGD 等),会非常容易上手 PyTorch。与 TensorFlow 的大规模构建、训练、部署相比,PyTorch 做大规模、大集群、分布式部署时,需要定制性修改大量的代码,因此它更有利于研究人员、爱好者、小规模项目等快速搞出原型。PyTorch 的发布为深度学习社区带来了一个强调易用性、灵活性和速度的框架,它提供了一种动态计算图,这使得用户可以更加直观定义和修改神经网络模型。除了 Facebook 外,它已经被 X(以前的 Twitter)、CMU 等机构采用。
MXNet
MXNet 是由多个个人和组织(包括 AWS 支持)开发的开源深度学习框架,其灵活性、可扩展性和高效的分布式计算能力,在 2017 年成为了亚马逊 Amazon 官方推荐的深度学习框架。由于 Amazon 的支持,实现了 MXNet 与 AWS 生态系统的无缝集成,特别是在与 Amazon SageMaker(AWS 的机器学习服务)和 EC2 实例配合使用时表现出色。开发者可以轻松地在 AWS 上设置、训练和部署深度学习模型。MXNet 在设计上十分轻量,专注于在推理和训练过程中实现低延迟和高性能,这使得它特别适合在大规模分布式计算和云计算环境中使用,对于 AWS 重度爱好者是一个深度学习利器,方便原型算法设计后进行云侧部署。不过缺点是目前的社区还是比较小,另外学习曲线比 Pytroch 高。
环境搭建
考虑大家是从零开始学习深度学习,因此本知识库选择 Pytorch 深度学习框架进行讲解,因为它相对于 TensorFlow 深度学习框架更加的简单,而且对新手也会更加友好。现在 Caffe2 已经与 Pytorch 合并到了 Pytorch1.0,后期上手基于 Pytorch 的 YOLO 等目标检测框架都会更加容易,环境也可以直接使用。
硬件要求
PyTorch 分为 CPU 版本和 GPU 版本,如果计算机配备了性能较好的 GPU,建议安装 GPU 版本,因为 GPU 的算力显著高于 CPU,可以大幅提高训练效率。推荐的计算机配置如下:
- 显存建议 6GB 以上的 GPU:虽然可以使用 CPU 进行计算,但速度相对较慢。而 GPU 相对于 CPU 拥有更多的计算单元,适用于类型高度统一、相互无依赖的大规模数据并行运算。
- 显卡选择推荐 NVIDIA (N 卡) 型号 1060 及以上:AMD 显卡 (A 卡) 也可以使用,但需要支持 ROCm/MIOpen 框架,相关教程可参考 AMD ROCm 官方文档。
- 使用 Anaconda 环境管理器:根据显卡型号选择对应的 CUDA (N 卡) 或 ROCm (A 卡) 支持库,N 卡 30 系列不支持 CUDA 11 以下版本,CUDA 10 最高支持算力为 7.x。
环境安装
重要提示:PyTorch 分为 CPU 版本和 GPU 版本。在安装过程中,请务必确认安装的是 GPU 版本,否则后续操作可能无法成功。可通过 conda list
查看当前 PyTorch 的版本,如果后缀带有 CPU,则表示安装的是 CPU 版本。
因为后期我们会使用 GPU 来进行深度学习,以下步骤讲解 GPU 版本的 PyTorch 安装流程,分为三个主要步骤:
- 安装 Anaconda 与文件夹权限修改,步骤如下:
- 安装 Anaconda(必选项,基础环境管理器),执行
conda -v
命令若返回版本号,则说明 Anaconda 安装正确。 - 找到 Anaconda 的安装目录,修改文件夹权限,防止出现
InvalidArchiveError
错误。 - 右键点击
Anaconda3
文件夹,选择“属性”,进入“安全”选项卡。 - 选择第一个用户或组中的“Authenticated Users”,若当前文件夹的权限没有达到完全控制,点击“编辑”按钮。
- 在“完全控制”、“修改”后面的框中打勾,点击“应用”按钮。
- 选择第二个用户或组中的“SYSTEM”,重复上面操作,直到有“完全控制”权限,然后点击确定。
- 安装 Anaconda(必选项,基础环境管理器),执行
::: image-group
:::
- 启用虚拟环境并检查更新驱动,步骤如下:
- 先创建虚拟环境,新建一个名称为
MyTorch
的文件夹,在里面创建一个名称为venv
的文件夹,通过命令行进入该文件夹位置,执行如下命令创建 Conda 虚拟环境:conda create --prefix=文件夹路径 python=版本号
。 - 执行命令
conda.bat activate conda环境路径
启动虚拟环境。 - 执行命令
nvidia-smi
查看显卡驱动版本和 CUDA 版本。 - 如果上面显示的显卡驱动版本小于 400,请先自行更新显卡驱动,访问 英伟达官网驱动下载页面 选择相应的显卡型号,操作系统,其他默认,其中的 Notebooks 是指笔记本,点击搜索,下载最新驱动后,进行安装即可。
- 先创建虚拟环境,新建一个名称为
::: image-group
:::
安装 PyTorch 并配置好环境,步骤如下:
科学上网访问 PyTorch 官网,点击导航栏中的 Learn 选项,再选择 Get Started 选项。
在网页下方根据您的操作系统和 CUDA 版本选择合适的安装命令。例如:
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
。将命令复制到命令行中执行,就会自动收集安装 PyTorch 需要的安装包,然后按
y
确认安装。安装完成以后,我们进入 Python 环境,输入下面代码验证是否可用。
python# 导入torch import torch # 检测N卡中的CUDA核心是否能被GPU版本的pytorch使用 print(torch.cuda.is_available())
在 PyCharm 中配置虚拟环境,首先在 Pycharm 中打开
MyTorch
文件夹,点击左上角“File”,选择“Settings”,选择“Python Interpreter”,点击齿轮,选择“Add Python Interpreter”,左侧第一个“Virtualenv Environment”,点击“Existing environment”(已存在的环境),选择venv
文件夹,最后点击 “OK”即可。环境应用好以后,我们新建
test.py
文件,再次使用上面的代码进行验证。若返回为True
就说明 Pycharm 环境配置成功。
::: image-group
:::
可能报错
若报一个找不到指定模块的错误,就按以下步骤进行修复:
- 安装 VS 依赖项。
- 然后在环境里面执行命令
conda install -c peterjc123 vc vs2017_runtime
。 - 最后卸载重装 Numpy 库。