• 简单介绍
  • 单个神经元模型
  • 生物学动机和连接
  • 单个神经元当做线性分类器
  • 常用的激活函数
  • Sigmoid
  • Tanh
  • ReLU
  • Leaky ReLU
  • Maxout
  • 神经网络结构
  • 前向传播计算例子
  • 表述能力
  • 设置层的个数和大小
  • 总结
  • 更多参考


简单介绍

在介绍线性分类器是,介绍了评分函数s=Wx,例如分类CIFAR-10时,x是[3072×1]的向量,W是[10×3072]的矩阵,输出是10个类别的得分。

上面的计算时线性的;而神经网络往往是非线性的。例如一个神经网络s=W2max(0,W1x)。这里W1是[100×3072的矩阵,把图像转换为一个向量;函数max(0,−)是非线性运算,非线性运算有很多种。W2是[10×100]的矩阵,这样就能得到10个评分了。非线性运算至关重要,如果没有非线性运算,这两步运算得到的结果和输入也是线性关系。权重参数W1,W2可以通过随机梯度下降求得,梯度可以通过链式求导法则计算。

单个神经元模型

神经网络是由生物学上的神经元激发而创建;在机器学习领域的工程实践上表现优异。

生物学动机和连接

大脑的的基本组成单位是神经元。在人的神经系统中,大概有860亿个神经元通过1014∼1015个突出连接。下图左边是一个神经元,右边是模仿神经元的数学模型。

神经元从突出接收到信号,在神经元信号和权重相乘,随后再相加,然后经过一个非线性函数输出。这个非线性函数叫做激活函数。

上面建立的模型只是一个粗糙简单的模型,真实情况远比上面负责,具体可以参考这里和这里

单个神经元当做线性分类器

上面建立的模型和线性匪类器很像。把loss函数应用到神经元的输出就可以看做是线性分类器了。

二元分类器:把函数σ(∑iwixi+b)当做分类的概率。
二元SVM分类器:在输出后面加上一个hinge loss函数,可以训练成一个二元SVM分类器。
正则化解释:正则化函数让W趋向于零,这里可以理解为逐渐忘记。

常用的激活函数

激活函数的输入都是一个数字,然后进行非线性运算。下图是几个激活函数

Sigmoid


σ(x)=1/(1+e−x)

它把输入压缩到(0,1)之间;非常大的负数趋向于0,非常大的正负趋向于1。Sigmod现在已经少用了,因为
1、Sigmoid有梯度消失的问题。
2、Sigmoid输出不是零中心的。例如输出全是正数,那么下一层输入就全是正数,这将导致梯度要么全是正数,要么全是负数;在使用梯度下降算法时,呈现出Z字下降。这个问题可以通过批量梯度下降解决。

Tanh



tanh(x)=2σ(2x)−1

它的输出是零中心的[-1,1],但是它同样存在梯度消失问题。

ReLU



f(x)=max(0,x)

ReLU近几年比较受欢迎。它有以下优缺点
1、优点:使用SGD时,它比Sigmoid/Tanh收敛速度快。
2、优点:和Sigmoid和Tanh相比,它计算简单。
3、缺点:脆弱,容易死掉。死掉是指,比较大的梯度经过神经元后,可以导致ReLU输出都小于0,即不再激活。这个可以同构调整学习率部分解决。

Leaky ReLU



f(x)=1(x<0)(αx)+1(x>=0)(x)



f(x)=max(αx,x)

其中α是一个很小的常数。$Leaky ReLU是解决ReLU死掉问题的。详细介绍参考这里

Maxout

归纳ReLU和Leaky ReLU,得到更通用的一般形式



max(wT1x+b1,wT2x+b2)


例如,当

W1=0,b1=0时就是ReLU函数。它克服了ReLU的缺点,保留了其优点。但是其参数增加了一倍。

在神经网络中,很少见到在同一个网络的不同神经元中使用不同的激活函数,即使这样做没有什么问题。

神经网络结构

神经网络是由神经元组成的无环图;一个神经元的输出可以作为另一个神经元的输入,但是神经网络中不存在环路(这样会造成前向传播死循环)。神经网络是分层的,最常见的层是全连接层。在全连接层中,神经网元与前一层和后一层的每个神经元都相连。下图就是由全连接层组成的两个神经网络。

命名规则:在定义神经网络层数时,不包括输入层。例如上图中,左边的神经网络有2层,右边的神经网络有3层。
输出层:输出层通常没有激活函数,因为输出层一般用来评分,它的值范围是任意的。
定义神经网络大小:最常用的有神经元个数和参数个数。
例如,上图左边升级网络有6个神经元;有[3x4]+[4x2]=20个权重和4+2=6个偏置。右边升级网络有9个神经元,有[3x4]+[4x4]+[4x1]=32个权重和4+4+1=9个偏置。

前向传播计算例子

神经元按层来组织的一个原因是因为这样的结构,使用矩阵向量运算特别方便。以上图右边神经网络为例。输入是[3x1]向量。一个层的所有连接可以用一个矩阵表示,第一个隐藏层权重W1大小为[4x3],偏置b1为[4x1];每个神经元的权重时W1的一行,这样权重和输入乘积(矩形乘以向量)加上偏置(向量)就是激活函数的输入。同理,可以得到W2为[4x4]的矩阵,W_3$是[1x4]的向量。
用代码表示

# forward-pass of a 3-layer neural network:
f = lambda x: 1.0/(1.0 + np.exp(-x)) # activation function (use sigmoid)
x = np.random.randn(3, 1) # random input vector of three numbers (3x1)
h1 = f(np.dot(W1, x) + b1) # calculate first hidden layer activations (4x1)
h2 = f(np.dot(W2, h1) + b2) # calculate second hidden layer activations (4x1)
out = np.dot(W3, h2) + b3 # output neuron (1x1)

其中W1,W2,W3,b1,b2,b3是要学的参数。

表述能力

可以把带全连接的神经网络看做一个函数,这个函数的参数是网络中的权重。怎么衡量这个函数的表述能力呢?是否存在神经网络不能表达的函数。

可以证明,包含至少一个隐藏层的神经网络可以近似任何函数。证明参考 Approximation by Superpositions of Sigmoidal Function和intuitive explanation。

既然2层神经网络可以近似任何函数,那么为什么还要更深的网络?因为在实际中,2网络相对较差。实际中用更深的网络,因为它们更加平滑、更好的符合统计特性,可以通过梯度下降等算法学习。

3层的神经网络比2层神经网络效果好,但是更深的网络(4,5,6)层网络未必更好;这时神经网络情况。但是在卷积神经网络中,情况就不同了,更深的网络往往表现更好。

更多内容,参考:
Deep Learning book in press by Bengio, Goodfellow, Courville, in practicularChapter 6.4.
Do Deep Nets Really Need to be Deep?
FitNets: Hints for Thin Deep Nets

设置层的个数和大小

在使用神经网络时,该不该用隐藏层?如果用,用多少个隐藏层?每层设置多大?
随着网络层数增加,网络的表达能力也会增加。以一个二元分类为例,下面是不同隐藏层的效果


一个动态的例子在这里

可以看到,更深的网络拟合的效果更好。但是拟合训练集更好时,可能存在过拟合问题;我们想要的模型应该有比较好的泛化能力。限制过拟合的方法很多,例如L2正则化,dropout,输入噪声等。实际中,往往使用这些方法来限制过拟合比减少神经元数目效果更好。下图就是L2正则化上面对应网络的图片:

不要通过减少神经元来防止过拟合的另外一个原因是因为,小的神经网络更难训练。虽然小的神经网络拥有更少的局部极小值,且很容易收敛到局部极小值,但是实际中这些极小值效果很差,它们的loss很大。更深的网络显然有更多的局部极小值,但是这些极小值表现效果更好。神经网络是非凸优化问题,数学上很难表述。可以参考The Loss Surfaces of Multilayer Networks

总结

1、介绍了几个激活函数。
2、介绍了神经网络和全连接层。
3、神经网络可以近似所有函数。
4、大的神经网络往往效果更好,但是需要其他手段防止过拟合。

更多参考

deeplearning.net tutorial with Theano ConvNetJS demos for intuitions Michael Nielsen’s tutorials