想用这篇文章想记录一下我的机器学习历程,由于对这块的认识还比较浅,可能存在一些问题。如果能从一个初学者的角度出发帮到其他正在入门的朋友更加轻松地认识机器学习就再好不过了。
从大二开始我开始接触机器学习,看了一些视频和文章,那时我对机器学习的认识还处于一个懵懂的状态。机器学习算法,框架,神经网络,目标检测,语义分割听起来一个比一个高端。学机器学习的时候看过很多原理介绍,但是心里却没真正弄明白这些操作的目的。后面我开始专注于目标检测这块,想从目标检测简单说一下我的认识。
大三的时候有幸和我的老师做了目标检测的项目,那时我惊讶地发现,尽管说那时我还是没搞懂机器学习,但是也能进行一部分操作。在我学会使用Linux系统,学会配置环境后,给我一张图片我就能让机器识别出来图片里的目标。虽然能达到识别,可是不知道原理,就是学会了怎么用网上的代码去识别自己要识别的目标。所幸那次经历后的某天,我开始了思考为什么要机器学习。
我想,如果从人的角度出发,看看人是怎么判断出目标的,在从人工神经网络输出的结果开始,反向推导,我能更清楚的认识这个过程。
首先要明确我要做什么。这篇文章关注目标检测,就是对图像中的目标进行分类和判断置信度。
1.既然要分类目标,那一定要有个指标吧,通过搜索,我发现了判断目标的方法全连接层+softmax,通过输出的结果对目标进行分类。
引用一张我特别喜欢的图片
从这张图我们可以直观的看出,在某个区间内,对应的目标被区分出来,例如满足蓝色界限的一侧取值则被判断为是飞机。
补充softmax的作用:经过全连接层,我们获得了KK个类别(−∞,+∞)(−∞,+∞)范围内的分数zjzj,为了得到属于每个类别的概率,先通过ezjezj将分数映射到(0,+∞)(0,+∞),然后再归一化到(0,1)(0,1)
也就是说判断上图猫咪的概率其实是通过softmax得到的,在softmax处理前,是没有例如0.98这样归一化过的数据的
2.那么问题又来了,类别究竟是怎么匹配上的呢?还有那些矩阵又是干嘛用的?
再次引用一张我非常喜欢的图片
通过这样的方式,每个类别就和模板匹陪上了
明白了上述两个问题,整个人通透了很多,至少图片里的阿猫阿狗怎么识别的我是知道了。当然问题不可能这么简单,这时我想到,甚至一个基本的问题我都没能明白,为什么会有人工神经网络呢?人们为什么会想出这些公式啊。
说起神经网络,根据看过的几篇介绍神经网络研究起源的文章,我大致明白,或许当初人们是为了研究人脑。当人们发现人脑存在上百亿种神经元和错综复杂的连接方式时,开始了人工神经网络的构想(https://blog.csdn.net/illikang/article/details/82019945)
至于公式都是有其作用的,当你去思考要解决什么问题时,会发现人们正在尝试用公式解决这些问题,这时公式就不再那么冷冰冰了。
全连接神经网络,网上有很多文章,就不赘述了
附上链接:https://blog.csdn.net/weixinhum/article/details/79273480(原理介绍和公式推导)
全连接神经网络可以说是人脑神经网络直观的模拟,确实还蛮像的。
卷积神经网络的目的,终于研究到和目标检测密切相关的部分了,我们怎样能更轻松地解读这个过程呢?
想问一下有没有人和我一样,看过这几张图片,却还是比较懵的,说来我有些尴尬。
假设我们已经清楚了全连接神经网络。为啥有了全连接神经网络,我们还要卷积神经网络出来呢?这个链接可以帮你理解这个问题(https://www.zybuluo.com/hanbingtao/note/485480)
自然是因为卷积神经网络更适合图像识别任务啊
3.终于进入到看图说话环节了
想问一下有没有当初像我一样,看完了整个过程,但还是不明白这在干件什么事的?
(1)要说起在做什么,还得从过滤器说起,也就是上面的卷积核,这里提到一个概念——深度
深度是什么呢?我们从图片来看一下
(2)那么为什么卷积后会产生深度呢?
因为用了多个卷积核,一个卷积核产生一个feature map。也就是说卷积核越多,那么提取出的特征越多,深度越深。
(3)那么卷积是怎么提取出特征的呢?
对比一下这两张图片,绿色的是原本图片的值,而x1,x0这些则是3*3的卷积核
我们可以看出卷积操作后,图片变小了(其实应该说feature map, 已经不是原来的图了)
(4)这里顺带提一下使用更小的卷积核的作用(https://www.cnblogs.com/xiaoboge/p/10532962.html)
4.随着层数的增多,更多的卷积核产生了更多,更小的特征图,可当初的我对于这个过程依旧有点疑惑。
这里我试着用一种比较形象简单但可能没那么准确的方式来描述一下我的理解
假设你还不知道机器学习,有人和你说想要你帮我用电脑识别一张金毛巡回犬的图片,你能怎么做呢?
金黄的毛色,四条腿,两只带着微笑的眼睛,一根毛茸茸的尾巴,这些它的特征。
不过机器是没法知道这些的。
它能知道些什么呢,金色的RGB值(255,215,0),金色的像素块出现的空间位置。
金色像素的位置用图来说明会比较好理解,暂时没有图图的话,就口头描述吧。站着的金毛大致可以想象成一个金色的大长方形像素块(躯干),四个竖着放的小长方形像素块(腿),等等。当然也会存在一些特殊的情况,例如狗狗有时候是躺着的,你看不到它四条腿。
先继续正题,在这里提一下权重的简单理解,当然现实的机器学习的训练权重可不是这么直观的。假设65%的图片中狗狗是站着的,35%的是躺着的,狗狗的四条腿在识别时占到全身的面积20%的权重,0.65*0.2=0.13,于是识别一只狗狗时四条腿这个信息占到了0.13的权重。补充一句,如果你都用在训练机器时,用的都是站着的狗狗,训练了一轮又一轮,这时你突然给机器一张狗狗躺着的图片,机器很可能告诉你这不是狗狗,你可以简单地理解为过拟合的一个例子。
这时候,我们可以设置几个感受器,一个针对狗狗的腿,一个针对狗狗的躯干,一个针对尾巴…这些感受器会返回给我们各个部位的权重。
当然,实际上权重的获取并不是这样的。让机器去划分腿,躯干和尾巴,它原本就没有对这些部位的认识,你这么做不难为它嘛。不具备普适性,因为世上物体千千万,你不能都替他划分了啊。那我们来看看机器怎么做到的吧。
上图是单层的神经网络,里面的w1, w2, w3是权重
这时候我们再看这图,产生了6张特征图,即该层深度为6,也就是有6个卷积核(过滤器,再理解简单点就是上面说的感受器)
其实这6张2828的特征图都和前面3232的input的图片都会有类似单层神经网络的连接,连接上有相应的权重。
这些卷积核都是人为设定的,数值都是人赋予的,为什么他们能像感受器一样探究什么是腿,什么是尾巴呢?
事实上他们不能,更准确的说是他们不需要,我随便给你一个卷积核,比如下图
你会得到一个新的特征图像
这时我又给了你一个新的卷积核,于是它又产生了新的特征图像
卷积核越多,特征图像越多,产生了机器能使用的信息。
也就是说你肯定是看不出什么信息的,但这些信息对机器去判断图像时是价值的。
那么问题又来了,为什么这些信息会对机器有用呢?
你可以这样想,当我给你不一样的狗狗图片时,经过卷积神经网络,从全连接层出来,再进过softmax,会出现是狗狗的概率对吧。当你输入很多狗狗图片时,要让机器识别出来这些图片都是狗狗的图片,机器就要去调整权重,最后调整出一个合适的权重,让你输进去图片,能输出正确的图片上的对象的类别和置信度。
继续说一些细节写的内容,在通过softmax前,输入其实是很类似的张量(说简单点你可以先看成两个相似的数去理解)
因为着两个张量在某个特定的区间(简单理解: 这两个值很相似),满足这个区间(简单理解: 取值),机器就判断,你给的是狗狗的图片。
值得一说的是这个区间提前给的,提前训练出来的。这里现在先讲的是识别的过程
接下来就好理解了,我们要得到的是近似的值
如果只给你一层神经网络,该层有两个卷积核。再给两个输入矩阵,他们和卷积核卷积后肯定很难得到相似的向量。也就是说给你两张狗狗图片,再让图片通过神经网络,机器肯定不会把事实上是一类的狗狗识别成一类
但是如果我给你很多层神经网络,很多卷积核,还有非常合理的权重时呢?
这时出来的向量就可能很类似了!每个权重和对应的卷积核都会给出一个合理的值赋给张量,通过连接好的卷积神经网络,输出结果,根据预先确定的区间,计算机就能通过结果在哪个区间找到对应类别的生物。
划上开心的分割线,上文主要讲的是识别,想必你对训练也开始有点想法了吧,权重W是怎么训练出的呢?用的是梯度训练还是什么方法呢?以后有机会在发文啦。
当然除了训练之外,大家可能也会想到,机器能识别目标,但是他们是怎么找到目标的位置的呢?恭喜你,你找到了一个自己感兴趣的问题。这是你去搜索就可能找到region proposal等一系列的方法,这可比看书或者视频是看见了某个高端的方法,你被动地接受了它却还没搞懂它究竟要干嘛好多了。
本文最大的感悟,是对于学习的思考,为什么我们要去学知识。从古至今,其实我们一直是想通过知识去解决问题呀。
一些学习能力很强的同学可能觉得,我们从基础学起,一步一步往前推,到时候肯定能用现有的知识解决各种问题,成为一个全面的人才。
可惜我不是呀,虽然我很早开始接触机器学习的内容,但是直到很久后的一天我才明白了大致原理。所以找到适合自己的方法很重要。学了很久,但是正在感悟出这些只是一下午的时间。我想说的不是我能学的很快,而是,虽然不懂原理,但是之前对于卷积核之类的名词有过了解,我才能在那天下午快速地解决这些的困惑。所以说努力了总是有用的,只是你不知道哪天会用上。
如果有朋友像我一样,感觉学习某个知识很困难,或者说尝不到甜头就不想继续学(其实这很正常), 不妨尝试尝试我的方法。先想想自己为啥要学这个,学这个以后我真的用的上吗?如果用的上,我会把它用在什么地方呢?当你想明白了这个问题,你就会觉得你做这件事是有意义的。拿神经网络来说,人们为啥要想这个东西呢,有很多可能的答案:1.要是机器也能像人类一样了,好像挺有意思的(额,不过也可能挺可怕的);2.要是人们能研究懂神经网络,构建出一个能支持人脑神经网络的世界,人是不是可以已新的方式存活。这个问题答案是什么不重要,重要是你在想这些问题的过程中,会觉得自己在干一件很有意义的事。
我挺支持基于项目(project-based)的学习方式的,去做一件实事。先发做这件事需要什么知识,再去学习这些知识,这样你就可能站在发现或者发明这个知识的人的角度去想问题了。这样你将不再被动,学习知识也就不再是一件枯燥的事了。