深度学习

深度学习(deep learning)是机器学习的分支,以人工神经网络为架构,对数据进行特征学习的方法。
相比与机器学习,深度学习无需人工进行特征工程,能够自动的进行特征抽取;在数据量上,机器学习的数据量较少,效果不是特别好;深度学习的数据多,效果更好。

人工神经网络的概念

人工神经网络(Artificial Neural Network,ANN),简称神经网络(Neural Network,NN)或类神经网络,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型,用于对函数进行估计或者近似。

神经元的概念

在生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个“阈值”,那么他就会被激活,即“兴奋”起来,向其他神经元发送化学物质。

1943年,心理学家Warren McCulloch和数理逻辑学家Walter Pitts在合作的《A logical calculus of the ideas immanent in nervous activity》论文中提出并给出了人工神经网络的概念及人工神经元的数学模型,即一直沿用至今的M-P神经元模型,把许多这样的神经元按一定的层次结构链接起来,就得到了神经网络。神经元的数学模型如下图所示:

M-P神经元模型结构

其中:

  • a_1,a_2...a_n为各个输入的分量;
  • w_1,w_2...w_n为哥各个输入分量对应的权重参数;
  • b为偏置;
  • f激活函数,常见的激活函数有tanh,sigmoid,relu;
  • t为神经元的输出。

用数学公式可以表达为:
$$t=f(W^TA+b)$$
可见,一个神经元的功能是求得输入向量与权向量的内积后,经一个非线性传递函数得到一个标量结果。

单层神经网络

单层神经网络是最基本的神经元网络行驶,由有限个神经元构成,所有神经元的输入向量都是同一个向量。由于每个神经元都会产生一个标量结果,所以单层神经元的输出是一个向量,向量的维数等于神经元的数目,如图所示:

单层神经网络示意图

感知机

感知机由两层神经网络组成,输入层接收外界输入信号后传递给输出层(输出+1为正例,输出-1为反例),输出层是M-P神经元

感知机示意图

其中:w_1,w_1...w_n都表示权重

感知机的作用:

把一个n维向量空间用一个超平面分割为两部分,给定一恶搞输入向量,超平面可以判断出这个向量位于超平面的哪一边,得到输入时正类或者反类,对应到2维空间就是一条直线把一个平面分为两个部分。

多层神经网络

多层神经网络由单层神经网络进行叠加之后得到,具备的概念,常见的多层神经网络的结构如下:

  • 输入层(Input Layer),众多神经元(Neuron)接受大量分线性输入消息。输入的消息称为输入向量
  • 输出层(Output Layer),消息在神经元链接中传输、分析、权衡,形成输出结果。输出的消息称为输出向量
  • 隐藏层(Hidden Layer),简称“隐层”,是输入层和输出层之间众多神经元和链接组成的各个层面。隐藏层可以有一层或多层。隐层的节点(神经元)数目不定,但数目越多的神经网络的非线性越显著,从而神经网络的强健性(robustness)更显著。
    示意图如下:
多层神经网络示意图

概念:全连接层
全连接层:当前一层和前一层每个神经元相互链接,称当前层为全连接层。
当第N-1层有m个神经元,第N层有n个神经元,当第N层是全连接层的时候,则N-1和N层之间有多少个参数w,这些参数可以如何表示?

从上图可以看出,全连接层是在前一层输出的基础上进行一次Y=Wx+b的变化(不考虑激活函数的情况下就是一次线性变化,即平移(+b)和缩放的组合(*w))

激活函数

引入

对于单层感知机而言,其结果类似:
$$y=w_1x_1+w_2x_2+b$$
嘉定确定了参数w和b后,带入需要预测的数据即可完成分类,然而,对于一些任务,仅使用直线式无法完成分类的,如下图中三角形和四边形的分类案例:

此时考虑使用多层神经网络进行尝试,比如在前面的感知机模型中增加一层:

对上图的等式进行合并,多层神经网络得到预测结果类似于:
$$
y=(w{1-1}w{2-1}+...)x1+(w{1-21}w_{2-1}+...)x2+(w{2-1}+...)b_{1-1}
$$
上式括号中的都为w参数,和公式y=w_1x_1+w_2x_2+b完全相同,依然 只能够绘制出直线。
因此,多层神经网络也没有在这个问题上有任何改进。故在感知机的基础上添加非线性激活函数,输出结果不再是一条直线。

上图中对感知机的结果使用sigmoid函数进行处理,如果给定合适的参数w和b,就可以得到合适的曲线,能够完成对最开始问题的线性分割。
激活函数的重要作用就是增加模型的非线性分割能力

常用激活函数

  • sigmoid只会输出正数,以及靠近0的输出变化率最大
  • tanhsigmoid不同,tanh可以输出负数
  • Relu是输入只能大于0,如果输入含有负数,Relu就不合适,如果输入是图片格式,Relu比较常用,因为图片像素值是[0,255]。
    此外,激活函数还具有以下作用:
  • 提高模型鲁棒性
  • 缓解梯度消失问题
  • 加速模型收敛等