深度学习框架
深度学习框架是一种用于构建、训练和部署深度神经网络模型的工具集合。它提供了丰富的函数和工具,使开发者能够方便地创建、调整和优化神经网络模型。目前常用的深度学习框架有PyTorch、Theano、TensorFlow、Keras、Caffe、MXNet、CNTK、PaddlePaddle。这些深度学习框架被应用于计算机视觉、自然语言处理、语音识别、机器学习等多个领域。
深度学习采用 “端到端”的学习模式,在很大程度上减轻负担。但随着神经网络的发展,模型的复杂度也在不断提升。
框架存在的意义就是屏蔽底层的细节,使研究者可以专注于模型结构。
深度学习框架一般提供了以下功能:
模型定义:提供了一种方式来定义神经网络模型的结构,包括网络层的连接和参数设置。
训练和优化:提供了一种方式来训练和优化神经网络模型,包括定义损失函数、选择优化算法和设置训练参数。
自动求导:能够自动计算神经网络模型的梯度,以便进行反向传播算法进行训练。
并行计算:支持在多个GPU或分布式环境上进行并行计算,以提升训练和推理的效率。
部署和推理:能够将训练好的神经网络模型部署到实际应用中进行推理,包括在移动设备、边缘设备或云端进行推理。
Caffe
卷积神经网络框架( Convolutional Architecture for Fast Feature Embedding, Caffe)是一 种常用的深度学习框架,主要应用在视频、图像处理等方面。Caffe 是一个清晰、可读性高、快速的深度学习框架。
Caffe的基本工作流程是设计建立在神经网络的一个简单假设,所有的计算都是以层的形式表示的,如网络层所做的事情就是接收输人数据,然后输出计算结果。
比如卷积层就是输入一幅图像,然后和这一层的参数( filter )进行卷积,最终输出卷积结果。每层需要两个函数计算,一个forward,以输人计算到输出;另一个backward,从上层给的gradient来计算相对于输入层的gradient。这两个函教实现之后,我们就可以把许多层连接成一个网络,这个网络输人数据(图像、语音或其他原始数据),然后计算需要的输出( 比如识别的标签)。我们在训练的时候,可以根据已有的标签计算loss和gradient,然后用gradient来更新网络中的参数。
Cafee的特点
Expression:通过文本来构建模型和优化策略,而不是代码。
Speed:现有的CNN模型中速度最快。在NVIDIA K40 或Titan GPU*上,训练一张图片要5ms,测试一张图片要2ms。
Modularity:易扩展
纯C++/CUDA构建的框架,提供了命令行、Python、MATLAB接口
实现了CPU和GPU的无缝结合
Caffe Model Zoo (集合了各种预训练Caffe模型的仓库。这些模型是经过大量数据集上训练得到的,并在各种计算机视觉任务中表现出色。模型库中提供了各种经典的网络架构和权重文件,包括AlexNet、GoogLeNet、ResNet等,可以用于快速搭建和测试自己的模型。):model share
Caffe 中的数据结构是以 Blobs-layers-Net 形式存在。其中,Blobs 是通过 4 维向量形式(num,channel,height,width)存储网络中所有权重,激活值以及正向反向的数据。作为 Caffe 的标准数据格式,Blob 提供了统一内存接口。Layers 表示的是神经网络中具体层,例如卷积层等,是 Caffe 模型的本质内容和执行计算的基本单元。layer 层接收底层输入的 Blobs,向高层输出 Blobs。在每层会实现前向传播,后向传播。Net 是由多个层连接在一起,组成的有向无环图。一个网络将最初的 data 数据层加载数据开始到最后的 loss 层组合为整体。
TensorFlow
TensorFlow 可以训练和运行深度神经网络,它是一个完全基于 Python 语言设计的开源的软件。它能应用在许多场景下,比如,图像识别、手写数字分类、递归神经网络、单词嵌入、自然语言处理、视频检测等等。TensorFlow 可以运行在多个 CPU 或 GPU 上,同时它也可以运行在移动端操作系统上(如安卓、IOS 等),它的架构灵活,具有良好的可扩展性,能够支持各种网络模型(如OSI七层和TCP/IP四层)。
TensorFlow 这个词由 Tensor 和 Flow 两个词组成,这两者是 TensorFlow 最基础的要素。Tensor 代表张量(也就是数据),它的表现形式是一个多维数组;而 Flow 意味着流动,代表着计算与映射,它用于定义操作中的数据流。
TensorFlow的组件
1) Tensor
TensorFlow 这个名称源自框架核心组件“ Tensor”,它的英文含义是“张量”的意思。张量是矢量概念的推广,矢量是一阶张量,而标量是零阶张量,矩阵可视为二阶张量。
张量,size可动态调整的多维数据数组。他是数据的载体,包含名字、形状、数据类型等属性。张量中的所有值都具有相同的数据类型,和一个给定的已知形状(维数)。张量可以作为输入数据,也可以在计算结果中生成。
2) Graph
该组件能够对模型训练期间所做的计算做出详细的汇总和描述,因此又称“计算图”。举一个简单示例:
现在有下列表达式:a =(b + c)*(c + 2),我们可以将该表达式分成以下几部分:
d = b + c
e = c + 2
a = d * e
下面我们使用图形表示上述数据关系:
计算图具有以下属性:
第一,叶子顶点或起始顶点始终是张量,即操作(图中的每个节点代表一个操作,如加法减法等)永远不会发生在图的开头,由此可以推断,图中的每个操作都应该接收一个张量并产生 一个新的张量。
第二,张量不能作为非叶子节点出现,这意味着它们应始终作为输人提供给操作节点。
第三,计算图总是以层次顺序表达复杂的操作。
第四,计算图的并行,即同级节点的操作彼此独立,这是计算图的重要属性之一。
3) OP
上图所示每个椭圆要素代表着计算图中的节点(又称 OP)操作,节点在 TensorFlow 中以张量的形式表现出来,而每个节点之间连接线代表着节点之间的流动关系。
4) Session
Session 用来执行 Graph 中定义的运算,在 TensorFlow 中只有让 Graph(计算图)上的节点在 Session(会话)中执行,才会得到结果。Session 的开启涉及真实的运算,比较消耗资源。所以当你在使用结束后,务必关闭 Session。
对于上述组件可以这样简单理解其作用:Tensor 是一个张量,用于存放各种数据,若要完成多个 Tensor 计算需要在 Graph 中组织数据关系,而执行计算需要 Session 会话调用 run() 方法 ,促使 Tensor 按计算图设定的数据关系流动,最终得到计算结果,这就是为 Tensor Flow。
PyTorch
PyTorch 可以看作为加入了GPU 支持的numpy。TensorFlow 与Caffe 都是命令式的编程语言,而且是静态的,即首先必须构建一个神经网络,然后一次又一次使用同样的结构;如果想要改变网络的结构,就必须从头开始。但是PyTorch通过一种反向自动求导的技术,可以让用户零延迟地任意改变神经网络的行为。
PyTorch的优点:
1. 动态计算图
PyTorch最突出的优点之一就是它使用了动态计算图(Dynamic Computation Graphs,DCGs),与TensorFlow和其他框架使用的静态计算图不同。动态计算图允许你在运行时更改图的行为。这使得PyTorch非常灵活,在处理不确定性或复杂性时具有优势,因此非常适合研究和原型设计。
2. 易用性
PyTorch被设计成易于理解和使用。其API设计的直观性使得学习和使用PyTorch成为一件非常愉快的事情。此外,由于PyTorch与Python的深度集成,它在Python程序员中非常流行。
3. 易于调试
由于PyTorch的动态性和Python性质,调试PyTorch程序变得相当直接。你可以使用Python的标准调试工具,如PDB或PyCharm,直接查看每个操作的结果和中间变量的状态。
4. 强大的社区支持
PyTorch的社区非常活跃和支持。官方论坛、GitHub、Stack Overflow等平台上有大量的PyTorch用户和开发者,你可以从中找到大量的资源和帮助。
5. 广泛的预训练模型
PyTorch提供了大量的预训练模型,包括但不限于ResNet,VGG,Inception,SqueezeNet,EfficientNet等等。这些预训练模型可以帮助你快速开始新的项目。
6. 高效的GPU利用
PyTorch可以非常高效地利用NVIDIA的CUDA库来进行GPU计算。同时,它还支持分布式计算,让你可以在多个GPU或服务器上训练模型。
综上所述,PyTorch因其易用性、灵活性、丰富的功能以及强大的社区支持,在深度学习领域中备受欢迎。
机器学习基础知识
模型评估与模型参数选择
损失函数
若对于给定的输入x,若某个模型的输出y ̂=f(x)偏离真实目标值y,那么就说明模型存在误差;y ̂ 偏离y的程度可以用关于y ̂ 和y某个函数L(y,y ̂ )来表示,作为误差的度量标准:这样的函数L(y,y ̂ )称为损失函数。
经验误差、泛化误差
在某种损失函数度量下,训练集上的平均误差被称为训练误差(经验误差),测试集上的误差称为泛化误差。
由于我们训练得到一个模型最终的目的是为了在未知的数据上得到尽可能准确的结果,因此泛化误差是衡量一个模型泛化能力的重要标准。
不能把训练误差作为模型参数选择的标准,是因为训练集可能存在以下问题:
①训练集样本太少,缺乏代表性;
②训练集中本身存在错误的样本,即噪声。如果片面地追求训练误差的最小化,就会导致模型参数复杂度增加,使得模型过拟合( Overfitig )
泛化误差越小越好,训练误差不一定越小越好,可能导致过拟合
数据集:训练集、验证集、测试集
3种数据集之间的关系:
•训练集相当于上课学知识
•验证集相当于课后的的练习题,用来纠正和强化学到的知识
•测试集相当于期末考试,用来最终评估学习效果
验证集:
当我们的模型训练好之后,我们并不知道他的表现如何。这个时候就可以使用验证集(Validation Dataset)来看看模型在新数据上的表现如何。同时通过调整超参数,让模型处于最好的状态。
验证集有2个主要的作用:
•评估模型效果,为了调整超参数而服务
•调整超参数,使得模型在验证集上的效果最好
说明:
•验证集不像训练集和测试集,它是非必需的。如果不需要调整超参数,就可以不使用验证集,直接用测试集来评估效果。
•验证集评估出来的效果并非模型的最终效果,主要是用来调整超参数的,模型最终效果以测试集的评估结果为准。
测试集:
当我们调好超参数后,就要开始「最终考试」了。我们通过测试集(Test Dataset)来做最终的评估,来看学习效果(模型效果)好不好。
通过测试集的评估,我们会得到一些最终的评估指标,例如:准确率、精确率、召回率、F1等。
划分数据集:
过拟合:
泛化能力差,训练样本集准确率高,测试样本集准确率低。
过拟合原因:
数据噪声太大
特征太多
模型太复杂
过拟合的解决办法:
清洗数据
减少模型参数,降低模型复杂度
增加惩罚因子(正则化),保留所有的特征,但是减少参数的大小(magnitude)。
欠拟合:
泛化能力差,训练样本集准确率低,测试样本集准确率低。
欠拟合原因:
训练样本数量少
模型复杂度过低
参数还未收敛就停止循环
欠拟合的解决办法:
增加样本数量
增加模型参数,提高模型复杂度
增加循环次数
查看是否是学习率过高导致模型无法收敛
1.如果训练集和测试集(验证集)上,正确率都很低,那么,说明模型处于欠拟合状态,需要调整超参数。
2.如果训练集上正确率很低,测试集(或验证集)上正确率较高,说明数据集有问题。
3.如果训练集上正确率很高,测试集(以及验证集)上正确率较低,说明模型过拟合,需要进行正则化或者Dropout(是一种正则化方法,用于随机禁用神经网络单元)来抑制过拟合。
4.如果训练集和验证集上正确率都很高,但是在测试集上正确率较低,那么说明模型的泛化能力不足,调整方法可参考之前的过拟合情况。
验证
模型不能过拟合于训练集,否则将不能在测试集上得到最优结果;但是否能直接以测试集上的表现来选择模型参数呢?答案是否定的。因为这样的模型参数将会是针对某个特定测试集的,得出来的评价标准将会失去其公平性,失去了与其他同类或不同类模型相比较的意义。
因此参数的选择(即调参)必须在一个独立于训练集和测试集的数据集上进行,这样的用于模型调参的数据集被称为开发集或验证集。
然而很多时候我们能得到的数据量非常有限。这个时候我们可以不显式地使用验证集,而是重复使用训练集和测试集,这种方法称为交叉验证。
常用的交叉验证方法有:
简单交叉验证
1.留出法(Holdout cross validation)
•按照固定比例将数据集静态的划分为训练集、验证集、测试集。
2.自组法(bootstrapping)
•适合于样本数目较少,有放回的取法。
K-重交叉验证
把原始训练数据集分割成K个不重合的子数据集,然后做K次模型训练和验证。每一次,使用一个子数据集验证模型,并使用其它K−1个子数据集来训练模型。最后,对这K次训练误差和验证误差分别求平均。
具体步骤:
交叉验证是将一个整体数据平均划分为K份
先取第一份子集数据作为测试集,剩下的K-1份子集数据作为训练集
再取第二份子集数据作为测试集,剩下的K-1份子集数据作为训练集
…
不断往复,重复K次
然后将得到的结果进行加权平均,作为最终的评估结果
优点:降低由一次随机划分带来的偶然性,提高其泛化能力,提高对数据的使用效率。
缺点:可能存在一种情况:数据集有5类,抽取出来的也正好是按照类别划分的5类。这样的结果就会导致,模型训练时没有学习到测试集中数据的特点,从而导致模型得分很低,甚至为0。
正则化
在优化目标中加入正则化项:
minL(y,y`; θ) +λ·J(θ)
θ为模型参数,L(y,y`; θ)为原来的损失函数,J(θ)是正则化项,λ用于调整正则化项的权重。
正则化项通常为θ的某阶向量范数。
通过限制参数值域空间,显式地控制了模型复杂度,从而避免了过拟合
监督学习与非监督学习
监督学习
回归
回归最简单的形式之一是一个连续函数的拟合。回归问题中通常使用均方损失函数来作为度量模型效果的指标,最简单的求解例子之一是最小二乘法。
分类
•想要预测(检测)的目标是猫,那么在数据集中猫为正样本(Positive ),其他狗、兔子、狮子这些数据为负样本(Negative )。
•将这只猫预测(分类)为狗、兔子、其他预测结果为错(False);将这只猫预测为猫,预测结果为对(True)。
准确率
精确率
召回率
F-度量
非监督学习
数据中不含有标签的机器学习问题通常被为无监督学习(unsupervised learning)
聚类(clustering)问题:
非监督学习通常用于这样的分类问题:给定一些样本的特征值,而不给出它们正确的分类,也不给出所有可能的类别;而是通过学习确定这些样本可以分为哪些类别、它们各自都属于哪一类。这一类问题称为聚类;
主成分分析(principal component analysis)问题(PCA):
我们能否找到少量的参数来准确地捕捉数据的线性相关属性?比如,一个球的运动轨迹可以用球的速度、直径和质量来描述。
主成分分析PCA是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。
因果关系(causality)和概率图模型(probabilistic graphical models)问题:
我们能否描述观察到的许多数据的根本原因?例如,如果我们有关于房价、污染、犯罪、地理位置、教育和工资的人口统计数据,我们能否简单地根据经验数据发现它们之间的关系?
如果想通过物体a去推断物体b,就是将物体a放在这里会增加物体b出现概率的多少,想要找到这样一个确定的促进关系即因果关系,往往会被confounder干扰到,而这个confounder就是物体a与b之间的共因。