互联网科技机器学习与数据挖掘程序员

如何调教神经网络

2017-08-05  本文已影响106人  坂本龙一

之前有问一些朋友意见,都说根本不懂你这货在胡说八道什么。或许是学艺不精,加上表达能力捉鸡吧。

但是做事总得有始有终,只要能看到有个人点开,那就有勇气把都写完。尽自己最大的努力去解释清楚。

计划是,介绍完神经网络的功能,如何训练,之后什么是深度学习,还有它的一些应用。希望传达给大家的是,AI将会对社会带来巨大冲击,这现在也是领域内大牛们公认的。看最近从美国、英国、日本,再到中国发布的报告,各国政府也都在着手准备应对。

最后还希望能够引起大家的思考,自己现在或是将要从事的职业在这场革命中将会怎么样,是否会被取代掉,如果是的话,自己又将如何去应对。
谢谢。

之前有讲到,神经网络的主要功能就是对数据进行分类。

但是,并不是说一开始,我们把神经元连接好,把神经网络的架构搭建出来之后,它就能自动进行分类了。

那么,怎么样才能让它具有这个功能呢。

实际上,每个可以用来精确分类和预测的神经网络,几乎都是需要进行训练,才能从初始网络,变成具有强大功能的网络。就如人类一样,需要经过大量的训练才能熟练地掌握某种能力。

那么,训练是什么呢?又怎么来训练呢?

训练的目的

简单说吗,训练的目的就是让神经网络能够熟练并准确地完成某个特定任务。
更详细来说,我们有一个数据集。它有很多输入x和相对应的输出y。那么我们的神经网络就利用这些已有的数据集,来进行训练,最后,获得一个我给它一个特定x输入,然后能给出一个估计输出y^*的神经网络。这个估计y*能够尽量接近真正的输出y

这里要提一个机器学习中的术语,损失函数 (Loss Function). 可以大致当成是,估计y*和真正输出y之间的距离。而这个估计距离的方法有很多种,简单的比如说直接看成两者之间的差。

那么我们训练的目的实际上就是,如何挑选神经网络参数,从而使得损失函数的值最小。因此,训练事实上是可以看做是一个优化问题的。
Min: Loss(y^*,y)
okay,然后来说说怎么来训练吧。

训练的方法

在目前的多层神经网络中,其中一个最重要的算法就是,反向传播 (backpropagation)算法

为什么叫做反向传播这么奇怪的名字呢。但正如它的名字一样,它确实是反过来从最底层的输出层开始,向上传播东西,到达中间的隐藏层,最后再到输入层。

那么,这里传播的又是什么呢?

可以大致看成是一种叫做梯度 (gradient) 的东西, 有什么用呢。之后,整个神经网络会根据不断往回传的梯度,用一种叫做梯度下降法 (Gradient Descent)的方法,来对神经网络的参数进行更新,使得神经网络更加接近我们想要的神经网络。

最好还是打个比方吧。

如果我们在玩一个猜数字游戏。从1到100,我先在心里想一个在这个范围内的数字,然后你来猜。

好的,假设我心里想的是75,你要来猜我心里想的是什么数字。

于是,你先猜50,这是一个当前的预测y*。然后我想了想,告诉你不对,然后还说低了。

这个时候,相当于我反向传播给你了一个梯度信号,而梯度的用处是什么呢。

这时,你一听低了,于是你就会猜一个比50更加大的数字对不对;假如之前我说高了,那你就会往比50小的数调整。

梯度就相当于这里的我说的高了低了,也就是说它告诉了网络的参数该往哪个方向进行调整,是往大呢,还是往小呢。

你根据这个梯度来调整猜测数据的方法,就叫做梯度下降法。而事实上,梯度下降法就是用原来的值,根据所得梯度加减一个值, 使得参数更加接近自己想要的那个参数

学习率

如果,这里我再告诉你另外一个信息。比如说,大了很多,或者是,小了但很接近了。

那么你会根据,这个很多和接近来变化调整猜测值的大小。比如说,我说差了很多,那么你就会一下调整很大数字;而接近的话,就只会稍稍调整一下。

这个就叫做梯度下降法中的学习率 (learning rate)。

如果每次你猜时,调整的步长不变的话,如果设置步长太小,那么就会猜很多很多次才能接近正确结果;而太大的话,那么就会不断的越过正确答案。

所以最好的是,最开始用比较大的步长,之后快接近的时候用小步长。同理,训练开始用大的学习率,而慢慢用小的学习率,这样就能更好的接近结果。

虽然这个比喻很多地方还是很不恰当的,但是可能会好理解一些。如果是深层网络的话,那么可以想象成是很多人的猜数游戏,大家排成几层,然后前面一层告诉后面一层他们的猜测,然后后一层将这个数字乘以一个数字和加上非线性处理之后,继续传往下一层。直到最后的输出,与真实输出进行对比,然后将错误信息(梯度信息),再反过来传到最上层输入层,途中各人根据梯度,来调整自己的乘数。慢慢地最终将越来越接近最后的结果。

上一篇下一篇

猜你喜欢

热点阅读