主要内容

gru

门控循环单元

说明

门控循环单元 (GRU) 运算允许网络学习时间序列和序列数据中时间步之间的相关性。

注意

此函数将深度学习 GRU 运算应用于 dlarray 数据。如果要在 dlnetwork 对象中应用 GRU 运算,请使用 gruLayer

Y = gru(X,H0,weights,recurrentWeights,bias) 使用初始隐藏状态 H0 以及参数 weightsrecurrentWeightsbias 对输入 X 应用门控循环单元 (GRU) 计算。输入 X 必须是格式化的 dlarray。输出 Y 是格式化的 dlarray,其维度格式与 X 的维度格式相同,但不包含任何 "S" 维度。

gru 函数使用双曲正切函数 (tanh) 作为状态激活函数来更新隐藏状态。gru 函数使用 σ(x)=(1+ex)1 给出的 sigmoid 函数作为门激活函数。

示例

[Y,hiddenState] = gru(X,H0,weights,recurrentWeights,bias) 还会返回 GRU 运算后的隐藏状态。

X 不是格式化的 dlarray 时,___ = gru(X,H0,weights,recurrentWeights,bias,DataFormat=FMT) 还指定维度格式 FMT。输出 Y 是未格式化的 dlarray,其维度顺序与 X 的维度顺序相同,但不包含任何 "S" 维度。

___ = gru(X,H0,weights,recurrentWeights,bias,Name=Value) 使用一个或多个名称-值参量指定其他选项。

示例

全部折叠

使用 100 个隐藏单元执行一次 GRU 运算。

将输入序列数据创建为 32 个观测值,具有 10 个通道,序列长度为 64。

numFeatures = 10;
numObservations = 32;
sequenceLength = 64;

X = randn(numFeatures,numObservations,sequenceLength);
X = dlarray(X,"CBT");

创建具有 100 个隐藏单元的初始隐藏状态。对所有观测值使用相同的初始隐藏状态。

numHiddenUnits = 100;
H0 = zeros(numHiddenUnits,1);

为 GRU 运算创建可学习参数。

weights = dlarray(randn(3*numHiddenUnits,numFeatures));
recurrentWeights = dlarray(randn(3*numHiddenUnits,numHiddenUnits));
bias = dlarray(randn(3*numHiddenUnits,1));

执行 GRU 计算

[Y,hiddenState] = gru(X,H0,weights,recurrentWeights,bias);

查看输出的大小和维度格式。

size(Y)
ans = 1×3

   100    32    64

Y.dims
ans = 
'CBT'

查看隐藏状态的大小。

size(hiddenState)
ans = 1×2

   100    32

您可以使用隐藏状态来跟踪 GRU 运算的状态,并输入后续顺序数据。

输入参数

全部折叠

输入数据,指定为格式化的 dlarray、未格式化的 dlarray 或数值数组。当 X 不是格式化的 dlarray 时,必须使用 DataFormat 名称-值参量指定维度标签格式。如果 X 是数值数组,则 H0weightsrecurrentWeightsbias 中至少有一个必须是 dlarray

X 必须包含一个标记为 "T" 的序列维度。如果 X 具有任何标签为 "S" 的空间维度,则它们将展平为 "C" 通道维度。如果 X 没有通道维度,则会添加一个。如果 X 具有任何标签为 "U" 的未指定维度,则它们必须是单一维度。

数据类型: single | double

初始隐藏状态向量,指定为格式化的 dlarray、未格式化的 dlarray 或数值数组。

如果 H0 是格式化的 dlarray,它必须包含标签为 "C" 的通道维度,并且可以选择性地包含一个标签为 "B" 的批量维度(其大小与 X"B" 维度相同)。如果 H0 没有 "B" 维度,则该函数对 X 中的每个观测值使用相同的隐藏状态向量。

如果 H0 是格式化的 dlarray,则 "C" 维度的大小决定隐藏单元的数量。否则,第一个维度的大小决定隐藏单元的数量。

数据类型: single | double

权重,指定为格式化的 dlarray、未格式化的 dlarray 或数值数组。

weights 指定为一个大小为 3*NumHiddenUnits×InputSize 的矩阵,其中 NumHiddenUnitsH0"C" 维度的大小,InputSizeX"C" 维度的大小乘以 X 的每个 "S" 维度(如果存在)的大小。

如果 weights 是格式化的 dlarray,则它必须包含一个大小为 3*NumHiddenUnits"C" 维度和一个大小为 InputSize"U" 维度。

数据类型: single | double

循环权重,指定为格式化的 dlarray、未格式化的 dlarray 或数值数组。

