Pytorch로 시작하는 딥러닝 입문(07-01. 순환 신경망, 양방향 순환 신경망(Bidirectional Recurrent Neural Network))

2024. 6. 23. 13:31딥러닝 모델: 파이토치

양방향 순환 신경망은 시점 t에서의 출력값을 예측할 때 이전 시점의 데이터뿐만 아니라 이후 데이터로도 예측할 수 있다는 아이디어에 기반한다. 

 

영어 빈칸 채우기 문제에 비유하면 빈칸의 앞부분과 뒷부분이 모두 있어야 답을 풀 수 있는 것과 비슷하다. 

 

 

양방향 RNN은 하나의 출력값을 예측하기 위해 기본적으로 두 개의 메모리 셀을 사용한다. 첫 번째 메모리 셀은 앞에서 배운 것처럼 앞 시점의 은닉 상태(forward states)를 전달받아 현재의 은닉 상태를 계산한다. 주황색이 앞 시점의 은닉 상태를 전달받은 셀이다. 두 번째 메모리 셀은 뒤 시점의 은닉 상태를 전달 받아 현재의 은닉 상태를 계산한다. 초록색 메모리 셀에 해당한다. 두 개의 값이 모두 출력값을 예측하기 위해 사용된다. 

 

양방향 RNN도 다수의 은닉층을 가질 수 있다. 

 

양방향 순환 신경망을 파이토치로 구현할 때는 nn.RNN( )의 인자인 bidirectional에 값을 True로 전달하면 된다. 층이 2개인 깊은 순환 신경망이면서 양방향인 경우, 앞서 실습했던 임의의 입력에 대해 출력이 어떻게 달라지는지 확인해보자. 

 

첫 번째 리턴값의 크기가 단방향 RNN을 셀 때보다 은닉 상태가 두 배가 되었다. 양방향의 은닉 상태값들이 연결되었기 때문이다. 

 

 

 

두번째 리턴값의 크기는 (층의 개수 x 방향의 , 배치 크기, 은닉 상태의 크기)를 가진다. 이는 정방향 기준으로는 마지막 시점에 해당되면서, 역방향 기준에서는 첫번째 시점에 해당되는 시점의 출력값을 층의 개수만큼 쌓아 올린 결과값이다. 

 

 

 

첫 번째 레이어의 은닉 상태들은 outputs에서 확인할 수 없지만, 두 번째 레이어의 정방향 마지막 은닉 상태들은 outputs의 마지막 시점에서 나온 값의 앞부분에 해당한다. 

 

반대로 역방향 마지막 은닉 상태들은 outputs의 첫 번째 시점에서 나온 값의 뒷부분에 해당한다. 

 

♣ RNN 예시 코드

https://colab.research.google.com/drive/1BYK9cj5IuqtUpAIX-FT5h-H2t7rpwhEG#scrollTo=aT7_nUIdSkbd

 

Google Colab Notebook

Run, share, and edit Python notebooks

colab.research.google.com