神经网络学习笔记(一)

时间:2023-01-15 21:41:09

一、前馈神经网络基本模型

前馈神经网络是最基本的神经网络,其中的一些基本概念在神经网络的研究中被广泛的使用。

一个前馈神经网络可以看做是一个函数

fθ:xy
其中输入 xRn ,输出 yRm ,函数的行为通过参数 θRp 来决定。

构造一个神经网络,需要的各个要素如下:

1、神经元模型

神经元模型是构建神经网络的基本模块。神经元模型的要素如下:

  1. 每个神经元的输入为一个向量 xRn ,输出为一个标量
  2. 决定神经元行为的参数包括一组权值向量 ωRn 和一个偏置项 b
  3. 每个神经元的输出可以表示为
    f(i=1nxiωi+b)
    其中 f:RR 被称为激活函数
  4. 每个神经元需要满足以上三个条件,可以有多种数学形式。

2、神经网络的基本架构

神经网络的基本架构是以神经元为基础构建的层状网络。基本架构的要素如下:

  1. 神经元被组织成层状结构,每层的神经元数量根据需要设定。一层中神经元的个数被称为该层的宽度,每一层神经元的宽度不要求保持一致
  2. 最后一层神经元被称为输出神经元
  3. 输出神经元之前的各层神经元被称为“隐藏层
  4. 神经网络中包含的神经元层数被称为网络的深度
  5. 除了输入层外,每一层神经元以前一层神经元的输出网络输入
  6. 输出层神经元的输出作为整个神经网络的输出,是根据输出做出的预测或者判断
  7. 如前所述:一个前馈神经网络可以看做是一个函数 fθ:xy ,函数的行为通过参数 θRp 来决定。根据上面的要素,我们把参数 θ 叙述为所有神经元的权重 ω 和偏置 b
  8. 设计神经网络的一项重要工作就是设计网络的基本架构:即有多少层神经元,每层神经元的宽度。

3、前馈神经网络的矩阵表示

  1. 我们将输入用一个列向量 xRn 来表示,假设第一层神经元有 p1 个神经元,每个神经元有对应于输入向量的权重向量(行向量) ωRn ,则 p1 个神经元的权重向量组成了一个矩阵 ω1Rp1×n
  2. 第一层神经元的输出用一个列向量表示 a1RP1 ,且有 a1=f(ω1x+b1) ,其中 b1Rp1 是第一层神经元的偏置向量(列向量)
  3. 第二层神经元的情况与第一层的类似,只是第二层神经元以第一层神经元的输出作为输入,即 a2=f(ω2a1+b2) 。我们可以将两层神经元的总的计算式写成 o2=f(ω2f(ω1x+b1)+b2)

4、对网络输出的评价

网络的输出是否符合我们的需求,如何评价?

  1. 在训练神经网路的数据中,对于一个特定的输入 xi ,或有一个我们期望的输出 yi 。一般情况下我们将数据表示如下: D={(x1,y1),(x2,y2),...,(xn,yn)} ,其中 yi xi 的期望的输出
  2. 对于一个特定的输入 xi ,假设我们神经网络给出输出为 y^i
  3. 那么我们对神经网络输出的评价就是评估 y^i 在多大程度上对 y 进行的预测。我们称完成这一评估的函数为代价函数
  4. 代价函数 l(yi,y^i) 用于计算 y y^ 之间的距离。根据不同的任务类型,如二元分类、多元分类或者回归等,可以选用不同的代价函数。
  5. 在实际应用中,通常计算多个数据点的 y y^ 之间的距离,而不仅仅是一个数据点的

5、对神经网络的训练

  1. 我们假设 θ 是网络的所有参数的集合,即所有神经元的权重和偏置。 θ 以随机值被初始化。我们将整个神经网络以一个函数 fNN 来表示。
  2. l 为上面所述的代价函数。 l(y^,y)=l(fNN(x,θ),y)
  3. 在训练的流程中,我们首先计算代价函数的梯度,即 l(fNN(x,θ),y)
  4. 我们通过以下式子更新神经网络的参数:
    θs=θs1αl(fNN(x,θ),y)
    其中 s 代表步数。通过不断迭代,直到找到合适的参数集 θ

在此,我们先暂时不去讨论 l(fNN(x,θ),y) 的计算,计算这一式子有好几种方法。

6、代价函数的若干类型

针对不同的问题,我们可以选择不同的代价函数。以下是几种常用的代价函数形式:

二元交叉熵

该代价函数主要用于二元分类问题。 D={(x1,y1),(x2,y2),...,(xn,yn)} ,其中 yi xi 的期望的输出, xRn y{0,1} ,即期望输出是一个二元的量。

假设网络的参数为 θ ,网络的输出用 f(x,θ) 来表示。根据最大似然的思想,我们要找到使得 P(D|θ) 取最大值的那个参数集 θ 。我们有

P(D|θ)=i=1nf(xi,θ)yi(1f(xi,θ))1yi

我们对等式两边同时取对数,然后取负号可得到:
logP(D|θ)=i=1nyilogf(xi,θ)+(1yi)(1f(xi,θ))

我们将等式的右边,即 ni=1yilogf(xi,θ)+(1yi)(1f(xi,θ)) 作为代价函数。

该代价函数主要用于解决二元分类问题,即输出只有0和1两种情况的问题。

交叉熵

对于多元分类问题,即输出 y{0,1,...,k} ,每一种输出值代表一个分类。我们假设第 k 种分类的格式是 nk ,有 ki=1ni=n 。在这种情况下,依然是用上述最大似然估计的思路,我们可以得到:

P(D|θ)=n!n1!n2!nk!i=1nf(xi,θ)yi

我们对两边取对数,可得:
logP(D|θ)=logn!logn1!n2!nk!+i=1nyilogf(xi,θ)

去掉算式前面的常数项,然后取负号得到
logP(D|θ)=i=1nyilogf(xi,θ)

我们将 ni=1yilogf(xi,θ) 称为交叉熵函数,可以用作多元分类问题的代价函数。

方差

即以期望输出与实际输出之间的方差作为代价函数:

i=1n(yif(xi,θ))2

代价函数小结

  1. 如果针对二元分类问题,通常使用二元交叉熵函数作为代价函数:
    i=1nyilogf(xi,θ)+(1yi)(1f(xi,θ))

    在此情况下,输出层一般使用sigmoid函数作为激活函数
  2. 针对多元分类问题,通常使用交叉熵函数作为代价函数:
    logP(D|θ)=i=1nyilogf(xi,θ)

    在此情况下,输出层一般使用softmax(柔性最大值)函数作为激活函数
  3. 对于回归(regression)问题,通常使用方差函数作为代价函数:
    i=1n(yif(xi,θ))2

    在此情况下,对输出层的类型不加限制

7、激活函数的若干类型

对于激活函数,我们首先列举一些性质:

  1. 在理论上,如果激活函数是非线性的,两层神经网络就能够拟合任何函数。因此,我们需要采用非线性函数作为激活函数
  2. 为了方便神经网络的训练,激活函数一般需要连续可导
  3. 为了神经网络的稳定,激活函数一般值域有限
  4. 较平滑的函数会表现得更好
  5. 一般是基于原点对称的函数

常使用的激活函数如下:

Sigmoid函数

函数形式如下:

y=11+e(ωx+b)

该函数通常被同于结合二元交叉熵代价函数来解决二元分类问题

Softmax函数

该函数主要用于输出层,将输出层第 j 个神经元的输出定义为

aj=eωjx+bkeωkx+b

该函数分母的求和在所有神经元上进行,相当于将输出层所有神经元的输出值求和后,和等于1。

该激活函数常配合交叉熵代价函数用于解决多元分类问题。

Rectified Linear Unit(ReLU)

f(x)=max(0,ωx+b)

该激活函数常常被用于隐藏层,由于该函数导数为固定值,所以非常方便于使用基于梯度的学习算法。

Hyperbolic Tangent(双曲正切)

y=tanh(ωx+b)

该函数也通常用于隐藏层的激活函数。