跟我一起学PyTorch-04:神经网络

本节从神经网络的发展着手,依次介绍激活函数、前向算法、损失函数、反向传播算法以及PyTorch中的数据处理,最后使用PyTorch解决一个iris数据集上的多分类问题。通过本节的学习,我们将对整个神经网络的流程有一个比较全面的认识。

1.神经元与神经网络

神经元最早是生物学上的概念,它是人脑中的最基本单元。人脑中含有大量的神经元,米粒大小的脑组织中就包含超过10000个神经元,不同的神经元之间相互连接,每个神经元与其他的神经元平均有6000个连接。一个神经元接收其他神经元传递过来的信息,通过某种方式处理后再传递给其他神经元。下图就是生物神经元的示意图。


image.png

一个神经元由细胞核、树突、轴突和轴突末梢等组成。其中树突有很多条,且含有不同的权重,主要用来接收从其他神经元传来的信息;接收到的信息在细胞整合后产生新的信息传递给其他神经元;而轴突只有一条,轴突末端有许多神经末梢,可以给其他神经元传递信息。神经末梢跟其他神经元的树突连接,从而传递信号,这个链接的位置在生物学上叫做“突触”。

在对人脑工作机理研究的基础上,1943年McCulloch和Pitts参考了生物神经元的结构,最早提出了人工神经元模型,即MP神经元模型。MP神经元从外部或者其他神经元接受输入信息,通过特定的计算得到输出结果。如下图所示,输入X1,X2,对应权重w1,w2,偏置b,通过加权求和代入f(z)函数中,得到输出Y。这个函数f(z)就是激活函数。人工神经元是人工神经网络中最基本的单元。


image.png

MP模型虽然简单,但却是构建神经网络的基础。神经网络(Neural Network,NN)是人工神经网络(Artificial Neural Network,ANN)的简称,由很多神经元组成。神经网络是对人脑工作机制的一种模仿。在MP模型中,权重的值都是预先设置的,因此不能学习。1949年Hebb提出了Hebb学习率,认为人脑神经细胞的突触上的强度是可以变化的。于是研究者开始考虑使用调整权值的方法来让机器学习。

1958年,Rosenblatt提出了由两层(输入层和输出层)神经元组成的神经网络,名叫“感知机”,如下图所示。从结构上,感知机把神经元中的输入变成了单独的神经元,成为输入单元。与神经元模型不同,感知机中的权重是通过训练得到的。感知机类似一个逻辑回归模型,可以做线性分类任务,是首个可以学习的人工神经网络。这为后面的学习算法奠定了基础,可以说感知机是神经网络的基石。但由于它只有一层功能神经单元,因此学习能力非常有限。Minsky在1969年出版了一本名为“Perceptron”的书,使用数学方法详细地证明了感知机的弱点,尤其是感知机对XOP(异或)这样的简单分类任务都无法解决。


image.png

感知机是前馈神经网络的一种,前馈神经网络实最早起也是最简单的一种人工神经网络。前馈神经网络包含多个神经元,被安排在不同的层,即输入层、隐含层、输出层,其中隐含层的个数有0个或多个。在前馈神经网络中,信息在神经元上的传播方向只有一个——向前,即从输入层经过隐含层到达 输出层,神经元之间没有循环结构。感知机就是没有隐含层的前馈神经网络。拥有一个或多个隐含层的前馈神经网络称为“多层感知机”(Multi Layer Perceotron,MLP),如下图所示。


image.png

多层感知机可以很好地解决非线性可分问题,我们通常将多层感知机这样的多层结构称为神经网络。

所谓神经网络的训练或者学习,其主要目的就是通过学习算法得到神经网络解决指定问题所需的参数。这里的参数包括各层神经元之间的连接权重以及偏置等。参数的确定需要神经网络通过训练样本和学习算法来迭代找到最优参数组合。说起神经网络的学习算法,不得不提其中最杰出、最成功的代表——反向传播算法。

2.激活函数

前面提到过在神经元中,输入信息通过一个非线性函数y=f(x)产生输出,这个函数决定哪些信息保留以传递给后面的神经元,这个函数就是激活函数(Activation Function),又被称为非线性函数(Nonlinearity Function),对于给定的输入,激活函数执行固定的数学运算得到输出结果,根据输出结果控制输入信息的保留程度。

激活函数要具有以下性质:

  • 非线性:当激活函数是线性时,一个两层的神经网络基本上就可以表达所有的函数了,恒等函数f(x)=x不满足这个条件,如果MLP中使用恒等激活函数,那么整个神经网络跟单层的神经网络是等价的。为什么需要非线性呢?因为线性的叠加还是线性,而线性函数的表达能力有限,只能做线性可分的任务。对于线性不可分的更复杂的问题,比如说playground上的一些问题,线性不可分,所以需要用到非线性激活函数。

    360截图20190630165805206.jpg
  • 连续可微性:在训练神经网络的过程中,使用到了梯度下降,所以连续可微性是必要的。ReLU虽然不连续,但是也同样适合做激活函数。
  • 值域是有限的:激活函数的值域是有限的时候,基于梯度下降的训练过程才能越来越稳定,因为特征表示受有限值的影响更加有效。
  • 单调性:激活函数是单调的时候,单层的神经网络才能保证是凸函数。
  • 具有单调导数的光滑函数:在某些情况下,这些已经被证明可以更好地概括。对这些性质的论证表名,这种激活函数与奥卡姆剃刀原理(简单有效原理)更加一致。
  • 函数值和输入近似相等:满足这个条件的激活函数,当权重初始化成很小的随机数时,神经网络的训练将会很高效,如果不满足这个条件则需要很小心的初始化神经网络权重。

下面介绍几种常见的激活函数:Sigmoid、Tanh、Hard Tanh、ReLU、Softmax、LogSoftmax等。

1.Sigmoid
2.Tanh
3.Hard Tanh
4.ReLU
5.ReLU的扩展
6.Softmax
7.LogSoftmax

3.前向算法

4.损失函数

1.损失函数的概念
2.回归问题
3.分类问题
4.PyTorch中常用的损失函数

5.反向传播算法

6.数据处理

7.示例:单层神经网络实现

你或许想:《去原作者写文章的地方

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论