Kuekua's blog


YesterDay you said tomorrow!


Deep Learning读书笔记2---深度前馈网络

1.基本概念

1.1隐藏层:

神经网络中输入与输出层之间的中间层,训练数据并没有给出这些层中的每一层所需的输出,所以叫隐藏层。

1.2模型的宽度:

网络中的每个隐藏层通常都是向量值的。这些隐藏层的维数决定了模型的宽度。 向量的每个元素都可以被视为起到类似一个神经元的作用。
除了将层想象成向量到向量的单个函数,我们也可以把层想象成由许多并行操作的单元组成,每个单元表示一个向量到标量的函数。
每个单元在某种意义上类似一个神经元,它接收的输入来源于许多其他的单元,并计算它自己的激活值。

1.3激活函数:

用于计算隐藏层值的函数,常见的有整流线性单元(分段函数max{0,f(x)})。

1.4常见的代价函数:

交叉熵(负的最大似然函数)


2.输出单元

2.1 线性单元

线性输出层经常被用来产生条件高斯分布的均值:
p(y∣x)=N(y;y^,I).

2.2 logistic sigmoid函数

sigmoid单元可用于Bernoulli输出分布,许多任务需要预测二值型变量 y 的值。
具有两个类的分类问题可以归结为这种形式。sigmoid输出单元定义为:



2.3 softmax单元

任何时候当我们想要表示一个具有n个可能取值的离散型随机变量的分布时,我们都可以使用softmax函数。softmax函数的形式为:


3.隐藏单元

3.1整流线性单元

整流线性单元使用激活函数 g ( z ) = max ( 0 , z )

扩展:

a.当$$z_i<0$$时使用一个非零的斜率$$α_i:h_i=g(z,α)i=max(0,z_i)+α_imin(0,z_i)$$ 。
b. 绝对值整流固定 α i = − 1 来得到 g ( z ) = | z | 。
它用于图像中的对象识别,其中寻找在输入照明极性反转下不变的特征是有意义的。
c. 渗漏整流线性单元将 α_i固定成一个类似0.01的小值,参数化整流线性单元(PReLU)将 α i 作为学习的参数。
d. maxout单元将 z 划分为每组具有 k 个值的组,而不是使用作用于每个元素的函数 g ( z ) 。
每个maxout单元则输出每组中的最大元素。

3.2 logistic sigmoid与双曲正切函数

在引入整流线性单元之前,大多数神经网络使用logistic sigmoid激活函数
g(z)=σ(z)
或者是双曲正切激活函数
g(z)=tanh(z)
这些激活函数紧密相关,因为 tanh ( z ) = 2 σ ( 2 z ) − 1 。
与分段线性单元不同,sigmoid单元在其大部分定义域内都饱和——当 z 取绝对值很大的正值时,它们饱和到一个高值,当 z取绝对值很大的负值时,它们饱和到一个低值,并且仅仅当z接近0时它们才对输入强烈敏感。
sigmoid单元的广泛饱和性会使得基于梯度的学习变得非常困难。 因为这个原因,现在不鼓励将它们用作前馈网络中的隐藏单元。
当使用一个合适的代价函数来抵消sigmoid的饱和性时,它们作为输出单元可以与基于梯度的学习相兼容。

当必须要使用sigmoid激活函数时,双曲正切激活函数通常要比logistic sigmoid函数表现更好。 在 tanh(0 )=0而σ(0)=0.5的意义上,它更像是单位函数。因为tanh在0附近与单位函数类似,训练深层神经网络 $$y^=w^⊤tanh(U^⊤tanh(V^⊤x))$$ 类似于训练一个线性模型$$y^= w^⊤U^⊤V^⊤x$$ ,只要网络的激活能够被保持地很小。 这使得训练tanh网络更加容易。

4.架构设计

万能近似定理: 一个前馈神经网络如果具有线性输出层和至少一层具有任何一种”挤压”性质的激活函数(例如logistic sigmoid激活函数)的隐藏层,只要给予网络足够数量的隐藏单元,它可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的Borel可测函数。 前馈网络的导数也可以任意好地来近似函数的导数。

在神经网络框架中,更深的神经网络远远比大模型尺寸的单层网络好得多,这说明神经网络中应该用许多简单的函数组成,而尽量不用复杂庞大的单模型。

5.反向传播

5.1链式法则


从这里我们看到,变量 x 的梯度可以通过~Jacobian矩阵∂y/∂x和梯度∇yz相乘来得到。
反向传播算法由图中每一个这样的~Jacobian~梯度的乘积操作所组成。

5.2反向传播步骤:


5.3符号到符号的导数

代数表达式和计算图都对符号或不具有特定值的变量进行操作。 这些代数或者基于图的表达式被称为符号表示。
当我们实际使用或者训练神经网络时,我们必须给这些符号赋特定的值。 我们用一个特定的数值来替代网络的符号输入 x ,例如 [ 1.2 , 3 ,7.65 , − 1.8 ] ⊤ 。

一些反向传播的方法采用计算图和一组用于图的输入的数值,然后返回在这些输入值处梯度的一组数值。 我们将这种方法称为符号到数值的微分。
这种方法用在诸如Torch和Caffe之类的库中。

另一种方法是采用计算图以及添加一些额外的节点到计算图中,这些额外的节点提供了我们所需导数的符号描述。
这是Theano和TensorFlow所采用的方法。这种方法的主要优点是导数可以使用与原始表达式相同的语言来描述。
因为导数只是另外一张计算图,我们可以再次运行反向传播,对导数再进行求导就能得到更高阶的导数。

基于符号到符号的方法的描述包含了符号到数值的方法。 符号到数值的方法可以理解为执行了与符号到符号的方法中构建图的过程中完全相同的计算。
关键的区别是符号到数值的方法不会显示出计算图。

博客全站共85.5k字