分类: 机器学习

  • 关于机器学习:机器学习笔记3多元线性回归和正规方程

    多元线性回归的假如函数

    • 下边咱们介绍多个特色量的线性回归模式,并通过向量乘法示意。例如,之前的预测房价例子中,咱们只有一个特征向量(屋宇大小),来预测屋宇价格。然而,实际上屋宇价格不仅仅与大小无关,还与卧室数量、楼层数、应用年限等多个特征向量无关
    相干符号含意


    在多元线性回归中,m仍示意数据集的数据数量,上标i示意第i个训练样本;n示意每个数据的特征值数量,下标示意数据的第i个特色

    多元假如函数的引入

    • 例如在房价预测的例子中,可用上图的多元线性函数作为假如函数。随着面积、楼层数、此屋宇所在楼层增大,房价增大;随着屋宇年限增大,房价变小
    用向量模式示意多元假如函数
    • 设x0=1,即定义了额定的特色量,但取值总为1.这样特色量可用一个n+1维向量示意,同样咱们把参数看做n+1维的行向量。两个向量相乘,就失去咱们的假如函数

    多元线性回归的梯度降落法

    • 前边咱们提到了多元线性回归的假如模式,下边咱们看一下如何找到满足假如最拟合的参数。即如何应用梯度降落法,解决多特色的线性回归问题
    • 多元线性回归的梯度降落法与一元线性回归相似,都是先写出代价函数式子,而后将代价函数代入梯度降落公式中,通过计算失去参数j的偏导数项。一直的用参数j,减去学习速率a*参数j的偏导数,直到参数收敛

    • 多元梯度降落的参数更新规定实际上和一元梯度降落也是雷同的。只是把x0设为1而已

    梯度降落算法的应用技巧

    • 在学习完多特色的线性回归模型后,咱们来看一下梯度降落算法的应用技巧
    梯度缩放
    • 当机器学习问题有多个特色时,若特色都处于相近的范畴内,梯度降落算法会更快地收敛。若特色范畴相差较大,如预测房价问题中,面积大小在0~2000间,卧室数目在1~5之间,那么轮廓图就变成了十分瘦长的椭圆(相似地形图,卧室数目单位影响更大,所以变动更快,而地形图中变动快的线密集)。这个时候咱们应用梯度降落法,就会来回稳定,降落迟缓


    这样的状况下,咱们就会进行特色缩放,让特色的范畴尽可能靠近。这样轮廓图就会就会靠近圆,不再是瘦长的椭圆。这时梯度降落的速率就会变快

    • 一般来说,特色缩放将特色缩放到-1和1之间。然而实际上范畴能够大于小于这个范畴,只有别太过分就行


    如上图,0~3、-2~0.5是能够承受不必缩放的,然而-100~100、0.001就相差太远,须要用特色缩放。一般来说,-3~3和-1/3~1/3是能够承受的,超出就要思考特色缩放

    均值归一化
    • 除了梯度学习,也能够通过均值归一化,即让特征值具备0的平均值,来让梯度降落更快。减去平均值,除以范畴(最大值-最小值)。不肯定齐全准确,大略就行

    如何抉择适合的特色和假如函数

    • 前边学习了多特色的线性回归,下边咱们来看一下如何抉择适合的特色或者办法
    抉择适合的特色:能够本人发明新的特色
    • 在预测房价的例子中,若给予宽度深度两个特色,而真正确定房价的特色应该是面积。所以咱们用深度*宽度,失去新的特色面积,用一元线性回归进行预测

    即咱们不是给什么特色就用什么特色,而是从特色和标签的角度扫视问题,必要时通过定义新的特色,失去更好地模型

    抉择适合的假如函数:理解各种函数的走势
    • 在机器学习中,有时线性函数不能很好的拟合数据,可能要用到非线性函数。如预测房价中,显然直线是不能拟合的;若应用二次函数的话,后边会降回来,然而房价不会因为面积过大降回来,不符合实际;因而咱们思考应用三次函数拟合

      正规方程:求最优解参数的另一种办法

      • 在前边的线性回归问题中,咱们始终应用梯度降落法求假如函数的最优解参数,这种办法须要通过屡次迭代,来收敛到参数的全局最小值。这里,咱们再引入正规方程的办法,通过矩阵计算,一步得出参数的最优解
    先对正规方程有一个直观了解

    • 先从一个参数看起,求最优解,就是求导,而后导数置零失去的参数值
    • 当有多个参数时,对每个参数求偏导数,全副置零时失去的每个参数的值。然而偏微分办法太过简单,因而咱们不应用遍历微分的办法,而是通过矩阵计算失去参数值
    • 假如有m=4个样本数据,首先构建前边的x矩阵。每个样本给出本人的特征向量(依然x0=1),转置后,将第一个数据的向量作为第一行,第二个数据的向量作为第二行,以此类推。而后进行下边的矩阵计算,失去的后果就是参数值

    正规方程和梯度降落的比拟

    • 梯度降落法:

    (1)若参数不在相近的范畴内,须要梯度缩放或者特色归一化,解决到相近范畴内;特征方程则不须要
    (2)须要人为抉择学习速率,尝试不同的学习速率,运行屡次找到最好的那个,带来了额定的工作和麻烦
    (3)须要屡次迭代,计算慢

    • 特征方程:

    (1)不须要抉择学习速率
    (2)运行一次即可
    (3)不须要画出曲线查看收敛性

    • 看了上边,仿佛正规方程远优于梯度降落。然而,特征方程须要样本数目m和特色量n值比拟小。因为矩阵运算相当于矩阵维度的三次方计算,当m或n太大时,计算会十分慢,还不如用梯度降落快。个别,咱们把一万作为分界点,超过一万就只思考梯度降落法,一万以内正规方程比拟好

    而且随着算法越来越简单,后边的分类算法等只能用梯度降落,不能用特征方程解决
    ##### 应用正规方程的问题:矩阵的不可逆性

    • 当应用正规方程时发现矩阵不可逆怎么办?通常由两种起因引起

    (1)某些特色间存在一个固定关系。例如预测房价中,把面积英寸和平方米作为特色,两者存在3.28的换算(线性)关系,这会造成矩阵的不可逆
    (2)特色数量远大于数据个数。假如咱们有10个训练样本,却有100个特征值,要从10个样本中找到100个参数值,太艰难。可能造成矩阵的不可逆。对于m>>n的问题,咱们能够通过正则化的线性代数办法,删除某些反复或低效特色解决m>>n的问题

  • 关于机器学习:小白学AI防止过拟合的方法大全

    文章转自【机器学习炼丹术】

    1 什么是过拟合

    过拟合就是在训练集上体现得十分好,在测试集上体现得不好。也就是咱们俗称的泛化能力弱

    过拟合无奈防止,只能缓解,那么如何缓解呢?办法太多了。这篇文章一一介绍。

    2 数据集加强 Augmentation

    图像上,翻转,平移,缩放,旋转,镜像,加强对比度,加强亮度等诸多形式。
    我在上面的内容中介绍了图像处理的图像增强的办法:
    【预处理库函数】albumentations 库的简略理解和应用

    3 Early Stopping

    训练模型的时候,训练误差往往是一直降落的,然而验证数据集的误差,是先降落后回升。 两个数据集的误差出现分歧的时候,阐明模型开始过拟合了。所以 Early Stopping 就是当验证数据集的误差不在降落的时候,完结训练,保留模型参数。

    4 正则化

    • regularization

    L1 正则:模型中只有少部分特色对模型的泛化能力有奉献,所以 L1 就是限度模型中非零参数的数量。让大部分的模型参数都是 0,只有真正对泛化能力其作用的参数才是非零的。

    L2 正则:咱们心愿模型找到的极小值是平坦的,为什么呢?

    图中示意的意思,就是平坦的极小值,能够有更多的容忍,容忍什么呢?容忍训练数据集和测试数据集之前的散布偏差。当初,如果模型的某些参数特地大,那么就算输出的样本只有很小的区别,然而通过特地大的参数之后,模型给出的后果很可能是十分不同的。这就是太平缓。所以 L2 正则就是限度模型参数的大小。参数的平方的和作为损失的一部分,当参数数值越大,那么梯度降落的损失越大,就会强制参数变小。

    这里有两幅图:

    这一幅图体现的是假如只有两个参数的状况下,减少 L1 正则的状况。圆圈圈体现的是损失等值线,方框是 L1 正则的损失。假如没有 L1 正则,那么参数应该收敛到最小的那个圆圈中的。然而因为减少了 L1 正则,所以须要衡量两个局部的损失,而后找到接触的交点地位。因为圆形和矩形在矩形的顶点相交的可能性大,而矩形的顶点就是某一个参数为 0 的状况。所以 L1 正则会让模型参数有更大的可能性为 0.
    【在更多参数的模型中,会有更多的顶点。不过二维图像就画不进去了】



    这个是 L2 正则的示意图。L2 正则式一个原型因为是参数的平方和。相比 L1 的(0,1)这样的交点,L2 更心愿每一个参数都广泛较小,不心愿某一个参数特地大。

    5 Dropout

    这个就是神经网络中,在全连贯网络中常常用到的。

    在每一个 Batch 数据训练的时候,Dropout 层依照概率 P 随机让一些神经元失活,而后保留下来的神经元的参数被更新。dropout是只有在训练的时候才应用的,在测试的时候并不实用。

    我集体了解的 dropout 其实就相当于一个多模型交融的过程。因为每一次都会失活一部分的神经元,所以每一次的模型都是不那么一样的,相当于不同的模型吧。

    6 减少乐音

    6.1 输出中减少乐音

    输出中有乐音 $\epsilon$,那么输入中就会有一个相似于 $\epsilon \omega$,这样的损失项。 从而限度权值的大小。

    当然这样也能够减少模型对输出的容忍度,我感觉也能够了解为一种数据加强。 去噪自编码器 DAE 就是利用这样的办法的。

    6.2 权值中加乐音

    这个用的不多,在初始化网络的时候,用 0 均值的高斯分布作为参数的初始化。

    7 集成

    集成次要是 bagging,boosting,之前说的 dropout 我感觉也能够算作集成的办法

    7.1 bagging

    将数据集抽取一部分,比方抽取 70%的样本,而后用这些样本去训练一个模型。而后再从数据集中抽取 70%的样本,再训练一个新的。典型的就是随机森林。
    【神经网络因为训练速度的问题,所以个别不必这样的办法。决策树 lgb 啥的能够用】

    7.2 boosting

    训练简单神经网络比较慢,所以能够通过训练多个简略的分类器,而后加权均匀每一个分类器的输入。这就是 Boost 的思维。【这句话给我背下来!】

    之后整顿一下 Adaboost 和 XGBoost 的这些算法。

    8 其余

    • 限度网络的层数和复杂度
  • 关于机器学习:小白学AI防止过拟合的方法大全

    文章转自【机器学习炼丹术】

    1 什么是过拟合

    过拟合就是在训练集上体现得十分好,在测试集上体现得不好。也就是咱们俗称的泛化能力弱

    过拟合无奈防止,只能缓解,那么如何缓解呢?办法太多了。这篇文章一一介绍。

    2 数据集加强 Augmentation

    图像上,翻转,平移,缩放,旋转,镜像,加强对比度,加强亮度等诸多形式。
    我在上面的内容中介绍了图像处理的图像增强的办法:
    【预处理库函数】albumentations 库的简略理解和应用

    3 Early Stopping

    训练模型的时候,训练误差往往是一直降落的,然而验证数据集的误差,是先降落后回升。 两个数据集的误差出现分歧的时候,阐明模型开始过拟合了。所以 Early Stopping 就是当验证数据集的误差不在降落的时候,完结训练,保留模型参数。

    4 正则化

    • regularization

    L1 正则:模型中只有少部分特色对模型的泛化能力有奉献,所以 L1 就是限度模型中非零参数的数量。让大部分的模型参数都是 0,只有真正对泛化能力其作用的参数才是非零的。

    L2 正则:咱们心愿模型找到的极小值是平坦的,为什么呢?

    图中示意的意思,就是平坦的极小值,能够有更多的容忍,容忍什么呢?容忍训练数据集和测试数据集之前的散布偏差。当初,如果模型的某些参数特地大,那么就算输出的样本只有很小的区别,然而通过特地大的参数之后,模型给出的后果很可能是十分不同的。这就是太平缓。所以 L2 正则就是限度模型参数的大小。参数的平方的和作为损失的一部分,当参数数值越大,那么梯度降落的损失越大,就会强制参数变小。

    这里有两幅图:

    这一幅图体现的是假如只有两个参数的状况下,减少 L1 正则的状况。圆圈圈体现的是损失等值线,方框是 L1 正则的损失。假如没有 L1 正则,那么参数应该收敛到最小的那个圆圈中的。然而因为减少了 L1 正则,所以须要衡量两个局部的损失,而后找到接触的交点地位。因为圆形和矩形在矩形的顶点相交的可能性大,而矩形的顶点就是某一个参数为 0 的状况。所以 L1 正则会让模型参数有更大的可能性为 0.
    【在更多参数的模型中,会有更多的顶点。不过二维图像就画不进去了】



    这个是 L2 正则的示意图。L2 正则式一个原型因为是参数的平方和。相比 L1 的(0,1)这样的交点,L2 更心愿每一个参数都广泛较小,不心愿某一个参数特地大。

    5 Dropout

    这个就是神经网络中,在全连贯网络中常常用到的。

    在每一个 Batch 数据训练的时候,Dropout 层依照概率 P 随机让一些神经元失活,而后保留下来的神经元的参数被更新。dropout是只有在训练的时候才应用的,在测试的时候并不实用。

    我集体了解的 dropout 其实就相当于一个多模型交融的过程。因为每一次都会失活一部分的神经元,所以每一次的模型都是不那么一样的,相当于不同的模型吧。

    6 减少乐音

    6.1 输出中减少乐音

    输出中有乐音 $\epsilon$,那么输入中就会有一个相似于 $\epsilon \omega$,这样的损失项。 从而限度权值的大小。

    当然这样也能够减少模型对输出的容忍度,我感觉也能够了解为一种数据加强。 去噪自编码器 DAE 就是利用这样的办法的。

    6.2 权值中加乐音

    这个用的不多,在初始化网络的时候,用 0 均值的高斯分布作为参数的初始化。

    7 集成

    集成次要是 bagging,boosting,之前说的 dropout 我感觉也能够算作集成的办法

    7.1 bagging

    将数据集抽取一部分,比方抽取 70%的样本,而后用这些样本去训练一个模型。而后再从数据集中抽取 70%的样本,再训练一个新的。典型的就是随机森林。
    【神经网络因为训练速度的问题,所以个别不必这样的办法。决策树 lgb 啥的能够用】

    7.2 boosting

    训练简单神经网络比较慢,所以能够通过训练多个简略的分类器,而后加权均匀每一个分类器的输入。这就是 Boost 的思维。【这句话给我背下来!】

    之后整顿一下 Adaboost 和 XGBoost 的这些算法。

    8 其余

    • 限度网络的层数和复杂度
  • 关于机器学习:小白学AI梯度消失爆炸及其解决方法

    文章来自【机器学习炼丹术】

    梯度隐没问题和梯度爆炸问题,总的来说能够称为梯度不稳固问题

    【要背住的常识】:用ReLU代替Sigmoid,用BN层,用残差构造解决梯度隐没问题。梯度爆炸问题的话,能够用正则化来限度。sigmoid的导数是【0,0.25】.

    1 呈现起因

    两者呈现起因都是因为链式法则。当模型的层数过多的时候,计算梯度的时候就会呈现十分多的乘积项。用上面这个例子来了解:

    这是每层只有1个神经元的例子,每个神经元的激活函数都是sigmoid,而后咱们想要更新b1这个参数。
    依照大家都公认的符号来示意:

    • $w_1*x_1 + b_1 = z_1$这就是z的含意;
    • $\sigma(z_1)=a_1$,这是a的含意。

    能够失去这个偏导数:
    $\frac{\partial C}{\partial b_1} = \frac{\partial z_1}{\partial b_1}\frac{\partial a_1}{\partial z_1} \frac{\partial z_2}{\partial a_2}\frac{\partial a_2}{\partial z_2} \frac{\partial z_2}{\partial a_3}\frac{\partial a_3}{\partial z_3} \frac{\partial z_3}{\partial a_4}\frac{\partial a_4}{\partial z_4} \frac{\partial C}{\partial a_4}$

    而后化简:
    $\frac{\partial C}{\partial b_1}=\sigma'(z_1)w_2\sigma'(z_2)w_3\sigma'(z_3)w_4\sigma'(z_4)\frac{\partial C}{\partial a_4}$

    关键在于这个$\sigma'(z_1)$,sigmoid函数的导数,是在0~0.25这个区间的,这意味着,当网络层数越深,那么对于后面几层的梯度,就会十分的小。下图是sigmoid函数的导数的函数图:

    因而常常会有这样的景象:

    图中,别离示意4层隐含层的梯度变动幅度。能够看到,最浅的那个隐含层,梯度更新的速度,是十分小的。【图中纵轴是指数变动的】。

    那么梯度爆炸也很好了解,就是$w_j\sigma'(z_j)>1$,这样就爆炸了。
    【留神:如果激活函数是sigmoid,那么其导数最大也就0.25,而$w_j$个别不会大于4的,所以sigmoid函数而言,个别都是梯度隐没问题】

    【总结】:

    1. 梯度隐没和梯度爆炸是指后面几层的梯度,因为链式法则一直乘小于(大于)1的数,导致梯度十分小(大)的景象;
    2. sigmoid导数最大0.25,个别都是梯度隐没问题。

    2 解决方案

    2.1 更换激活函数

    最常见的计划就是更改激活函数,当初神经网络中,除了最初二分类问题的最初一层会用sigmoid之外,每一层的激活函数个别都是用ReLU。

    【ReLU】:如果激活函数的导数是1,那么就没有梯度爆炸问题了。

    【益处】:能够发现,relu函数的导数在负数局部,是等于1的,因而就能够防止梯度隐没的问题。
    【不好】:然而正数局部的导数等于0,这样意味着,只有在链式法则中某一个$z_j$小于0,那么这个神经元的梯度就是0,不会更新。

    【leakyReLU】:在ReLU的正数局部,减少了肯定的斜率:

    解决了ReLU中会有死神经元的问题。

    【elu】:跟LeakyReLU一样是为了解决死神经元问题,然而减少的斜率不是固定的:

    然而相比leakrelu,计算量更大。

    2.2 batchnorm层

    这个是十分给力的胜利,在图像处理中必用的层了。BN层提出来的实质就是为了解决反向流传中的梯度问题

    在神经网络中,有这样的一个问题:Internal Covariate Shift
    假如第一层的输出数据通过第一层的解决之后,失去第二层的输出数据。这时候,第二层的输出数据绝对第一层的数据分布,就会产生扭转,所以这一个batch,第二层的参数更新是为了拟合第二层的输出数据的那个散布。然而到了下一个batch,因为第一层的参数也扭转了,所以第二层的输出数据的散布相比上一个batch,又不太一样了。而后第二层的参数更新方向也会产生扭转。层数越多,这样的问题就越显著。

    然而为了保障每一层的散布不变的话,那么如果把每一层输入的数据都归一化0均值,1方差不就好了?然而这样就会齐全学习不到输出数据的特色了。不论什么数据都是遵从规范正太散布,想想也会感觉有点奇怪。所以BN就是减少了两个自适应参数,能够通过训练学习的那种参数。这样吧每一层的数据都归一化到$\beta$均值,$\gamma$标准差的正态分布上。

    【将输出散布变成正态分布,是一种去除数据相对差别,扩充绝对差别的一种行为,所以BN层用在分类上成果的好的。对于Image-to-Image这种工作,数据的相对差别也是十分重要的,所以BN层可能起不到相应的成果。】

    2.3 残差构造


    残差构造,简略的了解,就是让深层网络通过走捷径,让网络不那么深层。这样梯度隐没的问题就缓解了。

    2.4 正则化

    之前提到的梯度爆炸问题,个别都是因为$w_j$过大造成的,那么用L2正则化就能够解决问题。

  • 关于机器学习:小白学AI梯度消失爆炸及其解决方法

    文章来自【机器学习炼丹术】

    梯度隐没问题和梯度爆炸问题,总的来说能够称为梯度不稳固问题

    【要背住的常识】:用ReLU代替Sigmoid,用BN层,用残差构造解决梯度隐没问题。梯度爆炸问题的话,能够用正则化来限度。sigmoid的导数是【0,0.25】.

    1 呈现起因

    两者呈现起因都是因为链式法则。当模型的层数过多的时候,计算梯度的时候就会呈现十分多的乘积项。用上面这个例子来了解:

    这是每层只有1个神经元的例子,每个神经元的激活函数都是sigmoid,而后咱们想要更新b1这个参数。
    依照大家都公认的符号来示意:

    • $w_1*x_1 + b_1 = z_1$这就是z的含意;
    • $\sigma(z_1)=a_1$,这是a的含意。

    能够失去这个偏导数:
    $\frac{\partial C}{\partial b_1} = \frac{\partial z_1}{\partial b_1}\frac{\partial a_1}{\partial z_1} \frac{\partial z_2}{\partial a_2}\frac{\partial a_2}{\partial z_2} \frac{\partial z_2}{\partial a_3}\frac{\partial a_3}{\partial z_3} \frac{\partial z_3}{\partial a_4}\frac{\partial a_4}{\partial z_4} \frac{\partial C}{\partial a_4}$

    而后化简:
    $\frac{\partial C}{\partial b_1}=\sigma'(z_1)w_2\sigma'(z_2)w_3\sigma'(z_3)w_4\sigma'(z_4)\frac{\partial C}{\partial a_4}$

    关键在于这个$\sigma'(z_1)$,sigmoid函数的导数,是在0~0.25这个区间的,这意味着,当网络层数越深,那么对于后面几层的梯度,就会十分的小。下图是sigmoid函数的导数的函数图:

    因而常常会有这样的景象:

    图中,别离示意4层隐含层的梯度变动幅度。能够看到,最浅的那个隐含层,梯度更新的速度,是十分小的。【图中纵轴是指数变动的】。

    那么梯度爆炸也很好了解,就是$w_j\sigma'(z_j)>1$,这样就爆炸了。
    【留神:如果激活函数是sigmoid,那么其导数最大也就0.25,而$w_j$个别不会大于4的,所以sigmoid函数而言,个别都是梯度隐没问题】

    【总结】:

    1. 梯度隐没和梯度爆炸是指后面几层的梯度,因为链式法则一直乘小于(大于)1的数,导致梯度十分小(大)的景象;
    2. sigmoid导数最大0.25,个别都是梯度隐没问题。

    2 解决方案

    2.1 更换激活函数

    最常见的计划就是更改激活函数,当初神经网络中,除了最初二分类问题的最初一层会用sigmoid之外,每一层的激活函数个别都是用ReLU。

    【ReLU】:如果激活函数的导数是1,那么就没有梯度爆炸问题了。

    【益处】:能够发现,relu函数的导数在负数局部,是等于1的,因而就能够防止梯度隐没的问题。
    【不好】:然而正数局部的导数等于0,这样意味着,只有在链式法则中某一个$z_j$小于0,那么这个神经元的梯度就是0,不会更新。

    【leakyReLU】:在ReLU的正数局部,减少了肯定的斜率:

    解决了ReLU中会有死神经元的问题。

    【elu】:跟LeakyReLU一样是为了解决死神经元问题,然而减少的斜率不是固定的:

    然而相比leakrelu,计算量更大。

    2.2 batchnorm层

    这个是十分给力的胜利,在图像处理中必用的层了。BN层提出来的实质就是为了解决反向流传中的梯度问题

    在神经网络中,有这样的一个问题:Internal Covariate Shift
    假如第一层的输出数据通过第一层的解决之后,失去第二层的输出数据。这时候,第二层的输出数据绝对第一层的数据分布,就会产生扭转,所以这一个batch,第二层的参数更新是为了拟合第二层的输出数据的那个散布。然而到了下一个batch,因为第一层的参数也扭转了,所以第二层的输出数据的散布相比上一个batch,又不太一样了。而后第二层的参数更新方向也会产生扭转。层数越多,这样的问题就越显著。

    然而为了保障每一层的散布不变的话,那么如果把每一层输入的数据都归一化0均值,1方差不就好了?然而这样就会齐全学习不到输出数据的特色了。不论什么数据都是遵从规范正太散布,想想也会感觉有点奇怪。所以BN就是减少了两个自适应参数,能够通过训练学习的那种参数。这样吧每一层的数据都归一化到$\beta$均值,$\gamma$标准差的正态分布上。

    【将输出散布变成正态分布,是一种去除数据相对差别,扩充绝对差别的一种行为,所以BN层用在分类上成果的好的。对于Image-to-Image这种工作,数据的相对差别也是十分重要的,所以BN层可能起不到相应的成果。】

    2.3 残差构造


    残差构造,简略的了解,就是让深层网络通过走捷径,让网络不那么深层。这样梯度隐没的问题就缓解了。

    2.4 正则化

    之前提到的梯度爆炸问题,个别都是因为$w_j$过大造成的,那么用L2正则化就能够解决问题。

  • 关于机器学习:小白学AI线性回归与逻辑回归似然参数估计

    文章转自【机器学习炼丹术】

    线性回归解决的是回归问题,逻辑回归相当于是线性回归的根底上,来解决分类问题。

    1 公式

    线性回归(Linear Regression)是什么相比不必多说了。格局是这个样子的:
    $f_{w,b}(x)=\sum_i{w_ix_i}+b$

    而逻辑回归(Logistic Regression)的样子呢?
    $f_{w,b}(x)=\sigma(\sum_i{w_ix_i}+b)$

    要记住的第一句话:逻辑回归能够了解为在线性回归后加了一个sigmoid函数。将线性回归变成一个0~1输入的分类问题。

    2 sigmoid

    sigmoid函数就是:
    $\sigma(z)=\frac{1}{1+e^{-z}}$

    函数图像是:

    线性回归失去大于0的输入,逻辑回归就会失去0.5~1的输入;
    线性回归失去小于0的输入,逻辑回归就会失去0~0.5的输入;


    这篇文章的重点,在于线性回归的参数估计应用的最小二乘法,而而逻辑回归应用的是似然预计的办法。(当然,两者都能够应用梯度降落的办法)。


    3 似然预计逻辑回归参数

    举个例子,当初咱们有了一个训练数据集,是一个二分类问题:

    下面的$x^1$是样本,上面的$C_1$是类别,总共有两个类别。

    当初假如咱们有一个逻辑回归的模型:
    $f_{w,b}(x)=\sigma(\sum_i{w_ix_i}+b)$
    那么$f_{w,b}(x^1)$的后果,就是一个0~1的数,咱们能够设定好,假如这个数字就是是类别$C_1$的概率,反之,1减去这个数字,就是类别$C_2$的概率。

    似然简略的了解,就是让咱们下面的数据集呈现的概率最大

    咱们来了解一下:

    1. $x_1$是$C_1$的概率是$f_{w,b}(x^1)$;
    2. $x_2$是$C_1$的概率是$f_{w,b}(x^2)$;
    3. $x_3$是$C_2$的概率是$1-f_{w,b}(x^3)$;
    4. ……
    5. $x_N$是$C_1$的概率是$f_{w,b}(x^N)$;

    样本之间彼此独立,那么下面那个数据集的概率是什么?是每一个样本的乘积,这个就是似然Likelihood:

    咱们心愿这个w,b的参数估计值,就是能取得最大化似然的那个参数。也就是:

    加上负号之后,就能够变成最小化的问题。当然,加上一个log并不会影响整个的w,b的估计值。因为$L(w,b)$最大的时候,$log(L(w,b))$也是最大的,log是个枯燥递增的函数。所以能够失去上面的:
    【留神:所有的log其实是以e为底数的自然对数】

    log又能够把之前的乘积和,转换成加法。
    $log(L(w,b))=log(f(x^1))+log(f(x^2))+log(1-f(x^3))…$

    而后,为了更加简化这个算是,咱们将$C_1, C_2$数值化,变成1和0,而后每一个样本的实在标签用$y$来示意,所以就能够失去:
    $log(L(w,b))=\sum_i^N{ylog(f(x^i))+(1-y)log(1-f(x^i))}$
    【有点像是二值穿插熵,然而其实就是二值穿插熵。。】

    • 当y=1,也就是类别是$C_1$的时候,这个是$log(f(x^i))$
    • 当y=0,也就是类别是$C_2$的时候,这个是$1-log(f(x^i))$

    所以其实咱们失去的损失函数是:
    $loss=-log(L(w,b))=-\sum_i^N{ylog(f(x^i))+(1-y)log(1-f(x^i))}$

    之前说了,要找到让这个loss最小的时候的w和b,那怎么找?
    【有情万能的梯度降落】

    所以计算$\frac{\partial loss}{\partial w}$,而后乘上学习率就好了。这里就不持续推导了,有急躁的能够缓缓推导,反正必定能推出来的。
    这里放个后果把:
    $\frac{-\partial lnL(w,b)}{\partial w_i}=\sum_n^N{-(y^n-f_{w,b}(x^n))x_i^n}$

    • 其中$w_i$为第i个要预计的参数,第i个特色;
    • $x^n_i$是第n个样本的第i个特色的值;
    • $y^n$是第n个样本的实在类别,0或者1。
  • 关于机器学习:评价指标详解F1score与多分类F1

    文章转自【机器学习炼丹术】

    基本概念

    首先,要背住的几个概念就是:accuracy,precision,recal, TP,FP,TN,FN

    • TP:true positive。预测是正确的正样本
    • FP:false positive。预测是谬误的正样本
    • TN:true negative。预测是正确的负样本
    • FP:false positive。预测是谬误的负样本

    通常咱们会做出这样的一个混同矩阵:

    右边的positive,negative示意样本实在值,表格上边的positive,negative示意样本的预测后果。

    当初咱们有这样的一个例子:

    图中的TP,FP等是一个比例,假如总共有100个样本,有40个是TP,有20个是FP……(不过混同矩阵个别不必除以总样本数量)

    当初咱们有了
    $TP=0.3,FP=0.1$
    $TN=0.4,FN=0.2$

    准确率Accuracy

    准确率是指,对于给定的测试数据集,分类器正确分类的样本书与总样本数之比,也就是预测正确的概率。

    对应下面的例子,能够失去Accuracy=0.7。

    【准确率Accuracy的弊病】

    准确率作为咱们最罕用的指标,当呈现样本不平衡的状况时,并不能正当反映模型的预测能力。例如测试数据集有90%的正样本,10%的负样本,假如模型预测后果全为正样本,这时准确率为90%,然而模型对负样本没有辨认能力,此时高准确率不能反映模型的预测能力。

    准确率Precision

    示意预测为正的样本中,理论的正样本的数量。

    对应下面的例子,$precision=\frac{0.3}{0.3+0.1}=0.75$。

    【集体了解】

    Precision是针对预测后果而言的。预测后果中,预测为正的样本中预测正确的概率。相似于一个考生在考卷上写进去的答案中,正确了多少。体现模型的精准度,模型说:我说哪个对哪个就是对的。

    召回率Recall

    Recall示意理论为正的样本被判断为正样本的比例

    对应上述的例子,失去$Recall=\frac{0.3}{0.3+0.2}=0.6$

    【集体了解】

    Recall是针对数据样本而言的。数据样本中,正样本中预测正确的概率。相似于一个考生在考卷上答复了多少题。体现一个模型的全面性,模型说:所有对的我都能找进去。

    F1 score

    Precision和Recall是一对矛盾的度量,一般来说,Precision高时,Recall值往往偏低;而Precision值低时,Recall值往往偏高。当分类置信度高时,Precision偏高;分类置信度低时,Recall偏高。为了可能综合思考这两个指标,F-measure被提出(Precision和Recall的加权和谐均匀),即:

    F1的核心思想在于,在尽可能的进步Precision和Recall的同时,也心愿两者之间的差别尽可能小。F1-score实用于二分类问题,对于多分类问题,将二分类的F1-score推广,有Micro-F1和Macro-F1两种度量。

    【Micro-F1】

    统计各个类别的TP、FP、FN、TN,加和形成新的TP、FP、FN、TN,而后计算Micro-Precision和Micro-Recall,失去Micro-F1。具体的说,统计进去各个类别的混同矩阵,而后把混同矩阵“相加”起来,失去一个多类别的混同矩阵,而后再计算F1score

    【Macro-F1】

    我感觉更罕用的是Macro-F1。统计各个类别的TP、FP、FN、TN,别离计算各自的Precision和Recall,失去各自的F1值,而后取平均值失去Macro-F1

    【总结】

    从下面二者计算形式上能够看出,Macro-F1平等地对待各个类别,它的值会受到罕见类别的影响;而Micro-F1则更容易受到常见类别的影响。

    参考:

    [1]http://zjmmf.com/2019/08/13/F…

    [2]https://zhuanlan.zhihu.com/p/…

  • 关于机器学习:评价指标详解F1score与多分类F1

    文章转自【机器学习炼丹术】

    基本概念

    首先,要背住的几个概念就是:accuracy,precision,recal, TP,FP,TN,FN

    • TP:true positive。预测是正确的正样本
    • FP:false positive。预测是谬误的正样本
    • TN:true negative。预测是正确的负样本
    • FP:false positive。预测是谬误的负样本

    通常咱们会做出这样的一个混同矩阵:

    右边的positive,negative示意样本实在值,表格上边的positive,negative示意样本的预测后果。

    当初咱们有这样的一个例子:

    图中的TP,FP等是一个比例,假如总共有100个样本,有40个是TP,有20个是FP……(不过混同矩阵个别不必除以总样本数量)

    当初咱们有了
    $TP=0.3,FP=0.1$
    $TN=0.4,FN=0.2$

    准确率Accuracy

    准确率是指,对于给定的测试数据集,分类器正确分类的样本书与总样本数之比,也就是预测正确的概率。

    对应下面的例子,能够失去Accuracy=0.7。

    【准确率Accuracy的弊病】

    准确率作为咱们最罕用的指标,当呈现样本不平衡的状况时,并不能正当反映模型的预测能力。例如测试数据集有90%的正样本,10%的负样本,假如模型预测后果全为正样本,这时准确率为90%,然而模型对负样本没有辨认能力,此时高准确率不能反映模型的预测能力。

    准确率Precision

    示意预测为正的样本中,理论的正样本的数量。

    对应下面的例子,$precision=\frac{0.3}{0.3+0.1}=0.75$。

    【集体了解】

    Precision是针对预测后果而言的。预测后果中,预测为正的样本中预测正确的概率。相似于一个考生在考卷上写进去的答案中,正确了多少。体现模型的精准度,模型说:我说哪个对哪个就是对的。

    召回率Recall

    Recall示意理论为正的样本被判断为正样本的比例

    对应上述的例子,失去$Recall=\frac{0.3}{0.3+0.2}=0.6$

    【集体了解】

    Recall是针对数据样本而言的。数据样本中,正样本中预测正确的概率。相似于一个考生在考卷上答复了多少题。体现一个模型的全面性,模型说:所有对的我都能找进去。

    F1 score

    Precision和Recall是一对矛盾的度量,一般来说,Precision高时,Recall值往往偏低;而Precision值低时,Recall值往往偏高。当分类置信度高时,Precision偏高;分类置信度低时,Recall偏高。为了可能综合思考这两个指标,F-measure被提出(Precision和Recall的加权和谐均匀),即:

    F1的核心思想在于,在尽可能的进步Precision和Recall的同时,也心愿两者之间的差别尽可能小。F1-score实用于二分类问题,对于多分类问题,将二分类的F1-score推广,有Micro-F1和Macro-F1两种度量。

    【Micro-F1】

    统计各个类别的TP、FP、FN、TN,加和形成新的TP、FP、FN、TN,而后计算Micro-Precision和Micro-Recall,失去Micro-F1。具体的说,统计进去各个类别的混同矩阵,而后把混同矩阵“相加”起来,失去一个多类别的混同矩阵,而后再计算F1score

    【Macro-F1】

    我感觉更罕用的是Macro-F1。统计各个类别的TP、FP、FN、TN,别离计算各自的Precision和Recall,失去各自的F1值,而后取平均值失去Macro-F1

    【总结】

    从下面二者计算形式上能够看出,Macro-F1平等地对待各个类别,它的值会受到罕见类别的影响;而Micro-F1则更容易受到常见类别的影响。

    参考:

    [1]http://zjmmf.com/2019/08/13/F…

    [2]https://zhuanlan.zhihu.com/p/…

  • 关于机器学习:25Cr2Ni3Mo叶轮转子

    25Cr2Ni3Mo钢是依据钢的合金化原理bai并思考压缩机du转子的制作特点,以及在国外电站设dao备用钢ASTMA-1100541No8等根底上,适当调整C、Cr、Mo、Ni等次要元素的含量设计并研制的,该钢通过不同的热处理工艺能够取得不同的机械性能,在压缩机叶轮、主轴和定子等整机中有较为宽泛的利用.
    其化学成份如下:C 0.21,Cr 1.5, Ni 3.44, Si 0.18, S 0.018, P 0.022.
    对25Cr2Ni3Mo钢叶轮进行了真空热处理:将叶轮在真空度为1.33×10-2~1.33×10-3Pa的真空炉中加热至830~870℃,
    保温后别离进行油冷和以5×10-5 Pa压力的氮气冷却,随后于610℃回火.
    热处理后,检测叶轮的力学性能和显微组织.结果表明,经油淬和气淬并低温回火的叶轮的力学性能基本相同,显微组织也均以回火索氏体为主.
    经真空热处理的叶轮表面质量优于经一般热处理的叶轮表面质量.

    淬火温度对25Cr2Ni3Mo钢垫片显微组织和力学性能的影响.
    测试了不同淬火温度下25Cr2Ni3Mo钢垫片试样的常温拉伸性能和-115℃高温冲击排汇能量值;利用金相显微镜、扫描电子显微镜等进行了金相显微组织和扫描电镜高倍组织的观测、冲击断口形貌剖析.
    根据测试和剖析后果确定了25Cr2Ni3Mo钢的佳淬火温度范畴,满足25Cr2Ni3Mo钢垫片的高力学性能要求.

    25Cr2Ni3 Mo高强度高温钢进行了亚温淬火的热处理工艺试验,对不同亚温淬火温度解决后试样的常温拉伸性能和-115℃的高温冲击排汇能量值进行了测试,并利用金相显微镜、扫描电子显微镜等进行了金相显微组织、冲击断口形貌的剖析.亚温淬火试样的金相组织比失常调质的平均细小,断口形貌更好,综合力学性能更高,850℃油冷+ 840℃油冷的双淬火试样的综合性能好.确保了25Cr2Ni3Mo螺栓要求的低温力学性能.
    25Cr2Ni3Mo钢热处理对其机械性能及焊接接头机械性能的影响.别离叙述了该资料在叶轮、主轴及定子上的利用状况.得出了利用于转动件及定子件的合适温度(高温).
    叶轮是丙烯压缩机的要害整机。采纳840焊条焊接。焊后需热处理。

  • 关于机器学习:焦点损失函数-Focal-Loss-与-GHM

    文章来自公众号【机器学习炼丹术】

    1 focal loss的概述

    焦点损失函数 Focal Loss(2017年何凯明大佬的论文)被提出用于密集物体检测工作。

    当然,在指标检测中,可能待检测物体有1000个类别,然而你想要辨认进去的物体,只是其中的某一个类别,这样其实就是一个样本十分不平衡的一个分类问题。

    而Focal Loss简略的说,就是解决样本数量极度不均衡的问题的。

    说到样本不均衡的解决方案,相比大家是晓得一个混同矩阵的f1-score的,然而这个如同不能用在训练中当成损失。而Focal loss能够在训练中,让小数量的指标类别减少权重,让分类谬误的样本减少权重

    先来看一下简略的二值穿插熵的损失:

    • y’是模型给出的预测类别概率,y是实在样本。就是说,如果一个样本的实在类别是1,预测概率是0.9,那么$-log(0.9)$就是这个损失。
    • 讲道理,个别我不喜爱用二值穿插熵做例子,用多分类穿插熵做例子会更难受。

    【而后看focal loss的改良】:

    这个减少了一个$(1-y’)^\gamma$的权重值,怎么了解呢?就是如果给出的正确类别的概率越大,那么$(1-y’)^\gamma$就会越小,阐明分类正确的样本的损失权重小,反之,分类谬误的样本的损权重大


    【focal loss的进一步改良】:

    这里减少了一个$\alpha$,这个alpha在论文中给出的是0.25,这个就是单纯的升高正样本或者负样本的权重,来解决样本不平衡的问题

    两者联合起来,就是一个能够解决样本不均衡问题的损失focal loss。


    【总结】:

    1. $\alpha$解决了样本的不均衡问题;
    2. $\beta$解决了难易样本不均衡的问题。让样本更器重难样本,漠视易样本。
    3. 总之,Focal loss会的关注程序为:样本少的、难分类的;样本多的、难分类的;样本少的,易分类的;样本多的,易分类的。

    2 GHM

    • GHM是Gradient Harmonizing Mechanism。

    这个GHM是为了解决Focal loss存在的一些问题。

    【Focal Loss的弊病1】
    让模型过多的关注特地难分类的样本是会有问题的。样本中有一些异样点、离群点(outliers)。所以模型为了拟合这些十分难拟合的离群点,就会存在过拟合的危险。

    2.1 GHM的方法

    Focal Loss是从置信度p的角度动手衰减loss的。而GHM是肯定范畴内置信度p的样本数量来衰减loss的。

    首先定义了一个变量g,叫做梯度模长(gradient norm)

    能够看出这个梯度模长,其实就是模型给出的置信度$p^*$与这个样本实在的标签之间的差值(间隔)。g越小,阐明预测越准,阐明样本越容易分类。

    下图中展现了g与样本数量的关系:

    【从图中能够看到】

    • 梯度模长靠近于0的样本多,也就是易分类样本是十分多的
    • 而后样本数量随着梯度模长的减少迅速缩小
    • 而后当梯度模长靠近1的时候,样本的数量又开始减少。

    GHM是这样想的,对于梯度模长小的易分类样本,咱们漠视他们;然而focal loss过于关注难分类样本了。要害是难分类样本其实也有很多!,如果模型始终学习难分类样本,那么可能模型的精确度就会降落。所以GHM对于难分类样本也有一个衰减。

    那么,GHM对易分类样本和难分类样本都衰减,那么真正被关注的样本,就是那些不难不易的样本。而克制的水平,能够依据样本的数量来决定。

    这里定义一个GD,梯度密度

    $$GD(g)=\frac{1}{l(g)}\sum_{k=1}^N{\delta(g_k,g)}$$

    • $GD(g)$是计算在梯度g地位的梯度密度;
    • $\delta(g_k,g)$就是样本k的梯度$g_k$是否在$[g-\frac{\epsilon}{2},g+\frac{\epsilon}{2}]$这个区间内。
    • $l(g)$就是$[g-\frac{\epsilon}{2},g+\frac{\epsilon}{2}]$这个区间的长度,也就是$\epsilon$

    总之,$GD(g)$就是梯度模长在$[g-\frac{\epsilon}{2},g+\frac{\epsilon}{2}]$内的样本总数除以$\epsilon$.

    而后把每一个样本的穿插熵损失除以他们对应的梯度密度就行了。
    $$L_{GHM}=\sum^N_{i=1}{\frac{CE(p_i,p_i^*)}{GD(g_i)}}$$

    • $CE(p_i,p_i^*)$示意第i个样本的穿插熵损失;
    • $GD(g_i)$示意第i个样本的梯度密度;

    2.2 论文中的GHM

    论文中呢,是把梯度模长划分成了10个区域,因为置信度p是从0~1的,所以梯度密度的区域长度就是0.1,比方是0~0.1为一个区域。

    下图是论文中给出的比照图:

    【从图中能够失去】

    • 绿色的示意穿插熵损失;
    • 蓝色的是focal loss的损失,发现梯度模长小的损失衰减很无效;
    • 红色是GHM的穿插熵损失,发现梯度模长在0左近和1左近存在显著的衰减。

    当然能够想到的是,GHM看起来是须要整个样本的模型估计值,能力计算出梯度密度,能力进行更新。也就是说mini-batch看起来仿佛不能用GHM。

    在GHM原文中也提到了这个问题,如果光应用mini-batch的话,那么很可能呈现不平衡的状况。

    【我集体感觉的解决办法】

    1. 能够应用上一个epoch的梯度密度,来作为这一个epoch来应用;
    2. 或者一开始先应用mini-batch计算梯度密度,而后模型收敛速度降落之后,再应用第一种形式进行更新。

    3 python实现

    下面讲述的关键在于focal loss实现的性能:

    1. 分类正确的样本的损失权重小,分类谬误的样本的损权重大
    2. 样本过多的类别的权重较小

    在CenterNet中预测中心点地位的时候,也是应用了Focal Loss,然而稍有改变。

    3.1 概述


    这外面和下面讲的比拟相似,咱们漠视脚标。

    • 假如$Y=1$,那么预测的$\hat{Y}$越凑近1,阐明预测的约正确,而后$(1-\hat{Y})^\alpha$就会越小,从而体现分类正确的样本的损失权重小;otherwize的状况也是这样。
    • 然而这里的otherwize中多了一个$(1-Y)^\beta$,这个是用来均衡样本不平衡问题的,在前面的代码局部会提到CenterNet的热力求。就会明确这个了。

    3.2 代码解说

    上面通过代码来了解:

    class FocalLoss(nn.Module):
        def __init__(self):
            super().__init__()
            self.neg_loss = _neg_loss
    
        def forward(self, output, target, mask):
            output = torch.sigmoid(output)
            loss = self.neg_loss(output, target, mask)
            return loss

    这外面的output能够了解为是一个1通道的特色图,每一个pixel的值都是模型给出的置信度,而后通过sigmoid函数转换成0~1区间的置信度。

    而target是CenterNet的热力求,这一点可能比拟难了解。打个比方,一个10*10的全都是0的特色图,而后这个特色图中只有一个pixel是1,那么这个pixel的地位就是一个指标检测物体的中心点。有几个1就阐明这个图中有几个要检测的指标物体。

    而后,如果一个特色图上,全都是0,只有几个孤零零的1,未免显得过于稠密了,直观上也十分的不平滑。所以CenterNet的热力求还须要对这些1为核心做一个高斯

    能够看作是一种平滑:

    能够看到,数字1的周围是同样的数字。这是一个以1为核心的高斯平滑。


    这里咱们回到下面说到的$(1-Y)^\beta$:

    对于数字1来说,咱们计算loss天然是用第一行来计算,然而对于1左近的其余点来说,就要思考$(1-Y)^\beta$了。越凑近1的点的$Y$越大,那么$(1-Y)^\beta$就会越小,这样从而升高1左近的权重值。其实这里我也讲不太明确,就是依据间隔1的间隔升高负样本的权重值,从而能够实现样本过多的类别的权重较小


    咱们回到主题,对output进行sigmoid之后,与output一起放到了neg_loss中。咱们来看什么是neg_loss:

    def _neg_loss(pred, gt, mask):
        pos_inds = gt.eq(1).float() * mask
        neg_inds = gt.lt(1).float() * mask
    
        neg_weights = torch.pow(1 - gt, 4)
    
        loss = 0
    
        pos_loss = torch.log(pred) * torch.pow(1 - pred, 2) * pos_inds
        neg_loss = torch.log(1 - pred) * torch.pow(pred, 2) * \
                   neg_weights * neg_inds
    
        num_pos = pos_inds.float().sum()
        pos_loss = pos_loss.sum()
        neg_loss = neg_loss.sum()
    
        if num_pos == 0:
            loss = loss - neg_loss
        else:
            loss = loss - (pos_loss + neg_loss) / num_pos
        return loss

    先说一下,这外面的mask是依据特定工作中加上的一个小性能,就是在该工作中,一张图片中有一部分是不须要计算loss的,所以先用过mask把那个局部过滤掉。这里间接漠视mask就好了。

    neg_weights = torch.pow(1 - gt, 4)能够得悉$\beta=4$,从上面的代码中也不难推出,$\alpha=2$,剩下的内容就都一样了。

    把每一个pixel的损失都加起来,除以指标物体的数量即可。