0.机器学习

  机器学习(Machine Learning)听上去非常高端,表面上来看好像是机器模仿人类学习新知识,可是人类是如何学习的,我无法给出答案,我学习的途径就是理解、重复加练习,那要如何去类比机器呢?这看上去是有些困难的,但是我们换一个说法,机器学习的本质其实是在寻找函数(Looking for Function),我们都知道计算机中的表数据都可以用数字表示,无论是文本还是图片,在计算机眼中都是一串数字,那要让它去"理解“这些内容,就需要找到一个特定函数,将输入信息转换成特定的输出。

1.训练过程

  比如输入一张车的图片,计算机将图片读取为一串数字,现在给他一个函数,把读取出的数字放入该函数中,输出一个特定结果,这个结果就代表车。我们输入大量车的图片,并告诉计算机这是车子,这就是训练集(Training Set)。计算机找到一个特定函数,通过这个函数的变化,可以把所有输入都转变为指定的输出,为了获得这个函数,计算机会去分析图片中的所有信息,在我们例子中,计算机可能会认为四个轮子的就是车,它就会构建一个函数,只要找到图片中四个轮子的信息,就会输出车子这个结果。 而计算机寻找什么是车的特征的过程不是一蹴而就的,你可以认为它是没有跳跃思维的"笨机器",它要去不断的试错、枚举。那我们要怎么才知道训练获得的函数是好的,这时候我们就将真实结果与训练的预测结果比较,这就是损失函数(loss function),用来估量模型的预测值与真实值的不一致程度。如果偏差很大,计算机就会重新寻找图片特征,重新进行训练。这样不断重复,我们就可以把训练集中图片输入都可以输出车这个结果,在直观上看,就好像计算机已经认识了车这个物体。

Tips1 损失函数位置
在机器学习中,我们知道输入的特征(或称为x)需要通过模型(model)预测出y,此过程称为前向传播(Forward Pass),而要将预测与真实值的差值减小需要更新模型中的参数,这个过程称为反向传播(Backward Pass),其中我们损失函数就基于这两种传播之间,起到一种有点像承上启下的作用,承上指:接収模型的预测值,启下指:计算预测值和真实值的差值,为下面反向传播提供输入数据。


  但这是不够的,就像我们从指定图片认识到这是车,但是要是获得其他我们没见过的图片那怎么办?这时候我们就要对训练获得的函数进行验证,这个函数也就叫做模型(Model)。验证的时候,我们要输入其他不同车子的图片,这就是验证集(Validation Set)。如果这个函数对训练集中的数据可以获得接近100%的准确率,但对于验证集中数据准确率只有50%,这种训练集中的准确率高于验证集的准确率的情况称为过拟合(Overfitting)。与之相反的是,训练集中准确率很低,称为欠拟合(Underfitting)。对于这两种情况,都需要调整训练模型,参数或者数据集的大小。
  总的来说,上述训练的过程可以分为三步:1.定义一个初始函数。2.选择损失函数。3.优化。

2.测试

  假如我们获得了一个很好的模型,在训练集和验证集中都获得了很好的效果,此时我们可以把没有参与训练的测试集(Testing Set)数据放入模型,通过如均方根损失、决定系数等各类评价指标对模型进行评价。通过测试的函数,就是我们训练完成的模型,可以直接拿来使用、至此,对于车子图像识别的机器学习过程全部完成。如果想要动手完成简单的图像识别,可以参考基于CNN的手写数字识别实现0-9十个手写数字的识别。

Tips2 为什么要使用测试集
(1)训练集直接参与了模型调参的过程,显然不能用来反映模型真实的能力(防止课本死记硬背的学生拥有最好的成绩,即防止过拟合)。
(2)验证集参与了人工调参(超参数)的过程,也不能用来最终评判一个模型(刷题库的学生不能算是学习好的学生)。
(3) 所以要通过最终的考试(测试集)来考察一个学生(模型)真正的能力(期末考试)。


  在上述的训练过程是一个简单的分类问题,我们只考虑了车子这一个图片,并没有加入其他容易造成误判的图片,也就是说计算机可以把车认成车,但被计算机认成车的图片不一定真是车,也可能是两个自行车。为了避免计算机把其他物体误认成车,我们需要在训练过程中加入干扰项,告诉计算机这些图片不属于车这个分类。