01 深度学习到底是什么:从机器学习到神经网络
前言学完一套机器学习入门课程后我们已经可以用线性回归预测连续数值用逻辑回归、决策树或随机森林完成分类也知道如何划分数据、训练模型和评估结果。既然传统机器学习已经能够解决很多问题为什么还要学习深度学习神经网络究竟带来了什么变化它和我们熟悉的线性模型又有什么联系本篇不急着写神经网络代码也不展开复杂公式。我们先建立一张完整的认知地图传统机器学习在什么地方遇到了困难神经网络如何从数据中逐层学习有用的表示以及深度学习为什么适合图像、文本和语音等复杂数据。读完本篇你应该能够判断深度学习适合解决什么问题也应该知道什么时候没有必要使用它。一、从机器学习继续往前走先回顾一个熟悉的监督学习任务。假设我们要根据房屋信息预测房价通常会经历以下步骤收集原始数据整理出面积、房龄、楼层、位置等特征划分训练数据和测试数据选择模型并训练用模型进行预测使用合适的指标评估模型。换成鸢尾花分类流程并没有本质变化。输入可以是花萼长度、花萼宽度、花瓣长度和花瓣宽度输出是花的类别。换成垃圾邮件识别我们仍然需要把每封邮件转换成模型能够处理的数值特征然后训练一个分类器。这套流程非常有效。问题在于其中有一个步骤可能会随着数据变复杂而迅速变难怎样把原始数据变成真正有用的特征在规则整齐的表格数据中特征往往已经比较明确。房屋面积、用户年龄、商品价格、花瓣长度都具有清楚的含义。我们可以结合业务知识选择特征还可以构造“每平方米价格”“最近 30 天购买次数”等新特征。但现实中的数据并不总是整齐的表格。一张照片、一段录音、一篇文章都很难直接概括成几十个由人手工设计的数字。深度学习正是在这类问题中展现出了重要价值。二、传统机器学习遇到的关键问题特征从哪里来1. 表格数据中的特征通常比较直观考虑几个已经熟悉的任务预测房价时可以使用面积、房龄、卧室数量和地理位置判断贷款风险时可以使用收入、负债、工作年限和还款记录对鸢尾花分类时可以使用花萼和花瓣的长度、宽度预测客户是否流失时可以使用消费次数、使用时长和投诉记录。这些特征虽然也需要清洗、筛选和构造但大多可以由人理解也容易放进二维表格。逻辑回归、决策树、随机森林、支持向量机等传统模型很擅长处理这样的输入。2. 图片中的“特征”没有那么容易定义一张彩色图片在计算机中可以看成大量数字。例如一张尺寸为224 × 224 × 3的图片前两个数字表示高度和宽度最后的3表示三个颜色通道。它一共包含 150,528 个数值。单个数值只描述某个位置的颜色强度并不会直接告诉模型“这里是一只耳朵”或“这是一条狗的尾巴”。如果要使用传统方法完成猫狗分类人们可能会尝试设计与边缘、颜色、纹理和轮廓有关的特征。但问题接踵而来猫转了一个角度原来的轮廓特征是否还有效光线变暗后颜色特征是否可靠背景复杂时怎样把动物和背景分开短毛猫、长毛猫和不同品种的狗应该使用同一套规则吗这些问题并非完全无法处理。传统计算机视觉积累了大量优秀的特征设计方法但设计过程需要专业知识而且一套特征未必能适应所有场景。3. 文本和语音也有类似困难垃圾邮件识别可以统计某些关键词出现的次数但只看词频可能忽略语序和上下文。同一句话中的词换一个位置含义可能发生变化同一个词放在不同语境里也可能表达不同意思。语音更加复杂。音量、说话速度、口音、环境噪声都会影响原始信号。仅靠少量人工规则很难覆盖真实世界中的全部变化。这就是深度学习要解决的核心问题之一能否减少对人工特征设计的依赖让模型直接从数据中学到适合当前任务的表示这里并不是说传统机器学习“过时了”。恰恰相反在结构化表格、小数据集、计算资源有限或解释性要求较高的任务中传统方法仍然经常是更合理的选择。深度学习扩展了机器学习能够处理的问题范围但没有抹去原有方法的价值。三、从人工设计特征到自动学习表示1. “表示”是什么意思模型不能直接理解人眼看到的猫、耳朵或文字含义它只能处理数字。因此我们需要用一组数字来描述输入中与任务有关的信息。这种供模型使用的内部描述可以称为数据的表示representation。在房价预测中面积、房龄和楼层就是房屋的一种表示。在垃圾邮件识别中每个词出现的次数也可以构成邮件的一种表示。同一份原始数据可以有不同表示而表示是否合适会直接影响模型能否学到有效规律。传统机器学习常见的做法是先由人设计或选择特征再把这些特征交给模型。模型主要学习“怎样根据已有特征作出预测”。深度学习则希望把更多特征提取工作交给神经网络。训练过程中网络不仅学习最后怎样分类还会调整内部参数逐步形成对当前任务有用的中间表示。这通常称为表示学习representation learning。2. 以图片分类为例理解逐层表示为了建立直觉可以把图片分类过程简化为以下几个层次网络接收图片中的像素数值较前面的层学习对局部变化有反应的表示例如方向、明暗交界或简单纹理后面的层把前一层结果继续组合形成与局部形状或物体部件有关的表示更靠后的层根据这些信息作出类别判断。于是猫狗图片不再需要先由人完整写出“耳朵应该是什么形状”“毛发纹理应该满足什么规则”。网络可以在大量带有正确标签的样本中通过训练调整自己的参数找到有助于区分类别的信息。需要注意这只是一种便于入门的简化描述。真实神经网络中的每一层并不一定严格对应“第一层只看边缘、第二层只看纹理、第三层只看形状”也不是每个内部特征都能被人准确命名。我们真正想表达的是后一层可以在前一层结果的基础上继续组合信息数据的表示会随着层次逐步变化。3. “自动”不等于完全不需要人自动学习表示也不是把数据随意丢给模型一切问题就会自动解决。人仍然需要完成很多重要工作明确任务和标签收集、清洗并检查数据选择合适的模型类型决定如何训练和评估防止数据泄漏和过拟合分析模型错误及其使用边界。深度学习减少的是某些任务中手工规定特征的负担而不是取消整个建模过程。四、人工智能、机器学习与深度学习是什么关系这几个词经常一起出现但它们不是同一个概念。人工智能Artificial IntelligenceAI关注如何让机器完成需要智能的任务例如识别图像、理解语言、规划路径和作出决策。它是一个很大的领域。机器学习Machine LearningML是实现人工智能的一类重要方法。它不要求人把所有判断规则逐条写死而是让模型从数据中学习规律。深度学习Deep LearningDL是机器学习中的一个重要分支主要以多层神经网络为基础从数据中学习表示并完成预测。神经网络Neural Network是一类可学习模型。多层神经网络构成了现代深度学习的核心模型基础。因此深度学习属于机器学习机器学习又是人工智能领域的重要组成部分。并非所有人工智能系统都依赖机器学习也并非所有机器学习模型都是深度学习模型。线性回归、决策树和 KNN 属于机器学习但通常不会被称为深度学习。“神经网络”和“深度学习”也不完全是同义词。一个只有很少层的神经网络仍然是神经网络当我们使用具有多层可学习变换的神经网络解决问题时通常会把它放在深度学习的范围内。五、神经网络并不是凭空出现的神秘模型1. 从熟悉的线性模型开始假设我们只使用房屋面积和房龄预测一个数值。一个非常简化的线性关系可以写成y w1 * x1 w2 * x2 b这个式子要解决的问题是把两个输入特征组合成一个预测结果。其中x1表示第一个输入特征例如房屋面积x2表示第二个输入特征例如房龄w1和w2是权重决定对应特征对结果的影响程度b是偏置用于整体调整预测结果y是模型根据当前参数算出的预测值。式子中的*表示相乘表示相加。整个计算所做的事就是先让每个输入乘以对应权重再把结果与偏置相加。训练线性模型时我们会根据预测误差寻找更合适的w1、w2和b。也就是说模型结构规定了“怎样计算”训练过程负责找出“使用什么参数”。逻辑回归同样会先对输入进行带权组合再把结果转换成适合分类判断的形式。具体转换方式现在不必展开重要的是看见它们与神经网络的共同起点输入经过带参数的计算得到预测参数再通过训练得到调整。神经网络延续了同样的基本思想。它也有输入、参数和输出也需要比较预测与真实答案再根据错误调整参数。神经网络并没有抛弃机器学习的基本流程。2. 神经网络增加了什么线性模型只进行相对简单的输入组合。神经网络会组织大量可学习的计算单元并让它们分层工作前一层的输出成为后一层的输入后一层再对已有信息进行新的变换。一个简单计算单元可以接收若干输入按照权重组合这些输入再产生输出。为了帮助初学者理解人们常把这种计算单元称为“神经元”。它借用了生物神经系统的名称但人工神经元只是数学和程序中的计算结构并不是对真实大脑神经元的精确复制。更完整的神经元还会包含一种用于改变输出形式的处理。它为什么必不可少将在后面的“激活函数”一篇中单独解释。本篇只需要抓住一点一个神经元负责一次可学习计算大量神经元可以被组织成层多层又可以继续组合。六、从一个神经元到神经网络一个典型的神经网络可以从整体上分成三类层输入层接收原始输入。例如房价任务中的多个特征或者图片中的像素数据。隐藏层位于输入和最终输出之间对数据进行一层或多层变换。之所以叫“隐藏”是因为我们通常只直接提供输入和真实答案并不会为每个中间计算结果准备标准答案。输出层产生任务需要的最终结果例如一个预测价格或者每个类别对应的判断分数。多个神经元放在同一层可以同时学习不同的信息把多层连接起来后一层就能继续处理前一层提取出的结果。网络训练时需要寻找的权重和偏置统称为参数。这里仍然能看到传统模型的影子输入没有消失参数没有消失预测和误差也没有消失。主要变化在于神经网络不再只做一次简单映射而是使用多层可学习变换逐步处理数据。七、“深度学习”中的“深度”是什么意思“深度”主要指神经网络中存在多层可学习的表示变换。数据进入网络后会依次经过多层处理每一层都以此前得到的结果为基础产生新的表示。不同资料统计网络层数时可能采用不同约定。例如有的资料只统计带有可学习参数的层有的资料还会按网络模块来描述层数。初学阶段不必纠结某个网络究竟应该算 18 层还是 20 层重要的是理解“深度”背后的思路复杂映射由多级变换逐步构成而不是只依赖一次计算完成。但“更深”不等于“必然更好”更深的网络有潜力表达更复杂的规律网络加深后训练通常会更加困难参数量和计算量可能随之增加模型可能需要更多数据和更长训练时间如果任务本身很简单更复杂的网络反而可能过拟合。网络深度只是模型设计中的一个因素。真正的效果还受到数据质量、网络结构、训练方法和评价方式等多方面影响。八、为什么多层结构能够处理复杂规律很多复杂规律都可以由多个相对简单的步骤组合而成。以人脸识别为例原始图片首先只是像素。直接从单个像素判断一个人是谁几乎没有意义因为同一个人在不同光线、角度和背景下像素值会发生很大变化。如果网络能够先组合邻近像素得到对边缘或局部明暗变化有用的表示再组合这些结果形成轮廓和局部结构最后继续组合眼睛、鼻子等区域之间的关系那么最终判断就可以建立在更高层次的信息上。可以把它理解成一条分阶段处理信息的流水线但这个类比只用于说明“逐步组合”。普通流水线的规则通常由人提前确定而神经网络中许多变换由训练数据推动参数会随着学习过程不断调整。这种逐层组合的能力尤其适合图片、文本和语音图片包含局部空间关系简单视觉模式可以进一步组合成物体结构文本包含词语、语序和上下文关系局部表达可以组合成更完整的含义语音包含随时间变化的信号短时声音模式可以组合成音节、词语和句子信息。这并不意味着每个复杂任务都只能用深度学习完成而是说明多层模型为处理高维、结构复杂的原始数据提供了一种有效途径。九、神经网络是怎样学习的现在先看训练过程的完整地图不讨论内部公式。一次典型的学习循环大致包含以下步骤输入数据把样本交给网络。计算预测网络使用当前参数从输入逐层算出结果。这个从输入走向输出的过程称为前向传播。比较答案把预测结果与真实标签进行比较。计算损失使用损失函数把错误程度转换成一个可用于训练的数值。损失越小通常表示当前预测越接近训练目标但损失与准确率等评价指标并不是同一个概念。确定调整方向通过反向传播分析各个参数对当前错误产生了怎样的影响。这里会用到梯度它可以帮助我们判断参数应该向哪个方向调整。更新参数优化器根据梯度修改网络中的权重和偏置。重复训练用更多样本反复执行这些步骤使参数逐渐适应数据中的规律。这些名词现在只需要知道各自负责什么前向传播负责得到预测损失函数负责衡量错误反向传播和梯度负责传递调整依据优化器负责真正修改参数。当训练结束后我们通常固定已经学到的参数让模型对新数据产生预测。这个使用已训练模型的阶段称为推理inference。训练强调“学习参数”推理强调“使用参数”。它们不会停留在抽象名词上。后续课程会先学习 PyTorch 中的数据形式再分别拆解自动求导、神经元、激活函数、损失函数和优化器最后把它们组合成一个完整的多层感知机MLP。十、深度学习和传统机器学习到底有什么区别下面的比较描述的是常见倾向不是不可打破的规则。同一个任务最终应该选择哪种方法仍然要通过合理实验来判断。比较角度传统机器学习深度学习特征工程通常更依赖人工选择、构造或转换特征可以从数据中逐层学习表示但仍需要数据处理和任务设计常见数据规模在小型和中型数据集上经常很有竞争力往往能从更多数据中受益复杂模型通常也更需要数据擅长的数据类型结构化表格和含义明确的人工特征图片、文本、语音等高维或结构复杂的数据计算资源通常对硬件要求较低训练可能需要更多内存、算力较大任务常使用 GPU训练时间很多模型可以较快完成训练通常更长并且会随模型、数据和硬件规模产生很大差异模型复杂度通常更容易建立强基线调试成本相对较低层数、参数和训练设置较多排查问题可能更复杂可解释性线性模型、浅层决策树等相对容易解释内部表示通常较难直接解释需要额外分析方法常见场景风险评分、业务表格预测、小样本分类等视觉、语音、自然语言、生成任务等例如现在有一个包含几千行数据、几十个结构化特征的二分类任务。逻辑回归、随机森林以及常被用于表格任务的 XGBoost 等方法都可能是非常合理的选择甚至可能比从头训练神经网络效果更好、速度更快、解释更方便。这里的 XGBoost 只作为常见算法名称出现本系列不在此展开它的原理。反过来如果输入是大量原始图片而目标是识别其中的物体人工为每种物体设计一套稳定特征会非常困难。能够学习图像表示的深度神经网络通常更值得尝试。正确的问题不是“哪一种技术更高级”而是“当前数据、目标和资源更适合哪一种方法”。十一、深度学习擅长解决哪些问题深度学习已经应用在许多数据形态和任务中图像分类判断图片属于哪个类别目标检测找到图片中的物体并判断类别图像分割判断每个像素属于哪个区域语音识别把语音信号转换成文字自然语言处理处理文本分类、信息抽取、问答等任务机器翻译在不同语言之间转换文本推荐系统结合用户、物品和交互信息生成推荐时间序列分析具有时间顺序的数据生成式人工智能生成文本、图像、音频等内容大语言模型在大量文本上学习语言规律并执行生成、问答等任务。这些任务使用的模型并不完全相同。后续课程会分别认识用于图像的卷积神经网络CNN、用于序列的循环神经网络RNN和 LSTM再逐步进入 Attention、Transformer 与 GPT。本篇只建立它们在学习路线中的位置不提前讨论具体结构。十二、深度学习也有代价深度学习扩大了机器学习能够处理的问题范围但这份能力不是免费的。1. 对数据的要求可能更高复杂网络包含大量需要学习的参数。如果训练样本太少模型可能只记住训练数据却不能对新数据作出可靠预测。当然预训练和迁移学习可以缓解部分数据压力但它们也有各自的适用条件后续会单独学习。2. 对计算资源的要求可能更高许多传统模型在普通 CPU 上就能快速训练。深度网络需要进行大量数值计算较大任务通常会借助 GPU。不过学习基础概念并不等于一开始就训练大型模型。本系列前期会控制示例规模普通 CPU 环境也能完成大多数基础内容。3. 训练时间和调试成本可能增加网络结构、学习过程和数据处理都会影响结果。模型没有学好时需要检查数据、参数设置、训练流程和评价方法而不是只更换一个算法名称。4. 结果不一定容易解释线性模型的系数或浅层决策树的路径比较容易查看深度网络中的大量参数和中间表示则很难直接转化成人能理解的规则。对于医疗、金融、工业安全等高风险场景性能并不是唯一要求。5. 仍然会过拟合也会继承数据偏差深度学习不会自动消除机器学习中的基本风险。训练数据不完整、标签有误或群体分布存在偏差模型就可能学到不可靠的规律。模型更复杂也不代表这些问题会自行消失。6. 大模型的训练成本很高大型语言模型和生成模型可能需要海量数据、专用硬件、很长训练时间和显著能源成本。理解它们的基本原理与亲自从头训练一个大型模型是两件不同的事。本系列会使用教学规模的示例解释机制不会把普通电脑能够完成的小实验包装成大型模型训练。十三、几个容易混淆的问题深度学习是不是不需要特征工程了更准确的说法是深度学习能够自动学习许多对任务有用的表示因此在图片、文本等任务中减少了手工设计特征的压力。但数据清洗、输入形式、标签质量、任务设计和评价方案依然需要人负责。神经网络层数越多效果就一定越好吗不一定。层数增加会带来更强表示能力的潜力也会增加训练难度和资源消耗。对于简单任务较小模型可能已经足够。网络应该多深需要结合任务和实验结果判断。学习深度学习必须有高性能显卡吗不是。GPU 可以加速大量并行计算但 Tensor、自动求导和小型神经网络等基础内容可以在 CPU 上学习。等项目规模增加后再根据实际需要使用 GPU。神经网络是在模仿人的大脑吗“神经元”“神经网络”等名字受到生物神经系统启发但现代人工神经网络是数学模型和计算程序。用生物大脑做简单类比可以帮助入门却不能把两者视为同一种系统。十四、本系列的学习路线地图后面的内容会沿着一条明确的依赖关系推进大致分为以下阶段使用 PyTorch 建立深度学习开发环境学习 Tensor理解深度学习中的数据和参数如何组织学习自动求导理解 PyTorch 如何为参数更新提供梯度从神经元、激活函数、损失函数和优化器开始搭建并训练神经网络完善数据加载、训练、验证和正则化流程使用 CNN 处理图片使用 RNN、LSTM 等模型处理序列从 Attention 进入 Transformer并理解 GPT 的基本来路用一个综合项目串起数据、训练、评估、保存和推理。这条路线不会在第一篇就塞入所有细节。每个阶段只引入后续真正需要的知识再通过简单、可运行的代码把概念落到实际结果上。十五、为什么选择 PyTorch神经网络包含大量参数和重复计算。如果只依靠基础 Python 手工实现每个步骤不仅代码烦琐也很容易在求导、设备使用和模型组织上出错。因此我们需要一个专门的深度学习开发框架。本系列主要使用 PyTorch原因包括它可以方便地处理深度学习中的多维数据它支持自动求导能够记录计算并帮助获得梯度它提供了搭建和训练神经网络所需的组件它能够在 CPU 上运行也能在条件允许时使用 GPU 加速它的代码执行方式接近普通 Python适合观察每一步发生了什么它同时广泛用于教学、研究和实际开发。本篇不展开 PyTorch 的具体接口。现在可以做的准备只有检查当前 Python 环境python --version这条命令会显示当前终端实际使用的 Python 版本。这里不提供示例版本号避免把别人的环境误当成你的环境。如果电脑上已经安装了 PyTorch还可以新建一个 Python 文件并运行import torch print(torch.__version__)import torch用于导入 PyTorch 的主包torch.__version__是记录当前 PyTorch 版本的属性print()会把这个版本字符串显示在终端中。这段代码只检查安装状态不会创建或训练神经网络。如果出现找不到torch的错误也不必现在尝试各种安装命令下一篇会从环境选择开始完整处理。本章小结回到开头的问题已经会机器学习为什么还要学习深度学习传统机器学习能够有效解决大量问题尤其适合结构化表格、小型数据集、资源有限或需要较强解释性的场景。但面对图片、文本和语音等复杂数据时人工设计一套稳定、通用的特征往往非常困难。深度学习提供的关键能力是让神经网络通过多层可学习变换逐步形成对当前任务有用的数据表示。它没有脱离机器学习的基本框架模型仍然接收数据使用参数产生预测根据误差调整参数再用未见数据检验效果。神经网络只是把大量可学习计算组织成了更有层次的结构。因此深度学习不是传统机器学习的替代口号也不是所有任务的默认答案。选择方法时仍然要看数据类型、数据规模、计算资源、解释要求和实际效果。现在我们已经知道了深度学习要解决什么问题也知道了神经网络训练的大致方向。下一篇《PyTorch 入门搭建第一个深度学习开发环境》将从安装与环境验证开始为后续 Tensor、自动求导和神经网络代码准备一个可靠的运行基础。