斯坦福CS231n - CNN for Visual Recognition(5)-lecture5激活函数、神经网络结构
来源:互联网 发布:嘀哩嘀哩下载下载软件 编辑:程序博客网 时间:2024/05/20 11:48
本节从神经元讲起,分别介绍了激活函数和神经网络结构
在线性分类中,我们使用
神经元
大脑的基本计算单位是神经元(neuron)。人类的神经系统中大约有860亿个神经元,由大约
在神经元的计算模型中,信号顺着轴突(比如
在基本模型中,树突将信号传递到细胞体,信号在细胞体中相加。如果最终之和高于某个阈值,那么神经元将会激活,向其轴突输出一个峰值信号。在计算模型中,我们将神经元的激活率建模为激活函数(activation function),它表达了轴突上激活信号的频率。历史上,激活函数常使用sigmoid函数,该函数输入实数值(求和后的信号强度),输出值被压缩到
一个简单的神经元前向传播代码如下所示
class Neuron(object): # ... def forward(inputs): """ 假设输入和权重是1-D的numpy数组,偏差是一个数字 """ cell_body_sum = np.sum(inputs * self.weights) + self.bias firing_rate = 1.0 / (1.0 + math.exp(-cell_body_sum)) # sigmoid激活函数 return firing_rate
注意:这只是个粗糙的模型,实际上生物体内的神经元相当复杂,比如神经元的种类就非常多,并且加和信号之后的激励函数的非线性变换,也比数学上模拟出来的函数复杂得多。数学建模的神经网络只是一个非常简化的模型,跟实际神经元还有很大差距。
单个神经元分类
像线性分类器中那样,神经元有能力“喜欢”(激活函数值接近1),或者不喜欢(激活函数值接近0)输入空间中的某些线性区域。因此,只要在神经元的输出端有一个合适的损失函数,就能让单个神经元变成一个线性分类器。
二分类Softmax分类器。我们标记
二分类SVM分类器。在神经元的输出外增加一个最大边界折叶损失(max-margin hinge loss)函数,就可以将其训练成一个二分类的支持向量机。
理解正则化。在SVM/Softmax的例子中,正则化损失从生物学角度可以看做逐渐遗忘,因为它的效果是让所有突触(权重)在参数更新过程中逐渐向着0变化。
一个单独的神经元可以用来实现一个二分类分类器,比如二分类的Softmax或者SVM分类器。
常用激活函数
Sigmoid函数
Tanh函数
ReLU函数
Leaky ReLU函数
针对ReLU单元的弱点,研究者做了这么一件事,在
Maxout函数
近些年非常受欢迎的激励函数Maxout,它并不是对
激励函数/神经元小总结
即使从计算和训练的角度看来是可行的,实际应用中,其实我们很少会把多种激励函数混在一起使用。
一般说来,用的最多的依旧是ReLU,但是我们确实得小心设定学习率,同时在训练过程中,还得时不时看看神经元此时的状态(是否死亡)。当然,如果你非常担心神经元训练过程中挂掉,你可以试试Leaky ReLU和Maxout。不要用sigmoid函数了,可以试试tanh,不过通常状况下,它的效果不如ReLU/Maxout。
神经网络结构
组建层
神经网络结构是一种单向的层级连接结构,每一层可能有多个神经元,神经元之间以无环图的形式进行连接。
普通神经网络,最普通的层的类型是全连接层。全连接层中神经元与其前后两层的神经元是完全成对连接的,但同一层内的神经元之间没有连接。下图是两个使用的全连接层的神经网络:
命名规则。当我们说N层神经网络的时候,我们没有把输入层算入。因此,单层的神经网络就是没有隐层的(输入直接映射到输出)。有的认为逻辑回归或者SVM只是单层神经网络的一个特例。研究者们也会使用人工神经网络(Artificial Neural Networks 缩写ANN)或者多层感知器(Multi-Layer Perceptrons 缩写MLP)来指代神经网络。很多研究者倾向于用单元(unit)而不是神经元作为术语。
输出层。和神经网络中其他层不同,输出层神经元一般不会有激活函数(或可认为它们有一个线性相等的激活函数)。这是因为最后的输出层大多用于表示分类评分值,因此是任意值的实数,或者某种实数值的目标数(比如在回归中)。
确定网络尺寸。用来度量神经网络的尺寸的标准主要有两个:一个是神经元的个数,另一个是参数的个数,用上面图示的两个网络举例:
- 第一个网络有4+2=6个神经元(输入层不算),[3x4]+[4x2]=20个权重,还有4+2=6个偏置,共26个可学习的参数。
- 第二个网络有4+4+1=9个神经元,[3x4]+[4x4]+[4x1]=32个权重,4+4+1=9个偏置,共41个可学习的参数。
神经网络前向传播示例
神经网络组织成层状的一个主要原因,就是这个结构让神经网络算法使用矩阵向量操作变得简单和高效。上图3层神经网络,输入是np.dot(W1, x)
就能计算该层中所有神经元的激活数据。类似的,
# 一个3层神经网络的前向传播:f = lambda x: 1.0/(1.0 + np.exp(-x)) # 激活函数(用的sigmoid)x = np.random.randn(3, 1) # 含3个数字的随机输入向量(3x1)h1 = f(np.dot(W1, x) + b1) # 计算第一个隐层的激活数据(4x1)h2 = f(np.dot(W2, h1) + b2) # 计算第二个隐层的激活数据(4x1)out = np.dot(W3, h2) + b3 # 神经元输出(1x1)
上述代码中,W1,W2,W3,b1,b2,b3
都是待学习的神经网络参数。注意到我们这里所有的运算都是向量化/矩阵化之后的,x
不再是一个数,而是包含训练集中一个batch的输入,这样并行运算会加快计算的速度。最后一层是没有经过激励函数,直接输出。
全连接层的前向传播一般就是先进行一个矩阵乘法,然后加上偏置并运用激活函数。
神经网络表达能力
现在看来,拥有至少一个隐层的神经网络是一个通用的近似器。在研究(例如1989年的论文Approximation by Superpositions of Sigmoidal Function,或者Michael Nielsen的直观解释。)中已证明,给出任意连续函数
既然一个隐层就能近似任何函数,那为什么还要构建更多层来将网络做得更深?答案是:虽然一个2层网络在数学理论上能完美地近似所有连续函数,但在实际操作中效果相对较差。在一个维度上,虽然以
另外,在实践中3层的神经网络会比2层的表现好,然而继续加深(做到4,5,6层)很少有太大帮助。卷积神经网络的情况却不同,对于一个良好的识别系统来说,深度是一个极端重要的因素(比如数十(以10为量级)个可学习的层)。对于该现象的一种解释观点是:因为图像拥有层次化结构(比如脸是由眼睛等组成,眼睛又是由边缘组成),所以多层处理对于这种数据就有直观意义。
层数与尺寸的影响
首先,要知道当我们增加层的数量和尺寸时,网络的容量上升了。即神经元们可以合作表达许多复杂函数,所以表达函数的空间增加。例如,如果有一个在二维平面上的二分类问题。我们可以训练3个不同的神经网络,每个网络都只有一个隐层,但是每层的神经元数目不同:
在上图中,可以看见有更多神经元的神经网络可以表达更复杂的函数。然而这既是优势也是不足,优势是可以分类更复杂的数据,不足是可能造成对训练数据的过拟合。过拟合是网络对数据中的噪声有很强的拟合能力,而没有重视数据间(假设)的潜在基本关系。
上图中,有20个神经元隐层的网络拟合了所有的训练数据,但是其代价是把决策边界变成了许多不相连的红绿区域。而有3个神经元的模型的表达能力只能用比较宽泛的方式去分类数据。它将数据看做是两个大块,并把个别在绿色区域内的红色点看做噪声。在实际中,这样可以在测试数据中获得更好的泛化(generalization)能力。
基于上面的讨论,看起来如果数据不是足够复杂,则似乎小一点的网络更好,因为可以防止过拟合。然而并非如此,防止神经网络的过拟合有很多方法。
在实践中,不要去减少网络神经元数目,使用L2正则化,dropout和输入噪音等方法来控制过拟合比减少网络神经元数目要好得多。
不要减少网络神经元数目的主要原因在于小网络更难使用梯度下降等局部方法来进行训练
虽然小型网络的损失函数的局部极小值更少,也比较容易收敛到这些局部极小值,但是这些最小值一般都很差,损失值很高。相反,大网络拥有更多的局部极小值,但就实际损失值来看,这些局部极小值表现更好,损失更小。
神经网络是非凸的,很难从数学上研究这些特性。有一些文章尝试对这些目标函数进行理解,比如The Loss Surfaces of Multilayer Networks。
实际中,你将发现如果训练的是一个小网络,那么最终的损失值将展现出多变性:某些情况下运气好会收敛到一个好的地方,某些情况下就收敛到一个不好的极值。而如果你训练一个大的网络,你将发现许多不同的解决方法,最终损失值的差异将会小很多,对于随机初始化参数好坏的依赖也会小很多。
重申一下,正则化强度是控制神经网络过拟合的好方法,而不要去减少神经元。
上图是不同正则化强度的效果:每个神经网络都有20个隐层神经元,但是随着正则化强度增加,它的决策边界变得更加平滑。
不应该因为害怕出现过拟合而使用小网络。相反,应该进尽可能使用大网络,然后使用正则化技巧来控制过拟合。
参考资料
链接:http://cs231n.github.io/neural-networks-1/
链接:https://zhuanlan.zhihu.com/p/21462488?refer=intelligentunit
https://zhuanlan.zhihu.com/p/21513367?refer=intelligentunit
链接:http://blog.csdn.net/han_xiaoyang/article/details/50447834
- 斯坦福CS231n - CNN for Visual Recognition(5)-lecture5激活函数、神经网络结构
- 斯坦福CS231n - CNN for Visual Recognition(6)-lecture5预处理、正则化、损失函数
- 斯坦福CS231n - CNN for Visual Recognition(2)-lecture3(上)线性分类器、损失函数
- 斯坦福CS231n - CNN for Visual Recognition(3)-lecture3(下)最优化
- 斯坦福CS231n - CNN for Visual Recognition(1)-lecture2图像分类、最近邻分类器
- 斯坦福CS231n - CNN for Visual Recognition(4)-lecture4反向传播
- 斯坦福CS231n - CNN for Visual Recognition(7)-lecture6梯度检查、参数更新
- 斯坦福CS231n - CNN for Visual Recognition(8)-lecture6学习率更新、超参数调优
- CS231n CNN for Visual Recognition Module (1)
- CS231n CNN for Visual Recognition Module (2)
- CS231n - CNN for Visual Recognition Assignment1 ---- KNN
- CS231n - CNN for Visual Recognition Assignment1 ---- SVM
- 斯坦福CS231n课程: 视觉识别中的卷积神经网络 Convolutional Neural Networks for Visual Recognition
- 学习笔记 -- 斯坦福课程:CNN for Visual Recognition(一)
- CS231n CNN for Visual Recognition Module (3) backpropagation
- 斯坦福大学深度学习公开课cs231n学习笔记(5)神经网络结构与激活函数
- cs231n笔记(5)--传统神经网络,激活函数
- cs231n 卷积神经网络与计算机视觉 5 神经网络基本结构 激活函数总结
- 递规反向输出字符串的例子
- InternetGatewayDevice.TraceRouteDiagnostics.下的几个参数理解
- 练习
- scala之闭包
- 对象数组根据单个属性进行排序
- 斯坦福CS231n - CNN for Visual Recognition(5)-lecture5激活函数、神经网络结构
- Failed to load resource: the server responsed with a status of 400 (Bad Request)
- 数据结构–用C++实现string
- Oracle--杂记
- springAOP的两种配置方法
- SpringMVC中的主要注解及介绍
- android 教你如何判断是否是模拟器还是真机
- yii2.0使用ActionForm创建表单
- 移植madplay 很好用用的播放器工具