65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Levenberg-Marquardt 算法结合贝叶斯正则化进行神经网络学习(第一部分)

starIconstarIconstarIconstarIconstarIcon

5.00/5 (11投票s)

2010年1月31日

CPOL

7分钟阅读

viewsIcon

79858

downloadIcon

2108

为完全不懂的人提供的完整解释,共两部分,这是第一部分。Levenberg–Marquardt 算法提供了一种数值解决方案来最小化(通常是非线性的)函数。本文介绍了 Levenberg-Marquardt 算法如何用于训练神经网络。

为完全不懂的人提供的完整解释,共两部分,这是第一部分。

下载次数

 

目录

  1. 概述
    1. 神经网络
    2. AForge 框架
    3. 网络训练作为函数优化问题
  2. Levenberg-Marquardt
    1. 计算雅可比矩阵
    2. 近似海森矩阵
    3. 求解 Levenberg-Marquardt 方程
    4. 通用算法
    5. 限制
  3. 贝叶斯正则化
    1. 扩展的 Levenberg-Marquardt 算法
  4. 源代码
    1. Using the Code
    2. 示例应用程序
  5. 其他说明
  6. 参考文献

 

概述

神经网络学习问题可以看作是一个 函数优化问题,我们试图确定最佳的网络参数(权重和偏置)以最小化网络误差。因此,来自 数值线性代数 的几种函数优化技术可以直接应用于网络学习,其中一种技术就是 Levenberg-Marquardt 算法

Levenberg–Marquardt 算法提供了一种数值解决方案,用于最小化函数在参数空间上的(通常是非线性的)函数。它是高斯-牛顿法寻找函数最小值的一种流行替代方法。

神经网络

神经网络是一种相对较新的人工智能技术。在大多数情况下,ANN 是一种自适应系统,它在学习阶段信息流经网络时,会根据外部或内部信息改变其结构。学习过程试图找到一组连接 w,该连接集能提供一个良好地拟合训练集的映射。

此外,神经网络可以被视为具有基本形式的高度非线性函数:

F(x,w) = y

(1)

其中 x 是输入到网络的输入向量,w 是网络的权重,y 是网络近似或预测的相应输出向量。权重向量 w 通常首先按层排序,然后按神经元排序,最后按每个神经元的权重加上其偏置排序。

将网络视为参数化函数的这种观点将是应用标准函数优化方法来解决神经网络训练问题的基础。

AForge 框架

AForge.NET Framework 是一个为 计算机视觉人工智能 领域开发者和研究人员设计的 C# 框架。在此,Levenberg-Marquardt 学习算法实现为一个实现了 AForge 框架的 ISupervisedLearning 接口的类。

网络训练作为函数优化问题

如前所述,神经网络可以被视为高度非线性函数。从这个角度来看,训练问题可以被视为一个通用的 函数优化 问题,其中可调参数是网络的权重和偏置,Levenberg-Marquardt 算法在这种情况下可以直接应用。

 

Levenberg-Marquardt 算法

Levenberg-Marquardt 算法 是一种非常简单但鲁棒的逼近函数的方法。基本上,它包括求解方程

(JtJ + λI)δ = JtE

(2)

其中 J 是系统的 雅可比矩阵λ 是 Levenberg 的 阻尼因子δ 是我们要找到的权重更新向量,E 是包含网络训练中使用的每个输入向量的输出误差的误差向量。δ 告诉我们应该如何改变网络权重以获得(可能)更好的解决方案。JtJ 矩阵也称为近似 海森矩阵

阻尼因子 λ 在每次迭代时进行调整,并指导优化过程。如果 E 的减少很快,可以使用较小的值,使算法更接近 高斯-牛顿算法;而如果一次迭代未能充分减小残差,则可以增加 λ,使其更接近 梯度下降 方向。

计算雅可比矩阵

雅可比矩阵 是一个向量值函数的所有一阶偏导数组成的矩阵。在神经网络的情况下,它是一个 NW 列的矩阵,其中 N 是训练集的条目数,W 是我们网络的参数总数(权重 + 偏置)。可以通过对每个输出关于每个权重求偏导数来创建它,其形式为:

Jacobian matrix for neural networks

其中 F(xi, w) 是使用权重向量 w 评估的训练集第i个输入向量的网络函数,wj 是网络权重向量 w 的第 j 个元素。

在传统的 Levenberg-Marquardt 实现中,雅可比矩阵通过使用 有限差分 来近似。然而,对于神经网络,可以通过使用 链式法则 和激活函数的一阶导数来非常有效地计算它。

近似海森矩阵

对于最小二乘问题,通常不需要计算 海森矩阵。如前所述,可以使用雅可比矩阵通过以下公式进行近似:

H ≈ JtJ

(3)

如果解处的残差误差“很小”,这会是对海森矩阵的一个非常好的近似。如果解处的残差不够小,这种方法可能导致收敛缓慢。海森矩阵也可用于对学习过程应用正则化,这将在后面讨论。

求解 Levenberg-Marquardt 方程

Levenberg 对该方法的主要贡献是引入了阻尼因子 λ。该值被加到近似海森矩阵对角线的所有成员上,然后才求解梯度方程。通常,λ 以一个很小的值开始,例如 0.1

然后,通常通过使用 LU 分解 来求解 Levenberg-Marquardt 方程。然而,只有当近似海森矩阵没有变得奇异(不可逆)时,方程才能求解。如果是这种情况,仍然可以使用 SVD 分解 来求解方程。

求解方程后,使用 δ 更新权重 w,并重新计算训练集中每个条目的网络误差。如果新的均方误差和已减小,则减小 λ 并结束迭代。如果未减小,则丢弃新权重,并使用更高的 λ 值重复该方法。

λ 的这种调整是通过使用一个调整因子 v 来完成的,通常定义为 10。如果 λ 需要增加,则乘以 v。如果需要减小,则除以 v。重复该过程直到误差减小。发生这种情况时,当前迭代结束。

通用 Levenberg-Marquardt 算法

如前所述,Levenberg-Marquardt 主要通过求解 (2) 式(使用不同的 λ 值)直到均方误差和减小为止。因此,每次学习迭代(epoch)将包括以下基本步骤:

  1. 计算雅可比矩阵(使用有限差分或链式法则)
  2. 计算误差梯度
    • g = JtE
  3. 使用雅可比矩阵的交叉乘积近似海森矩阵(公式 3
    1. H = JtJ
  4. 求解 (H + λI)δ = g 以找到 δ
  5. 使用 δ 更新网络权重 w
  6. 使用更新后的权重重新计算均方误差和
  7. 如果均方误差和没有减小,则
    1. 丢弃新权重,使用 v 增加 λ,然后转到步骤 4。
  8. 否则,使用 v 减小 λ 并停止。

该算法的变体可能包括对 v 的不同值,一个用于减小 λ,另一个用于增加 λ。其他算法可能会求解 (H + λdiag(H))δ = g 而不是 (H + λI)δ = g (2),而其他算法可能会根据 H 中元素的大小来选择初始 λ,设置 λ0 = t max(diag(H)),其中 t 是用户选择的值。我选择了单位矩阵方程,因为它显然是 MATLABNeural Network Toolbox 内部实现的相同方法。

我们可以看到,如果误差在经过一些迭代后仍未减小,我们会遇到问题。在这种情况下,如果 λ 变得过大,算法也会停止。

限制

Levenberg-Marquardt 对初始网络权重非常敏感。此外,它不考虑数据中的异常值,这可能导致 过度拟合噪声。为了避免这种情况,我们可以使用一种称为正则化的技术。

 

在本文的 下一部分(第二部分) 中,我们将进一步讨论贝叶斯正则化。我们还将介绍并演示本文配套源代码的使用。

 

点击前往 使用 Levenberg-Marquardt 算法进行神经网络学习(第二部分)


© . All rights reserved.