3.gitchat训练营-原理

3.1.机器是如何学习的?

        什么是机器学习?机器学习就是:让计算机程序(机器),不是通过人类直接指定的规则,而是通过自身运行,习得(学习)事物的规律,和事物间的关联
        计算机能够处理的只有数值和运算。要让一段程序了解客观世界变化万千的事物,则必须将这些事物数值化,将事物的变化和不同事物之间的关联转化为运算
        当若干现实世界的事物转化为数值之后,计算机通过在这些数值之上的一系列运算来确定它们之间的关系,再根据一个全集之中个体之间的相互关系,来确定某个个体在整体(全集)中的位置。
        注意:这里的数值不是大家本能地想到的int、double、float......,而是将自然语言转化成n维向量。因为如果将一个语言要素对应成一个标量的话,太容易出现两个原本相差甚远的概念经过简单运算相等的情况。
        这种现实世界和计算机之间,概念<->数值、关系<->运算的映射,造就了机器可以自主学习获得事物规律的可能。

3.1.1.机器学习的基本原理

        首先我们需要机器(Machine)来用于学习。然后,我们通过准备好的数据集(Data)来告诉模型目标的特征(Feature),这个过程就是学习(Learning)的过程,学习过程中进行思考的过程就是算法。学习完的结果就是一个模型(Model)

3.1.2.有监督学习

        通过标注数据进行学习的方法,就叫做有监督学习或直接叫监督学习(Supervised Learning)。

3.1.3.无监督学习

        如果用于学习的数据只有样本,没有标注,那么通过这种无标注数据进行学习的方法,就叫做无监督学习(Unsupervised Learning)。


3.2.机器学习三要素之数据、模型、算法

        机器学习三要素包括数据、模型、算法。总结成一句话:算法通过在数据上进行运算产生模型

3.2.1.数据

  • 源数据
            现实中的图片、文字或者音频等等,它们都是原始数据(Raw Data)。不过,计算机能够处理的是数值,而不是图片或者文字等等。
  • 向量空间模型和无标注数据
            我们需要构建一个向量空间模型(Vector Space Model,VSM)负责将格式(文字、图片、音频、视频)转化为一个个向量。
            开发者把这些转换成的向量输入给机器学习程序,数据才能够处理。
            假设我们要对以下6匹马做聚类,而且已经知道要用它们的两个特征来做聚类,这两个特征就是:独角和翅膀。
    小马宝莉6女主

            那么我们就可以定义一个二维的向量A=[a_1, a_2]a_1表示是否有独角,有则a_1 = 1,否则a_1 = 0。而a_2表示是否有翅膀。按照这个定义,我们的6匹马最终会被转化为下面6个向量:

        x_1 = [1, 0]
        x_2 = [0, 0]
        x_3 = [0, 0]
        x_4 = [0, 1]
        x_5 = [0, 1]
        x_6 = [1, 0]

        这样,计算机就可以对数据x_1, ..., x_6进行处理了。这6个向量也就叫做这份数据的特征向量(Feature Vector)。这是无标注数据

  • 有标注数据
            和无标注对应的是有标注。数据标注简单而言就是给训练样本打标签。这个标签是依据我们的具体需要给样本打上的。
            我们把样本的标签用变量y表示,一般情况下,y都是一个离散的标量值。
            标注数据当然也要提取出特征向量x。每一个标注样本既有无标注样本拥有的x,同时还比无标注样本多了一个y
  • 特征工程
            上面将现实中的事物转换成数据集的过程叫做特征工程。我们其实做了如下两步:
                    1. 确定用哪些特征来表示数据;
                    2.确定用什么方式表达这些特征。
  • 模型
            模型是机器学习的结果,这个学习过程,称为训练(Train)。
            我们把数据(对应其中的x)输入进去,得到输出结果(对应其中的y)。
            这个输出结果可能是一个数值(回归),也可能是一个标签(分类)。
            模型是怎么得到的呢?模型是基于数据,经由训练得到的。


    模型是如何得到的

            训练是怎么回事呢?训练就是根据已经被指定的f(x)的具体形式--模型类型,结合训练数据,计算出其中各个参数的具体取值的过程。
            训练过程需要依据某种章法进行运算。这个章法就是算法。

  • 算法
            这里简单记下有监督学习模型算法。
            有监督学习的目标就是:让训练数据的所有x讲过f(x)计算后,获得的y'与它们原本对应的y的差别尽量小。
            我们需要用一个函数来描述y'与y之间的差别,这个函数叫做损失函数(Loss Function)L(y, y') = L(y, f(x))
            Loss函数针对一个训练数据,对于所有的训练数据,我们用代价函数(Cost Function)来描述整体的损失。
            代价函数一般写作:J(theta)——注意,代价函数的自变量不再是y和f(x),而是变成了theta,theta表示f(x)中所有待定的参数(theta也可以是一个向量,每个维度表示一个具体的参数)!
            既然J(theta)被称为代价函数,顾名思义,它的取值代表了整个模型付出的代价,这个代价自然是越小越好。
            因此我们也就有了学习的目标(也称为目标函数):argmin J(theta)——最小化J(theta)。
            能够让J(theta)达到最小的theta,就是最好的theta。当找到最好的theta之后,我们把它带入到原f(x),使得f(x)成为一个完整的x的函数,也就是最终的模型函数。
            优化算法就是找到让J(theta)最小的theta。具体的优化算法有很多,比如:梯度下降法(Gradient Descent)、共轭梯度法(Conjugate Gradient)、牛顿法和拟牛顿法、模拟退火法(Simulated Annealing)等等。其中最常用的是梯度下降法。
            强调一点:要得到高质量的模型,算法很重要,但往往(尤其是在应用经典模型时)更重要的是数据

