主要内容

神经网络训练概念

本主题是中描述的设计工作流的一部分神经网络设计工作流

本主题描述了两种不同的培训风格。在ncremental每次向网络提供输入时,网络的训练权值和偏差都会更新。在批处理训练权值和偏差只有在所有输入都呈现出来之后才会更新。批处理训练方法在MATLAB中通常效率更高®环境,并且它们在Deep Learning Toolbox™软件中得到了强调,但是在一些应用程序中,增量训练可能是有用的,因此也实现了范式。

增量式适应训练

增量训练既可以应用于静态网络,也可以应用于动态网络,尽管它更常用于动态网络,例如自适应滤波器。本节说明如何在静态和动态网络上执行增量训练。

静态网络的增量训练

再次考虑第一个示例中使用的静态网络。您希望增量地训练它,以便在每个输入呈现后更新权重和偏差。在本例中使用函数适应,输入和目标以序列形式表示。

假设你想训练网络来创建线性函数:

t = 2 p 1 + p 2

对于之前的输入,

p 1 = ( 1 2 ] p 2 = ( 2 1 ] p 3. = ( 2 3. ] p 4 = ( 3. 1 ]

目标是

t 1 = ( 4 ] t 2 = ( 5 ] t 3. = ( 7 ] t 4 = ( 7 ]

对于增量训练,您将输入和目标呈现为序列:

P = {[1;2] [2;1] [2;3] [3;1]};T = {4 5 7 7};

首先,建立初始权重和偏差为零的网络。同样,将初始学习率设置为零,以显示增量训练的效果。

Net = linearlayer(0,0);net = configure(net,P,T);网{1,1} = [0 0];网B {1} = 0;

回想一下静态网络中并发输入的仿真即,对于静态网络,无论输入是作为并发向量矩阵还是作为序列向量的单元阵列。然而,在训练网络时,情况并非如此。当你使用适应函数,如果输入以顺序向量的单元数组表示,则权重在每个输入呈现时更新(增量模式)。如下一节所示,如果输入以并发向量矩阵的形式呈现,那么权重只有在呈现所有输入后才会更新(批处理模式)。

现在,您已经准备好增量训练网络了。

[网,a,e,pf] = adapt(网,P,T);

网络输出保持为零,因为学习率为零,并且权重没有更新。误差等于目标:

A = [0] [0] [0] [0] e = [4] [5] [7] [7]

如果你现在将学习率设置为0.1,你可以看到当每个输入出现时网络是如何调整的:

net.inputWeights {1} .learnParam。Lr = 0.1;net.biases {1} .learnParam。Lr = 0.1;[网,a,e,pf] = adapt(网,P,T);A = [0] [2] [6] [5.8] e = [4] [3] [1] [1.2]

第一个输出与零学习率时相同,因为在第一个输入出现之前不会进行更新。第二个输出是不同的,因为权重已经更新。随着每个误差的计算,权重继续被修改。如果网络有能力并且学习率设置正确,则误差最终被驱动为零。

动态网络的增量训练

你也可以增量地训练动态网络。事实上,这是最常见的情况。

为了增量训练网络,将输入和目标表示为单元阵列的元素。这是初始输入π以及输入P目标T作为细胞阵列。

Pi = {1};P = {2 3 4};T = {3 5 7};

以输入有一个延迟的线性网络为例,如前面的例子所示。初始化权重为0,并设置学习率为0.1。

Net = linearlayer([0 1],0.1);net = configure(net,P,T);网{1,1} = [0 0];网biasConnect = 0;

你想训练网络通过将当前和之前的输入相加来产生当前的输出。这与您在前面的示例中使用的输入序列相同,不同之处在于您将序列中的第一个项指定为延迟的初始条件。您现在可以使用顺序训练网络适应

[net,a,e,pf] = adapt(net,P,T,Pi);A = [3] [2.4] [7.98] e = [3] [2.6] [-0.98]

第一个输出是零,因为权重还没有更新。在随后的每个时间步中,权重都会发生变化。

批处理培训

批处理训练,其中权重和偏差只有在所有输入和目标出现后才更新,可以应用于静态和动态网络。本节将讨论这两种类型的网络。

静态网络批处理训练

批量训练可以使用任何一种适应火车,虽然火车通常是最好的选择,因为它通常可以访问更有效的训练算法。增量训练通常是用适应;批量训练通常是用火车

用于静态网络的批量训练适应,输入向量必须放在一个并发向量矩阵中。

