cs231n-(5)神经网络-1:建立架构

介绍激活函数,建立神经网络

简单介绍

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

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

单个神经元模型

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

生物学动机和连接

大脑的的基本组成单位是神经元。在人的神经系统中,大概有860亿个神经元通过$10^{14} \sim 10^{15}$个突出连接。下图左边是一个神经元,右边是模仿神经元的数学模型。
cs231n05_01.png

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

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

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

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

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

常用的激活函数

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

Sigmoid

$$ \sigma(x) = 1 / (1 + e^{-x}) $$

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

Tanh

$$ \tanh(x) = 2 \sigma(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) = \mathbb{1}(x < 0) (\alpha x) + \mathbb{1}(x>=0) (x) $$

$$
f(x) = \max(\alpha x, x)
$$

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

Maxout

归纳ReLU和Leaky ReLU,得到更通用的一般形式
$$ \max(w_1^Tx+b_1, w_2^Tx + b_2) $$
例如,当$W_1=0,b_1=0$时就是ReLU函数。它克服了ReLU的缺点,保留了其优点。但是其参数增加了一倍。

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

神经网络结构

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

cs231n05_03.jpeg

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

前向传播计算例子

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

1
2
3
4
5
6
# 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 Functionintuitive 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

设置层的个数和大小

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

cs231n5_04.jpeg
一个动态的例子在这里
可以看到,更深的网络拟合的效果更好。但是拟合训练集更好时,可能存在过拟合问题;我们想要的模型应该有比较好的泛化能力。

限制过拟合的方法很多,例如L2正则化,dropout,输入噪声等。实际中,往往使用这些方法来限制过拟合比减少神经元数目效果更好。下图就是L2正则化上面对应网络的图片:
cs231n5_05.jpeg

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

总结

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

更多参考

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

文章目录
  1. 1. 简单介绍
  2. 2. 单个神经元模型
    1. 2.1. 生物学动机和连接
    2. 2.2. 单个神经元当做线性分类器
    3. 2.3. 常用的激活函数
    4. 2.4. Sigmoid
    5. 2.5. Tanh
  3. 3. ReLU
    1. 3.1. Leaky ReLU
    2. 3.2. Maxout
  4. 4. 神经网络结构
    1. 4.1. 前向传播计算例子
    2. 4.2. 表述能力
    3. 4.3. 设置层的个数和大小
  5. 5. 总结
  6. 6. 更多参考
,
#add by kangyabing