Stanford curriculum cs231n学习记录(2)神经网络基础

五、神经网络基础

神经网络系统理解:数学上,神经网络中的每一个神经元就是一个线性单元(f=Wx+b)加上一个激活函数,这个激活函数是一个非线性系统。线性系统在高维空间中线性划分区间,而神经网络由于引入了非线性环节,因此可以使用曲面空间划分空间。除此之外,神经网络多层神经元的引入增加了拟合函数的复杂度,因此,应该具有更好的拟合效果。如果从生物神经系统上进行解释,神经元通过自己的许多树突获取信号(线性单元),如果信号达到一定强度,则神经元兴奋或者抑制(激活函数),通过轴突向下一个神经元传递信号(单个神经元连接到下一个神经元)。
1、下图是用数学方法表示,max(0,-)是一种激活函数,一个线性单元就是一个没有激活函数的神经元。图中表示了两层和三层神经元的数学表示方法。而max(0,-)赋予了神经网络非线性,使其能够划分更为复杂的结构。

2、神经网络的架构,隐层中每一个圆圈都是一个神经元。

3、每一个神经元的构造模型

4、几种类型的激活函数

  • sigmoid激活函数:以前的神经网络算法经常使用,但是有三个缺点:
    (1)由于在接近0和1的地方,梯度为0,在进行反向传播的过程中,根据链式法则,其他较大的梯度与激活函数处的梯度相乘,得到的梯度也会很小,会导致梯度消失现象,而使得该部分的参数无法进行优化。为了防止饱和,对初始参数的设定尤为注意,其实这也是神经网络中所需要注意的。
    (2) sigmoid函数不是零中心输出的(不是很理解课程中所说的权重的Z字型下降是什么意思),零中心输出会使得收敛速度更快。
    (3)exp运算需要更大的计算量(其实更大的计算量在于卷积和点乘)

  • Tanh函数,零中心对称,数据拉伸到(-1,1)之间,但是和sigmoid一样具有(1)(3)中的缺点。

  • Relu函数(Rectified Linear Unit),f(x)=max(0,-)。
    优点如下:
    (1)在大于0的地方一直增长,具有非饱和性,不会出现梯度消失现象
    (2)简单的比较大小,计算效率高了很多
    (3)在实践中显示收敛速度更快,这个与计算效率不是一个概念。
    缺点:
    (1)也不是关于中心对称的
    (2)非激活的输入值(小于0)无法进行反向传播,因此,权值也不会跟新。
    (3)有时候Relu函数不会被激活,包括初始化参数不合适,以及学习率过高(question)
  • Leaky Relu函数
    f(x)=max(0.01x,x);
    该函数的出现是为了解决Relu函数的输入值小于0而不被激活的问题,尽管有研究表明,这个函数确实比Relu函数效果好一些,但是它可能不总是这样的。实际上0.01是一个参数(alpha),可以对每一个神经元进行设置。
  • ELU(exponential linear units)
    几种Relu相关函数的曲线图
    几种Relu相关函数的曲线图
    Elu继承了Relu的优点,更加接近0均值输出(不知道是否有更好的效果),但是计算需要exp。
  • Maxout函数
    是对Relu函数和Leaky Relu的一般性归纳,其表达形式是Max(W1*X+B1,W2*X+B2),这里有之前的f=WX+B的神经元组成形式不同,它需要有两组参数。当W1X+B1=0的时候,它就是RElu函数。
    5、激活函数总结
    • 虽然有很多中激活函数,但是最为常用的还是Relu函数
    • RElu函数注意学习率的设计
    • 可以Leaky ReLU / Maxout / ELU函数
    • 尝试tanh函数,但是不要期望太高 
    • 不要使用sigmoid函数

一个反向传播的例子:https://www.cnblogs.com/charlotte77/p/5629865.html

六、几点建议

1、熟悉一个神经网路所需要的参数数量计算
2、在前向传播的程序编写中,一般先进行矩阵乘法,然后加上偏置,最后进行激活函数。
3、实践表明三层神经网络会有较好的效果(没有考虑卷积神经网络)

七、神经网络的使用步骤

1、数据预处理
不同数据的散乱分布会影响最终的分析结果,因此,需要对其进行零归一化处理;除此之外,由于不同的评价指标具有不同的量纲和单位,会导致在训练过程中,数据较大的特征对结果影响更大,为了消除这种影响,最好进行数据归一化。
零中心化(Zero-centered或者Mean-subtraction)和归一化(标准化Standardization或Normalization),零中心化是将数据变成均值为0的数据,在图像上相当于平移,在操作上,是将所有的数据减去均值。归一化将数据变成均值为0,标准差为1的数据。在操作上X*=(X-均值)/标准差。在图像处理过程中,更多的使用第一种方式,因为像素之间不存在量纲不同的问题。
在实际使用过程中,也会看到PCA和Whitening of the data的处理方式。
注意:在进行零中心化的时候,计算的是训练集上的所有数据的均值,然后拿各个像素值减去均值,在进行测试的时候,使用的也是训练集上的均值。不能使用测试集上的均值。
2、权重初始化
不能使用零初始化?
:全0初始化会使得每一个神经元的输出相同,在反向传播过程中,所有的梯度都相同(全为0),最终每一个神经元的参数也相同。
一般通过产生一个较小的随机数去初始化参数?
:使用W = 0.01 * np.random.randn(D,H)产生一个零均值和标准差的高斯分布。
对于层数很少的情况,上面这种方法有效,然而初始权重较小意味着反向传播梯度较小,当层数很多的时候,根据链式法则,会得到一个较小的梯度。除此之外,当数据量较大的时候,还会导致初始神经元的输出数据的方差变大。
使用1/sqrt(n)校准方差
:w = np.random.randn(n) / sqrt(n)可以保证所有神经元的起始时有近似同样的输出分布。实验表明,可以提高收敛速度。
当使用Relu作为激活函数的时候,推荐使用:w = np.random.randn(n) * sqrt(2.0/n)进行初始化。
3、正则化方法
L1正则化:
这里写图片描述
L2正则化(最常用的方法):
这里写图片描述
最大范式约束:

随机失活
论文:Dropout: A Simple Way to Prevent Neural Networks from Overfitting提出,在训练过程中,随机剔除一些神经元。
这里写图片描述

4、梯度下降的更新方法
(1)普通更新方法
x=x+learning_rate*dx
(2)学习率退火
学习率随着训练时间的增长而减小。对于减小方式,有不同的方式。
(3)二阶方法
进行求解二阶偏导数
(3)逐参数适应学习率方法

Read More:https://blog.csdn.net/hduxiejun/article/details/53571770
在上面的CS231n课程笔记翻译:神经网络笔记 2,3中给出了更多的训练技巧。

猜你喜欢

转载自blog.csdn.net/weixin_40100431/article/details/81126545