神经网络精要

神经网络的灵活性也是它的主要缺点之一:有太多超参数可以调整。

#Number of Neurons per Hidden Layer

对于每个隐藏层的神经元数目,最佳实践是漏斗模型,即逐层减少。因为许多低级特征可以合并为更少的高级特征。 但是一般来说,通过增加层数而不是每层神经元数量,你将获得更多的收益。

#Number of Hidden Layers

对于隐藏层数目,虽然已经证明,只需一个包含足够多神经元的隐层,MLP就能以任意精度逼近任意复杂度的连续函数,但他们忽略了这样一个事实,即深度网络的训练效率要比浅层网络高得多,也就是说可以使用比浅层网络更少的神经元来模拟复杂函数,从而使它们更快地训练。
底层的隐藏层建模低级的结构(抽取低级的细粒度的更具体的特征,比如各种形状和方向的线段),中间的隐藏层结合这些低级特征组成中间级特征(比如组成方形和圆形),最高级隐藏层和输出层结合这些中级特征组成高级的粗粒度的目标特征(比如一张人脸)。





所以完全可以将DNN所提取的特征送给SVM、LR等传统机器学习模型完成分类任务(loss function使用SVM的hinge损失或者LR的对数损失即可)。
假如现在我们已经训练好了一个人脸识别的深度学习模型,现在又来了一个新的业务让我们训练一个动物识别的模型,这时我们可以重用人脸识别模型所抽取的低级特征,即使用其前面几层隐藏层的权重初始化新模型,因为低级的细粒度特征大家都一样,可以共享(而且也因为使用了其他领域的样本而使得低级特征更加多样化),我们只需要学习高级的特征而不用从头开始所有层级的特征,这就是迁移学习,它可以使训练更快并且只需少量的样本即可达到很好的效果。后面会详细讲到。

#梯度爆炸梯度消失

一般来说,网络层数越多效果越好。但是随着网络层数的增多,训练会变慢并且容易过拟合,更严重的是,会导致棘手的梯度消失和梯度爆炸问题,使得浅层神经元非常难以训练。
由上节反向传播的基本原理我们知道,根据偏误差反向传递更新参数,由于偏误差一般随着反向传递的过程变得越来越小,

由上节反向传播的基本原理我们知道,根据偏误差反向传递更新参数,由于偏误差一般随着反向传递的过程变得越来越小,从而导致浅层神经元参数几乎不变,这就是梯度消失问题;在某些情况下,偏误差会随着反向传递的过程变得越来越大,浅层神经元大幅度的更新梯度导致训练无法收敛(发散),这是梯度爆炸问题。

#激活函数




#Sigmoid

使用这种激活函数时,如果再用(0, 1)正态分布初始化参数,会导致神经网络的每一层输出的方差比输入方差大很多,因为Sigmoid不是0均值的,所以当神经网络正向计算的时候,方差不断增大,也就是说最终输出值趋近0和1两个极端,这时候回过头来看看反向传播的参数更新过程:


Oj(1-Oj)其实就是Sigmoid函数导数求解公式,当Oj趋近0和1两个极端时,权重更
新量几乎为0,所以这种情况下就导致了梯度消失。
可以通过Xavier initialization解决Sigmoid激活函数存在的梯度消失问题。这种初始化方式可以使得神经网络每一层的输出方差和输入方差相等,并且还能在BackPropagation的过程中保证流过每一层之前和之后,梯度的方差相等。



he_init = tf.contrib.layers.variance_scaling_initializer()
hidden1 = fully_connected(X, n_hidden1, weights_initializer=he_init,
scope="h1")


#tanh(hyperbolic tangent)

tanh函数图像与Sigmoid类似,所以也会偶尔出现梯度消失问题,但是由于它是0均值的,所以效果比Sigmoid激活函数稍好,但是其计算稍复杂,所以训练慢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要理解shader的入门精要,首先需要了解shader是指令代码,需要关联材质才能赋予游戏对象以特定的效果。材质按照关联的shader的规则,处理贴图等输入信息,达到特定的画面效果。 在Unity中,有几种类型的shader可供选择。一种是表面着色器(Surface Shader),它是对顶点/片断着色器的封装,更符合人类的思维模式,可以以极少的代码来实现不同的光照模型和不同平台下的需求。在表面着色器的开发中,我们直接在Subshader层次上编写代码,系统会将代码编译成适当的Pass。而顶点/片断着色器是更基础的shader类型,能够实现更多的效果,但表面着色器不一定能实现这些效果。还有一种被淘汰的固定管线着色器(Fixed Function Shaders),它在硬件上执行基本的命令,速度很快,但功能有限,不再推荐使用。 不同图形API都有各自的shader语言。在DirectX中,顶点shader叫做Vertex Shader,像素shader叫做Pixel Shader。而在OpenGL中,顶点shader也叫做Vertex Shader,但像素shader叫做Fragment Shader或者片断Shader。这些shader语言有不同的语法和特性,需要根据使用的图形API选择适当的语言来编写shader。 总结起来,要入门shader,首先需要了解shader是指令代码,需要关联材质才能实现效果。在Unity中,可以选择使用表面着色器、顶点/片断着色器或固定管线着色器来实现不同的效果。此外,不同图形API有不同的shader语言,需要根据使用的API选择合适的语言来编写shader。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值