Spec-Zone.ru › PyTorch 2.14

GRU

class torch.nn.GRU(input_size, hidden_size, num_layers=1, bias=True, batch_first=False, dropout=0.0, bidirectional=False, device=None, dtype=None) [исходный код]

Применяет многослойную рекуррентную нейронную сеть (RNN) с управляемыми рекуррентными блоками (GRU) к входной последовательности. Для каждого элемента входной последовательности каждый слой вычисляет следующую функцию:

rt=σ(Wirxt+bir+Whrh(t−1)+bhr)zt=σ(Wizxt+biz+Whzh(t−1)+bhz)nt=tanh⁡(Winxt+bin+rt⊙(Whnh(t−1)+bhn))ht=(1−zt)⊙nt+zt⊙h(t−1)\begin{array}{ll} r_t = \sigma(W_{ir} x_t + b_{ir} + W_{hr} h_{(t-1)} + b_{hr}) \\ z_t = \sigma(W_{iz} x_t + b_{iz} + W_{hz} h_{(t-1)} + b_{hz}) \\ n_t = \tanh(W_{in} x_t + b_{in} + r_t \odot (W_{hn} h_{(t-1)}+ b_{hn})) \\ h_t = (1 - z_t) \odot n_t + z_t \odot h_{(t-1)} \end{array}

где hth_t — скрытое состояние в момент времени t, xtx_t — вход в момент времени t, h(t−1)h_{(t-1)} — скрытое состояние слоя в момент времени t-1 или начальное скрытое состояние в момент времени 0, а rtr_t, ztz_t, ntn_t — соответственно, сбрасывающий, обновляющий и новый вентили. σ\sigma — сигмоидальная функция, а ⊙\odot — произведение Адамара.

В многослойной GRU вход xt(l)x^{(l)}_t ll-го слоя (l≥2l \ge 2) — это скрытое состояние ht(l−1)h^{(l-1)}_t предыдущего слоя, умноженное на dropout-маску δt(l−1)\delta^{(l-1)}_t, где каждая δt(l−1)\delta^{(l-1)}_t — случайная величина Бернулли, принимающая значение 00 с вероятностью dropout.

Параметры:
  • input_size – Количество ожидаемых признаков во входе x
  • hidden_size – Количество признаков в скрытом состоянии h
  • num_layers – Количество рекуррентных слоёв. Например, значение num_layers=2 означает, что две GRU будут расположены последовательно, образуя stacked GRU, где вторая GRU получает выходы первой GRU и вычисляет окончательные результаты. Значение по умолчанию: 1
  • bias – Если False, слой не использует веса смещения b_ih и b_hh. Значение по умолчанию: True
  • batch_first – Если True, входные и выходные тензоры передаются в формате (batch, seq, feature) вместо (seq, batch, feature). Обратите внимание, что это не относится к скрытым состояниям или состояниям ячеек. Подробности см. в разделах «Входы/выходы» ниже. Значение по умолчанию: False
  • dropout – Если значение ненулевое, добавляет слой Dropout к выходам каждого слоя GRU, кроме последнего, с вероятностью dropout, равной dropout. Значение по умолчанию: 0
  • bidirectional – Если True, становится двунаправленной GRU. Значение по умолчанию: False
Входы: input, h_0
  • input: тензор формы (L,Hin)(L, H_{in}) для входа без пакетной размерности, (L,N,Hin)(L, N, H_{in}) при batch_first=False или (N,L,Hin)(N, L, H_{in}) при batch_first=True, содержащий признаки входной последовательности. Вход также может быть упакованной последовательностью переменной длины. Подробнее см. torch.nn.utils.rnn.pack_padded_sequence() или torch.nn.utils.rnn.pack_sequence().
  • h_0: тензор формы (D∗num_layers,Hout)(D * \text{num\_layers}, H_{out}) или (D∗num_layers,N,Hout)(D * \text{num\_layers}, N, H_{out}), содержащий начальное скрытое состояние входной последовательности. Если значение не указано, по умолчанию используется нулевой тензор.

где:

