从第一篇博文发出来之后,将近两个月没有写博客了,这段时间我主要利用假期撸了一篇论文。这不昨天刚投到aaai2019,今天就更博了。我撸的那篇文章是关于attention机制的,第一次投ai的论文,希望能有个好的结果。过段时间我再把文章贴出来吧。
我硕士时候的室友就是搞机器学习的,当时看他做那些实验觉得还挺有意思。本来想学一下这方面的内容,不过因为跟当时的研究方向没什么关系,所以就搁置了。直到今年3月份的时候,看了一篇在信息安全顶会的一篇文章,它用深度学习来做漏洞挖掘。当时我把文章仔细读了一遍,发现数据处理是一个非常简单的过程,没有什么很深的理论知识,然后输入到一个基于B-LSTM的神经网络之后,就很神奇的得到一个很好的结果(当然后面深入研究神经网络之后,发现这篇文章的问题也很多 )。当时这篇文章让我对深度学习的能力产生了非常大的好奇,所以请教了很多朋友,把文章的模型复现了一遍,在文章公开的数据集上跑了一下,结果竟然非常牛逼。从那会儿开始,算是正式入坑机器学习。
作为我博客的第一篇关于技术的文章,我想按照我的理解聊一聊机器学习到底在干啥。如果说的不对或者不完善的地方还请斧正。
机器学习的本质其实是找一个能够尽量模拟真实状况的函数,在这篇文章里我称之为目标函数。比方说想做一个能够预测股价走势的机器人,那么我们的目标就是想找一个函数,当我们输入影响股价的一堆因素的时候,这个函数能告诉我们股价是多少,并且和真实值差距越小越好。寻找目标函数的过程,就称为机器学习。
如何找到目标函数?
首先我们应该给机器划定一个圈子,告诉它就在这个圈子里面找目标函数。这个圈子称之为模型。模型定义了一个函数空间,也就是说目标函数只能在模型所定义的这个函数空间里面。模型决定了目标函数模拟效果的上限。
要让机器在模型所定义的函数空间中找到目标函数,需要告诉机器目标函数需要具备什么样子特质。我们用损失函数(loss function)来量化函数的好坏,Loss越小,代表函数越“好”。函数空间中最“好”的那个函数就是目标函数,它对应的Loss是最小的。例如在股价预测的例子中,损失函数可以是预测值和真实值之差的绝对值的平均,也可以是预测值和真实值之差平方和的平均。
找目标函数的最后一步就是告诉机器怎样在模型所定义的函数空间中去找到Loss最小的函数。如果函数空间是一个有限的集合,当然可以采用穷举法。但是一般来说,模型所定义的函数空间是一个无限大的集合,至少是一个非常大的集合,因此穷举法是不可能的。一般的做法是先初始化模型的参数(具体初始化的方式有若干种),然后在训练集上算出loss针对各个参数的偏微分,最后按照一定的计算规则对各个参数进行更新。参数更新的规则称为优化器(optimizer)。具体的优化器就很多了,比如最简单的gradient descent,还有SGD,Adam之类的,就不一一细表。
总结一下,机器学习主要干三件事:1、设计模型,确定查找目标函数的范围;2、选择损失函数,制定函数的评价标准;3、选择优化器,为机器指明如何找到目标函数的途径。大部分机器学习的文章写的都是这三个点。了解了机器学习的本质再对其深入的学习,逐渐丰富整个机器学习大框架的细节,很容易明白各个知识点究竟在解决什么样的问题,不至于一上来就被各种CNN、RNN吓到。