zoukankan      html  css  js  c++  java
  • 再看机器学习

    机器学习解决的问题

    • 分类问题
      分类问题预测的是类别,模型的输出是一个概率分布。 概率分布中最大的值对应的索引将被认为是这条数据项所述的类别。

      e.g. 三分类问题,模型将输出[0.2, 0.7, 0.1] 那么认为这条数据将被分类为第二类

    • 回归问题
      回归问题预测的是一个实数值,模型的输出是一个实数值。
      通过训练数据对党项数据条目进行预测,得出一个统计学意义上的值。

    目标函数

    用来衡量模型对数据的拟合程度,也叫做损失函数

    • 为什么需要目标函数
      这是机器学习对问题建模的特性决定的。 对于大部分的机器学习模型,都是通过逐步调整参数,最终才能得到一个准确率较高的模型的。 不像解方程那样可以一步到位。 需要多次迭代逼近真实值。因此我们需要目标函数作为评价的依据,通过调优目标函数,从而提高整个模型的精度。

      总结: R1 参数是需要逐步调整的 R2 目标函数可以帮助衡量模型的好坏

    • 什么是目标函数
      如上所说,目标函数可以作为模型调优的评价标准,针对不同问题,选择不同的目标函数,获得一个准确率较高的模型。

      比如对于分类问题,有两个模型预测一个物品的分类,A模型得到一个概率分布[0.2, 0.7, 0.1], 模型B得到一个概率分布[0.4, 0.5, 0.1]. 可该物品的真实分类是第1类, 两个模型在准确率上都错了,都是0. 但这并不等于两个模型一样差。 相对于A模型, 因为B模型更接近真实值[1, 0, 0], 所以B模型更好。

    • 目标函数有哪些
      你听过的MSR,RMSE, AMSE,交叉熵损失...都是目标函数的简称, 根据解决问题的不同,可以选择不同的目标函数

    模型

    模型里都有什么

    模型是有一些神经元组成的具有层级结构的网络。通过将数据和参数的层层计算,得到的一组参数矩阵。 这一组参数就是模型

    神经元

    激活函数

    特性
    1. 非线性:即导数不是常数。这是多层神经网络的基础,保证多层网络不退化成单层线性网络。

    2. 几乎处处可微:可微性保证了在优化中梯度的可计算性。传统的激活函数如sigmoid等满足处处可微。对于分段线性函数比如ReLU,只满足几乎处处可微(即仅在有限个点处不可微)。对于SGD算法来说,由于几乎不可能收敛到梯度接近零的位置,有限的不可微点对于优化结果不会有很大影响。

    3. 计算简单: 激活函数在神经网络前向的计算次数与神经元的个数成正比,因此简单的非线性函数自然更适合用作激活函数。这也是ReLU之流比其它使用Exp等操作的激活函数更受欢迎的其中一个原因。

    4. 非饱和性(saturation):饱和指的是在某些区间梯度接近于零(即梯度消失),使得参数无法继续更新的问题。最经典的例子是Sigmoid,它的导数在x为比较大的正值和比较小的负值时都会接近于0。更极端的例子是阶跃函数,由于它在几乎所有位置的梯度都为0,因此处处饱和,无法作为激活函数。ReLU在x>0时导数恒为1,因此对于再大的正值也不会饱和。但同时对于x<0,其梯度恒为0,这时候它也会出现饱和的现象(在这种情况下通常称为dying ReLU)

    5. 单调性(monotonic):即导数符号不变。这个性质大部分激活函数都有,除了诸如sin、cos等。函数的单调性使得在激活函数处的梯度方向不会经常改变,从而让训练更容易收敛。

    6. 输出范围有限:有限的输出范围使得网络对于一些比较大的输入也会比较稳定,这也是为什么早期的激活函数都以此类函数为主,如Sigmoid、TanH。但这导致了前面提到的梯度消失问题,而且强行让每一层的输出限制到固定范围会限制其表达能力。因此现在这类函数仅用于某些需要特定输出范围的场合,比如概率输出(此时loss函数中的log操作能够抵消其梯度消失的影响)、LSTM里的gate函数。

    7. 接近恒等变换(identity):即约等于x。这样的好处是使得输出的幅值不会随着深度的增加而发生显著的增加,从而使网络更为稳定,同时梯度也能够更容易地回传。这个与非线性是有点矛盾的,因此激活函数基本只是部分满足这个条件,比如TanH只在原点附近有线性区(在原点为0且在原点的导数为1),而ReLU只在x>0时为线性。这个性质也让初始化参数范围的推导更为简单。

    8. 参数少:大部分激活函数都是没有参数的。

    9. 归一化(normalization):对应的激活函数是SELU,主要思想是使样本分布自动归一化到零均值、单位方差的分布,从而稳定训练。

    为什么要用激活函数

    [未完成]

    为什么要用非线性函数做激活函数, 线性函数有什么缺点?

    神经网络的都是有层次的, 高层与低层之间用全连接方式连起来。 在多个神经网络的层次中,通过矩阵计算合并,如果使用线性函数做激活函数,即便是很深层次的网络,效果也只相当于一个单层的神经网络, 加了非线性激活函数之后,这种现象就不存在了。 为保证多层网络不退化成单层线性网络,就要使用非线性的函数。 这也是激活函数的意义所在。

    训练

    到底啥是训练

    模型的训练就是调整参数的过程,也就是使目标函数逐渐变小的过程。要使函数值变小,基本思路是对目标函数求导,求极值,让函数向最小值靠近。 然后在目标函数减小的方向上更新参数,用新的参数重新计算,一直重复下去。
    SGD, adam

    训练原理

    对目标函数求导,寻找能使目标函数值下降的方向。 然后不断迭代。

    前向传播

    前向传播; 给一个数据, 从数据中, 计算出来预测值

    反向传播

    反向传播; 是为了求解参数, 是梯度下降算法, 在神经网络上的一个具体的计算过程

    训练Tips

    对数据归一化,可以调高分类的准确率

    优化

    • 在之前不断训练过程中,当然存在很多问题, 比如以下的一些

      1. 每次都在整个数据集上计算Loss和梯度

        造成计算量过大,甚至内存不够

      2. 有时在梯度方向确定的时候,仍然保持每次都走一个固定的单位步长

        导致模型训练的时间过长,需要提高效率

      3. 梯度下降过程中,目标函数可能存在局部极值点和saddle point鞍点的问题

        这将导致模型的训练停滞在这一区域,模型以为自己达到了最小值点,实际没有,影响精度

    • 对应的解决方法

      1. 使用随机梯度下降;每次只使用一个样本,这样计算量就不会太大,内存爆炸的问题也得到解决

        但是使用数据量少,不能代表整个数据集的梯度方向,所以会导致参数更新速度也变慢,也就意味收敛速度慢, 尽管计算任务完成迅速, 整个模型训练会变长

      2. 继续改进, 使用mini-batch梯度下降: 每次使用随机采样,得到小部分数据进行训练。 因为是随机采样得出的,所以能代表数据原来的大概的梯度方向,这样收敛的速度也得到了加快,

        但是mini-batch梯度下降也存在问题即,震荡问题, 部分数据集不能完全反应整个数据集的确切方向,有时不能很好的收敛,从而得到很好的结果,当然,随着采样数据集数量的增大,这个问题的影响可以逐渐削弱。

      3. 接着又提出了SGD 动量梯度下降,开始训练时, 积累动量,加速训练(步长很大)。当目标函数在局部极值附近震荡时, 梯度为0,但是由于动量的存在,仍然存在很小的步长,帮助模型跳出陷阱。 而且在梯度改变方向的时候, 动量缓解震荡,帮助获得一个稳定的结果。

  • 相关阅读:
    Linux基础命令(一)
    You've made choice
    protege推理
    字符编码
    第二次作业
    数据类型-集合set
    数据类型-元组&字典
    数据类型-列表
    数据类型-数值&字符串
    流程控制之for循环
  • 原文地址:https://www.cnblogs.com/sight-tech/p/13150315.html
Copyright © 2011-2022 走看看