昨天在B站上瞎逛的时候,看到了“深度学习”这个字眼,以为是教人如何学习方面的知识,点进去一看,一脸懵逼。慢慢了解了之后才知道,这就是最近火的不能再火的人工智能相关的内容。带着好奇的心态,自己也开始了一番尝试。
这真的是一番新天地,虽然自己曾经了解过神经网络,却没有想到,现如今的人工智嫩就是靠着它一步一步的发展起来了。
本科阶段由于参加过数学建模竞赛,了解了一些高级的算法,其中就包括了BP神经网络,当时也没有去深究为什么这个网络就能给出一个比较满意的答案。具体原理将会在下面进行介绍。
现在的神经网络已经得到了很大的发展,有传统的神经网络BP神经网络,有卷积神经网络CNN,循环神经网络RNN以及对抗网络GAN等各种网络的组合形式。昨天主要学习的内容是传统神经网络的原理了解。
神经网络就像是有无数多个神经元相互通过无限多个突触连接起来,并交流信息。在我们的神经网络里也是这样,只不过我们的神经元个数没有那么多,他们之间的突触数量也不会多的数不清。我们就从最简单的三层神经网络入手吧。什么是三层,就是有多个输入神经元,相当于我们受到刺激的一个神经元;一个是中间神经元,由于我们所受到的刺激会传递到我们的大脑,所以刺激会通过一系列的连接传过来,当然不可能就只通过三层传过来,应该会有很多层,我们这里是简化了的传递。中间层的神经元数量不止一个;最后一层就是我们的输出层,也就相当于我们的大脑,在这里可以只有一个神经元,其实可以有很多个神经元,输入曾也是一样,都可以有很多个神经元。 消息从输入神经元那里经过各自连接到下一层的每一个神经元,将自己的输入传过去,在穿的过程中会经过一系列的处理,在这里就是会有一个权重系数会乘上去,第二层的每一个神经元都会受到第一层的神经元的每一个系数会权重系数相乘之后在相加的结果,最后再加上一个偏置项,便得到了第二层神经元的输入。考虑到普通神经元不能解决非线性问题,且在生活中,更多的事非线性的问题,在第二层输出前会让给输入进行一个非线性化的处理(也可以使用非线性的输入来解决这件事只不过非线性的输入不好控制),然后再以永阳的方式由第二层传向下一层。由此便会得到一个结果,这个结果怎么样会经一个Loss损失函数来决定,这样就给了模型一个反馈量,给了图形一次再更改自己的机会。
模型如何更改自己的模型了,我们可以看到的事,模型能改的也就是偏置项和权重系数了,一般的我们对于偏置项没有做处理,主要工作就集中在对于权重系数的更改,或者就更新。事项,如果不断的更新权重系数到loss函数的值达到我们需要的精度方可,是不是就可以输出我们满意的答案了了。
可是,如何来更新我们的权重系数了。这里就涉及到大学高数里面所学到的知识了。有个梯度下降法。就是用来求最优值的算法。我们最是渴望以最小的成本获得最大的收益,梯度下降就是这样,神经网络也一样,希望能最快的找到我们的权重系数。稍微解释下梯度下降原理,一个人在他看不到头的山上,需要找到最快的下山方法,最有效的做法就是沿着当前位置,不断向下走,那么那个地方在走单位路程的情况下,下降的最快了,就是我们的斜率最小的地方,也就是斜率的负值最大的地方。这个值我们也叫做梯度。也就是沿着梯度的方向,可以达到最快下降的目的。当然,这样得到的结果不一定是全局最优解,但一定会是局部最优解。那么如何更新我们的权重系数了。根据梯度下降的原理,每次更新我们的权重值应该是在原来的值的基础上,+或者-去梯度值,加减决定于你计算下一层输入的方式有关。当然我们一般不会就这么简单的加上或者减去梯度值就够了,我们还需要给模型一个惩罚函数,由于其输出的结果有一定的偏差,由其偏差大小决定惩罚的大小。最后对偏差函数乘以一个学习系数,就是每次更新梯度的大小,或者说是一个步长问题也可以,取得太大太小都不可以。太大,找不到最优值,或者在两个值之间不停的来回转换,太小,则计算时间太长。一般取值为0.001或者0.0001这里面又涉及到一个高数问题,如果网络足够长,我怎么求梯度,连续求偏导可以解决这个问题。可以从后面的每一个神经元算出前面的每一个权重系数的梯度,具体就是一层一层饿算,下一层的计算依赖于上一层的计算。最后得以全部更新权重系数。
最后还补充一个,权重系数和偏置项的初始化问题,一般就是而让偏置项初始化为0或者1。权重系数随机初始化,不过,其值一般初始化比较小。在-1到1之间取值。
网友评论