Statistics
38
Views
0
Downloads
0
Donations
Support
Share
Uploader

高宏飞

Shared on 2025-12-29

Author张效捷 著

No description

Tags
pytorch
Language: 中文
File Format: PDF
File Size: 7.0 MB
Support Statistics
¥.00 · 0times
Text Preview (First 20 pages)
Registered users can read the full content for free

Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.

(This page has no text content)
深⼊浅出PyTorch:从模型到源码 1. 第1章 深度学习概念简介 2. 第2章 PyTorch深度学习框架简介 3. 第3章 PyTorch计算机视觉模块 4. 第4章 PyTorch机器视觉案例 5. 第5章 PyTorch⾃然语⾔处理模块 6. 第6章 PyTorch⾃然语⾔处理案例 7. 第7章 其他重要模型 8. 第8章 PyTorch⾼级应⽤ 9. 第9章 PyTorch源代码解析 10. 参考资料
第1章 深度学习概念简介 作为近年来计算机科学的重要研究⽅向之⼀,⼈⼯智能这个概念得到 了学术界和⼯业界的⼴泛追捧。迄今为⽌,⼈⼯智能的研究核⼼依然 是基于⼤数据和⾼性能计算的深度神经⽹络,即我们所称的深度学 习。由于深度学习需要⽤到⼤量的神经⽹络的构建和运算模块,基于 这个需求,⼈们开发了很多深度学习框架,如Caffe、MXNet、 PyTorch和TensorFlow等。这些框架的共同特点是极⼤地简化了深度学 习的神经⽹络的构建过程。为了更好地理解这个框架的内在设计思 路,以及如何使⽤这些框架,这⾥需要对深度学习的概念和术语进⾏ 简要介绍,希望对读者理解本书后续⼏章的内容有所帮助。 1.1 深度学习的历史 1.1.1 深度学习的发展过程 由于PyTorch和深度学习的联系紧密,下⾯回顾⼀下深度学习的历史。 深度学习本质是⼀个前馈神经⽹络(Feed-Forward Neural Network), 因此,它的历史可以追溯到⼈⼯神经⽹络(Artificial Neural Networks,ANN)研究的时期。⼈⼯神经⽹络主要是通过模拟动物的 神经元的运⾏模式来对现实数据进⾏拟合和预测,即通过函数来模拟 信息在神经元中的变换和传输。最早的⼈⼯神经⽹络是20世纪60年代 Frank Rosenblatt发明的感知机(Perceptron)1,通过对输⼊进⾏单层 的线性变换来完成分类。然⽽这个模型并不能解决线性不可分的问 题,对于很多现实问题并不适⽤,因此这个模型很快就被废弃了,从 ⽽造成了⼈⼯神经⽹络研究的低潮。到了20世纪80年代,⼈们的研究 ⼜重新转向⼈⼯神经⽹络,并且开发了多层感知机(Multi-layer perceptron,MLP)2来解决感知机的问题。相⽐简单的感知机,多层
感知机由于增加了⼈⼯神经⽹络的深度,对于相对复杂的函数拟合效 果⽐较好,理论上,根据万能近似定理(Universal Approximation Theorem)3,对于多层感知机来说,只要参数和隐含层的数量⾜够, 就能够拟合任意的连续函数,同时,⼈们也发明了反向传播算法 (Backpropagation algorithm)4来⾼效地优化多层感知机的模型。使⽤ 反向传播算法虽然能够在神经⽹络层数⽐较少的时候有效地优化模 型,但是不适⽤于神经⽹络层数较多的情况,这是由于在较深的⽹络 中使⽤反向传播算法会导致梯度消失(Gradient Vanish)和梯度爆炸 (Gradient Explode)。⽽且相⽐于⼀些⽐较简单的模型,⽐如⽀持向 量机(Support Vector Machine,SVM)5,多层感知机的计算量⽐较 ⼤,模型的准确率也没有明显优势。因此,在20世纪90年代中期前 后,⼈们对这种类型的⼈⼯神经⽹络逐渐失去了兴趣。神经⽹络⽅法 研究的衰退⼀直到了2007年,⼈们发现了如何训练包含⽐较多隐含层 的神经⽹络的⽅法,即深度信念⽹络(Deep Belief Network,DBN) 6。深度信念⽹络的主要特征是叠合多层神经⽹络(可以使⽤限制玻尔 兹曼机(Restricted Boltzmann Machine7,RBM)或者⾃编码器 (Autoencoder8),并且逐层训练这些神经⽹络单元,最后进⾏微调 训练,可以达到训练很深的神经⽹络的⽬的。同时,通过调整神经元 的连接和激活,⼀些新的神经⽹络连接⽅式和激活函数也进⼊了⼈们 的视线,著名的如卷积神经⽹络(Convolution Neural Network, CNN)、循环神经⽹络(Recurrent Neural Network,RNN)、残差⽹ 络(Residue Neural Network),以及新型激活函数如线性整流函数 (Rectified Linear Unit,ReLU)。通过引⼊这些特殊结构的神经⽹ 络,能够使梯度在神经⽹络内部进⾏有效传播,不仅能够训练隐含层 较多的神经⽹络,同时也可以使⽤⽐较多的参数,有效提⾼了模型的 准确率。这⾥需要提到⼀点的是,隐含层的数量在神经⽹络拟合数据 的准确性中起到了关键的作⽤。每个隐含层能够对前⼀层的神经⽹络 的特征进⾏组合,从⽽构造更复杂的特征,并更好地拟合给定的数据
集。因此,⼈们⼀般把现阶段的神经⽹络模型称为深度学习(Deep Learning),反映了这些神经⽹络具有很多隐含层的特点。 1.1.2 深度学习在计算机视觉领域的发展 我们可以从ImageNet⼤规模视觉理解竞赛(ImageNet Large Scale Visual Recognition Challenge,ILSVRC)使⽤的算法和准确率来⼀窥 近年来深度学习的发展趋势。ImageNet是由普林斯顿⼤学的课题组收 集的⼤规模数据集9,主要包含了共计12⼤类和5247⼩类物体的照⽚, 总共有320万张左右的图⽚。ILSVRC竞赛从2010年到2017年⼀共举办 了8次,其任务主要是物体的分类和物体的位置识别,其中任务中使⽤ 的所有数据集(包括训练集、验证集和测试集)都是ImageNet的⼦数 据集。对于这么⼤的训练数据,传统的机器学习⽅法的结果不是很理 想。在ILSVRC10和ILSVRC11的⽐赛中,⼈们主要使⽤的⽅法是尺度 不变特征变换(Scale-invariant feature transform,SIFT)10的⽅法来提 取图像的特征,然后结合SVM算法对图像进⾏分类,这些算法的特点 是参数数量少,⽽且分类错误率相对较⾼。图1.1描述了理解ILSVRC 从2010年到2017年优胜算法的Top 5错误率(即预测前五的图像类别不 正确分类的概率),我们可以看到,从2010年到2011年,图像分类的 错误率⽐较⾼,⽽且降低速度相对缓慢。到了2012年,由于⼈们对于 深度学习模型的逐渐深⼊研究,该年度优胜的模型是基于卷积神经⽹ 络的深度学习模型AlexNet11。该模型的分类错误率降到了16.4%,相 ⽐于2011年有了⼀个质的⻜跃。从此以后,在ILSVRC⽐赛中深度学习 模型⼀直占据着优势地位。值得注意的是,在2015年ResNet的出现使 得该项⽐赛的错误率⾸次降低到了5%以下(图1.1中虚线部分代表⼈ 类对这项任务的识别⽔平),达到了3.56%的错误率。这意味着深度 学习模型通过结构的调节可以有超越⼈类的能⼒。 图1.1 历届ILSVC(2012—2017)优胜模型⼀览表
当然,深度学习在实践中的应⽤远不⽌图像识别这么简单。在计算机 视觉的另⼀个领域,即⽬标检测(Object Detection)领域,深度学习 也得到了⼴泛的应⽤。⽬标检测任务的任务⽬标可以简述如下:在⼀ 张照⽚中找到所有物体的位置,并且对物体进⾏分类。如图1.2所⽰, 在⽬标检测的过程中,主要是把⼀张图⽚分割成若⼲个⼩区域(⿊⾊ 的⽹格),每个⼩区域各⾃找到可能的物体的位置(图1.2中不同⼤⼩ 的候选框),以及对应物体的分类(狗、⾃⾏⻋、汽⻋和相应的位 置)。在基于深度学习的⽬标检测被发明之前(2010—2012),由于 缺乏很好的⽅法来选择有效的候选框,⽬标检测算法处在⼀种计算速 度较慢、准确率也⽐较低的状态。同时,在这个阶段,机器学习算法 的调整对提⾼检测的准确率也⽐较有限。 图1.2 ⽬标检测任务概述 随着深度学习算法被⼤规模应⽤于计算机视觉领域,⼈们也开始在⽬ 标检测算法中应⽤深度学习算法。⼈们发明了⼀系列的算法来产⽣候 选框和对候选框进⾏分类。其中代表性的算法包括RCNN、YOLO和 SSD等。图1.3列举了⼀系列的⽬标检测算法和这些算法在COCO⽬标 检测数据集上的表现。我们可以看到,表现最好的算法能够在该数据 集上达到接近60%的mAP分数(可以粗略地认为图⽚中有60%的物体 被算法识别出来了),⽽且对于⼀张图⽚的识别能够在最少22ms (YOLOv3-320的结果)以内完成。 图1.3 不同⽬标检测模型在COCO数据集上的表现 1.1.3 深度学习在⾃然语⾔处理和其他领域的发展
除在计算机视觉上的优异表现外,深度学习在⾃然语⾔处理(Natural Language Processing,NLP)任务中也得到了⼴泛的应⽤,⽽且在许多 任务中表现优异。在各项⾃然语⾔处理的任务中,机器翻译(Machine Translation)作为⾃然语⾔处理的核⼼任务之⼀,很好地体现了深度学 习模型的强⼤威⼒,⽤于机器翻译的模型称为神经⽹络机器翻译 (Neural Machine Translation,NMT)。早在基于神经⽹络的机器翻译 算法发明之前,⼈们就开始研究基于机器学习和统计模型的机器翻 译,这种机器翻译被称为统计机器翻译(Statistical Machine Translation,SMT)。这个算法的主要原理是创建⼀个源语⾔和⽬标 语⾔对应的数据库,然后构建⼀个机器学习模型根据源语⾔的单词或 词组计算概率最⼤的⽬标语⾔的对应单词或词组。其主要缺点是需要 花费⼤量时间进⾏预处理(构建对应的词汇数据库),⽽且算法很难 考虑整个句⼦中单词之间的相关性(即单词的上下⽂语义)。相⽐之 下,神经⽹络机器翻译不需要复杂的预处理(直接使⽤单词构造词向 量),⽽且能够很容易地考虑上下⽂的单词(使⽤循环神经⽹络或者 注意⼒机制),从⽽有效地提⾼了翻译结果的准确性和流畅性。神经 机器翻译相对于统计机器翻译的优势可以通过图1.4表现出来。从图中 可以看到,神经机器翻译算法(在图中使⽤的是GNMT模型12)相对 于统计机器翻译算法(在图中使⽤的是PBMT模型13)在翻译质量上有 着明显的优势,有的语⾔之间的翻译(⽐如法语到英语之间的翻译) 因为语⾔之间的相似性甚⾄已经接近了⼈类的⽔平。虽然在现阶段的 技术条件下,神经⽹络机器翻译和⼈类的翻译⽔平还有⼀定距离,但 是随着技术的不断进步,可以预⻅在将来,深度学习在机器翻译⽅⾯ 将会逐渐赶上甚⾄超过⼈类的⽔平。 图1.4 不同翻译模型结果的⽐较,GNMT是⼀种NMT模型,PBMT是⼀ 种SMT模型
当然,除了计算机视觉和⾃然语⾔处理这两个领域,深度学习在很多 其他的领域也有着惊⼈的表现。在语⾳识别⽅⾯,LAS模型14和DS (DeepSpeech)模型15等模型均在单词错误率(Word Error Rate, WER)上达到了很低的⽔平,超越了传统的机器学习模型的效果。在 语⾳合成⽅⾯,使⽤Tacotron模型16和WaveNet模型17从⽂本合成语⾳ 的深度学习模型也得到了⼴泛的应⽤,并且达到了接近⼈类声⾳的⽔ 平。另外,随着深度学习研究的逐渐深⼊,深度学习模型也出现在⼀ 些传统上使⽤机器学习模型的领域,并开始逐渐代替机器学习模型的 ⼀些作⽤,⽐如,⼴告和商品的推荐系统,⽐较著名的有Deep Recommender18和Wide&Deep Learning19等。 综上所述,鉴于深度学习在实践中具有很好的效果,⽽且其效果通常 远远好于传统的机器学习⽅法,⼈们正逐渐在不同的领域中使⽤深度 学习的⽅法。同时,笔者也相信,深度学习作为⼀种新兴的技术,在 未来将发挥更⼤的作⽤,为未来⼈⼯智能技术的发展作出重要的贡 献。 1.2 机器学习基本概念 由于深度学习是⼀种特殊的机器学习⽅法,⼀般的机器学习概念对于 深度学习也适⽤。为了能够更好地对深度学习的⼀些概念做阐述,这 ⾥把机器学习的概念作为独⽴的⼀节,希望能够帮助读者更好地理解 深度学习的基本概念。 1.2.1 机器学习的主要任务 ⾸先让我们了解⼀下机器学习的主要任务。⼀般来说,我们可以把这 个任务描述为:给定在现实中获取的⼀系列数据来构建⼀个模型,⽤ 于描述数据的具体分布(这个分布指的是概率论意义上的分布。也就 是说,某些数据可能出现得⽐较频繁,另外⼀些数据可能出现得⽐较
稀少,我们需要描述什么数据⽐较可能出现,并且⽤概率来描述数据 出现的可能性)。在这⾥⽤粗体标出了三个重要的词,下⾯详细介绍 ⼀下这些词的具体意义。 数据是⼈们对周围发⽣的⼀些现象的数字化描述。我们在现实中获取 的数据是各种各样的,⽐如图⽚(计算机使⽤像素的排列来表⽰图 ⽚,其中每个像素可表⽰为三个数值(即红绿蓝(RGB))或四个数 值和透明度(RGBA))、⽂本(计算机使⽤字符串来表⽰⽂本)、 ⾳频(计算机中⼀个⽐较通⽤的格式是使⽤16bit(即65536个值)来 代表声⾳的振幅,按照⼀定采样频率如44.1kHz来组成⼀段⾳频。) 等。这些数据可以分成有标签的(⽐如电影评论的⽂本和⽂本对应的 评价)和没有标签的(⽐如只是⼀段⽂本)。根据能够处理的数据类 型,机器学习的任务⼤致可以分为两类:监督学习(Supervised Learning)和⽆监督学习(Unsupervised Learning)。前者指的是,我 们拥有具体的数据和预测⽬标(标签),需要从数据出发构造具体的 模型预测这些⽬标,当然模型预测越准确越好,其代表的主要任务包 括回归(预测连续的值,如根据历史的⽓温预测未来的⽓温)和分类 (预测离散的值,如根据图⽚预测图⽚描述的具体物体的类型)。后 者指的是,我们只有数据,没有预测⽬标,需要构造具体的模型来找 出数据的具体规律,其代表的主要任务包括聚类(找出相似的多组数 据并把它们归类)。当然,实际上还有介于监督学习和⽆监督学习⽅ 法之间的半监督学习(Semi-supervised Learning),这⾥限于篇幅,就 不具体展开介绍。 我们在机器学习的资料中经常会碰到⼀个概念:模型。⼤多数机器学 习任务的⽬的可以归纳为得到⼀个模型,⽤这个模型来描述给定的数 据。得到这个模型的过程称之为机器学习模型的训练过程。由于篇幅 所限,本书并不打算详细介绍机器学习模型具体有哪些,以及这些模 型具体的应⽤场景等,有兴趣的读者可以参考相关书籍。这⾥主要试 图从概率分布的⾓度来帮助理解⼀下什么是机器学习模型。从概率论
的⾓度说,我们可以认为机器学习模型是⼀个概率分布Pθ(X)(这 ⾥以概率密度函数来代表概率分布),其中X是训练数据,这个概率 分布拥有参数θ=(θ1,θ2,…,θn) (这个参数可以是⼀个或多个, 我们⽤粗体字⺟来代表所有的参数,n代表参数的个数)。机器学习的 任务就是求最优参数θt,使得概率分布Pθ(X)最⼤。我们可以⽤式 (1.1)来代表这个过程,其中argmax函数代表的是取参数使得数据的 概率密度最⼤。求解最优参数θt的过程,我们称之为模型的训练过程 (Training),⽤来训练这个模型的数据集称之为训练集(Training Set),由此得到的模型就可以⽤来做相应的预测。 由于⽤于机器学习的训练集通常有很多条具体数据,我们可以把训练 数据X拆成单条数据的集合,即X=(X1,X2,…,Xn),其中n为数据 的总数⽬,X为数据的批次(batch),X的⼦集称之为数据的迷你批次 (mini-batch)。假设训练数据的单条数据之间相互独⽴,我们可以把 式(1.1)进⼀步展开成式(1.2)。需要注意的是,这⾥把对于独⽴单 条数据的乘积取对数变成了求概率的对数的和,该⽅法是机器学习推 导公式时经常使⽤的⼀个⽅法,我们把整体的求解最优参数θt的过程 称之为极⼤似然估计(Maximum Likelihood Estimation,MLE)。 1.2.2 机器模型的类型 以上的机器学习理论适⽤于所有的机器学习,包括监督学习和⽆监督 学习。对于监督学习来说,我们⾯对的训练集包含输⼊的数据X及其 对应的标签Y。所以我们应该求的是包含了X和Y的⼀个概率分布。根 据概率论的知识可以知道,对应的概率分布(这⾥均以对应的概率密 度函数来指代分布)有两种,即联合概率分布(Joint Distribution)Pθ
(X,Y)和条件概率分布(Conditional Distribution)Pθ(Y|X)。这 两个概率分布的区别在于,前者表⽰的是数据和标签共同出现的概 率,后者表⽰的是在给定数据的条件下,对应标签的概率。根据描述 的概率分布,我们也可以把监督学习的机器学习模型分成两类:⽣成 式模型(Generative Model)和判别式模型(Discriminative Model), 前者基于的是联合概率分布,后者基于的是条件概率分布。⽣成式模 型代表性的有朴素⻉叶斯(Naive Bayes,NB)和隐⻢尔可夫模型 (Hidden Markov Model,HMM)等,判别式模型代表性的有逻辑斯 蒂回归(Logistic Regression,LR)和条件随机场(Conditional Random Fields,CRF)等。除了概率分布形式上的区别,这两类模型 在许多⽅⾯都有区别。⽣成式模型除了能够根据输⼊数据X来预测对 应的标签Y,还能根据训练得到的模型产⽣服从训练数据集分布的数 据(X,Y),相当于⽣成⼀组新的数据,这个也就是名称中的⽣成式 模型的来源。相对⽽⾔,判别式模型就仅能根据具体的数据X来预测 对应的标签Y。⼀般来说,牺牲了⽣成数据的能⼒,判别式模型获取 的是⽐⽣成式模型⾼的预测准确率。⾄于为什么判别式模型的预测准 确率⾼,我们可以通过全概率公式和信息熵公式来说明这个问题。⾸ 先看⼀下全概率公式(1.3)。我们可以看到,相对于条件概率,在计 算联合概率的时候引⼊了输⼊数据的概率分布P(X),⽽这并不是我 们关⼼的(我们只关⼼给定X的情况下Y的分布),于是这个就相对削 弱了模型的预测能⼒。 前⾯是定性的说明,下⾯从定量的⾓度来阐述⽣成式模型和判别式模 型的信息量。⾸先定义⼀下信息熵,如式(1.4)所⽰。如果概率密度 分布相对集中,意味着概率密度包含的信息⽐较少,信息熵就⽐较 ⼩,反之信息熵⽐较⼤。我们可以定义⼀下联合分布的信息熵(⻅式 (1.5))和条件分布的信息熵(⻅式(1.6))。根据条件概率的定 义,可以得到式(1.7)。假如X的分布⽐较离散,⽽且相对均匀,满
⾜H(X)>0(所有的离散分布和很多连续分布满⾜这个条件),可 以得到条件分布的信息熵⼩于联合分布,从对应模型的⾓度上说,我 们可以认为判别式模型⽐⽣成式模型包含的信息更多。这就是判别式 模型⽐⽣成式模型在很多条件下效果好的原因。更多关于判别式和⽣ 成式模型的相关理论可以参考相应的资料20。 1.2.3 损失函数以及模型的拟合 有了关于极⼤似然估计和监督学习的⼀些知识后,我们可以进⼀步考 虑⼀个问题:如何优化机器学习模型?让我们⾸先从回归模型 (Regression)出发。所谓回归模型,可以简单地认为拟合⼀个函数fθ (x),给定输⼊的值Xi,给出对应的⽬标值Yi,其中θ是需要训练的 参数。假设我们的噪声,也就是模型的预测值和对应⽬标值的差值fθ (Xi)-Yi服从⾼斯分布N(0,σ2),其中,σ2是噪声的⽅差,这样就 可以通过极⼤似然估计的⽅法来计算最优的参数θt。整个过程的公式 如式(1-8)〜式(1.10)所⽰,其中,式(1.8)是根据极⼤似然估 计,代⼊⾼斯分布的概率密度函数,可以最后化简得到式(1.9)。这 个公式意味着,在上述的假设条件下,回归模型的极⼤估计可以归结 为求出最优的参数θt,使得模型的预测值和⽬标值差值对于所有训练 数据的平⽅和最⼩。我们把argmin函数中需要优化的函数称之为损失 函数,这个损失函数被称为L2模损失函数(L2-norm Loss Function) 或者⽅均误差函数(Mean Square Error,MSE)。我们可以看到这个 损失函数和正态分布密切相关。当然,如果误差服从其他分布,如拉 普拉斯分布(Laplacian Distribution),最后得到的损失函数称为L1模 损失函数(L1-norm Loss Function),如式(1.10)所⽰。
接下来,我们关注⼀下监督学习的另⼀类问题,即分类问题。对于分 类问题,我们关注的是另外⼀个分布,即多项分布(Multinomial Distribution)。对于这类分布,我们设计的机器学习模型需要输出的 是概率,相应的任务是拟合⼀个函数,给定输⼊的值Xi,给出对应的 ⽬标值的概率,其中k=1,…,L,L是总的分类个数,取0和1两个值 中的⼀个,如果标签是⽬标标签,则为1,否则为0(在L个值中只有 ⼀个为1,其他为0,我们称之为独热编码,即One-hot Encoding)。相 应的概率分布和极⼤似然估计如式(1.11)和式(1.12)所⽰。这⾥之 所以要求最⼩值,是因为⼀般的优化过程都是做极⼩化的优化,⽽相 应的优化⽬标函数(即损失函数)称之为交叉熵(Cross Entropy)。 在训练过程中,我们⼀般会把数据集进⾏⼀定的分割,包括前⾯讲到 的训练集,我们会把数据集分为训练集(Training Set)、验证集 (Validation Set)和测试集(Test Set)。之所以要这样分类,⾸先是 因为备选的模型有很多,同时,选定了⼀种模型,可以调节的超参数 (hyper-parameter,指的是在模型初始化时选定,不随着训练过程变 化的参数,⽐如神经⽹络的层数等,在后⾯会进⼀步提到)也很多, 我们需要实验什么样的模型在什么超参数条件下表现最好,这时就要 使⽤验证集,根据模型在验证集的表现来决定具体使⽤的模型和模型 对应的超参数。⼀般来说,随着训练模型的进⾏,模型的损失函数 (Loss Function,衡量模型预测的结果和真实数据结果的差异,⼀般 来说,这个值越⼩越好,如前⾯提到的L2 Loss和Cross Entropy)在训 练集上将会越来越低,⽽在验证集上将会呈现出先减⼩后增加的情 况,如图1.5所⽰。之所以会这样,是因为在训练模型的过程中,模型 的分布会逐渐趋向训练集的分布,这个在训练集数据能够很好地代表 全体数据的分布时当然是⼀种很好的现象,但是在实际应⽤过程中, 我们得到的训练集数据往往是有限的,⽽且不能完全正确地描述实际 的数据分布,这样就要求我们保持模型具有⼀定的泛化性,即⽤和训
练集不同但数据源⼀致的数据来验证我们得到的模型时,损失函数不 能太⼤。我们可以看到在图1.5直虚线右边的区域,模型已经完全偏向 于训练集,失去了⼀定的泛化性,这个区域称之为过拟合(Over- fitting)区域,相应的左边的位置由于模型还没训练到验证集的损失函 数最低点,我们称之为⽋拟合区域(Under-fitting)。需要注意的是, 过拟合和⽋拟合是模型所处的⼀个状态,发⽣的位置和模型的参数数 ⽬、数据量⼤⼩有关系。⼀般来说,随着数据量增⼤,模型越不容易 过拟合,随着参数数⽬增⼤(即增⼤模型复杂性),模型越容易过拟 合。另外,测试集的存在是为了避免超参数的调节影响到最终的结 果。在实际的应⽤过程中,超参数的调节总是以尽量降低验证集的损 失函数为⽬的,这样验证集就不能作为⼀种很好的评判标准,我们需 要⼀个独⽴的未针对其调节过参数的数据集来验证模型是否有很⾼的 准确率,因此,我们从数据集中独⽴出了测试集,以此来验证模型是 否正常⼯作。在机器学习实践中,可以考虑类似70%、20%、10%的训 练集、验证集、测试集的划分(这⾥的划分仅供参考)。在深度学习 中,由于训练集越⼤越好,可以考虑类似90%、5%、5%的训练集、验 证集、测试集的划分(这⾥的划分仅供参考)。 图1.5 损失函数随着训练时间的变化(实线曲线为训练集的损失函数, 虚线曲线为验证集的损失函数,直线虚线为验证集损失函数最⼩的位 置) 为了消除过拟合的状态,我们需要引⼊参数的先验分布(Prior Distribution),这是因为之前我们在所有的推导中没有假设参数的范 围,因此给了参数很⼤的变动范围,从⽽使得模型更容易过拟合。为 了减⼩过拟合的趋势,我们可以⼈为假设参数服从⼀定的分布,⽐如 ⾼斯分布,这样就能减⼩参数的选择范围。我们称这种⼈为选择的分 布叫参数的先验分布。⼀般来说,可以假设参数θ服从的正态分布。结
合式(1.8),可以得到式(1.13),其中。我们可以看到后⾯加了⼀ 项,即所有的参数平⽅和乘以⼀个常数α。我们称这个⽅法为L2正则 化(Regularization),相应的系数α为正则化系数,正则化系数越⼤, 则正则化的效果越强,参数分布的标准差就越⼩,对应的模型在训练 过程中就会偏向⽋拟合区域,反之,模型则会偏向过拟合区域。这 样,我们通过调节正则化系数,就可以控制模型的拟合情况,使得最 后模型在验证集上尽量得到⾼的准确率。另外需要提到的⼀点是,这 ⾥显⽰的先验分布是正态分布,相应地,如果先验分布为拉普拉斯分 布,这⾥使⽤的正则化就称之为L1正则化,相应的正则化的项则表现 为所有参数值的绝对值的和。 除了加⼊正则项,在深度学习的实践过程中,我们往往会使⽤其他的 功能来避免过拟合,⽐如提前停⽌(Early Stopping),这是因为我们 发现在训练过程中可以通过观察验证集的损失函数是否停⽌下降并开 始上升来判断模型是否到达了过拟合的区域,从⽽避免过拟合的发 ⽣。另外⼀些⼿段,例如,把神经元的数值按照⼀定的概率置为零, 即丢弃(Dropout),以及在优化器中使⽤权重衰减(Weight Decay, 我们会在优化器的部分介绍这个⽅法)也能有效避免模型训练中的过 拟合。这些⽅法的本质原理都是减⼩参数的变化空间,从⽽缩⼩模型 的表⽰范围,最后达到让模型在表⽰训练集数据的同时,也能很好地 泛化到验证集数据的⽬的。 1.3 深度学习基本概念 前⾯简单回顾了机器学习的基础概念,本节将会更进⼀步了解深度学 习的相关概念。⾸先需要了解的是,深度学习是⼀种基于神经⽹络的 机器学习。因此,我们前⾯学到的机器学习的概念可以和深度学习⽆ 缝衔接。另外,由于在神经⽹络模型的计算过程中,会涉及⼤量的向
量、矩阵和张量计算,下⾯先来回顾⼀下相关的线性代数的基础知 识。 1.3.1 向量、矩阵和张量及其运算 ⾸先要介绍的是向量的概念。这⾥把向量定义为⼀⾏或者⼀列数,分 别称之为⾏向量和列向量,如式(1.14)和式(1.15)所⽰(这⾥⽤T 代表转置,意思是⾏列互换)。向量是最基本的⼀种数据排列⽅式, 组成向量的每个数称为向量的分量,这⾥⽤a1,a2,…,an来表⽰, 其中的n代表向量分量的数⽬,即向量的⼤⼩。在⼏何上,向量可以看 作ℝn空间中的⼀个⽅向,其中向量的每个分量代表向量在某个坐标 (⽐如,当n等于3时可以认为是在空间x、y、z坐标上)上分量的⼤ ⼩。我们定义向量和实数的乘法为向量的每⼀个分量乘以该实数得到 ⼀个新向量,向量与向量的加减法为向量每个元素⼀⼀对应相加减 (仅对分量数⼤⼩相等的向量有意义)。向量与向量之间⼀个重要的 运算是点积(Dot Product),或者称之为内积(Inner Product),表现 为两个相同⼤⼩的向量按分量相乘并且求和。我们把向量与⾃⾝内积 的平⽅根称之为向量的⻓度(或模,即前⾯提到的L2-norm),两个 向量的内积等于向量的模⻓乘以向量之间夹⾓的余弦,如式(1.16) 所⽰。 向量相当于把数排成⼀维的⼀条线,当我们把数排列成⼀个平⾯的时 候,就有了矩阵的概念。所谓矩阵,就如前⾯所说,是把数按照矩形 的形状排列成⼀个⼆维的结构,如式(1.17)所⽰。这⾥展⽰了⼀个 m×n的矩阵a,其中m是矩阵的⾏数,n是矩阵的列数。和向量⼀样,我 们可以定义矩阵的转置操作,如式(1.18)所⽰,⼀个m×n的矩阵a的 转置是⼀个n×m的矩阵。同向量⼀样,矩阵和实数的乘法得到⼀个新 矩阵,该矩阵的每个元素等于原来的矩阵对应位置的元素乘以该矩 阵,矩阵的加减法同样定义为对应元素相加减得到的新矩阵(两个相
加减的矩阵⾏列数必须相等)。矩阵的另⼀个⽐较重要的操作称为矩 阵乘法,我们定义⼀个m×n的矩阵c为⼀个m×k⼤⼩的矩阵a和k×n的矩 阵b的乘积(这⾥注意矩阵a的列数和矩阵b的⾏数必须相等,否则乘法 ⽆意义)。矩阵c的每个分量定义如式(1.19)所⽰。我们可以看到, c矩阵的每个元素等于a矩阵对应的⾏和b矩阵对应的列,按照元素⼀⼀ 对应的乘积的和。如果把a矩阵的⾏和b矩阵的列分别看作⼀个向量, 则c矩阵的元素的值是这两个向量的内积。矩阵的乘法由于和线性⽅程 的变量替换有关,我们也把矩阵的乘法称为线性变换。这⾥需要注意 的是矩阵的乘法和⼀般的乘法不同,⼀般不满⾜交换律,但是满⾜结 合率,即ab≠ba,(ab)c=a(bc)。 我们把⾏和列数⽬相等的矩阵称为⽅阵。当⼀个⽅阵对⾓线都为1,剩 下的元素都为0时,我们称这个⽅阵为单位矩阵,如式(1.20)所⽰。 单位矩阵和任意矩阵的乘积(⽆论是左乘还是右乘)等于该任意矩阵 本⾝的公式(1.21)。我们定义⼀个(可逆)⽅阵的逆是和该矩阵乘 积为单位矩阵的⼀个矩阵。需要注意的是,有些⽅阵不可逆,这个涉 及⾏列式的操作(⽤det来表⽰取矩阵的⾏列式,可以认为是把⽅阵映 射为⼀个实数的函数),详细内容可以参考线性代数的相关书籍。我 们把⽅阵对⾓线元素的和称为⽅阵的迹,⽤tr函数来表⽰,如式(1- 22)所⽰。 我们可以把数字的排列进⼀步推⼴为张量(Tensor)。作为张量的特 例,向量可以看作⼀维张量,矩阵可以看作⼆维张量,三维的张量可 以看作数字排列成⻓⽅体。更⾼维的张量虽然我们⽆法想象,但是可 以根据前⾯的例⼦推理得到。举例来说,我们可以把⿊⽩图⽚看作⼀ 个⼆维矩阵,其两个维度分别为图⽚的⾼h和图⽚的宽w,⽽彩⾊图⽚ 由于有RGB(即红绿蓝)三个通道,可以看作⼀个三维张量,即
h×w×c,其中h是图⽚的⾼度,w是图⽚的宽度,c是图⽚的通道数⽬ (c=3)。⼀个三维张量可以看成多个⼆维张量的堆叠,如前⾯所⽰的 彩⾊图⽚可认为是三个单通道图⽚的堆叠。同理,我们可以把多个三 维张量堆叠在⼀起形成四维的张量。在进⾏深度学习过程中,我们经 常会⽤到四维张量,增加的⼀个维数称为迷你批次(mini-batch)的⼤ ⼩,可以认为是每次输⼊深度学习神经⽹络的图⽚的数⽬。根据四维 张量四个维度的排列⽅式可以分为NCHW和NHWC两种,前⼀种代表 的意思是输⼊神经⽹络的张量的⼤⼩是迷你批次的⼤⼩×通道数⽬×图 ⽚⾼度×图⽚宽度,后⼀种代表的意思是输⼊神经⽹络的张量⼤⼩是 迷你批次的⼤⼩×图⽚⾼度×图⽚宽度×通道数⽬。不同的深度框架可 能会采⽤不同的排列⽅式,需要根据具体使⽤的框架来决定具体的维 数排列应该是什么。图1.6展⽰了向量、矩阵、三维张量的元素排列⽅ 式,读者可以根据这些元素排列的形状来想象更⾼维的张量应该是什 么样的。向量、矩阵和张量是深度学习的基础,很多深度学习的运算 涉及向量和矩阵的加法和乘法。 另外,这⾥可以补充⼀点知识,作为前⾯的向量、矩阵和张量之间关 系的进⼀步说明。实际上,我们可以在向量的基础上添加⼀个维度, 让向量成为矩阵,矩阵上添加⼀个维度,让矩阵成为(三维)张量。 具体地说,假如向量的⼤⼩为m,我们可以直接把这个向量转换为m×1 或者1×m的矩阵(即增加⼀个维度,保持元素不变)。同理,如果有 ⼀个m×n⼤⼩的矩阵,我们可以⾃由选择增加在某⼀个维度,使之成 为m×n×1或者m×1×n或者1×m×n的三维张量,⽽保持其中的元素不 变。 图1.6 向量、矩阵和三维向量⽰意图(每个格⼦代表⼀个浮点数) 在深度学习的神经⽹络的构造过程中,我们经常会碰到各种各样的线 性变换,⽽这些线性变换的过程主要分成两类,⼀类是对于张量(包
括向量和矩阵)的线性变换,另⼀类是张量的逐点(Point-wise)变 换。举⼀个具体的例⼦,假如有⼀个⻓度为n的向量,需要转换为⻓度 为m的向量,这时可以根据前⾯的知识,使⽤⼀个⼤⼩为m×n的矩阵来 对其进⾏变换,因为我们知道,m×n的矩阵乘以n×1的矩阵(亦即⻓度 为n向量),结果能够得到m×1的矩阵(即⻓度为m向量)。在实践 中,神经⽹络的基本构建可以使⽤各种层来表⽰,其中⼀些重要的层 如卷积层(Convolution Layer)和线性层(Linear Layer)可以直接通 过线性变换和矩阵乘法来计算,我们将会在后续章节介绍相关内容。 关于张量的逐点计算,相对于前⾯的线性变换的概念⽐较简单⼀点, 即对输⼊张量的每⼀个分量(数字)进⾏相同的运算,⽐如都乘以⼀ 个数(或者形状相同的张量的对应分量),或者都应⽤⼀个(⾮线 性)函数,最后输出⼀个与输⼊张量形状相同的新张量,即对于张量 应⽤激活函数(Activation Function)的过程。我们也将在后⾯章节陆 续介绍相关内容。⼀般来说,在神经⽹络的构建过程中,都是⼀系列 的线性变换和⾮线性的激活函数的运算交错进⾏叠加,最后构造出⼀ 个含有很多参数的⾮线性模型,其中,可训练的参数是线性变换的系 数。 1.3.2 张量的存储 在整个深度学习的过程中,由于我们会不断地和张量打交道,这⾥需 要进⼀步阐述⼀下张量在内存中的表⽰和存储⽅法。假如有⼀个k维的 张量,它的维数为(n1,n2,…,nk),由于计算机的内存是连续的 地址空间,所以在实际存储过程中存储的是1维的向量,这个向量在内 存中的⼤⼩为n1×n2×…×nk。实际数值的排列⽅式可以从两个⽅向开始 (从n1到nk或者从nk到n1),⼀般选择从nk这个维度开始,由⼩到⼤排 列这个向量,即先填满nk的维度,再逐渐填满nk-1,直到n1的维度。假 设有1个元素,它在张量中的具体下标是(i1,i2,…,ik),那么它在 内存中是第i1×(n2×n3×…×nk)+i2×(n3×..nk)+…+ik-1×nk+ik个元素,
我们称每个维度位置乘以的系数,即(n2×n3×…×nk), (n3×..nk),…,1为这个维度的步⻓(Stride)或者系数(Offset)。 张量在内存中的排列⽅式如图1.7所⽰。我们可以看到,维度序数较⼩ (⽐如第1或第2个维度)的相邻数字在内存中的间隔⽐较⼤,反之, 在内存中的间隔⽐较⼩。 图1.7 ⼀个2×2×4的张量在内存中数字的排布(下标从0开始) 1.3.3 神经元的概念 神经⽹络最基础的组成单元可以认为是⼀个神经元(Neuron),它的 结构由数个输⼊和输出组成。如图1.8所⽰,⼀个神经元的输⼊x是之 前神经元输⼊的线性组合x=∑wiai,其中,wi(i=1,…,n)为⼀系列 的可训练的参数,称为神经⽹络的权重。该神经元随之对这个线性组 合输出的结果做⼀个⾮线性的函数变换f(x),输出该函数的变换结 果。⾮线性的函数⼜称激活函数,其选择有多样性,我们会在激活函 数的相关章节提到相关⽅⾯的问题。由于⾮线性函数变换的存在,整 个神经元的输出结果是⾮线性的,这就使得神经元的输出能够模拟不 同的函数,构成神经⽹络的数学基础。在实际应⽤中,虽然深度学习 的神经⽹络架构多种多样,但最终都能表⽰为神经元之间相互连接的 形式,唯⼀的区别在于神经元的数⽬和神经元之间的相互连接⽅式不 同。结合前⾯讲的向量、矩阵和张量的知识,我们可把神经元的输⼊ 和输出排列成矩阵的形式,那么使⽤神经⽹络的权重进⾏线性变换就 可以对应成矩阵的乘法,同时激活函数的计算就可以看作⼀个对于矩 阵每个元素的逐点计算。 图1.8 单个神经元结构⽰意图