cs231n 学习笔记(5)- 神经网络-1:Setting up Architecture

目录

1.Quick Intro without brain analogies

2. Modeling one neuron

2.1 Biological motivation and connections

2.2 Single Neuron as a linear classifier

2.3 Commonly used activation function

3. Neural Network architectures

3.1 Layer-wise organization

3.2 Example feed-forward computation

3.3 Representational power

3.4 Setting number of layers and their sizes

扫描二维码关注公众号,回复: 5312260 查看本文章

4. Summary

5. Additional Reference


1.Quick Intro without brain analogies

在线性分类器那一节,我们利用评分函数 \small s=Wx计算了不同类别的得分,其中\small W是矩阵,\small x是向量。以CIFAR-10为例,\small x\small [3072\times1]的向量,\small W\small [10 \times3072]的矩阵,输出的得分\small s\small [10 \times1]的向量。

上面的评分函数是线性的,而神经网络往往是非线性的。

例如:一个简单的两层神经网络:\small s=W_2max(0,W_1x)。其中,令\small W_1\small [100\times3072]的矩阵,那么\small W_1x可以得到一个\small [100\times1]的向量。\small max(0,-)是一个比较常用的非线性运算,后续还会介绍其他类型的非线性运算。最后,\small W_2是一个\small [10\times100]的矩阵,这样我们可以得到得分\small s\small s是一个\small [10 \times1]的向量。

问题如果上述神经网络不使用非线性运算,全部使用线性函数,那么会怎么样?

答案如果上述神经网络的每个神经元都用线性函数,那么最后的输出与输入的关系仍是线性关系。

2. Modeling one neuron

神经网络是受到生物学中神经系统的启发而提出的一种机器学习算法,在机器学习领域表现优异。

2.1 Biological motivation and connections

在生物学上,一个神经元有很多个突触,这些突触用来接收外部的信号,然后决定该神经元是否被激活。

下图的左图是一个真正的神经元,右图是模仿神经元的数学模型。

如右图所示,一个神经元可以接受外部输入\small x,然后将其与对应的权重相乘,随后再相加,然后经过一个激活函数后得到输出结果。激活函数就是一个非线性函数(它为神经元添加了非线性的特性)。激活函数用来计算该神经元被激活的概率。常用的激活函数有sigmoid,tanh,relu,leaky relu,maxout等。

上图介绍的模型是非常粗糙的,真实的情况比上图复杂的多,具体可以参考这里这里

2.2 Single Neuron as a linear classifier

单个神经元与线性分类器很像:只要把合适的loss函数作用到神经元的输出上,就可以将一个单个的神经元看作线性分类器。

Binary Softmax classifier:当单个神经元的激活函数为sigmoid函数,我们将激活函数的输出\small \sigma(\sum_iw_ix_i+b)看做是\small P(y_i=1|x_i;w),然后使用cross-entropy作为loss函数,就可以将其看做是Binary Softmax classifier。

Binary SVM classifier:在输出后面添加一个hinge loss函数,就可以将其训练为二分类SVM

正则项的解释:由于Softmax和SVM中的正则项趋向于选择较小的\small w,故而在在神经元视角可以被解释为gradual forgetting。

2.3 Commonly used activation function

名称 公式 特点和优缺点
Sigmoid \small \sigma(x)=\frac{1}{1+e^{-x}}

Sigmoid函数把输入压缩到(0,1)之间;非常大的负数趋向于0,非常大的正负趋向于1。

Sigmod现在已经少用了,因为其缺点:

1. 梯度消失问题

在输出值为0或1附近,其梯度会非常小。因此,在反向传播时几乎传不到信号去更新权重的梯度,导致收敛非常缓慢。在初始化参数时要特别注意,不能初始化过大\small w,这会导致所有神经元都难以学习。

2. Sigmoid输出不是零中心的。

例如:输出全是正数,那么下一层输入就全是正数,这将导致梯度要么全是正数,要么全是负数;在使用梯度下降算法时,呈现出Z字下降。这个问题可以通过批量梯度下降解决。

tanh \small tanh(x)=2\sigma(x)-1

tanh函数是对sigmoid函数进行了尺度变化和平移。

虽然它的输出是中心对称的,但是仍存在梯度消失问题。

Relu \small f(x) = max(0,x)

ReLU近几年比较受欢迎。

优点:
1. 使用SGD时,它比Sigmoid/Tanh收敛速度快。 
2. 和Sigmoid和Tanh相比,它计算简单。 
缺点

1.  Dying Relu - 脆弱,容易死掉。

死掉是指,比较大的梯度经过神经元后,可以导致ReLU输出都小于0,即不再激活。这个可以同构调整学习率部分解决。

Leaky Relu

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

\small \alpha is a small constant

Leaky Relu 尝试解决dying relu的问题
Maxout \small f(x) = max(w_1^Tx+b_1,w_2^Tx+b_2)

Maxout是归纳Relu和Leaky Relu,得到更一般的形式。

例如:当\small W_1=0,b_1=0时就是ReLU函数。它克服了ReLU的缺点,保留了其优点,避免了dying relu的缺点。但是其参数增加了一倍。

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

3. Neural Network architectures

3.1 Layer-wise organization

神经网络是由神经元组成的无环图;一组神经元的输出可以作为其他神经元的输入;不允许存在环路的原因是这会导致网络在前向传播过程中出现死循环。