recurrentWeights 指定为一个大小为 3*NumHiddenUnits×NumHiddenUnits 的矩阵,其中 NumHiddenUnitsH0"C" 维度的大小。

如果 recurrentWeights 是格式化的 dlarray,则它必须包含一个大小为 3*NumHiddenUnits"C" 维度和一个大小为 NumHiddenUnits"U" 维度。

数据类型: single | double

偏置,指定为格式化的 dlarray、未格式化的 dlarray 或数值数组。

bias 指定为长度为 3*NumHiddenUnits 的向量,其中 NumHiddenUnitsH0"C" 维度的大小。

如果 bias 是格式化的 dlarray,则非单一维度的标签必须为 "C"

数据类型: single | double

名称-值参数

全部折叠

将可选参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: Y = gru(X,H0,weights,recurrentWeights,bias,DataFormat="CTB") 应用 GRU 运算并指定数据格式为 "CTB"(通道、时间、批量)。

数据维度的描述,指定为字符向量或字符串标量。

数据格式是一个字符串,其中每个字符描述对应数据的维度的类型。

这些字符是:

  • "S" - 空间

  • "C" - 通道

  • "B" - 批量

  • "T" - 时间

  • "U" - 未指定

例如,假设有一个表示一批序列的数组,其中第一个、第二个和第三个维度分别对应于通道、观测值和时间步。您可以将该数据描述为具有格式 "CBT"(通道、批量、时间)。

您可以指定多个标注为 "S""U" 的维度。每个 "C""B""T" 标签最多可以使用一次。该软件忽略第二个维度后的单一尾部 "U" 维度。

如果输入数据不是格式化的 dlarray 对象,则必须指定 DataFormat 选项。

有关详细信息,请参阅Deep Learning Data Formats

数据类型: char | string

自 R2023a 起

重置门模式,指定为以下值之一:

  • "after-multiplication" - 在矩阵乘法之后应用重置门。此选项与 cuDNN 兼容。

  • "before-multiplication" - 在矩阵乘法之前应用重置门。

  • "recurrent-bias-after-multiplication" - 在矩阵乘法之后应用重置门,并为循环权重使用一组额外的偏置项。

有关重置门计算的详细信息,请参阅 gruLayer 参考页上的Gated Recurrent Unit Layer

自 R2024a 起

用于更新隐藏状态的激活函数,指定为下列值之一:

  • "tanh" - 使用双曲正切函数 (tanh)。

  • "softsign" - 使用 softsign 函数 softsign(x)=x1+|x|

  • "relu" (自 R2024b 起) - 使用修正线性单元 (ReLU) 函数 ReLU(x)={x,x>00,x0

软件在计算中使用此选项作为 σs 函数来更新隐藏状态。

有关详细信息,请参阅 gruLayer 参考页上的Gated Recurrent Unit Layer

自 R2024a 起

应用于门的激活函数,指定为下列值之一:

  • "sigmoid" - 使用 sigmoid 函数 σ(x)=(1+ex)1

  • "hard-sigmoid" - 使用硬 sigmoid 函数

    σ(x)={00.2x+0.51if x<2.5if2.5x2.5if x>2.5.

软件在层门计算中使用此选项作为 σg 函数。

有关详细信息,请参阅 gruLayer 参考页上的Gated Recurrent Unit Layer

输出参量

全部折叠

GRU 输出,以 dlarray 形式返回。输出 Y 与输入 X 具有相同的基础数据类型。

如果输入数据 X 是格式化的 dlarray,则 Y 具有与 X 相同的维度格式,但不包含任何 "S" 维度。如果输入数据不是格式化的 dlarray,则 Y 是未格式化的 dlarray,其维度顺序与输入数据的维度顺序相同。

Y"C" 维度的大小与隐藏单元的数量相同,由 H0"C" 维度大小指定。

每个观测值的隐藏状态向量,以 dlarray 或数值数组(与 H0 具有相同的数据类型)的形式返回。

如果输入 H0 是格式化的 dlarray,则输出 hiddenState 是格式化的 dlarray,格式为 "CB"

详细信息

全部折叠

参考

[1] Cho, Kyunghyun, Bart Van Merriënboer, Caglar Gulcehre, Dzmitry Bahdanau, Fethi Bougares, Holger Schwenk, and Yoshua Bengio. "Learning phrase representations using RNN encoder-decoder for statistical machine translation." arXiv preprint arXiv:1406.1078 (2014).

扩展功能

全部展开

版本历史记录

在 R2020a 中推出

全部展开