最热门的深度学习,想必很多人都想了解学习,网络上也有不少资料;小编也希望可以从头开始,更为透彻地去理解原理机制,这样在日后可以在深度学习框架实战的学习上更为轻松。那我们就从头开始,从最简单的神经元:感知机开始学习。
感知机:
感知机是最早的监督式训练算法,我们之前的学习文章中也略有提到,它是神经网络和支持向量机的基础,在支持向量机方面主要是理解支持向量和max margin的loss函数;而神经网络方面,我们可以将它看作是神经网络的一个神经元。
假如平面中存在n个点,并被分别标记为“0”和“1”。此时加入一个新的点,如果想要对这个点进行分类判别,最简单的方法是查找离这个点最近的点是什么,然后返回和这个点一样的标记。而一种稍微“智能”的办法则是去找出平面上的一条线来将不同标记的数据点分开,并用这条线作为“分类器”来区分新数据点的标记。
在本例中,每一个输入数据都可以表示为一个向量 x_t 作为一个新的插入点,我们的感知机将如何判断,并进行权重的改变的。最终将输入、权重和偏移结合可以得到如下传递函数:
这个传递函数的结果将被输入到一个激活函数中以产生标记。在上面的例子中,我们的激活函数是一个门限截止函数(即大于某个阈值后输出1):
看到这样的线性表达,应该很容易想到其可以通过最小化误差输出,去进行训练;重点是感知机只是一个线性的分类器,并不能解决XOR简单的函数
为了解决非线性这个问题,我们就要使用多层感知机,也就是前馈神经网络。
前馈神经网络
神经网络实际上就是将大量之前讲到的感知机进行组合,用不同的方法进行连接并作用在不同的激活函数上。
我们简单介绍下前向神经网络,其具有以下属性:
1. 一个输入层,一个输出层,一个或多个隐含层。上图所示的神经网络中有一个四神经元的输入层、一个三神经元的隐含层、一个二神经元的输出层。
2. 每一个神经元都是一个上文提到的感知机。
3.输入层的神经元作为隐含层的输入,同时隐含层的神经元也是输出层神经元的输入。
4. 每条建立在神经元之间的连接都有一个权重w(与感知机中提到的权重类似)。
5. 在t层的每个神经元通常与前一层(t - 1层)中的每个神经元都有连接(但你可以通过将这条连接的权重设为0来断开这条连接)。
6. 为了处理输入数据,将输入向量赋到输入层中。然后这些值将被传播到隐含层,通过加权传递函数传给每一个隐含层神经元(这就是前向传播),隐含层神经元再计算输出(激活函数)。
7. 输出层和隐含层一样进行计算,输出层的计算结果就是整个神经网络的输出。
如果每一个感知机都只能使用一个线性激活函数会怎么样?整个网络的最终输出也仍然是将输入数据通过一些线性函数计算过一遍,只是用一些在网络中收集的不同权值调整了一下。换名话说,再多线性函数的组合还是线性函数。如果我们限定只能使用线性激活函数的话,前馈神经网络其实比一个感知机强大不到哪里去,无论网络有多少层。正是这个原因,大多数神经网络都是使用的非线性激活函数,如对数函数、双曲正切函数、阶跃函数、整流函数等。不用这些非线性函数的神经网络只能学习输入数据的线性组合。
对于常用的判别非线性函数就是:
sigmoid函数的定义如下:
将其带入式子,得到
sigmoid函数是一个非线性函数,值域是(0,1)。函数图像如下图所示
sigmoid函数的导数是:
可以看到,sigmoid函数的导数非常有趣,它可以用sigmoid函数自身来表示。这样,一旦计算出sigmoid函数的值,计算它的导数的值就非常方便。
有了传递的非线性函数,神经网络的基本表达就很容易了,通过权重向量和矩阵形式,更方便通过反向传导方法确定每一层的参数。
在上式中,激活函数是sigmoid函数;W是某一层的权重矩阵;x是某层的输入向量;a是某层的输出向量。则说明神经网络的每一层的作用实际上就是先将输入向量左乘一个数组进行线性变换,得到一个新的向量,然后再对这个向量逐元素应用一个激活函数。这里不再具体BP算法是如何操作的,主要是通过链式法则求每个神经元的偏导数,再进行权值分配。
BP反向传导算法的直观解释:当误差对权值的偏导数大于零时,权值调整量为负,实际输出大于期望输出,则权值向减少方向调整,使得实际输出与期望输出的差减少;反之,当误差对权值的偏导数小于零时,权值调整量为正,实际输出少于期望输出,权值向增大方向调整,使得实际输出与期望输出的差减少。
总之,还是利用随机梯度的方法,去在每一层进行优化,最终在整体算法上接近全局最优。 之后随着不断地学习,还会发布深度学习的相关文章。还请持续关注、转发~
参考文献: