深度学习(Deep Learning)读书思考二:前向神经网络

概述

深度学习也是机器学习的一种,是由前向神经网络或者多层感知机算法演化而来,由于计算资源和可计算数据增加,神经网络的效果逐渐浮现出来,从而迎来了蓬勃发展。本节主要介绍深度学习中基础网络结构前向神经网络(Feedword Netural Network)

FNN基本概念

机器学习都是在学习一种变换,深度学习也不例外,即 y=f(x)=ϕ(x;θ) ,机器学习目标需要找到最优的拟合函数。不同的学习算法由于其模型表达能力不同,所拟合效果也不太一样。例如有的方法能够拟合线性函数、有的模型能够拟合二次函数等等。

FNN理论上能够拟合各种不同类型函数表达。

FNN采取的思路是对输入x进行各种非线性变换,直到达到较好的效果。

例如 y=f(x)=f3(f2(f1(x))) 变换可以线性或者非线性变换,但是如果所有的变化都是线性变换,则多层变换和一层变换效果一致,因此FNN会包含各种不同类型的非线性变换。

基于梯度学习算法

基于梯度的学习算法是机器学习中非常常用的方法,在深度学习中也不例外。比较经典的梯度反向传播算法也是其中的一种,根据以往机器学习的经验,需要解决一下问题。

价值函数

在大多数的情形下,深度学习模型能够学习到 P(y|x;θ) 。因此只需要选择交叉熵计算训练数据和模型预测结果作为价值函数,采用最大释然估计进行求解。

通用的价值函数可以表达为

J(θ)=Ex,ypdatalogpmodel(y|x)

可以根据不同的概率分布选择模型表示。

输出单元

FNN包括三种比较重要的层次,输入层常常表示为一维向量或者多维向量;中间层也叫隐藏层;输出层。
常见的输出单元有
1. 线性单元,即输出表示为 y^=WTh+b ,常用于回归
2. Sigmoid单元:即 y^=σ(WTh+b) ,常用于二元分类
3. SoftMax单元:即 z=Wh+b,softmax(zi)=exp(zi)jexp(zj) ,常用于多分类问题
4. 其他输出单元

隐藏单元

隐藏层是FNN中非常重要的结构,隐藏单元的选择关乎模型好坏,而且对学习效率影响也非常大。

隐藏层常常表示为:先对输入进行线性变换,然后通过一个激活函数进行非线性变换,其中激活函数的选择决定整个隐藏层。即 h=g(Wx+b)

修正线性单元(ReLU)

修正线性单元(Rectified Linear Units)的激活函数为 g=max(0,z)z=Wx+b

  1. ReLU的一个最大优势在于计算效率非常高。
  2. 工程实际中常常将b设置为一个较小的整数,例如0.1
  3. ReLU的问题在于如果某个实例的激活值为0,则该参数无法通过梯度的方法进行学习,因此有很多变形解决该问题
  4. ReLU的泛化变形可以为 h=g(z,α)=max(0,zi)+αmin(0,zi)
  5. 绝对值修正(Absolute Value Rectification)将参数 α=1
  6. Leaky ReLU将参数设置为0.01
  7. Pamametric ReLU 将 α 当做参数进行学习。
  8. Maxout Units是更进一步的泛化,将z分成若干个组分别进行最大值操作, g(zi)=maxjG(i)zj

Sigmoid 单元

Sigmoid单元 g(z)=σ(z)
反正切单元 g(z)=tanh(z)

这两个比较常用的原因在于该单元可以将数值变换到[0,1]或者[-1, 1]但是其计算复杂度较高。

其他隐藏单元

例如 h=cos(Wx+b) ,一般在特定问题上回使用到。大部分情况下使用以上隐藏单元可以达到较好的效果。

网络架构设计

FNN常见的网络架构设计是线性架构,即每一层的输入都是来自于其父节点,例如

h1=g1(Wx+b)h2=g2(W2h1+b)

依次类推直到输出。

  1. 这类结构仅仅需要设计的参数包层数以及每一层的宽度,即隐藏节点的个数
  2. 根据”统一近似理论“只要要拟合的函数满足一定测度分布,FNN就能表达出来。即FNN能拟合所有的映射,从有限维度到另外一个有效维度。
  3. “天下没有免费的午餐”,虽然FNN能拟合所有的函数,但不能保证学习算法能够学习到相关参数。
  4. FNN这种基础的线性结构,后续还会针对特定问题构造不同的网络结构,例如CNN、RNN等

反向传播算法

Back-Propagation反向传播算法是训练FNN最重要的方法,由于映射函数的复杂性,通过梯度学习算法进行求解时,梯度不好计算,因此研究学者提出通过BP算法进行梯度的传播求解。
其主要步骤包括
1)通过前向传播计算网络中各个节点的激活值。
2)将梯度通过反向传播算法进行传播,得到各个参数的梯度值。
3)采用梯度下降法进行模型参数的更新。
4)迭代执行上述步骤,直到收敛。

这是一个非常标准的梯度下降过程,不同的地方在于梯度的计算过程,后面会详细介绍。

可计算图

神经网络可以通过可计算图语言进行表达(Computational Graph Language).
计算图包括以下几个部分节点(可以是标量、向量或者张量)、操作符(加减乘除等各类操作),示例如下:
这里写图片描述

  1. 图a 表达的是 z=xy
  2. 图b 表达的是 y=σ(wx+b)
  3. 图c表达的是 h=g(wx+b)
  4. 图d表达的是 y=wx+λ||w||

微分的链式法则

反向传播算法梯度的计算主要是利用链式法则进行的推导,在微积分中是最基础的知识。
对于标量的嵌套函数的微分常常表示为

y=g(x)z=f(g(x))=f(y)dzdx=dzdydydx

对于向量的嵌套函数常常表示为

xRm,yRny=g(x),gRmRnz=f(y),fRNRzxi=jzyjyjxi

通过向量的方式进行表达,则可以表示为 xz=(yx)Tyz ,其中雅克比矩阵和梯度向量的乘积。

对于张量可以展开成一维向量进行求解。

反向传播算法应用于FNN

前向传播过程
这里写图片描述
反向传播过程
这里写图片描述

其中前向传播计算各个节点的激活值
反向传播计算各个节点的梯度值
最终的算法还需要一个迭代过程进行串联起来。

符号表示

符号表示是指所有相关的操作都在符号上进行,在未进行赋值前都是抽象表示。
可计算图大概有两种进行BP算法的思路
”符号-数值导数推导“:输入包括一个计算图和输入变量值,返回各个节点的梯度值,代表软件Torch和Caffe
“符号-符号导数推导”:输入包括一个计算图,通过增加额外的节点提供另外的符号表示进行梯度的推导,主要不同在于输出还是一个可计算图,用于计算各个节点的梯度。示例如下:
这里写图片描述

即通过加入额外的节点表达梯度计算过程。

反向传播泛化

理论上任何可计算图只要表示成有向无环图均可以采用BP算法进行求解。

总结

FNN是深度学习中最基础的网络结构,需要着重了解
1. FNN的基础网络结构,标准线性结构
2. 常用隐藏单元和输出单元
3. 模型训练算法-经典的BP算法
4. 了解常见开源实现BP算法的思路
5. 设计自己的网络结构并应用。

猜你喜欢

转载自blog.csdn.net/fangqingan_java/article/details/51723870