1. 激活函数:

1)Sigmoid,σ(x)=1/(1+e-x)。把输出压缩在(0,1)之间。几个问题:(a)x比较大或者比较小(比如10,-10),sigmoid的曲线很平缓,导数为0,在用链式法则的时候,后一层传回来的导数乘以sigmoid的导数也是0了,换句话说,对于sigmoid饱和的区域后一层的导数传不到前面去了。(b)输出永远为正,即下一层的输入永远为正,我们希望输入的均值为0。(c)exp还是稍微有点难计算。

2)tanh(x),输出压缩在[-1,+1]之间,比sigmoid的进步在于输出有正有负以0为中心。

3)ReLU(Rectified Linear Unit),f(x)=max(0,x)。优点:(a)在正方向不会饱和。(b)计算简单。(c)实际中比sigmoid和tanh都收敛的快的多。(d)更像生物学神经元。缺点:(a)not zero-centered output。(b)负方向全部是0.

实际使用中,会给ReLU神经元一个正向的bias,比如0.01。

4)Leaky ReLU,f(x)=max(0.01x, x)。优点:有ReLU的所有优点,另外它在负方向也不会饱和,所以总是不会失效。

类似的有Parametric Rectifier (PReLU),f(x)=max(αx, x)。

5)Exponential Linear Units (ELU)。x>0时,f(x)=x, x<=0时,f(x)=α(exp(x)-1)。优点:有ReLU的所有优点,相比于Leaky ReLU,它更鲁邦。但计算过程需要exp(),计算稍微复杂一点。

6)Maxout “Neuron”,f(x)=max(wT1x+b1, wT2x+b2),是对ReLU和Leaky ReLU的推广,正负方向都是线性,不会饱和。缺点是花了两倍的参数。

总结:(a)用ReLU,注意学习率。(b)尝试Leaky ReLU/Maxout/ElU。(c)尝试tanh,但不要期望太好。(d)不要用sigmoid。

2. 数据预处理:中心化,所有样本的均值设为0,标准差设为1。中心化的目的是把每个样本都放到同一个尺度下去考虑,对于图像来说,由于像素的值已经被归一化到0~255之间,所以中心化的诉求会轻一些。 有时候还会用PCA去掉相关性,让协方差矩阵成为对角矩阵。也会Whiten操作,把协方差矩阵变换为单位矩阵。

3. 权重W的初始化:这是很重要的研究课题,有很多paper。

  1)小随机数,W = 0.01*np.random.randn(D, H)。这种方式对浅网络有效,对深层网络不好,每层的输出会很快衰减到0。

  2)大随机数,W = np.random.randn(D, H),很容易饱和。

  3)Xavier initialization,W = np.random.randn(node_in, node_out) / np.sqrt(node_in),Glorot et al., 2010,论文的数学推导是基于线性激活函数,对于非线性激活函数就无效了。

  4)He initialization,W = np.random.randn(node_in, node_out) / np.sqrt(node_in / 2),He et al., 2015,直观的解释是:在ReLU网络中,假定每一层有一半的神经元被激活,另一半为0,所以,要保持variance不变,只需要在Xavier的基础上再除以2。

4. Batch Normalization:在线性变换(全连接层、卷积层)之后对输出进行归一化,然后再非线性化激活,Loffe and Szegedy,2015。直观的解释是:我们想要的是在非线性activation之前,输出值应该有比较好的分布(例如高斯分布),以便于back propagation时计算gradient,更新weight。Batch Normalization将输出值强行做一次Gaussian Normalization和线性变换。

  归一化成均值为0,方差为1之后,我们也不能保证说这种归一化就一定好,于是往往又会给它自由度调整自己的均值和方差。

  Batch Normalization降低了对初始化好坏的依赖。

  注意在训练阶段,mean/std是基于batch计算出来的,而在测试阶段,mean/std则是用训练阶段得到的某个固定值(比如取平均),而不是基于bach计算。

5. 深度学习的一般流程:

  1)归一化输入,减去均值,除以方差。

  2)检查Loss是否合理,先不要考虑正则化项,得到一个loss值,看这个值合理么;然后考虑正则化项,这时候的loss值应该比之前大了一些。

  3)先用小的训练集,关掉正则化项,这时候算法要能过拟合,得到很小的loss,接近0。

  4)用全部的训练集,设一个小的正则化项,找learning rate使得loss可以下降。Loss不下降或者下降很慢,说明learning rate设小了,需要增大。Loss变成无穷大NaN,说明learning rate设太大了,需要减小。Learning rate一般在[1e-3, 1e-5]。

6. 超参数的选取:用cross-validation从粗糙到精细地搜索。开始,只需要迭代几次,就可以很直观的看超参数如何影响,最好是把超参数在它的空间随机选取,如果一定要有规律,那就按10的n次方选取,线性的搜索太慢了。然后,迭代多一点,更精细的找。如果loss超过最开始值的三倍,就可以放弃这组参数了。另外一个经验是:更新的量和原来的值的比值update/value在0.001、0.01周围比较好,太大太好都不好。

  超参数包括:网络的结构,学习率,正则化项等。这些参数里,学习率是最影响结果的,要优先调,正则化什么的相对次要一些。

cs231n spring 2017 lecture6 Training Neural Networks I的更多相关文章

  1. cs231n spring 2017 lecture6 Training Neural Networks I 听课笔记

    1. 激活函数: 1)Sigmoid,σ(x)=1/(1+e-x).把输出压缩在(0,1)之间.几个问题:(a)x比较大或者比较小(比如10,-10),sigmoid的曲线很平缓,导数为0,在用链式法 ...

  2. cs231n spring 2017 lecture7 Training Neural Networks II 听课笔记

    1. 优化: 1.1 随机梯度下降法(Stochasitc Gradient Decent, SGD)的问题: 1)对于condition number(Hessian矩阵最大和最小的奇异值的比值)很 ...

  3. cs231n spring 2017 lecture7 Training Neural Networks II

    1. 优化: 1.1 随机梯度下降法(Stochasitc Gradient Decent, SGD)的问题: 1)对于condition number(Hessian矩阵最大和最小的奇异值的比值)很 ...

  4. cs231n spring 2017 lecture10 Recurrent Neural Networks 听课笔记

    (没太听明白,下次重新听一遍) 1. Recurrent Neural Networks

  5. cs231n spring 2017 lecture10 Recurrent Neural Networks

    (没太听明白,下次重新听一遍) 1. Recurrent Neural Networks

  6. cs231n spring 2017 lecture5 Convolutional Neural Networks听课笔记

    1. 之前课程里,一个32*32*3的图像被展成3072*1的向量,左乘大小为10*3072的权重矩阵W,可以得到一个10*1的得分,分别对应10类标签. 在Convolution Layer里,图像 ...

  7. cs231n spring 2017 lecture5 Convolutional Neural Networks

    1. 之前课程里,一个32*32*3的图像被展成3072*1的向量,左乘大小为10*3072的权重矩阵W,可以得到一个10*1的得分,分别对应10类标签. 在Convolution Layer里,图像 ...

  8. cs231n spring 2017 lecture8 Deep Learning Networks 听课笔记

    1. CPU vs. GPU: CPU核心少(几个),更擅长串行任务.GPU有很多核心(几千个),每一个核都弱,有自己的内存(几个G),很适合并行任务.GPU最典型的应用是矩阵运算. GPU编程:1) ...

  9. cs231n spring 2017 lecture8 Deep Learning Networks

    1. CPU vs. GPU: CPU核心少(几个),更擅长串行任务.GPU有很多核心(几千个),每一个核都弱,有自己的内存(几个G),很适合并行任务.GPU最典型的应用是矩阵运算. GPU编程:1) ...

随机推荐

  1. 2.0 虚拟机linu开启ssh服务与FTP

    2.1.1.当本地机器ssh连接过一次虚拟主机.虚拟主机重启过或者配置发生改变 需要重新配对密钥,需要先清除本地缓存的密钥  ssh-keygen -R "ip"  2.1.2. ...

  2. slam库安装

    Ceres安装: 1.Ceres是一个cmak工程,首先要安装他的依赖项,使用apt-get安装. sudo apt-get install liblapack-dev libsuitesparse- ...

  3. linux常用命令及小知识点

    网络跟踪: 1.mtr  2.tractroute  3.ping 下载命令 curl -O  /path/xx wget 直接下载,将文件下载至当前目录 2.linux非22端口进行双机互信时候pu ...

  4. linux 解压命令总结

    常用Linux 命令: [转自]https://www.jianshu.com/p/ca41f32420d6 解压缩 .tar 解包:tar xvf FileName.tar 打包:tar cvf F ...

  5. Java面向对象(概述,构造函数,类与对象的关系,this关键字,成员、局部),匿名对象的调用,构造代码块(5)

    Java面向对象(概述,构造函数,类与对象的关系,this关键字,成员.局部),匿名对象的帝爱用,构造代码块(5)

  6. Python说文解字_半成品再加工

    1. 其实在编写代码的时候,根据需求和程序员的喜好,对现有类中的属性和方法进行二次加工,原先所给与的属性和方法贴合自己想要的需求.这就是我们常说的“重写”和二次封装. 2. 比如我们对现有的库list ...

  7. leetcode中二分查找的具体应用

    给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...

  8. 配置Action

    配置Action 实现了Action类后,就可以在struts.xml中配置该Action类了.配置Action就是让Struts2 知道哪个Action处理哪个请求,也就是完成用户请求和Action ...

  9. Heavy Light Decomposition

    Note 1.DFS1 mark all the depth mark fathers mark the heavy/light children mark the size of each subt ...

  10. SpringBoot项目示例

    一.准备工作: 环境及工具:Eclipse+JDK8+Maven+SpringBoot 二.源码: 1.项目架构:                    2.引入pom.xml <project ...