P = [1 2 2 3;[2 1 3 1];T = [4 5 7 7];

从前面示例中使用的静态网络开始。学习率设置为0.01。

Net = linearlayer(0,0.01);net = configure(net,P,T);网{1,1} = [0 0];网B {1} = 0;

当你打电话时适应,它调用火车(线性网络的默认自适应函数)和learnwh(权重和偏差的默认学习函数)。火车使用Widrow-Hoff学习。

[网,a,e,pf] = adapt(网,P,T);A = 0 0 0 0 e = 4 5 7 7

注意,网络的输出都是零,因为权重直到所有的训练集都呈现出来后才更新。如果你显示权重,你会发现

网IW{1,1} ans = 0.4900 0.4100净。b{1} = 0.2300

这与经过一次后的结果不同适应使用增量更新。

现在执行相同的批量训练,使用火车。由于可以以增量或批处理模式使用Widrow-Hoff规则,因此可以通过以下方式调用它适应火车。(有几个算法只能在批处理模式下使用(例如,Levenberg-Marquardt),所以这些算法只能由火车。)

在这种情况下,输入向量可以在并发向量的矩阵中,也可以在顺序向量的单元数组中。因为网络是静态的,因为火车总是在批处理模式下运行,火车将顺序向量的任何单元数组转换为并发向量的矩阵。尽可能使用并发模式操作,因为它在MATLAB代码中具有更有效的实现:

P = [1 2 2 3;[2 1 3 1];T = [4 5 7 7];

网络的建立方法与此相同。

Net = linearlayer(0,0.01);net = configure(net,P,T);网{1,1} = [0 0];网B {1} = 0;

现在你已经准备好训练网络了。只训练一个历元,因为你只用了一次适应。线性网络的默认训练函数为trainb,权重和偏置的默认学习函数为learnwh,因此您应该得到与使用适应在前面的例子中,默认的适配函数是火车

net.trainParam.epochs = 1;net = train(net,P,T);

如果你在一个训练周期后显示权重,你会发现

网IW{1,1} ans = 0.4900 0.4100净。b{1} = 0.2300

这与批处理模式训练的结果相同适应。对于静态网络适应函数可以实现增量或批量训练,具体取决于输入数据的格式。如果数据呈现为并发向量的矩阵,则进行批处理训练。如果数据以序列的形式呈现,则会进行增量训练。这不是真的火车,无论输入的格式如何,它总是执行批处理训练。

批处理训练与动态网络

训练静态网络相对简单。如果你使用火车网络以批处理模式进行训练,输入被转换为并发向量(矩阵的列),即使它们最初是作为序列(单元数组的元素)传递的。如果你使用适应输入的格式决定了训练的方法。如果输入作为一个序列传递,那么网络将以增量模式进行训练。如果输入作为并发向量传递,则使用批处理模式训练。

对于动态网络,批处理模式训练通常使用火车只有,特别是当只有一个训练序列存在时。为了说明这一点,再考虑一下有延迟的线性网络。使用0.02的学习率进行训练。(当使用梯度下降算法时,批处理模式训练通常使用比增量训练更小的学习率,因为在确定权重的阶跃变化之前,对所有单个梯度进行求和。)

Net = linearlayer([0 1],0.02);net.inputs{1}。Size = 1;net.layers{1}。尺寸= 1;网{1,1} = [0 0];网biasConnect = 0;net.trainParam.epochs = 1;Pi = {1}; P = {2 3 4}; T = {3 5 6};

您希望使用先前用于增量训练的相同序列来训练网络,但这一次您希望仅在应用所有输入后更新权重(批处理模式)。因为输入是一个序列,所以网络是在序列模式下模拟的,但权重是在批处理模式下更新的。

net = train(net,P,T,Pi);

一次训练后的权重为

网IW{1,1} = 0.9000 0.6200

这些权重与使用增量训练获得的权重不同,在增量训练中,权重将在一次训练集中更新三次。对于批处理训练,权重在每个历元中只更新一次。

培训反馈

显示窗口参数允许您指定训练窗口在训练时是否可见。默认情况下出现训练窗口。另外两个参数,showCommandLine显示,确定训练过程中是否生成命令行输出以及命令行反馈之间的epoch数。例如,这段代码关闭了训练窗口,并在以后使用该网络进行训练时,每隔35个epoch向您提供训练状态信息火车

net.trainParam.showWindow = false;net.trainParam.showCommandLine = true;net.trainParam。显示= 35;

有时禁用所有训练显示很方便。要做到这一点,关闭训练窗口和命令行反馈:

net.trainParam.showWindow = false;net.trainParam.showCommandLine = false;

训练窗口在你训练时自动出现。