마케팅 팀장은 이번 이벤트의 후기를 분석하려고 했다.
하지만 너무 많은 양이라 할 엄두가 나지 않았다.
그래서 Pupbani를 불러 "후기 댓글들을 분석해 긍정, 부정을 판단할 수 없을까?"라고 했다.
Pupbani는 전에 배운 순환 신경망이 떠올라 알겠다고 대답한 후 자신의 자리로 돌아 갔다.
순차 데이터
순차 데이터(sequential data)는 텍스트나 시계열 데이터(time series data)와 같이 순서에 의미가 있는 데이터를 말한다.
우리가 여태까지 사용했던 데이터는 순서에 상관이 없었기에 골고루 섞어서 사용하기도 했다.
하지만 순차 데이터는 순서를 유지 하면서 신경망에 넣어야하기 때문에 까다롭다.
그래서 순차 데이터를 사용하기 위해서는 이전에 입력한 데이터를 기억하는 기능이 필요하다.
예시
- "별로지만 추천해요"가 입력 될 때 "별로지만"을 기억해야 이 댓글 무조건 적으로 긍정적이라고 판단하지 않는다.
완전 연결 신경망이나 합성곱 신경망 같은 경우는 이러한 기억 장치가 없다.
- 하나의 샘플(또는 하나의 배치)를 사용하여 정방향 계산을 수행하고 나면 그 샘플은 버려지고 다음 샘플을 처리할 때 재사용 하지 않는다.
이렇게 입력 데이터의 흐름이 앞으로만 전달 되는 신경망을 피드포워드 신경망(FFNN, Feedforward Neural Network)라고 한다. (완전 연결 신경망, 합성곱 신경망)
다음 샘플을 위해서 이전 데이터가 신경망 층에 순환될 필요가 있는데 이러한 신경망을 순환 신경망(RNN)이라고 한다.
순환 신경망(RNN, Recurrent Neural Network)
일반적인 완전 연결 신경망과 거의 비슷하나 이전 데이터의 처리 흐름을 순환하는 고리 하나가 추가된다.
뉴런의 출력이 다시 자기 자신으로 전달 된다. 즉 어떤 샘플을 처리할 때 바로 전 데이터를 재사용하는 것 이다.
ex. A, B, C를 처리하는 순환 신경망의 뉴런 동작
이렇게 샘플을 처리하는 한 단계를 타임스텝(timestep)이라고 한다.
순환 신경망은 이전 타임스텝의 샘플을 기억하지만 타임스텝이 오래될수록 순환되는 정보는 희미해 진다.
순환 신경망은 특별히 층을 셀(cell)이라고 부른다.
한 셀에는 여러개의 뉴런이 있지만 완전 연결 신경망과 달리 1개의 셀로 층을 표현한다.
또 셀의 출력은 은닉 상태(hidden state)라고 부른다.
부르는 이름은 다르지만 기본적인 동작과 구조는 동일하다.
- 입력에 어떤 가중치를 곱하고 활성화 함수를 통과하여 다음층으로 보냄.
순환 신경망은 층의 출력(==은닉 상태)을 다음 타임 스텝에 재사용한다.
일반적으로 은닉층의 활성화 함수는 하이퍼볼릭 탄젠트(Hyperbolic Tangent) 함수인 tanh^2가 많이 사용된다.
tanh 함수는 -1 ~ 1 사이의 범위를 가진다.
다른 신경망과 마찬가지로 순환 신경망 그림에도 번거로움을 피하기 위해 활성화 함수를 표시하지 않는 경우가 있다.
하지만 순환 신경망에서도 활성화 함수가 반드시 필요하다.
완전 연결 신경망에서 뉴런은 입력과 가중치를 곱하고 순환 신경망은 앞의 것을 포함하여 이전 타임스텝의 은닉 상태에 곱해지는 가중치를 사용한다.
즉 순환 신경망의 셀은 입력, 이전 타임스텝의 은닉 상태를 사용해 현재 타임스텝의 은닉 상태를 만든다.
위의 그림을 타임스텝으로 펼치면 다음과 같다.
타임스텝1에서 셀의 출력 h1이 타임스텝2의 셀로 주입, 이때 wh와 곱해진다.
타임스텝2에서 셀의 출력 h2이 타임스텝3의 셀로 주입, wh와 곱해진다.
여기서 알 수 있듯이 모든 타임스텝에서 사용되는 가중치는 wh 하나다.
가중치 wh는 타임스텝에 따라 변화되는 뉴런의 출력을 학습한다.
맨처음 사용된 이전 은닉 상태 h0은 어떻게 구할 수 있을까?
맨 처음 샘플을 입력할 때는 이전 타임스텝이 없다.
그러므로 h0은 모두 0으로 초기화 한다.
셀의 가중치와 입출력
순환 신경망의 셀에서 필요한 가중치를 계산 해보자.
예시 : 순환층에 입력되는 특성의 개수가 4개이고 순환층의 뉴런이 3개라고 가정해 보자.
먼저 wx의 크기를 구해보자.
가중치 wx의 크기 = 입력층의 뉴런 개수 X 순환층의 셀 개수
이제 순환층에서 다음 타임스텝에 재사용되는 은닉 상태를 위한 가중치 wb의 크기를 구해보자.
첫 번째 뉴런(r1)
- 은닉 상태가 다음 타임스텝에 재사용될 때 첫 번째 뉴런과 두 번 째 뉴런, 세 번째 뉴런에 모두 전달 한다.
두 번째 뉴런(r2)
- 첫 번째 뉴런과 두번 째 뉴런, 세 번째 뉴런에 모두 전달 한다.
세 번쨰 뉴런(r3)
- 첫 번째 뉴런과 두 번째 뉴런, 세 번째 뉴런에 모두 전달 한다.
따라서 이 순환층에서 은닉 상태를 위한 가중치 wh = 3 x 3 = 9
가중치를 모두 구했으니 모델 파라미터 개수를 계산해보자.
순환층의 각 뉴런 마다 하나의 절편(3개)이 있다.
모델 파라미터 개수 = 가중치(wx + wh) + 절편 = 12 + 9 + 3 = 24
순환층의 입력과 출력에 대해 생각해보자.
합성곱 층의 입력은 전형적으로 하나의 샘플이 3개의 차원(너비, 높이, 채널)을 가진다.
입력이 합성곱 층과 풀링 층을 통과하면 3개의 차원이 달라지지만 차원의 개수는 유지되었다.
순환층은 일반적으로 샘플마다 2개의 차원을 가진다.
보통 하나의 샘플을 하나의 시퀀스(sequence)라고 한다.
시퀀스 안에는 여러 개의 아이템이 들어 있고 시퀀스의 길이가 바로 타임스텝 길이가 된다.
예시: "I am a boy"라는 문장은 4개의 단어로 이루어져 있고 각 단어를 3개의 어떤 숫자로 표현한다고 가정
이런 입력이 순환층을 통과하면 두 번째, 세 번째 차원이 사라지고 순환층의 뉴런 개수만큼 출력된다.
하나의 샘플은 시퀀스 길이(여기에서 단어 개수)와 단어 표현의 2차원 배열이다.
순환층을 통과하면 1차원 배열로 바뀐다.
이 1차원 배열의 크기는 순환층의 뉴런 개수에 의해 결정된다.
순환층은 기본적으로 마지막 타임스텝의 은닉 상태만 출력으로 내보낸다.
그림을 보면 마치 입력된 시퀀스 길이를 모두 읽어서 정보를 마지막 은닉 상태에 압축하여 전달하는 것처럼 볼 수 있다.
순환 신경망도 여러 개의 층을 쌓을 수 있다.
순환층이 반복될 때, 마지막 셀을 제외한 다른 모든 셀은 모든 타임스텝의 은닉 상태를 출력한다.
- 첫 번째 셀 : 모든 타임스텝의 은닉 상태를 출력
- 두 번째 셀 : 마지막 타임스텝의 은닉 상태만 출력
마지막으로 출력층의 구성을 알아보자.
합성곱 신경망과 마찬가지로 순환 신경망도 마지막에 밀집층을 두어 클래스를 분류한다.
- 다중 분류 : 출력층에 클래스 개수만큼 뉴런을 두고 소프트맥스 활성화 함수를 사용한다.
- 이진 분류 : 하나의 뉴런을 두고 시그모이드 활성화 함수를 사용한다.
순환 신경망은 마지막 셀의 출력이 1차원이기 때문에 Flatten 층이 필요 없다.
'AI > 딥러닝(Deep Learning)' 카테고리의 다른 글
[딥러닝/DL]9. LSTM과 GRU 셀 (0) | 2022.12.09 |
---|---|
[딥러닝/DL]8. 순환 신경망으로 IMDB리뷰 분류하기 (1) | 2022.12.08 |
[딥러닝/DL]6. 합성곱 신경망의 시각화 (0) | 2022.12.08 |
[딥러닝/DL]5. 합성곱 신경망을 사용한 이미지 분류 (1) | 2022.12.08 |
[딥러닝/DL]4. 합성곱 신경망 - 구성요소 (0) | 2022.12.07 |