GRUBlockCellGrad

публичный финальный класс GRUBlockCellGrad

Вычисляет обратное распространение ячейки GRU за 1 временной шаг.

Args x: вход в ячейку ГРУ. h_prev: ввод состояния из предыдущей ячейки GRU. w_ru: Матрица весов для сброса и обновления вентиля. w_c: Весовая матрица для шлюза соединения ячеек. b_ru: Вектор смещения для вентиля сброса и обновления. b_c: Вектор смещения для шлюза соединения ячейки. r: Выход вентиля сброса. u: Выход шлюза обновления. c: Выход шлюза соединения ячеек. d_h: Градиенты h_new относительно целевой функции.

Возвращает d_x: Градиенты x относительно целевой функции. d_h_prev: Градиенты h относительно целевой функции. d_c_bar Градиенты c_bar относительно целевой функции. d_r_bar_u_bar Градиенты r_bar и u_bar относительно целевой функции.

Эта операция ядра реализует следующие математические уравнения:

Обратите внимание на обозначения переменных:

Объединение a и b представлено a_b. Скалярное произведение a и b по элементам представлено ab. Скалярное произведение поэлементно представлено \circ. Матричное умножение представлено *.

Дополнительные примечания для ясности:

`w_ru` можно разделить на 4 разные матрицы.

w_ru = [w_r_x w_u_x
         w_r_h_prev w_u_h_prev]
 
Аналогично, w_c можно разделить на две разные матрицы.
w_c = [w_c_x w_c_h_prevr]
 
То же самое касается и предвзятости.
b_ru = [b_ru_x b_ru_h]
 b_c = [b_c_x b_c_h]
 
Еще одно замечание по обозначениям:
d_x = d_x_component_1 + d_x_component_2
 
 where d_x_component_1 = d_r_bar * w_r_x^T + d_u_bar * w_r_x^T
 and d_x_component_2 = d_c_bar * w_c_x^T
 
 d_h_prev = d_h_prev_component_1 + d_h_prevr \circ r + d_h \circ u
 where d_h_prev_componenet_1 = d_r_bar * w_r_h_prev^T + d_u_bar * w_r_h_prev^T
 
Математика градиентов ниже:
d_c_bar = d_h \circ (1-u) \circ (1-c \circ c)
 d_u_bar = d_h \circ (h-c) \circ u \circ (1-u)
 
 d_r_bar_u_bar = [d_r_bar d_u_bar]
 
 [d_x_component_1 d_h_prev_component_1] = d_r_bar_u_bar * w_ru^T
 
 [d_x_component_2 d_h_prevr] = d_c_bar * w_c^T
 
 d_x = d_x_component_1 + d_x_component_2
 
 d_h_prev = d_h_prev_component_1 + d_h_prevr \circ r + u
 
Ниже расчет выполняется в оболочке Python для градиентов (а не в ядре градиента).
d_w_ru = x_h_prevr^T * d_c_bar
 
 d_w_c = x_h_prev^T * d_r_bar_u_bar
 
 d_b_ru = sum of d_r_bar_u_bar along axis = 0
 
 d_b_c = sum of d_c_bar along axis = 0
 

Публичные методы

static <T расширяет число> GRUBlockCellGrad <T>
create ( Область действия, Операнд <T> x, Операнд <T> hPrev, Операнд <T> wRu, Операнд <T> wC, Операнд <T> bRu, Операнд <T> bC, Операнд <T> r, Операнд <T > u, Операнд <T> c, Операнд <T> dH)
Фабричный метод для создания класса, обертывающего новую операцию GRUBlockCellGrad.
Выход <Т>
Выход <Т>
Выход <Т>
Выход <Т>
дХ ()

Унаследованные методы

Публичные методы

public static GRUBlockCellGrad <T> create ( Область действия, Операнд <T> x, Операнд <T> hPrev, Операнд <T> wRu, Операнд <T> wC, Операнд <T> bRu, Операнд <T> bC, Операнд <T > r, Операнд <T> u, Операнд <T> c, Операнд <T> dH)

Фабричный метод для создания класса, обертывающего новую операцию GRUBlockCellGrad.

Параметры
объем текущий объем
Возврат
  • новый экземпляр GRUBlockCellGrad

публичный выход <T> dCBar ()

публичный вывод <T> dHPrev ()

публичный вывод <T> dRBarUBar ()

публичный вывод <T> dX ()