BRNN ( Bidirectional Recurrent Neural Networks )μ λ°λ λ°©ν₯μ μ¨κ²¨μ§ λ λ μ΄μ΄λ₯Ό λμΌν μΆλ ₯μ μ°κ²°ν©λλ€. μ΄λ¬ν ννμ μμ± λ₯ λ¬λ μ ν΅ν΄ μΆλ ₯ λ μ΄μ΄λ κ³Όκ±° (λ€λ‘) λ° λ―Έλ (μμΌλ‘) μνμμ λμμ μ 보λ₯Ό μ»μ μ μμ΅λλ€. 1997 λ Schusterμ Paliwalμ΄ λ°λͺ ν [1] BRNNμ λ€νΈμν¬μμ μ¬μ© κ°λ₯ν μ λ ₯ μ 보μ μμ λ리기 μν΄ λμ λμμ΅λλ€. μλ₯Ό λ€μ΄, MLP ( Multilayer Perceptron ) λ° TDNN ( Time Delay Neural Network )μ μ λ ₯ λ°μ΄ν°λ₯Ό κ³ μ ν΄μΌνκΈ° λλ¬Έμ μ λ ₯ λ°μ΄ν° μ μ°μ±μ μ νμ΄ μμ΅λλ€. νμ€ λ°λ³΅ μ κ²½λ§νμ¬ μνμμ λ―Έλμ μ λ ₯ μ 보μ λλ¬ ν μ μμΌλ―λ‘ (RNN)μλ μ νμ΄ μμ΅λλ€. λ°λλ‘ BRNNμ μ λ ₯ λ°μ΄ν°λ₯Ό μμ νμ§ μμλλ©λλ€. λν νμ¬ μνμμ λ―Έλμ μ λ ₯ μ 보μ λλ¬ ν μ μμ΅λλ€. [2]
BRNNμ μ λ ₯ 컨ν μ€νΈκ° νμν λ νΉν μ μ©ν©λλ€. μλ₯Ό λ€μ΄, νκΈ° μΈμμμ νμ¬ λ¬Έμ μλ€μμλ λ¬Έμμ λν μ§μμ ν΅ν΄ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
https://en.wikipedia.org/wiki/Bidirectional_recurrent_neural_networks
μμ½νμλ©΄, νλ°©λΆν° μ λ°©κΉμ§μ μ 보λ₯Ό νμ΅ν μ μκ² λ§λ λͺ¨λΈμ΄ μλ°©ν₯ μν μ κ²½λ§μ λλ€.
μ°λ¦¬λ€μ κ°λ°νλ μ¬λμ΄κΈ° λλ¬Έμ μ¬μ©νλ λ°©λ²λ§ μμλ μΆ©λΆν μ½λ©ν μ μμ΅λλ€.
import torch
import torch.nn as nn
input = torch.randn(4, 7, 5)
print(input.size())
rnn_layer = nn.RNN(input_size=5, hidden_size=4, num_layers=3, batch_first=True, bidirectional=True)
print(rnn_layer)
(output, hidden) = rnn_layer(input)
print("Output size : {}".format(output.size()))
print("Hidden size : {}".format(hidden.size()))
# κ²°κ³Ό
# torch.Size([4, 7, 5])
# RNN(5, 4, num_layers=3, batch_first=True, bidirectional=True)
# Output size : torch.Size([4, 7, 8])
# Hidden size : torch.Size([6, 4, 4])
input : [batch_size, sequence, input_size]
output : [batch_size, sequence, hidden_size * 2]
hidden : [num_layers * 2, batch_size, hidden_size]