上篇为大家建立了宏观的机器学习概念,下篇我们通过一个真实的机器学习任务来理解一下机器学习的微观逻辑。

1.机器学习任务介绍

前段时间,同事上班路上骑车摔泥坑里骨折了,我就萌生了让人工智能自动识别路面泥坑的想法。

毕竟,同事要互相关怀、相亲相爱。另外,我们也可以通过这个机器学习的任务理解一下机器学习的基本原理。

image-20230722092656554

2.机器学习中的常用术语一览

开始机器学习的训练任务之前,我们快速浏览一下机器学习领域中的常用术语。假设AI识别路面泥坑是一个函数:

image-20230722093341203

2.1.模型是什么?

函数f的输入是路面的视频,输出是路面上是否有泥坑。输入称为自变量,在机器学习中也称为特征。输出称为因变量,在机器学习中也称为标签

image-20230722093803701

这个函数f称为模型,复杂的模型可能有数量庞大的自变量。

image-20230722094251783

2.2.怎样才算找到了函数f?

怎么才算找到了函数f呢?假设这个函数是个简单的函数:y=ax+b,那么找到a和b,就算找到了这个函数f。a、b也被称为模型的参数

image-20230722095702788

除了模型的参数,还有一种参数叫做超参数(hyperparameter),这些模型的外部参数,属于训练和调试的过程参数。

2.3.如何找到函数f?

那么,我们又如何找到函数f呢?机器学习的核心思想就是”给机器一堆数据,让机器自己从数据中提取特征、寻找规律"。这个过程,也称为炼丹

这些数据称为数据集,这些数据通常被分为三波,一波用于训练、一波用于验证、一波用于最终的测试。

用于训练的称为训练集,用于验证的称为验证集,用于测试的称为测试集

image-20230722100415709

2.4.找函数f的流派

  • 从数据的角度看,人类对全部训练数据做了标注称为自监督学习,对部分训练数据做了标注称为半监督学习、对训练数据没有任何标注称为无监督学习

  • 从数学工具的角度看,使用神经网络开展学习称为机器学习,将神经网络做深称为深度学习(不严谨,通俗点儿就这么理解吧),因此深度学习是机器学习中的一种。

  • 除了机器学习流派,强化学习(目前也很热门的流派)、生成式学习迁移学习等等。这些流派的边界没有太清晰,彼此会有交集和互相引用。

这里想到两个有趣的小点:

  • 神经网络很早就发明了,但后续却要换个机器学习、深度学习的名字,可能是联结主义之前被符号主义学派打的太惨了,需要换个响亮的名号吧。
  • GPT火了以后,有很多名词术语,听到有人把"用提示词的引导行为"称为"zero shot、few shot”,乱抛名词、概念搞混,根因就是没理解前述这些机器学习的基本概念。

3.从1个例子看机器学习过程

3.1.数据的收集和预处理

  • 我们要识别路面泥坑,首先要获得路面视频数据。这个过程称为原始数据收集

  • 我们需要通过一些数据标注的工具,在视频上标注出路面泥坑,这个过程称为数据标注

  • 数据标注完后,需要将数据向量化:data vectorization,就是把原始数据格式化,使机器可以读取(如:将原始图片转换为机器可以读取的矩阵)。

  • 处理坏数据和缺失值:数据不是全都用的,要利用数据处理工具把”捣乱数据“处理掉(冗余数据、离群数据、错误数据),把”缺失值“补上。

数据预处理有很多技术和技巧:

  • 特征缩放:feature scaling,包括数据标准化(standardization)和数据规范化(normalization)等:

  • 数据标准化:对数据特征分布的转换,目标是使数据特征符合正态分布(均值为0,标准差为1)。如果数据特征不符合正态分布,会影响机器学习效率。

  • 数据规范化:它是数据标准化的一种变体,将数据特征压缩到给定的最小值和最大值之间(通常为0~1)。

  • 特征提取:feature extraction,通过子特征的选择,减少冗余特征,使初始测量数据更简洁,同时保留最有用的信息。

  • 特征工程:使用数据的领域知识,来创建使得机器学习算法起作用的特征过程。

通俗地理解:

  • 数据预处理的本质:就是准备好机器看得懂、看得清的教材,方便机器进行学习。

我们再来看看实战中我们具体怎么做的:

  • 原始数据收集:通过行车记录仪,我收集了上班路上的路面情况。

image-20230723000930967

  • 数据标注:通过标注工具,对视频中的泥坑进行标注。

image-20230723001158467

  • 数据集划分:我们通常会将标注好的数据划分为训练集、验证集、测试集。划分有一些方法论,如:K-fold validation。我将数据集划分编写成了一段脚本,执行后就自动划分好了训练集、验证集、测试集。

image-20230723001237851

实战中,特征工程、数据向量化等,大多都被封装到了相应的AI训练框架中,本文不赘述。

3.2.设定范围

设定范围指的是设定选择模型的范围,这要根据训练任务选择合适的数学模型。常见的模型如下:

  • 线性模型:线性回归、逻辑回归
  • 非线性模型:支持向量机、k最邻近分类
  • 基于树和集成的模型:决策树、随机森林、梯度提升树等
  • 神经网络:人工神经网络、卷积神经网络、长短期记忆网络等

模型选择是最为关键的环节,实战中,训练资料越少,模型就要圈定在很小很严格的范围内。

否则,会产生一种现象:选择的这种模型在训练中表现很好,但换一波数据就不行了,说白了就是这个模型把数据死记硬背下来了。

3.3.设定标准

在确定了模型之后,就需要设定损失函数,损失函数用来表示机器学到位了。

以监督学习为例:

  • 人类老师标定了猪用103表示(如右图)
  • 人类老师标定了蓝精灵用17表示(如右图)
  • 当机器学习到了一个函数f1时,
    • 输入一个猪头,函数f1输出100,那么距离正确答案103的差值为3。
    • 输入一个蓝精灵,函数f1输出18,那么距离正确答案17的差值为1。
  • 因此,函数f1整体距离正确答案为4,这就表示函数f1的损失函数Loss(f1)=4。

image-20230722221402457

3.4.达成目标

当机器开始学习后,可能学到了N个不同的函数,那么就要从里面选择一个最优的函数,这个过程叫最佳化(Optimization)

image-20230722222441299

整个过程,可以归纳为如下公式:

image-20230722223058532

3.5.炼丹师:超参数调优

从"设定范围"到"达成目标”,整个过程不是一帆风顺的,在训练过程中、在超参数调优过程中,都会出现过拟合(过拟合就是当前这批数据表现不错,换一批数据就不灵了)。因此需要反复迭代。人工智能工程师此时就很像一个古代的炼丹师,不断地通过调参,对模型进行优化和泛化。

  • 优化:optimazation,就是让模型更好地拟合现有的数据。
  • 泛化:generalization,就是将当前的模型泛化到其他数据集上。

image-20230723000619543

实战中需要考虑算法工程化,比如本训练任务,我们只需要简单的命令行,就能把训练过程跑起来。

image-20230723001453414

3.6.模型测试

当模型训练好后,就要用测试数据集进行测试了,我们可以通过:

  • 各类训练指标进行判断。

image-20230723001817880

  • 当然,也可以用直观的方法观看(PS:本次训练任务有点出乎意料,除了能识别泥坑,路面的裂缝也被识别出来了。)

image-20230723002107388

image-20230723002143084

image-20230723002208208

image-20230723002237309

image-20230723002257695

本文部分内容由ChatGPT生成