3.3.模型的获取和改进

        要使用机器学习模型,首先要获取它。在有了数据和算法的情况下,我们需要通过一个过程来获得模型,这个过程就叫做:训练。

3.3.1.获取模型的过程

        笼统而言,为了构建一个模型,我们需要经历以下步骤。

  • Step-1:数据准备
    • Step-1.1 数据预处理:收集数据、清洗数据、标注数据。
    • Step-1.2 构建数据的向量空间模型(将文本、图片、音频、视频等格式的数据转换为向量)。
    • Step-1.3 将构建好向量空间模型的数据分为训练集、验证集和测试集。
  • Step-2:训练——将训练集输入给训练程序,进行运算。训练程序的核心是算法,所有输入的向量化数据都会按该训练程序所依据的算法进行运算。训练程序输出的结果,就是模型。
  • Step-3:测试——将测试集数据输入给训练获得的模型,得到预测结果;再将预测结果与这些数据原本预期的结果进行比较。
            然后按一定规则计算模型质量的衡量标准,比如Precision、Recall、F1Score等,根据指标的数值来衡量当前模型的质量。


    模型训练的过程

3.3.2.训练集、验证集和测试集

        训练集(Train Set):用来做训练的数据的集合。
        验证集(Validation Set):在训练的过程中,每个训练轮次结束后用来验证当前模型性能,为进一步优化模型提供参考的数据的集合。
        测试集(Test Set):用来测试的数据的集合,用于检测最终得出的模型的性能。
        每个集合都应当是独立的,和另外两个没有重叠。
        训练集是训练过程的基础,而验证和测试集则是在不同阶段用来评价训练结果的。

3.3.3.训练的过程

Step-2训练,又可以细化为几个步骤。

  • Step-2.1:编写训练程序。
    • Step-2.1.1:选择模型类型
    • Step-2.1.2:选择优化算法
    • Step-2.1.3:根据模型类型和算法编写程序
  • Step-2.2:训练->获得临时模型
  • Step-2.3:在训练集上运行临时模型,获得训练集预测结果
  • Step-2.4:在验证集上运行临时模型,获得验证集预测结果
  • Step-2.5:综合参照Step-2.3和Step-2.4的预测结果,改进模型
  • Step-2.6:Step-2.2到Step-2.5反复迭代,知道获得满意或者已经无法继续优化的模型。

3.3.4改进模型

        对照机器学习三要素,模型的优化可以从三个方面来进行:数据、算法和模型。

  • 数据
            机器学习的模型质量往往和训练数据有直接的关系。
            大量的高质量训练数据,是提高模型质量的最有效手段
            在有限的数据上,我们能从以下几个方面来尽量提高其质量:
                    1.对数据进行归一化(Normalization,又译作正规化、标准化)等操作。
                    2.采用Bootstrap等采样方法处理有限的训练/测试数据,以达到更好的运算效果。
                    根据业务进行特征选取:从业务角度区分输入数据包含的特征,并理解这些特征对结果的贡献。
  • 调参(算法)
            调参是模型训练过程中比不可少又非常重要的一步。
            模型对应公式中的若干参数是训练过程的输出,并不需要我们来调。
            除了这些参数外,还有一类被称为超参数的参数,例如用梯度下降方法学习LR模型时的步长(Alpha),用BFGS方法学习Linear-chain CRF是的权重(w)等。
            超参数是需要模型训练者自己来设置和调整的。
            调参本身有点像一个完整的Project,需要经历:
                    1. 制定目标
                    2. 制定策略
                    3. 执行
                    4. 验证
                    5. 调整策略->3
            这样一个完整的过程,其中3-5往往要经由多次迭代。
            只有当调参工程师对于模型的理论原理和算法的执行细节有深入了解的时候,才有可能找到正确的调参方向。
  • 模型类型选择
            有的时候,训练数据已经确定,而某个模型再怎么调参,都无法满足在某个特定指标上的要求。那就只好换个模型试试了。