神经网络的是分层的。最常见的层是FC layer(全连接层)。在全连接层中,前一层的每一个神经元与后一层的每一个神经元都相连,但是在同一层内神经元之间没有连接。下图就是两个由全连接层组成的神经网络:

命名规则:在定义神经网络的层数时不把输入层算在内。例如,在上图中左图是2层的神经网络,右图是3层神经网络。

通常神经网络也可以被叫作Artificial Neural Networks(ANN) 和Multi-layer Perceptrons(MLP) ,它们是等价的。

SVM和逻辑回归可以被看成一个单层的神经网络。

输出层输出层通常没有激活函数,因为输出层用来给出类别评分,其值的范围是任意的。

神经网络的大小:常用两个标准来衡量神经网络的大小:神经元的个数和参数的个数。

例如,上图中左边的网络共有6个神经元,\small [3\times4]+[4\times2]=20个权重和\small 4+2=6个偏置;右边的网络共有9个神经元,\small [3\times4]+[4\times4]+[4\times1]=32个权重,\small 4+4+1=9个偏置。

3.2 Example feed-forward computation

神经网络之所以按层来组织,这样组织的一个重要原因是因为层的结构方便进行矩阵和向量的运算

以上图的右图为例:

输入层:\small [3\times1]的向量,

第一个隐层:权重为\small W1,是\small [4\times3]大小的矩阵;偏置\small b1,是\small [4\times1]的向量。

第二个隐层:权重为\small W2,是\small [4\times4]大小的矩阵;偏置\small b2,是\small [4\times1]的向量。

输出层:权重为\small W3,是\small [1\times4]大小的矩阵;偏置\small b3,是一个数值。

用代码可以写成:

#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 (3 * 1)
h1 = f(np.dot(W1,x) + b1) #calculate first hidden layer activation (4*1)
h2 = f(np.dot(W2,h1) + b2) #calculate second hidden layer activation (4*1)
out = np.dot(W3,h2) + b3 #output neuron (1*1)

在上述代码中,\small W1\small W2\small W3\small b1\small b2\small b3是需要学习得到的参数。注意:除了可以输入单个的列向量之外,\small x可以同时包括整个训练数据,此时\small x的每一列代表一个样本,然后所有的样本可以被一起并行分析。

3.3 Representational power

可以将由全连接层组成的神经网络看成由网络的权重所组成的一个函数族(family of functions)。

Question如何衡量这个神经网络的表达能力呢?换句话说,是否存在这个函数族,也就是这个网络不能表达的函数呢?

Answer:可以证明,包含至少一个隐藏层的神经网络可以近似任何函数。证明参考 Approximation by Superpositions of Sigmoidal Functionintuitive explanation。换句话说,神经网络可以近似任何连续函数。

Question如果一个2层的神经网络(只包含一个隐藏层)能够近似任何函数,为什么还需要更深的网络呢?

Answer:因为2层的神经网络效果较差。而更深层的网络更加平滑,也更符合数据的统计特征,并且更容易通过优化算法来学习。因此,虽然深网络与浅网络的表达能力相同,但是实际中更深的网络效果会更好。

在神经网络中,3层的神经网络比2层神经网络效果好,但是更深的网络(4,5,6)层网络未必更好;但是在卷积神经网络中,情况就不同了,更深的网络往往表现更好,这是因为图像的结构是分层的(脸包括眼睛,眼睛是由边组成)

3.4 Setting number of layers and their sizes

在处理实际问题时,我们该如何定义网络的结构呢?例如:该不该用隐藏层?如果用,用多少个隐藏层?每层包括多少个神经元呢? 

首先,我们需要知道,随着网络层次和大小的增加,计算量也会相应增加;换句话说,函数的搜索空间也会相应增加。以一个二分类为例,我们使用三个神经网络来进行分类,效果如下图:

从上图我们可以看出,神经元多的网络能够表达更复杂的函数。虽然更深的网络的拟合效果更好,但是这也能会导致过拟合问题。例如上图中的第三个图,由20个神经元组成的网络不仅拟合了正常数据,还对其噪声(异常点)进行拟合,其泛化能力脚超。但是,实际中我们往往需要的是泛化能力强的模型。

在神经网络中,限制过拟合的方法有很多,常用的有L2正则化,dropout,输入噪声等等通过这些措施来限制过拟合的效果比减少神经元的数目的效果更好。

这是因为:虽然小的神经网络的损失函数有更少的局部极小值,并且也更容易收敛,但是实际上这些极小值的效果往往很差,且其损失更大。更深的网络显然有更多的局部极小值,但是这些极小值表现效果会更好。

实际上,对于一个小的神经网络,它的loss的方差可能会很大 —— 这是因为有时可能很幸运的收敛到一个好的局部极小值,有时候又会很差;而对于一个深的神经网络,可能会存在多个solutions,但是每一个solution的效果都很好,因此,更深的网络的loss的方差会更小。

神经网络是非凸优化问题,数学上很难表述。可以参考The Loss Surfaces of Multilayer Networks

下图,给出了正则化限制过拟合的效果图:

4. Summary

  • 简单介绍了生物学上的神经元
  • 介绍了多种激活函数和他们的优缺点
  • 介绍了神经网络和全连接层
  • 神经网络可以近似所有函数
  • 大的神经网络往往效果更好,但是需要其他手段防止过拟合。

5. Additional Reference

猜你喜欢

转载自blog.csdn.net/Emma_Love/article/details/87645032