본문 바로가기

머신러닝 + 딥러닝

[혼공딥] CHAPTER 09-1 순차 데이터와 순환 신경망

728x90

순차 데이터(sequential data) : 텍스트나 시계열 데이터(time series data)와 같이 순서에 의미가 있는 데이터

 

완전 연결 신경망이나 합성곱 신경망은 하나의 샘플(하나의 배치)을 사용하여 정방향 계산을 수행하고 나면 그 샘플은 버려지고 다음 샘플을 처리할 때 재사용하지 않는다

-> 피드포워드 신경망(feedforward neural network, FFNN) : 입력 데이터의 흐름이 앞으로만 전달되는 신경망

 

순환 신경망(recurrent neural network, RNN) : 신경망이 이전에 처리했던 샘플을 다음 샘플을 처리하는데 재사용하기 위해서, 이전 데이터가 신경망 층에 순환될 필요가 있다.

완전 연결 신경망에 이전 데이터의 처리 흐름을 순환하는 고리를 추가하면 된다

뉴런의 출력이 다시 자기 자신으로 전달된다.

어떤 샘플을 처리할 때 바로 이전에 사용했던 데이터를 재사용하는 것이다

A, B, C 3개의 샘플을 처리하는 순환 신경망의 뉴런이 있다고 가정할 때 O는 출련된 결과이다. 첫번째 샘플 A를 처리하고 난 출력 O_A이 다시 뉴런으로 들어간다

B를 처리할 때 앞에서 A를 사용해 만든 출력 O_A를 함께 사용한다

 

따라서 O_A와 B를 사용해서 만든 O_B에는 A에 대한 정보가 어느 정도 포함되어 있을 것

 

O_B와 C를 사용해 만든 O_C에는 B에 대한 정보와 A에 대한 정보도 포함되어 있다.

A에 대한 정보보다는 B에 대한 정보가 더 많을 것이다. 순환 신경망에서는 '이전 샘플에 대한 기억을 가지고 있다'고 하는데 이렇게 샘플을 처리하는 한 단계를 타임스텝(timestep)이라고 한다

 

순환신경망에서는 특별히 층을 셀(cell)이라고 부른다. 한 셀에는 여러 개의 뉴런이 있지만 완전 연결 신경망과 달리 뉴런을 모두 표시하지 않고 하나의 셀로 층을 표현한다. 셀의 출력을 은닉 상태(hidden state)라고 부른다.

일반적으로 은닉층의 활성화 함수는 하이퍼볼릭 탄젠트 함수인 tanh가 많이 사용된다.

 

순환 신경망에서도 뉴런에 입력, 가중치, 이전 타임스텝의 은닉 상태에 곱해지는 가중치를 곱한다. 셀은 입력과 이전 타임스텝의 은닉 상태를 사용하여 현재 타임스텝의 은닉 상태를 만든다

 

w_x는 입력에 곱해지는 가중치이고 w_h는 이전 타임스텝의 은닉 상태에 곱해지는 가중치이다. 피드포워드 신경망과 마찬가지로 뉴런마다 하나의 절편이 포함된다

 

타임스텝 1에서 셀의 출력 h_1이 타임스텝 2의 셀로 주입되고 w_b와 곱해진다.

타임스텝 2에서 셀의 출력 h_2가 타임스텝 3의 셀로 주입되고 w_b와 곱해진다

 

모든 타임스텝에 사용되는 가중치는 w_h 하나이다

가중치 w_h는 타임스텝에 따라 변화하는 뉴런의 출력을 학습한다.

맨 처음 타임스텝 1에서 사용되는 이전 은닉 상태 h_0은 타임스텝이 없어 모두 0으로 초기화한다

 

입력층과 순환층의 뉴런이 모두 완전 연결되기 때문에 가중치 w_x의 크기는 4*3=12개가 된다.

 

순환층에 있는 첫 번째 뉴런(r_1)의 은닉 상태가 다음 타임 스텝에 재사용될 때 첫번째 뉴런과 두번째, 세번째 뉴런에 모두 전달된다 - 붉은색 화살표

 -> 이전 타임스텝의 은닉 상태는 다음 타임스텝의 뉴런에 완전히 연결된다

두번째 뉴런의 은닉 상태도 마찬가지로 첫번째 뉴런과 두번째 뉴런, 세번째 뉴런에 모두 전달되고(파란색 화살표), 세번째 뉴런의 은닉 상태도 동일하다(검은 화살표)

 

순환층에서 다음 타임스텝에 재사용되는 은닉 상태를 위한 가중치 w_b의 크기는 3*3=9개이다.

 

모델 파라미터의 개수를 계산하려면 가중치에 절편을 더하면 된다

각 뉴런마다 하나의 절편이 있어 이 순환층은 모두 12 + 9 + 3 = 24개의 모델 파라미터를 가지고 있다.

 

순환층은 샘플마다 2개의 차원을 가진다. 하나의 샘플을 하나의 시퀀스(sequence)라고 한다. 시퀀스의 길이가 타임스텝의 길이가 된다

하나의 샘플은 시퀀스 길이와 단어 표현의 2차원 배열이다. 순환층을 통과하면 1차원 배열로 바뀌는데 이 배열의 크기는 순환층의 뉴런 개수에 의해 결정된다.

순환층은 기본적으로 마지막 타임스텝의 은닉 상태만 출력으로 내보낸다

입력된 시퀀스 길이를 모두 읽어서 정보를 마지막 은닉 상태에 압축하여 전달하는 것처럼 볼 수 있다. 

 

순환 신경망도 완전 연결 신경망이나 합성곱 신경망처럼 여러 개의 층을 쌓을 수 있다.

셀의 입력은 샘플마다 타임스텝과 단어 표현으로 이루어진 2차원 배열이어야한다. 첫번째 셀이 마지막 타임스텝의 은닉 상태만 출력해서는 안되고 마지막 셀을 제외한 다른 모든 셀은 모든 타임스텝의 은닉 상태를 출력한다

 

첫번째 셀은 모든 타임스텝의 은닉 상태를 출력하고, 두번째 셀은 마지막 타임스텝의 은닉 상태만 출력한다

 

순환 신경망도 마지막에 밀집층을 두어 클래스를 분류한다. 다중 분류일 경우 출력층에 클래스 개수만큼 뉴런을 두고 소프트맥스 활성화 함수를 사용한다. 이진 분류일 경우 하나의 뉴런을 두고 시그모이드 활성화 함수를 사용한다.

 

마지막 셀의 출력이 1차원이기 때문에 Flatten 클래스로 펼칠 필요가 없이 셀의 출력을 그대로 밀집층에 사용할 수 있다.

 

샘플은 20개의 타임스텝으로 이루어져 있고 각 타임스텝은 100개의 표현 또는 특성으로 이루어져 있다. 이 샘플이 순환층의 셀을 통과하면 모든 타임스텝을 처리하고 난 후의 은닉상태만 출력된다. 이 은닉 상태의 크기는 셀에 있는 뉴런의 개수가 되므로 (10, )이다

샘플마다 셀이 1차원 배열을 출력하기 때문에 합성곱 신경망처럼 Flatten 클래스로 펼칠 필요 없이 바로 출력층에 연결할 수 있다.

728x90