3.4.模型的质量和评判指标

3.4.1.衡量模型质量

        当我们训练出了一个模型以后,为了确定它的质量,我们可以用一些知道预期预测结果的数据来对其进行预测,把实际的预测结果和实际结果进行对比,以此来评判模型的优劣。
        由此,我们需要一些评价指标来衡量实际预测结果和预期结果的相似程度。

3.4.2.分类模型评判指标:Precision、Recall和F1Score

        对于分类而言,最简单也是最常见的验证指标:精准率(Precision)召回率(Recall),为了综合这两个指标并得出量化结果,又发明了F1Score
        假设数据data1被模型预测的类别是Class_A。那么,对于data1就有两种可能性:data1本来就是Class_A(预测正确),data1本来不是Class_A(预测错误)。
        当一个测试集全部被预测完之后,相对于Class_A,会有一些实际是Class_A的数据被预测为其他类,也会有一些其实不是Class_A的,被预测成Class_A,这样的话就导致了下面这个结果:

实际/预测 预测类为Class_A 预测类为其他类
实际类为Class_A TP: 实际为Class_A,也被正确预测的测试数据条数 FN:实际为Class_A,但被预测为其他类的测试数据条数
实际类为其他类 FP:实际不是Class_A,但被预测为Class_A的数据条数 TN:实际不是Class_A,也没有被测试为Class_A的数据条数

图示

        精准率:Precision=TP/(TP+FP),即在所有被预测为Class_A的测试数据中,预测正确的比率。
        召回率:Recall=TP/(TP+FN),即在所有实际为Class_A的测试数据中,预测正确的比率。
        F1Score = 2 * (Precision * Recall)/(Precision + Recall)
        显然上面三个值都是越大越好,但往往在实际当中P和R是矛盾的,很难保证双高。

此处需要注意,P、R、F1Score在分类问题中都是对某一个类而言的。

        也就是说假设这个模型总共可以分10个类,那么对于每一个类都有一套独立的P、R、F1Score的值。衡量模型整体质量,要综合看所有10套指标,而不是只看一套。
        同时,这套指标还和测试数据有关。同样的模型,换一套测试数据后,很可能P、R、F1Score会有变化,如果这种变化超过了一定幅度,就要考虑是否存在bias后者overfitting的情况。

3.4.3.指标对应的是模型&数据集

        无论是P、R和F1Score这一套指标,还是ROC、PR或者AUC等,或者是任意的评价指标,都同时指向一个模型和一个数据集,两者缺一不可。
        同样一套指标,用来衡量同一个模型在不同数据集上的预测成果,最后的分数值可能不同(几乎可以肯定不同,关键是差别大小)。

3.4.4.模型的偏差和过拟合

        首先,一个模型用来预测训练数据,并不能保证每一个预测结果都和预期结果相符。
        一个机器学习模型的质量问题,从对训练集样本拟合程度的角度,可以分为两类:欠拟合(Underfitting)过拟合(Overfitting)
        这里先建立一个感性认知:

拟合图例

        如果一个模型,在训练集上的预测效果就不佳,指标偏低,那一般是欠拟合的问题。
        如果在训练集上指标很好,而在验证/测试集上指标偏低,则有可能是过拟合问题。
        甚至有时候,在训练集和验证/测试集上效果都不差,一到真实环境却预测误差较大,这种情况也是过拟合
        欠拟合多数情况下是因为选定模型类型太过简单,特征选取不够导致的。而过拟合则相反,可能是模型太过复杂,特征选取不当(过多或组合不当)造成的。
        相应的解法是有针对性地选择更复杂/简单的模型类型;增加/减少特征;或者减小/增大正则项比重等。
        但有一点,无论哪种问题,增大训练数据量都可能会有所帮助。

你可能感兴趣的:(3.gitchat训练营-原理)