Полезно ли использовать несколько слоев в воротах LSTM? - PullRequest
0 голосов
/ 07 января 2019

Я делаю реализацию ячейки LSTM с нуля, и я думал о реализации вычисления затворов с несколькими нейронными слоями, а не просто с использованием однослойной версии: sigmoid(dot(W,concat(a_prev,xt)) + b). Я не могу найти литературу по этому вопросу. Это работает ? Может ли это сходиться?

Это стандартный код прямого распространения ячеек LSTM, который я выучил на курсе глубокого обучения Эндрю Нга:

concat = np.zeros((n_a + n_x, m))
concat[: n_a, :] = a_prev
concat[n_a :, :] = xt


ft = sigmoid(np.dot(Wf, concat) + bf)
it = sigmoid(np.dot(Wi, concat) + bi)
cct = np.tanh(np.dot(Wc, concat) + bc)
c_next = ft * c_prev + it * cct
ot = sigmoid(np.dot(Wo, concat) + bo)
a_next = ot * np.tanh(c_next)
# Compute prediction of the LSTM cell
yt_pred = softmax(np.dot(Wy, a_next) + by)

Ячейка LSTM, которую я хочу использовать:

concat = np.zeros((n_a + n_x, m))
concat[: n_a, :] = a_prev
concat[n_a:, :] = xt

ft1 = sigmoid(np.dot(Wf1, concat) + bf1)
ft2 = sigmoid(np.dot(Wf2, ft1) + bf2)

it1 = sigmoid(np.dot(Wi11, concat) + bi1)
it2 = sigmoid(np.dot(Wi12, it1) + bi2)

cct1 = np.tanh(np.dot(Wc1, concat) + bc1)
cct2 = np.tanh(np.dot(Wc2, cct1) + bc2)


c_next = ft2 * c_prev + it2 * cct2

ot1 = sigmoid(np.dot(Wo1, concat) + bo1)
ot2 = sigmoid(np.dot(Wo2, ot1) + bo2)

a_next = ot2 * np.tanh(c_next)

# Compute prediction of the LSTM cell
yt_pred1 = softmax(np.dot(Wy1, a_next) + by1)
...