第2章、深度学习框架
概念:是一种用于构建、训练和部署深度神经网络模型的工具集合。他提供了丰富的函数和工具,是开发者能够方便地构建、调整和优化神经网络模型。
常用的深度学习框架:Pytorch、Theano、TensorFlow、Keras、Caffe、MXnet、CNTK、PaddlePaddle。
上述深度学习框架被应用于计算机视觉、自然语言处理、语音识别、机器学习等多个领域。
深度学习框架提供了以下功能:
1.模型定义:提供方式来定义神经网络模型的结构,包括网络层的连接和参数设置。
2.训练和优化:提供方式来训练和优化神经网络模型,包括定义损失函数、选择优化算法和设置训练参数。
3.自动求导:能够自动计算神经网络模型的梯度,以便进行反向传播算法进行训练。
4.并行计算:支持在多个GPU或分布式环境上进行并行计算,以提升训练和推理的效率。
5.部署和推理:能够将训练好的神经网络模型部署到实际应用中进行推理,包括在移动设备、边缘设备或云端进行推理。
框架的意义:屏蔽底层的细节,使研究者可以专注于模型结构(类似于搭积木)
一、Caffe
卷积神经网络框架(Convolutional Architecture for Fast Feature Embedding,简称Caffe)
内核用C++编写,是一个主流的工业级深度学习工具,精于图像处理。
基本工作流程:设计建立在神经网络的一个简单假设,所有的计算都是以层的形式表示的,如网络层所做的事情就是接受输入数据,然后输出计算结果。
卷积层就是输入一幅图像,然后和这一层的参数(filter)进行卷积,最终输出卷积结果。
每层需要两个函数计算,一个是forward,从输入计算到输出;另一个是backward,从上层给的gradient来计算相对于输入层的gradient。在实现这两个函数之后,我们就可以把许多层连接成一个网络,在这个网络输入数据(图像、语音或其他原始数据),然后计算需要的输出(比如识别的标签)。我们在训练的时候,可以根据已有的标签计算loss(类似于误差,越小越好)和gradient,然后用gradient来更新网络中的参数。
Caffe的模型定义是用Protocol Buffer(协议缓冲区)语言以任意有向无环图的形式写进配置文件的。
caffe会根据网络需要正确占用内存,通过一个函数调用实现GPU和CPU之间的切换。caffe中的每一个单一的模块都对应一个测试,使测试的覆盖非常方便,同时提供python和MATLAB接口,用这两种语言进行调用都是可行的。
Caffe是一种对新手非常友好的深度学习框架,清晰而高效以文本形式而非代码形式给出。数据及其导数以blob的形式在层间流动,Caffe层的定义由两部分组成:层属性与层参数。
优点:快速、简洁明了,易用性强
缺点:灵活性缺失、扩展难、依赖众多环境且难以配置、应用局限等。
二、TensorFlow
TensorFlow是一个采用数据流图(data flow graph)进行数值计算的开源软件库。在数据流图中,“节点”表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persisent variable)的终点。“线”则表示在“节点”间互相联系的多为数据数组,”表示“节点”之间的输入/输出的关系。这些“线”可以输运“size可动态调整”的多维数据数组,即“张量”。
TensorFlow的特点:扩展便捷,数据透明。(将自动计算相关的微分导数)
TensorFlow中的"Flow",也就是流,是其完成运算的基本方式。流是指一个计算图或简单的一个图,图不能形成回路,图中的每一个节点代表一个操作(如加法,减法等)。每个操作都会形成新的张量。
图2.5展示了一个简单的计算图,所对应的表达式为:e=(a+b)*(b+1)。
计算图有以下属性。
第一,叶子顶点或起始顶点始终是张量
即操作不会发生在图的开头,可以推断出图中的每个操作都应该接受一个张量并产生一个新的张量。
第二,张量不能作为非叶子结点出现
这意味着它们应始终作为输入提供给操作/节点。
第三,计算图总是以层次顺序表达复杂的操作
第四,同级节点的操作彼此独立,同一级中的节点,可以并行执行
同一级中的节点,例如c和d,可以并行执行。
上图中(a)是单个系统分布式执行
优点:扩展便捷,数据透明
缺点:系统设计过于复杂,频繁变动接口,难以理解的概念,文档和教程缺乏明显的条理和层次。
三、Pytorch
TensorFlow 与Caffe 都是命令式的编程语言,而且是静态的,pytorch最大的优势是建立的神经网络是动态的。PyTorch通过一种反向自动求导的技术,可以让用户零延迟地任意改变神经网络的行为。
Pytorch的设计遵循tensor→variable(autograd)→nn.Module这三个由低到高的抽象层次,分别代表高位数组(张量)、自动求导(变量)和神经网络(层/模块)。
优点:简洁、优雅且高效、快速,代码易于理解,灵活性不以降低速度为代价。
缺点:推出时间短,很多代码需要开发者自己实现。
第3章 机器学习基础知识
一、模型评估与模型参数选择
真实值与预测值之间的误差称为损失函数
泛化误差:在新样本上的误差。
经验误差、训练误差:在训练集上的误差;
泛化误差是衡量一个模型泛化能力的重要标准。
训练集上的平均误差被称为训练误差,测试集上的误差称为泛化误差。
数据集:训练集、验证集、测试集
3种数据集之间的关系: 训练集相当于上课学知识 验证集相当于课后的的练习题,用来纠正和强化学到的知识 测试集相当于期末考试,用来最终评估学习效果。
过拟合与欠拟合
定义 | 表现 | 原因 | 解决方法 | |
过拟合 | 是指模型在训练数据上表现得过于完美,但在新的、未见过的数据上表现不佳的现象。 | 在训练集上表现很好,在测试集上表现不好。 | 1.训练数据太少(比如只有几百组) 2.模型的复杂度太高(比如隐藏层层数设置的过多,神经元的数量设置的过大) 3.数据不纯 | 1.使用验证集调参 2.对损失函数进行正则化 3.重新清洗数据 4.早停 5.移除特征,降低模型的复杂度 6.训练集增加更多的数据 7.数据增强 8.减少神经元个数,减少隐藏的层数 |
欠拟合 | 是指模型在训练数据上的拟合程度不足,无法捕捉到数据中的基本结构和规律。这通常是由于模型过于简单或者训练不充分导致的。 | 在训练集和测试集上的表现都不佳,预测误差较大。 | 1. 数据未做归一化处理 2. 神经网络拟合能力不足 3. 数据的特征项不够 | 1. 寻找最优的权重初始化方案 2. 增加网络层数、epoch 3. 使用适当的激活函数、优化器和学习率 4. 减少正则化参数 5. 增加特征 |
数据集划分的方法:1.留出法 2.交叉验证法 3.自助法
划分好的测试集、、验证集、验证集运行后master下有test、train、valid
二、 验证
1、模型不能过拟合于训练集,否则将不能在测试集上得到最优结果
2、参数的选择(即调参)必须在一个独立于训练集和测试集的数据集上进行,这样的用于模型调参的数据集被称为开发集或验证集。
3、数据量非常有限。这个时候我们可以不显式地使用验证集,而是重复使用训练集和测试集,这种方法称为交叉验证。
常用的交叉验证方法有: 简单交叉验证。 K-重交叉验证。
留出法(Holdout cross validation) 按照固定比例将数据集静态的划分为训练集、验证集、测试集。
自组法(bootstrapping) 适合于样本数目较少,有放回的取法。
k 折交叉验证(k-fold cross validation):k 一般取 10
将数据集分为训练集和测试集,将测试集放在一边;将训练集分为 k 份 每次使用 k 份中的 1 份作为验证集,其他全部作为训练集。 通过 k 次训练后,我们得到了 k 个不同的模型。 评估 k 个模型的效果,从中挑选效果最好的超参数 使用最优的超参数;然后将 k 份数据全部作为训练集重新训练模型,得到最终模型。
三、正则化
在优化目标中加入正则化项: min┬θL(y,y ̂;θ)+λ⋅J(θ) |
θ为模型参数,L(y,y ̂;θ)为原来的损失函数,J(θ)是正则化项,λ用于调整正则化项的权重。 正则化项通常为θ的某阶向量范数。 通过限制参数值域空间,显式地控制了模型复杂度,从而避免了过拟合。
L1正则化:使权重的绝对值最小化,且对于异常值是鲁棒的。
L2正则化:使得权重的平方最小化,该模型能够学习复杂的数据模式,但对于异常值不具备鲁棒性。
Dropout :是一种正则化方法,用于随机禁用神经网络单元。
四、无监督学习与监督学习
1、无监督学习
数据中不含有“目标”的机器学习问题通常被为无监督学习(unsupervised learning)
聚类(clustering)问题:将相似的对象归入同一个“类”
主成分分析(principal component analysis)问题(PCA): 主成分分析PCA是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。
因果关系(causality)和概率图模型(probabilistic graphical models)问题:如果想通过物体a去推断物体b,就是将物体a放在这里会增加物体b出现概率的多少,想要找到这样一个确定的促进关系即因果关系。往往会被confounder干扰到,而这个confounder就是物体a与b之间的共因。
生成对抗性网络(generative adversarial networks):为我们提供一种合成数据的方法,甚至像图像和音频这样复杂的非结构化数据。潜在的统计机制是检查真实和虚假数据是否相同的测试,它是无监督学习的另一个重要而令人兴奋的领域。
无监督学习衡量指标:直观检测、基于任务的评价、人工标注测试集。
直观检测:这是一种非量化的方法。 例如对文本的主题进行聚类,我们可以在直观上判断属于同一个类的文本是否具有某个共同的主题,这样的分类是否有明显的语义上的共同点。
基于任务的评价:如果聚类得到的模型被用于某个特定的任务,我们可以维持该任务中其他的设定不变,使用不同的聚类模型,通过某种指标度量该任务的最终结果来间接判断聚类模型的优劣。
人工标注测试集:有时候采用非监督学习的原因是人工标注成本过高,导致标注数据缺乏,只能使用无标注数据来训练。 在这种情况下,可以人工标注少量的数据作为测试集,用于建立量化的评价指标。
2、监督学习
2.1回归
回归问题:(1)一个购物网站想要计算出其在某个时期的预期收益,研究人员会将相关因素如广告投放量、网站流量、优惠力度等纳入自变量,根据现有数据拟合函数,得到在未来某一时刻的预测值。
(2)回归问题中通常使用均方损失函数来作为度量模型效果的指标,最简单的求解例子是最小二乘法。
均方误差损失函数(Mean Squared Error,MSE): 最常用的回归问题的损失函数。其定义为预测值与真实值之间的平方差的平均值。
该损失函数的值越小,表示模型的预测结果越接近真实值。 (类似于误差)
简单线性回归
自变量 x 和因变量 y之间存在一条线性关系:
多元线性回归
假设自变量 和因变量 y之间存在一条线性关系,即:
线性回归应用场景:①预测房价②预测销售额
2.2分类
想要预测(检测)的目标是猫,那么在数据集中猫为正样本(Positive ),其他狗、兔子、狮子这些数据为负样本(Negative )。 将这只猫预测(分类)为狗、兔子、其他预测结果为错(False);将这只猫预测为猫,预测结果为对(True)。
将正样本预测正样本(True Positive, TP);将负类样本预测为负样本(True Negative, TN)
将正样本预测为负样本(False Negative, FN);将负类样本预测为正样本(False Positive, FP)
准确率(Accuracy):对于测试集中D个样本,有k个被正确分类,D-k个被错误分类,则准确率为:
Accuracy=分类正确的样本/样本总数= k/D= (TP+TN)/(TP+TN+FP+FN)
虽然准确率可以判断总的正确率,但是在样本不平衡的情况下,并不能作为很好的指标来衡量结果。 举个简单的例子,比如在一个总样本中,正样本占90%,负样本占10%,样本是严重不平衡的。 对于这种情况,我们只需要将全部样本预测为正样本即可得到 90% 的高准确率,但实际上我们并没有很用心的分类,只是随便无脑一分而已。 这就说明了:由于样本不平衡的问题,导致了得到的高准确率结果含有很大的水分。即如果样本不平衡,准确率就会失效。
精确率(查准率)- Precision:所有被预测为正样本中实际为正样本的概率
Precision=预测为正样本实际也为样本/预测为正样本= TP/TP+FP
精准率代表对正样本结果中的预测准确程度。 准确率则代表整体的预测准确程度,既包括正样本,也包括负样本。
召回率(查全率)- Recall:实际为正的样本中被预测为正样本的概率
Recall=预测为正样本实际也为样本/实际为正样本= TP/TP+FN
召回率的应用场景: 比如拿网贷违约率为例,相对好用户,我们更关心坏用户,不能错放过任何一个坏用户。因为如果我们过多的将坏用户当成好用户,这样后续可能发生的违约金额会远超过好用户偿还的借贷利息金额,造成严重偿失。 召回率越高,代表实际坏用户被预测出来的概率越高,它的含义类似:宁可错杀一千,绝不放过一个。 召回率越高,也代表网络可以改进的空间越大。(故:召回率越低越好)
把精确率(Precision)和召回率(Recall)之间的关系用图来表达,就是下面的PR曲线:
平衡点(BEP)P=R
AP(Average Precision):PR曲线下的面积。 通常来说一个越好的分类器,AP值越高
mAP是多个类别AP的平均值。这个mean的意思是对每个类的AP再求平均,得到的就是mAP的值,mAP的大小一定在[0,1]区间,越大越好。该指标是目标检测算法中最重要的一个。