前言
这篇文档非常长所以我们会分成5篇来连载,因为机器学习并不是纯软件开发,简单地调用库函数 API,需要有一定的理论支撑,如果完全不介绍理论部分,可能就不知道为什么模型要这样设计,模型出了问题应该怎样改善。不过文档如果写太长大家可能很难有耐心看完,特别是理论部分会有很多公式,但是机器学习确实又对 理论基础 和 编程能力 都有一些要求,相信坚持看下去还是会有很多收获的,我也尽可能把理论和应用都介绍清楚。
前两篇的连载会以机器学习理论为主,之后的文档就基本是纯实际应用了,不会有太多理论内容了:[ Darknet 训练目标检测模型 ]、[ RT-Thread 连接 ROS 小车控制 ]。
这篇文章假定大家都已经会用 RT-Thread 的 env 工具下载软件包,并且生成项目上传固件到 stm32 上,因为这几天的两篇连载文章重点在于加载 onnx 通用机器学习模型,关于 RT-Thread 的教程大家可以在官网文档中心:https://www.rt-thread.org/document/site/上找一找。
首先,简单介绍一下上面提到的各个话题的范围 (Domain),人工智能 (Artifitial Intelligence) 是最大的话题,如果用一张图来说明的话:
然后机器学习 (Machine Learning) 就是这篇文档的主题了,但是 机器学习 依旧是一个非常大的话题:
这里简单介绍一下上面提到的三种类型:
监督学习 (Supervised Learning): 这应当是应用最多的领域了,例如人脸识别,我提前先给你大量的图片,然后告诉你当中哪些包含了人脸,哪些不包含,你从我给的照片中总结出人脸的特征,这就是训练过程。最后我再提供一些从来没有见过的图片,如果算法训练得好的话,就能很好的区分一张图片中是否包含人脸。所以监督学习最大的特点就是有训练集,告诉模型什么是对的,什么是错的。
非监督学习 (Unsupervised Learning): 例如网上购物的推荐系统,模型会对我的浏览记录进行分类,然后自动向我推荐相关的商品。非监督学习最大的特点就是没有一个标准答案,比如水杯既可以分类为日用品,也可以分类为礼品,都没有问题。
强化学习 (Reinforcement Learnong): 强化学习应当是机器学习当中最吸引人的一个部分了,例如 Gym 上就有很多训练电脑自己玩游戏最后拿高分的例子。强化学习主要就是通过试错 (Action),找到能让自己收益最大的方法,这也是为什么很多都例子都是电脑玩游戏。
所以文档后面介绍的都是关于 监督学习,因为手写体识别需要有一些训练集告诉我这些图像实际上应该是什么数字,不过监督学习的方法也有很多,主要有分类和回归两大类:
分类 (Classification): 例如手写体识别,这类问题的特点在于最后的结果是离散的,最后分类的数字只能是 0, 1, 2, 3 而不会是 1.414, 1.732 这样的小数。
回归 (Regression): 例如经典的房价预测,这类问题得到的结果是连续的,例如房价是会连续变化的,有无限多种可能,不像手写体识别那样只有 0-9 这 10 种类别。
这样看来,接下来介绍的手写体识别是一个 分类问题。但是做分类算法也非常多,这篇文章要介绍的是应用非常多也相对成熟的 神经网络 (Neural Network)。
人工神经网络 (Artifitial Neural Network):这是个比较通用的方法,可以应用在各个领域做数据拟合,但是像图像和语音也有各自更适合的算法。
卷积神经网络 (Convolutional Neural Network):主要应用在图像领域,后面也会详细介绍。
循环神经网络 (Recurrent Neural Network):比较适用于像声音这样的序列输入,因此在语言识别领域应用比较多。
最后总结一下,这篇文档介绍的是人工智能下面发展比较快的机器学习分支,然后解决的是机器学习监督学习下面的分类问题,用的是神经网络里的卷积神经网络 (CNN) 方法。
1 神经网络相关理论
这一部分主要介绍神经网络的整个运行流程,怎么准备训练集,什么是训练,为什么要训练,怎么进行训练,以及训练之后得到了什么。
1.1 线性回归 (Linear Regression)
1.1.1 回归模型
要做机器学习训练预测,我们首先得知道自己训练的模型是什么样的,还是以最经典的线性回归模型为例,后面的人工神经网络 (ANN) 其实可以看做多个线性回归组合。那么什么是线性回归模型呢?
比如下面图上这些散点,希望能找到一条直线进行拟合,线性回归拟合的模型就是:
这样如果以后有一个点 x = 3,不在图上这些点覆盖的区域,我们也可以通过训练好的线性回归模型预测出对应的 y。
不过上面的公式通常使用另外一种表示方法,最终的预测值也就是 y 通常用 hθ (hypothesis) 表示,而它的下标 θ 代表不同训练参数也就是 k, b。这样模型就成了: