Main Content

trainlm

莱文贝格-马夸特反向传播

说明

net.trainFcn = 'trainlm' 设置网络 trainFcn 属性。

示例

[trainedNet,tr] = train(net,...) 使用 trainlm 训练网络。

trainlm 是根据莱文贝格-马夸特优化更新权重和偏置值的网络训练函数。

trainlm 通常是工具箱中最快的反向传播算法,强烈推荐作为首选有监督算法,尽管它确实比其他算法需要更多内存。

训练包含 trainlm 训练参数,此处显示其默认值:

  • net.trainParam.epochs - 要训练的最大轮数。默认值为 1000。

  • net.trainParam.goal - 性能目标。默认值为 0。

  • net.trainParam.max_fail - 最大验证失败次数。默认值为 6

  • net.trainParam.min_grad - 最小性能梯度。默认值为 1e-7

  • net.trainParam.mu - 初始 mu。默认值为 0.001。

  • net.trainParam.mu_dec - 减小 mu 的因子。默认值为 0.1。

  • net.trainParam.mu_inc - 增大 mu 的因子。默认值为 10。

  • net.trainParam.mu_max - mu 的最大值。默认值为 1e10

  • net.trainParam.show - 各次显示之间的训练轮数(无显示时为 NaN)。默认值为 25。

  • net.trainParam.showCommandLine - 生成命令行输出。默认值为 false

  • net.trainParam.showWindow - 显示训练 GUI。默认值为 true

  • net.trainParam.time - 以秒为单位的最大训练时间。默认值为 inf

如果经历了一行中的 max_fail 轮训练后,基于验证向量的网络性能没有提升或仍保持不变,则验证向量用于提前停止训练。测试向量用于进一步检查网络是否泛化良好,但对训练没有任何影响。

示例

全部折叠

此示例说明如何使用 trainlm 训练函数训练神经网络。

此处神经网络经过训练用于预测体脂百分比。

[x, t] = bodyfat_dataset;
net = feedforwardnet(10, 'trainlm');
net = train(net, x, t);

y = net(x);

输入参数

全部折叠

输入网络,指定为网络对象。要创建网络对象,请使用 feedforwardnetnarxnet 等函数。

输出参量

全部折叠

经过训练的网络,以 network 对象形式返回。

训练记录(epochperf),以结构体形式返回,其字段取决于网络训练函数 (net.NET.trainFcn)。它可以包括如下字段:

  • 训练、数据划分以及性能函数和参数

  • 训练、验证和测试集的数据划分索引

  • 训练、验证和测试集的数据划分掩码

  • 轮数 (num_epochs) 和最佳轮次 (best_epoch)。

  • 训练状态名称列表 (states)。

  • 每个状态名称的字段(在整个训练过程中记录其值)

  • 最佳网络的性能(best_perfbest_vperfbest_tperf

限制

此函数使用雅可比矩阵执行计算,假设性能是误差的均值或平方和。因此,用此函数训练的网络必须使用 msesse 性能函数。

详细信息

全部折叠

莱文贝格-马夸特算法

与拟牛顿法一样,莱文贝格-马夸特算法旨在逼近二阶训练速度,而无需计算黑塞矩阵。当性能函数具有平方和形式时(如训练前馈网络时的典型形式),则黑塞矩阵可以逼近,如下所示

H = JTJ(1)

并且梯度可以计算为

g = JTe(2)

其中 J 是雅可比矩阵,其中包含网络误差关于权重和偏置的一阶导数,e 是网络误差的向量。雅可比矩阵可以通过标准的反向传播方法(请参阅 [HaMe94])来计算,这比计算黑塞矩阵要简单得多。

莱文贝格-马夸特算法在以下类牛顿更新中使用了对黑塞矩阵的此逼近:

xk+1=xk[JTJ+μI]1JTe

当标量 µ 为零时,这就是牛顿法,使用逼近黑塞矩阵。当 µ 较大时,这就变为步长较小的梯度下降法。牛顿法在接近误差最小值时速度更快,准确度更高,因此我们的目标是尽快转向牛顿法。因此,每个成功的时间步(性能函数值下降)后,µ 会减小,只有当尝试时间步会增加性能值时,它才会增大。这样,在算法的每次迭代中,性能函数值始终减小。

[Marq63] 中给出了莱文贝格-马夸特算法的原始描述。莱文贝格-马夸特在神经网络训练中的应用在 [HaMe94] 中描述,从 [HDB96] 的第 12-19 页开始。该算法似乎是训练中等规模前馈神经网络(最多几百个权重)的最快方法。它在 MATLAB® 软件中也有高效的实现,因为矩阵方程的解是一个内置函数,因此其属性在 MATLAB 环境中变得更加明显。

网络使用

您可以创建一个将 trainlmfeedforwardnetcascadeforwardnet 搭配使用的标准网络。要准备使用 trainlm 训练的自定义网络,请执行以下操作:

  1. NET.trainFcn 设置为 trainlm。这会将 NET.trainParam 设置为 trainlm 的默认参数。

  2. NET.trainParam 属性设置为期望的值。

在任一情况下,用生成的网络调用 train 都会用 trainlm 训练网络。有关示例,请参阅 feedforwardnetcascadeforwardnet

算法

如果网络的 NET.divideFcn 属性设置为数据划分函数,则 trainlm 支持使用验证和测试向量进行训练。如果经历了一行中的 max_fail 轮训练后,基于验证向量的网络性能没有提升或仍保持不变,则验证向量用于提前停止训练。测试向量用于进一步检查网络是否泛化良好,但对训练没有任何影响。

trainlm 可以训练任何网络,只要其权重、净输入和传递函数具有导函数。

反向传播用于计算性能 perf 关于权重和偏置变量 X 的雅可比矩阵 jX。每个变量根据莱文贝格-马夸特进行调整,

jj = jX * jX
je = jX * E
dX = -(jj+I*mu) \ je

其中 E 是所有误差,I 是单位矩阵。

自适应值 mumu_inc 递增,直到上述变化导致性能值降低。然后对网络进行更改,将 mumu_dec 递减。

出现以下任一情况时,训练停止:

  • 达到 epochs(重复)的最大数量。

  • 超出 time 的最大数量。

  • 性能最小化到 goal

  • 性能梯度低于 min_grad

  • mu 超过 mu_max

  • 自上次验证性能(使用验证时)下降以来,验证性能(验证误差)上升的次数超过了 max_fail 次。

版本历史记录

在 R2006a 之前推出