房地产建设网站的意义,wordpress速度快不快,一般使用的分辨率显示密度是,广告字制作哪家好本文系列主要作用就是读书笔记#xff0c;自己看的话比较杂#xff0c;没怎么归类过#xff0c;所以现在跟着这个分类走一遍。本文主要内容为前两章#xff0c;特征工程和模型评估。
如果我想起一些相关的内容也会做适当的补充#xff0c;主打就是一个intuition#xff…本文系列主要作用就是读书笔记自己看的话比较杂没怎么归类过所以现在跟着这个分类走一遍。本文主要内容为前两章特征工程和模型评估。
如果我想起一些相关的内容也会做适当的补充主打就是一个intuition感觉除了数学表示之外intuition最重要了虽然比起数学表达更抽象了但是对人来说更好记忆和理解
特征工程 特征工程师对原始数据进行一系列工程处理将其提炼为特征作为输入供算法和模型使用。从本质上来讲特征工程是一个表示和展示数据的过程。在实际工作中特征工程旨在去除原始数据中的杂志和冗余设计更高效的特征以刻画求解的问题与预测模型之间的关系。 个人理解是就是把原始数据改成能用的。比如清理数据比如做one-hot encoding比如做降维等等。 结构化数据可以看做关系型数据库的一张表每一列都有清晰的定义包含了数值型、类别型两种基本类型每一行数据表示一个样本信息。 非结构化数据主要包括文本、图像、音频、视频数据其包含的信息无法用一个简单的数值表示也没有清晰的类别定义并且每条数据的大小各不相同 特征归一化
为了消除数据特征之间的量纲影响使得不同指标之间具有可比性。比如人的身高和体重假设身高用毫米为单位体重用千克做单位那两者的数据差异在1000倍左右在做梯度下降的时候显然会出现zigzag也就是在身高的方向上走多点在体重上走少点首先这会造成找到weight的过程很曲折而且万一走到局部最优呢就很尴尬了。同时这也会对weight有影响比如都差1000倍了那身高显然就没啥影响了一个1000一个就1.5左右那这个1.5的有没有也就跟加不加bias没差了。
为什么要对数值类型的特征做归一化 在机器学习领域中不同评价指标即特征向量中的不同特征就是所述的不同评价指标往往具有不同的量纲和量纲单位这样的情况会影响到数据分析的结果 为了消除指标之间的量纲影响需要进行数据标准化处理以解决数据指标之间的可比性。原始数据经过数据标准化处理后各指标处于同一数量级适合进行综合对比评价。其中最典型的就是数据的归一化处理。 简而言之归一化的目的就是使得预处理的数据被限定在一定的范围内比如[0,1]或者[-1,1]从而消除奇异样本数据导致的不良影响。 如何理解归一化normalization? - 知乎 (zhihu.com) 这里补充一下一些normalization的方法在之前的学习中我们看到过batch normalization和layer normalization的区别其中batch normalization是针对每个加载进来的batch对其中的每一个特征做归一化而layer normalization是对每一个样本做归一化。换言之就是batch normalization保持了同一个特征下的样本之间的大小关系而layer normalization保持了同一个样本之中的各个特征的大小关系很好理解用layer normalization而不用batch normalization的原因为了保留样本的信息比如做NLP的时候一句话用了哪些token这个肯定是要保留的信息 深度学习笔记二Normalization原因、BN、WN、LN、IN、权重数据伸缩不变性_2 normalization-CSDN博客 常用的归一化方法 线性函数归一化min-max scaling 对原始数据进行线性变换是结果映射到[0, 1]的范围实现对原数据的等比缩放。归一化公式零均值归一化Z-score normalization 将原始数据映射到均值为0标准差为1的分布上。归一化公式 这个书里给的不是很详细可以参考如何理解归一化normalization? - 知乎 (zhihu.com)数据预处理之Normalization - 知乎 (zhihu.com) 最大最小标准化Min-Max Normalization (1) 线性函数将原始数据线性化的方法转换到[0 1]的范围, 计算结果为归一化后的数据X为原始数据 (2) 本归一化方法比较适用在数值比较集中的情况 (3) 缺陷如果max和min不稳定很容易使得归一化结果不稳定使得后续使用效果也不稳定。实际使用中可以用经验常量来替代max和min。 应用场景在不涉及距离度量、协方差计算、数据不符合正太分布的时候可以使用第一种方法或其他归一化方法不包括Z-score方法。比如图像处理中将RGB图像转换为灰度图像后将其值限定在[0 255]的范围 z—score 标准化 1 将原始数据集归一化为均值为0、方差1的数据集 2 该种归一化方式要求原始数据的分布可以近似为高斯分布否则归一化的效果会变得很糟糕。 应用场景在分类、聚类算法中需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候Z-score standardization表现更好。并且所有样本数据均要大于等于1。 机器学习中的标准化和归一化方法 | J. Xu (xujinzh.github.io)
类别型特征
在有限选项内取值的特征。类别型特征原始输入通常是字符串形式除了决策树等少数模型能直接处理字符串形式的输入对于logistic regression、SVM等模型类别型特征必须经过处理转换成数值型特征才能正常工作。
在对数据进行预处理时应该怎样处理类别型特征 序号编码。按程度、大小关系进行编码有点类似于赋分制拿优秀就给95分拿良好就给80分拿及格就给60这样。one-hot编码按照有没有、是不是进行编码比如性别就可以分成男性、女性、沃尔玛购物袋×one-hot的意思就是变成是不是男性是1不是0是不是女性是1不是0二进制编码类似序号编码不过是二进制形式比如8个类别不用1-8表示用000-100表示。
【补充】决策树
一文看懂决策树Decision Tree - 知乎 (zhihu.com)
【决策树】深入浅出讲解决策树算法原理、构建_决策树算法原理-CSDN博客
【机器学习sklearn】决策树Decision Tree算法_sklearn中决策树是什么算法-CSDN博客
sklearn的决策树能够处理字符串数据吗吗_决策树特征里面不能有字符型吗-CSDN博客
machine learning - strings as features in decision tree/random forest - Data Science Stack Exchange
似乎如果决策树使用sklearn还是要做编码。
决策树要做的就是做决策来把类别分开比如分辨谁会去买奶茶我们先决策喜欢甜食的人会购买那么人群就被分成两部分喜欢甜食不喜欢甜食然后再对不喜欢甜食的人分有朋友喜欢甜食的人可能会给朋友买奶茶又分两类这样。
只不过做决策的方式是计算机来做分类的指标是信息熵增益大/gini小
高维组合特征的处理
什么是组合特征如何处理组合特征 怎样有效地找到组合特征 文本表示模型
感觉这里书给的不怎么样orz。
有哪些文本表示模型它们各有什么优缺点
有哪些文本表示模型它们各有什么优缺点 - 知乎 (zhihu.com)
机器学习算法二十六文本表示模型-CSDN博客
词袋模型
词向量之词袋模型(BOW)详解_bow词袋模型-CSDN博客 词袋模型Bag-of-Words modelBOWBoW(Bag of Words)词袋模型最初被用在文本分类中将文档表示成特征矢量。它的基本思想是假定对于一个文本忽略其词序和语法、句法仅仅将其看做是一些词汇的集合而文本中的每个词汇都是独立的。简单说就是讲每篇文档都看成一个袋子因为里面装的都是词汇所以称为词袋Bag of words即因此而来然后看这个袋子里装的都是些什么词汇将其分类。 比如在一篇文章的袋子里面看到各种各样的专业术语我们倾向于这是一篇专业的文章我们看到一个袋子里装的都是柴米油盐酱醋茶我们肯定觉得这是一个讲生活的文章非常符合人类的认知。 显然能看出来这样完全没有重要性的区别也没有顺序。如果是“小猫和小狗是好朋友”那么“小狗和小猫是好朋友”没什么大问题但是如果是“小明这次考试没有考过小红”变成“小红这次考试没有考过小明”明显语义信息就没有得到保留了。当然这也限制了使用场景我记得在学校作业里这个只是用来对新闻文本分类的没要求我理解每个文章是什么意思
TF-IDF
机器学习生动理解TF-IDF算法 - 知乎 (zhihu.com)
用来解决BOW没有重要性的问题比如一篇文章里面出现“的”、“是”这种没有实际作用的词很多就像英文里出现“is”“there”这种不会影响判断的词。 TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术常用于挖掘文章中的关键词而且算法简单高效常被工业用于最开始的文本数据清洗。 TF-IDF有两层意思一层是词频Term Frequency缩写为TF另一层是逆文档频率Inverse Document Frequency缩写为IDF。 TF某个词在文章中出现的次数
IDF越常见的词给的权重越低 如果一个词越常见那么分母就越大逆文档频率就越小越接近0。分母之所以要加1是为了避免分母为0即所有文档都不包含该词。log表示对得到的值取对数。 可以看到TF-IDF与一个词在文档中的出现次数成正比与该词在整个语言中的出现次数成反比。所以自动提取关键词的算法就很清楚了就是计算出文档的每个词的TF-IDF值然后按降序排列取排在最前面的几个词。 优缺点 TF-IDF的优点是简单快速而且容易理解。缺点是有时候用词频来衡量文章中的一个词的重要性不够全面有时候重要的词出现的可能不够多而且这种计算无法体现位置信息无法体现词在上下文的重要性。如果要体现词的上下文结构那么你可能需要使用word2vec算法来支持。 简要来说就是可以在一定程度上体现一个词的重要性但是仅仅靠词的组合是无法体现句意/文意的也就是我们需要上下文信息来实现更复杂的算法。
N-gram 自然语言处理中N-Gram模型介绍 - 知乎 (zhihu.com) N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作形成了长度是N的字节片段序列。 每一个字节片段称为gram对所有gram的出现频度进行统计并且按照事先设定好的阈值进行过滤形成关键gram列表也就是这个文本的向量特征空间列表中的每一种gram就是一个特征向量维度。 该模型基于这样一种假设第N个词的出现只与前面N-1个词相关而与其它任何词都不相关整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。 总结一下有点类似于词语联想在手机上打字的时候输入一个字之后后面会出现一些联想词比如输入“回”大概率后面就有“家”这样就是说某个词后面出现某个词的概率。
这里就开始有上下文了。
不过这个显然也有问题啊一个是看的范围少一个是需要统计的也太多了吧上哪儿穷举去太离谱了肯定慢啊。
word embedding
万物皆可Embedding之Word Embedding - 知乎 (zhihu.com) 相似意思的接近。 现有的机器学习方法往往无法直接处理文本数据因此需要找到合适的方法将文本数据转换为数值型数据由此引出了Word Embedding词嵌入的概念。 词嵌入是自然语言处理NLP中语言模型与表征学习技术的统称它是NLP里的早期预训练技术。它是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中每个单词或词组被映射为实数域上的向量这也是分布式表示向量的每一维度都没有实际意义而整体代表一个具体概念。 分布式表示相较于传统的独热编码one-hot表示具备更强的表示能力而独热编码存在维度灾难和语义鸿沟不能进行相似度计算等问题。传统的分布式表示方法如矩阵分解SVD/LSA、LDA等均是根据全局语料进行训练是机器学习时代的产物。 Word Embedding的输入是原始文本中的一组不重叠的词汇假设有句子apple on a apple tree。那么为了便于处理我们可以将这些词汇放置到一个dictionary里例如[“apple”, “on”, “a”, “tree”]这个dictionary就可以看作是Word Embedding的一个输入。 Word Embedding的输出就是每个word的向量表示。对于上文中的原始输入假设使用最简单的one hot编码方式那么每个word都对应了一种数值表示。例如apple对应的vector就是[1, 0, 0, 0]a对应的vector就是[0, 0, 1, 0]各种机器学习应用可以基于这种word的数值表示来构建各自的模型。当然这是一种最简单的映射方法但却足以阐述Word Embedding的意义。 用一个vector来代替某个词关于这个vector怎么表示方法很多样。
Word2Vec
常用的词嵌入模型之一是一个浅层的生姜网络模型有两种网络结构分别是CBOWcontinues bag of word和skip-gram Word2Vec是如何工作的
I understand Word2vec in one article (basic concept 2 training model 5 advantages and disadvantages) (easyai.tech)
[NLP] 秒懂词向量Word2vec的本质 - 知乎 (zhihu.com)
深入浅出Word2Vec原理解析 - 知乎 (zhihu.com)
万物皆可Embedding之Word Embedding - 知乎 (zhihu.com) 为了更好的了解模型深处的原理我们先从Simple CBOW model仅输入一个词输出一个词框架说起。 input layer输入的X是单词的one-hot representation输入层到隐藏层之间有一个权重矩阵W隐藏层得到的值是由输入X乘上权重矩阵得到的细心的人会发现0-1向量乘上一个矩阵就相当于选择了权重矩阵的某一行如图输入的向量X是[001000]W的转置乘上X就相当于从矩阵中选择第3行[2,1,3]作为隐藏层的值;隐藏层到输出层也有一个权重矩阵W因此输出层向量y的每一个值其实就是隐藏层的向量点乘权重向量W的每一列比如输出层的第一个数7就是向量[2,1,3]和列向量[121]点乘之后的结果最终的输出需要经过softmax函数将输出向量中的每一个元素归一化到0-1之间的概率概率最大的就是预测的词。 对比可以发现和simple CBOW不同之处在于输入由1个词变成了C个词 Skip-gram model是通过输入一个词去预测多个词的概率。输入层到隐藏层的原理和simple CBOW一样不同的是隐藏层到输出层损失函数变成了C个词损失函数的总和权重矩阵W还是共享的。 一般神经网络语言模型在预测的时候输出的是预测目标词的概率也就是说我每一次预测都要基于全部的数据集进行计算这无疑会带来很大的时间开销。不同于其他神经网络Word2Vec提出两种加快训练速度的方式一种是Hierarchical softmax另一种是Negative Sampling。 embedding的问题 CBOW(Continuous Bag-of-Words Model)和Skip-gram (Continuous Skip-gram Model)是Word2vec 的两种训练模式。 CBOW 通过上下文来预测当前值。相当于一句话中扣掉一个词让你猜这个词是什么。 Skip-gram 用当前词来预测上下文。相当于给你一个词让你猜前面和后面可能出现什么词。 优化方法 为了提高速度Word2vec 经常采用 2 种加速方式 Negative Sample负采样Hierarchical Softmax Word2vec 的优缺点 需要说明的是Word2vec 是上一代的产物18 年之前 18 年之后想要得到最好的效果已经不使用 Word Embedding 的方法了所以也不会用到 Word2vec。 优点 由于 Word2vec 会考虑上下文跟之前的 Embedding 方法相比效果要更好但不如 18 年之后的方法比之前的 Embedding方 法维度更少所以速度更快通用性很强可以用在各种 NLP 任务中 缺点 由于词和向量是一对一的关系所以多义词的问题无法解决。Word2vec 是一种静态的方式虽然通用性强但是无法针对特定任务做动态优化 Word2Vec和LDA有什么区别和联系
Word2Vec和LDA的区别与联系 - 早起的小虫子 - 博客园 (cnblogs.com)Word2vec的词聚类结果与LDA的主题词聚类结果有什么不同 - 知乎 (zhihu.com)Word2Vec与LDA的区别和联系_lda和word2vec-CSDN博客 Word2Vec主要包含两个模型一个是CBOW模型上下文预测中间词还有一个是SG模型中间词预测上下文Word2Vec通过训练这两个模型得到模型训练的副产物-词向量。 LDA是基于文档中单词的共现关系来对单词进行主题聚类或者说是对“文档-单词”矩阵进行分解为“文档-主题”和“主题-单词”。 接下来我们对其区别和联系进行具体分析 Word2Vec生成的词向量由于词向量信息的丰富不同词向量之间会存在一定的联系那么其实也可以被理解为一种聚类那么这样就和LDA的主题词聚类对应上了。 Word2Vec是基于上下文的而LDA是基于隐含的主题的从更细节的角度去理解Word2Vec里关注的更多是语义、语法级别的信息而LDA关注的是更高的level-文章主题信息。甚至可以说Word2Vec关注细粒度信息而LDA关注粗粒度。 简单的说词向量所体现的是语义semantic和语法syntactic这些 low-level的信息。而LDA的主题词表现的是更 high-level的文章主题topic这一层的信息。 所以Word2vec的一些比较精细的应用LDA是做不了的。比如 1计算词的相似度。同样在电子产品这个主题下“苹果”是更接近于“三星”还是“小米” 2词的类比关系vector小米- vector苹果 vector乔布斯近似于 vector雷军。 3计算文章的相似度。这个LDA也能做但是效果不好。而用词向量即使在文章topic接近的情况下计算出的相似度也能体现相同、相似、相关的区别。 反过来说想用词向量的聚类去得到topic这一级别的信息也是很难的。很有可能“苹果”和“小米”被聚到了一类而“乔布斯”和“雷军”则聚到另一类。 这种差别本质上说是因为Word2vec利用的是词与上下文的共现而LDA利用的是词与文章之间的共现。 作者Xiaoran 链接https://www.zhihu.com/question/26680505/answer/34014109 Word2Vec和LDA的联系 1、在方法模型上他们两者是不同的但是产生的结果从语义上来说都是相当于近义词的聚类只不过LDA是基于隐含主题的WORD2VEC是基于词的上下文的或者说LDA关注doc和word的共现而word2vec真正关注的是word和context的共现。 2、主题模型通过一定的结构调整可以基于”上下文-单词“矩阵进行主题推理。同样的词嵌入方法也可以根据”文档-单词“矩阵学习出词的隐含向量表示。 3、加入LDA的结果作为word embeddings的输入可以增强文章分类效果。 看了一下基本的描述本质上压根不是干一个事的LDA应该更偏向于high-level的理解比如文章的种类而Word2Vec则更关注单词本身的语义。
很震惊的点在于学校讲LDA的时候压根没提这和词有什么关系本质上就是将数据从高维投影到低维的方法感觉就是个降维和分类的这很合理因为在上述的描述中LDA就是通过把各个单词聚在一起让不同类型的文章有不同的词语的聚类所以显然这并不是
机器学习-LDA(线性判别降维算法) - 知乎 (zhihu.com)
请参考上述链接我倾向于认为这并不是一个好的题目
图像数据不足时的处理方法
直接加数据不就好了吗:×
在图像分类任务中训练数据不足会带来什么问题
【机器学习与深度学习理论要点】04.训练数据不足带来的问题及解决方法_训练数据不足,请减小上下文长度或增加训练数据-CSDN博客
05-训练数据不足的影响及处理方式 - 赵家小伙儿 - 博客园 (cnblogs.com) 具体到分类任务上训练数据不足带来的问题主要体现在过拟合方面。即模型在训练样本上的效果可能不错但在测试数据集上泛化效果不佳 数据不足怎么处理
机器学习笔试面试之图像数据不足时的处理方法、检验方法、不均衡样本集的重采样 - 知乎 (zhihu.com) 具体到图像分类任务中在保持图像类别不变的前提下可以对训练集中的每幅圄像进行以下变换。 一定程度内的随机旋转、平移、缩版、裁剪、填充、左右翻转等这些变换对应着同一个目标在不同角度的观察结果。对图像中的像素添加躁声扰动。颜色变换改变图像的亮度、清晰度、对比度、锐度等。 CV — 目标检测数据增强_目标检测数据集增强-CSDN博客
目标检测图像增强方法(Data Augmentation)_目标检测中的图像增强-CSDN博客
一个有效的小目标检测的数据增强方法Mixup及其变体填鸭式_小目标增强-CSDN博客
模型评估
掏出之前的笔记 常见评估指标
总结详见上图。
下面尽量找一下当时看的内容
一文让你彻底理解准确率精准率召回率真正率假正率ROC/AUC - AIQ (6aiq.com)
机器学习的评价指标一Accuracy、Precision、Recall、F1 Score - 知乎 (zhihu.com)
一文看懂机器学习指标准确率、精准率、召回率、F1、ROC曲线、AUC曲线 (easyai.tech)
余弦距离的应用 总结一下其实这是在回答几个问题
什么是余弦距离为什么要用余弦距离余弦距离与其他距离有什么区别各种距离的使用场景是什么
机器学习中的数学——距离定义八余弦距离Cosine Distance-CSDN博客
余弦距离介绍 - 知乎 (zhihu.com) 余弦距离(Cosine Distance)也可以叫余弦相似度。 几何中夹角余弦可用来衡量两个向量方向的差异机器学习中借用这一概念来衡量样本向量之间的差异。相比距离度量余弦相似度更加注重两个向量在方向上的差异而非距离或长度上。 余弦取值范围为[ −1 , 1]求得两个向量的夹角并得出夹角对应的余弦值此余弦值就可以用来表示这两个向量的相似性。夹角越小趋近于0度余弦值越接近于1它们的方向更加吻合则越相似当两个向量的方向完全相反夹角余弦取最小值-1当余弦值为0时两向量正交夹角为90度。因此可以看出余弦相似度与向量的幅值无关只与向量的方向相关。 比如DNA和脱氧核糖核酸长度不一样但是理论上距离应该很近。
再比如我们看两个人的行为去图书馆的次数在图书馆待的总时长A是(1, 120)B是(10, 1200)可以看出两个人在图书馆停留的平均时长都是一样的但是明显B看起来更卷王一点。
如果是计算欧氏距离
1166481
如果计算余弦距离就是
0.000006943962225
因此可以看出不同的距离实际上是为了衡量不同的相似程度。
A/B测试
暂时不考虑做这段的笔记和生物实验设计差不多主打就是一个控制变量
超参数调优
sklearn.model_selection.GridSearchCV — scikit-learn 1.4.0 documentation
sklearn.model_selection.RandomizedSearchCV — scikit-learn 1.4.0 documentation
API Reference — scikit-learn 1.4.0 documentation
还有很多其他的自取
后期会补充各个方法之间的区别和联系
过拟合和欠拟合
过拟合的解决策略
获得更多的数据降低模型的复杂度增加线性降低非线性即variance↓bias↑ 神经网络中可以减少网络层数、神经元个数、决策树则可以降低树的深度剪枝等正则化加penalty
欠拟合的解决策略
增加特征增加模型复杂度减少正则化系数
这个答案给的不太好建议忽略。可以参考下面这篇文章
欠拟合和过拟合出现原因及解决方案 - 范中豪 - 博客园 (cnblogs.com)
附录梯度消失和梯度爆炸
发现这个很经常被问到哎。结果书里好像没有提到有点尴尬□
一般而言这类问题都是两方面是什么引起的怎么做可以缓解。我想再添一个方面为什么能缓解这是一个相当intuition的问题orz因为我没办法给出实验or数学表达式上的推导但是如果不问为什么能缓解就觉得没有解决前面两个问题
是什么
梯度爆炸 在深层网络或循环神经网络中误差梯度可在更新中累积变成非常大的梯度然后导致网络权重的大幅更新并因此使网络变得不稳定。在极端情况下权重的值变得非常大以至于溢出导致 NaN 值。 网络层之间的梯度值大于 1.0重复相乘导致的指数级增长会产生梯度爆炸。 梯度爆炸引发的问题 在深度多层感知机网络中梯度爆炸会引起网络不稳定最好的结果是无法从训练数据中学习而最坏的结果是出现无法再更新的 NaN 权重值。 The exploding gradient problem describes a situation in the training of neural networks where the gradients used to update the weights grow exponentially. This prevents the backpropagation algorithm from making reasonable updates to the weights, and learning becomes unstable. 爆炸梯度问题描述了神经网络训练中用于更新权值的梯度呈指数增长的情况。这使得反向传播算法无法对权重进行合理的更新并且学习变得不稳定。
梯度消失 和爆炸梯度一样消失梯度很大程度上是由Wt - k引起的。如果|W|1则|Wt−k|会迅速缩小到0特别是在s型非线性的情况下。对于之前的长距离步骤梯度将变为0这使得RNN很难学习长距离依赖关系。消失梯度比爆炸梯度问题更大因为它不仅是RNN的普遍问题而且是任何多层深度神经网络的普遍问题。 The vanishing gradient problem describes a situation encountered in the training of neural networks where the gradients used to update the weights shrink exponentially. As a consequence, the weights are not updated anymore, and learning stalls. 梯度消失问题描述了神经网络训练中遇到的一种情况即用于更新权重的梯度呈指数级缩小。结果权重不再更新学习就停滞了。
为什么 【梯度消失】经常出现产生的原因有一是在深层网络中二是采用了不合适的损失函数比如sigmoid。当梯度消失发生时接近于输出层的隐藏层由于其梯度相对正常所以权值更新时也就相对正常但是当越靠近输入层时由于梯度消失现象会导致靠近输入层的隐藏层权值更新缓慢或者更新停滞。这就导致在训练时只等价于后面几层的浅层网络的学习。 【梯度爆炸】一般出现在深层网络和权值初始化值太大的情况下。在深层神经网络或循环神经网络中误差的梯度可在更新中累积相乘。如果网络层之间的梯度值大于 1.0那么重复相乘会导致梯度呈指数级增长梯度变的非常大然后导致网络权重的大幅更新并因此使网络变得不稳定。 梯度爆炸会伴随一些细微的信号如①模型不稳定导致更新过程中的损失出现显著变化②训练过程中在极端情况下权重的值变得非常大以至于溢出导致模型损失变成 NaN等等。 深层网络 由于深度网络是多层非线性函数的堆砌整个深度网络可以视为是一个复合的非线性多元函数这些非线性多元函数其实就是每层的激活函数那么对loss function求不同层的权值偏导相当于应用梯度下降的链式法则链式法则是一个连乘的形式所以当层数越深的时候梯度将以指数传播。 如果接近输出层的激活函数求导后梯度值大于1那么层数增多的时候最终求出的梯度很容易指数级增长就会产生梯度爆炸相反如果小于1那么经过链式法则的连乘形式也会很容易衰减至0就会产生梯度消失。 从深层网络角度来讲不同的层学习的速度差异很大表现为网络中靠近输出的层学习的情况很好靠近输入的层学习的很慢有时甚至训练了很久前几层的权值和刚开始随机初始化的值差不多。因此梯度消失、爆炸其根本原因在于反向传播训练法则属于先天不足。由于深层网络链式法则如果梯度超过或者低于某个阈值的情况连续发生那么就会导致数值上的问题 激活函数这个是梯度消失的原因如果使用sigmoid作为激活函数引用的文章应该写错了那么其天然的就带来了小的梯度就更容易在链式求导的时候使得梯度值滑向0 初始权重过大这个是梯度爆炸的原因初始权重很大使得求导时出现大于1的情况 怎么做 解决方案1-预训练加微调 此方法来自Hinton在2006年发表的一篇论文Hinton为了解决梯度的问题提出采取无监督逐层训练方法其基本思想是每次训练一层隐节点训练时将上一层隐节点的输出作为输入而本层隐节点的输出作为下一层隐节点的输入此过程就是逐层“预训练”pre-training在预训练完成后再对整个网络进行“微调”fine-tunning。Hinton在训练深度信念网络Deep Belief Networks中使用了这个方法在各层预训练完成后再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优然后整合起来寻找全局最优此方法有一定的好处但是目前应用的不是很多了。 解决方案2-梯度剪切、正则化 梯度剪切这个方案主要是针对梯度爆炸提出的其思想是设置一个梯度剪切阈值然后更新梯度的时候如果梯度超过这个阈值那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。 注在WGAN中也有梯度剪切限制操作但是和这个是不一样的WGAN限制梯度更新信息是为了保证lipchitz条件。 另外一种解决梯度爆炸的手段是采用权重正则化weithts regularization比较常见的是l1正则和l2正则在各个深度框架中都有相应的API可以使用正则化。 解决方案3-relu、leakrelu、elu等激活函数 Relu:思想也很简单如果激活函数的导数为1那么就不存在梯度消失爆炸的问题了每层的网络都可以得到相同的更新速度relu就这样应运而生。先看一下relu的数学表达式 relu的主要贡献在于 缓解了梯度消失、爆炸的问题计算方便计算速度快加速了网络的训练 同时也存在一些缺点 由于负数部分恒为0会导致一些神经元无法激活可通过设置小学习率部分解决 输出不是以0为中心的 解决方案4-batchnorm/批规范化 Batchnorm是深度学习发展以来提出的最重要的成果之一了目前已经被广泛的应用到了各大网络中具有加速网络收敛速度提升训练稳定性的效果Batchnorm本质上是解决反向传播过程中的梯度问题。batchnorm全名是batch normalization简称BN即批规范化通过规范化操作将输出信号x规范化到均值为0方差为1保证网络的稳定性。 解决方案5-残差结构 残差结构说起残差的话不得不提这篇论文了Deep Residual Learning for Image Recognition关于这篇论文的解读可以参考机器学习算法全栈工程师知乎专栏文章链接https://zhuanlan.zhihu.com/p/31852747这里只简单介绍残差如何解决梯度的问题。 事实上就是残差网络的出现导致了image net比赛的终结自从残差提出后几乎所有的深度网络都离不开残差的身影相比较之前的几层几十层的深度网络在残差网络面前都不值一提残差可以很轻松的构建几百层一千多层的网络而不用担心梯度消失过快的问题原因就在于残差的捷径shortcut部分其中残差单元如下图所示 解决方案6-LSTM LSTM全称是长短期记忆网络long-short term memory networks是不那么容易发生梯度消失的主要原因在于LSTM内部复杂的“门”(gates)如下图LSTM通过它内部的“门”可以接下来更新的时候“记住”前几次训练的”残留记忆“因此经常用于生成文本中。 这里提一嘴relu的问题可以采用leakrelu替代这是为了防止有些neuron永远都不会被激活因为小于0的就一直是0另外有一种方法是elu但是由于这个牵涉到exp()求导所以会相对慢一些毕竟前面的relu和leakrelu求导都是常数在计算上肯定就更快介于训练得训练好多轮肯定希望算快点。
为什么可以这么做
预训练微调 老实说这个方法超常见的基本上就和爸妈盯着写作业然后家长签字交给老师那么老师拿到没有做完的作业的概率就会很低了。梯度剪切正则化 在NLP的课程中老师提到过在最开始很多人都没办法train起来network因为这个平面过于崎岖了很可能某个位置前一秒还是平坦的下一秒就马里亚纳海沟了一脚踩进去直接爆炸所以实际上当时采用的思路是限制梯度如果高/低于某个值就锁死在这个值这样即使一脚踩进去也不至于飞天上去。对权重做正则化也很好理解有的地方太离谱了就给揍狠一点那么下次就知道不要往这边走太多。激活函数 本身激活函数就可能是造成梯度爆炸/梯度消失的元凶首恶直接对它下手也很好理解batch normalization 似乎在前面的normalization部分介绍了batchnorm是什么了已经。这个作用其实还是希望在走向收敛的路上别走弯路尽量团成一个正常的圆resnet 本身resnet就用了batchnorm这里可以解决梯度消失的问题是采用了残差链接的方式。即使那边已经挂了这边至少还有一个输入的x。 本来我们学的是F(x)现在学的是F(x)-x据说这么做的好处除了防止梯度消失而且残差更好学。当然本身resnet是解决了退化的问题。 这里的“退化”指的是随着网络的加深accuracy先逐渐升高到达饱和然后迅速衰退。文中指出这一问题并非由过拟合导致并不是模型过于复杂。这一问题也说明了我们并不能简单的认为通过堆叠层数来优化模型。LSTM RNN和LSTM在面对memory的时候处理的operation其实是不一样的。在RNN里面其实在每一个时间点memory里面的信息都会被洗掉在每一个时间点output的值都会被放到memory里面去所以每个时间点memory里面的值都会被覆盖掉。 但是在LSTM里面不一样是把原来memory里面的值乘上一个值再加上input的值加起来放到memory里面。所以如果现在的weight可以影响到memory里面的值一旦发生影响这个影响会一直存在。 不像RNN里面每个时间点的memory里面的值都会被format掉只要一被format掉这个值就消失了。但是在LSTM里面一旦能对memory造成影响那个影响会永远保留除非forget gate决定吧当前memory里面的值洗掉关闭forget gate。 即使这样也有forget gate这也有可能会把memory里面的值洗掉。事实上在最开始的结构里是没有forget gate的因为设计出来就是为了解决gradient vanish的问题的forget gate实际上是后面加进来的一般而言是给forget gate比较大的bias确保forget gate在大部分时间是开启的。 摘自弹幕LSTM可以解决梯度消失的原因是来自上一时序的信息以相加的方式保存在memory unit中所以当forget gate一直保持开启时这部分梯度就始终存在 LSTM会把比较平坦的地方去掉也就是让error surface不要那么崎岖可以解决gradient vanish的问题这个时候就可以放心的把learning rate设的小一点-可以在learning rate特别小的情况下训练。 简单来说就是resnet采用连接的方式维持一个梯度的体面不要丢失LSTM采用把以前的梯度都吃掉融为一体什么恶魔的报恩方法 参考链接
警惕损失Loss为Nan或者超级大的原因_损失值为nan-CSDN博客深度网络梯度爆炸的原因、产生的影响和解决方法(常用激活函数)_tanh 稳定网络-CSDN博客梯度爆炸与梯度消失是什么有什么影响如何解决-CSDN博客梯度消失和梯度爆炸及解决方法 - 知乎 (zhihu.com)详解深度学习中的梯度消失、爆炸原因及其解决方法 - 知乎 (zhihu.com)出现梯度消失与梯度爆炸的原因以及解决方案 - 知乎 (zhihu.com)
附录GDBT与XGBoost的联系和区别
这个也很经常被问到但是在数的第12章感觉看到这里要很久哎~
所以提前放出来好啦✿✿ヽ(°▽°)ノ✿
第一次被问到的时候我愣住了XGBoost不是一个通用的库嘛里面封装了一系列方法。XGBoost Documentation — xgboost 2.0.3 documentation
GDBT GBDT也是集成学习Boosting家族的成员但是却和传统的Adaboost有很大的不同。回顾下Adaboost我们是利用前一轮迭代弱学习器的误差率来更新训练集的权重这样一轮轮的迭代下去。GBDT也是迭代使用了前向分布算法但是弱学习器限定了只能使用CART回归树模型同时同时GBDT是基于残差学习的算没有AdaBoost中的样本权重的概念。 请参考图解机器学习 | GBDT模型详解 (showmeai.tech)图解看例子 XGBoost XGBoosteXtreme Gradient Boosting极致梯度提升是一种基于GBDT的算法或者说工程实现。 XGBoost的基本思想和GBDT相同但是做了一些优化比如二阶导数使损失函数更精准正则项避免树过拟合Block存储可以并行计算等。 请参考图解机器学习 | XGBoost模型详解 (showmeai.tech)查看图解 差异 ①提升树基于残差每一次迭代当前模型都在尽可能拟合残差 ②GBDT基于一阶导数梯度下降法优化 ③Xgboost基于GBDT的思想使用了一阶和二阶导数信息牛顿法优化牛顿法可参见[优化方法] 梯度下降法、最小二乘法、牛顿法、拟牛顿法、共轭梯度法。 提升树、GBDT、Xgboost关系如下最开始的时候总是搞不懂网上很多资料把最原始的GBDT和Xgboost都混在一起讲了 ①提升树的思想是基于加法模型不断拟合残差。 ②GBDT和Xgboost都是基于提升树的思想。 ③GBDT的全称是Gradient Boosting Decision Tree之所以有Gradient是因为GBDT中引入了梯度作为提升树中“残差”的近似值提升树的每次迭代都是为了使当前模型拟合残差就是使求得的增量模型尽可能等于残差。 ④Xgboost可以说是GBDT的一种因为其也是基于Gradient和Boosting思想但是和原始GBDT的不同是Xgboost中引入了二阶导数和正则化除此之外Xgboost的作者陈天奇博士在工程实现方面做了大量的优化策略。 大概意思是提升树残差-GBDT用负梯度作为残差近似值-Xgboost加了二阶导数和正则化等优化策略 为什么已经有了基于残差的回归树还提出基于负梯度来替代残差的替代提升树 《统计学习方法》中给出的解释是当损失函数是平方损失和对数损失时每一步的优化是很简单的但是对于一般的损失函数而言往往每一步的优化不是那么容易使用负梯度代替残差。kaggle blog给出的解释是Although we can minimize this function directly, gradient descent will let us minimize more complicated loss functions that we can’t minimize directly. 原文链接https://blog.csdn.net/quiet_girl/article/details/88756843 参考链接
XGBoost的原理、公式推导、Python实现和应用 - 知乎 (zhihu.com)深入理解XGBoost优缺点分析原理推导及工程实现-CSDN博客GBDT和Xgboost原理、推导、比较_xgboost是gbdt的一种吗-CSDN博客Xgboost和GBDT的区别 (zhihu.com)梯度提升树GBDT - 知乎 (zhihu.com)GBDT算法原理以及实例理解_gbdt算法实例 csdn-CSDN博客梯度提升树(GBDT)原理小结 - 刘建平Pinard - 博客园 (cnblogs.com)