N=размер пакетаL=длина последовательностиD=2 если bidirectional=True, иначе 1Hin=input_sizeHout=hidden_size\begin{aligned} N ={} & \text{batch size} \\ L ={} & \text{sequence length} \\ D ={} & 2 \text{ if bidirectional=True otherwise } 1 \\ H_{in} ={} & \text{input\_size} \\ H_{out} ={} & \text{hidden\_size} \end{aligned}
Выходы: output, h_n
  • output: тензор формы (L,D∗Hout)(L, D * H_{out}) для входа без пакетной размерности, (L,N,D∗Hout)(L, N, D * H_{out}) при batch_first=False или (N,L,D∗Hout)(N, L, D * H_{out}) при batch_first=True, содержащий выходные признаки (h_t) последнего слоя GRU для каждого t. Если в качестве входа передан torch.nn.utils.rnn.PackedSequence, выход также будет упакованной последовательностью.
  • h_n: тензор формы (D∗num_layers,Hout)(D * \text{num\_layers}, H_{out}) или (D∗num_layers,N,Hout)(D * \text{num\_layers}, N, H_{out}), содержащий конечное скрытое состояние входной последовательности.
Переменные:
  • weight_ih_l[k] – обучаемые веса вход—скрытое состояние kth\text{k}^{th}-го слоя (W_ir|W_iz|W_in), формы (3*hidden_size, input_size) для k = 0. В противном случае форма равна (3*hidden_size, num_directions * hidden_size)
  • weight_hh_l[k] – обучаемые веса скрытое состояние—скрытое состояние kth\text{k}^{th}-го слоя (W_hr|W_hz|W_hn), формы (3*hidden_size, hidden_size)
  • bias_ih_l[k] – обучаемое смещение вход—скрытое состояние kth\text{k}^{th}-го слоя (b_ir|b_iz|b_in), формы (3*hidden_size)
  • bias_hh_l[k] – обучаемое смещение скрытое состояние—скрытое состояние kth\text{k}^{th}-го слоя (b_hr|b_hz|b_hn), формы (3*hidden_size)

Примечание

Все веса и смещения инициализируются из распределения U(−k,k)\mathcal{U}(-\sqrt{k}, \sqrt{k}), где k=1hidden_sizek = \frac{1}{\text{hidden\_size}}

Примечание

Для двунаправленных GRU направлениям прямого и обратного прохода соответствуют индексы 0 и 1. Пример разделения выходных слоёв при batch_first=False: output.view(seq_len, batch, num_directions, hidden_size).

Примечание

Аргумент batch_first игнорируется для входов без пакетной размерности.

Примечание

Вычисление нового вентиля ntn_t несколько отличается от описанного в исходной статье и других фреймворках. В исходной реализации произведение Адамара (⊙)(\odot) между rtr_t и предыдущим скрытым состоянием h(t−1)h_{(t-1)} вычисляется до умножения на матрицу весов W и сложения со смещением:

nt=tanh⁡(Winxt+bin+Whn(rt⊙h(t−1))+bhn)\begin{aligned} n_t = \tanh(W_{in} x_t + b_{in} + W_{hn} ( r_t \odot h_{(t-1)} ) + b_{hn}) \end{aligned}

В реализации PyTorch это выполняется после умножения Whnh(t−1)W_{hn} h_{(t-1)}

nt=tanh⁡(Winxt+bin+rt⊙(Whnh(t−1)+bhn))\begin{aligned} n_t = \tanh(W_{in} x_t + b_{in} + r_t \odot (W_{hn} h_{(t-1)}+ b_{hn})) \end{aligned}

Такое отличие реализации сделано намеренно для повышения эффективности.

Примечание

Если выполняются следующие условия: 1) включён cudnn, 2) входные данные находятся на GPU, 3) тип данных входа — torch.float16, 4) используется GPU V100, 5) входные данные не представлены в формате PackedSequence, можно выбрать постоянный алгоритм для повышения производительности.

Примеры:

>>> rnn = nn.GRU(10, 20, 2)
>>> input = torch.randn(5, 3, 10)
>>> h0 = torch.randn(2, 3, 20)
>>> output, hn = rnn(input, h0)

© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/generated/torch.nn.GRU.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API