[RNN] RNN

유가연·2022년 2월 10일
0

TIL

목록 보기
20/32

순차데이터

RNN은 CNN과 함께 대표적인 딥러닝 모델. 시계열 데이터 같은 순차 데이터 처리를 위한 모델. RNN이해에는 순차 데이터가 가지는 특징의 이해가 필요. 문장같이 일렬로 이루어진 데이터를 보고 그 다음 무엇이 나올지 예측하는 방식으로 많이 활용.

순서(ORDER)를 가지고 나타나는 데이터. 날짜에 따른 기온 데이터나 단어들로 이루어진 문장 등으로 유명. 데이터 내 각 개체간의 순서가 중요. 사람의 언어는 순서가 바뀌면 뜻이 바뀌기도 함. 딥러닝에서 주로 활용하는 것은 시계열 데이터. 일정한 시간 간격을 가지고 얻어낸 데이터. 연도별 대한민국의 평균 기온, 시간별 주식 가격 기록 등. 시간 자체가 순서를 만듦. 자연어 데이터. 인류가 말하는 언어를 의미. 주로 문장 내에서 단어가 등장하는 순서에 주목.

딥러닝을 활용한 순차 데이터 처리 예시

(1) 경향성 파악 : 주가 예측, 기온 예측, 이외에도 다양한 시계열 특징을 가지는 데이터에 적용 가능
(2) 음악 장르 분석 : 오디오 파일은 본질적으로 시계열 데이터. 음파 형태 등을 분석하여 오디오 파일의 장르를 분석
(3) 강수량 예측 : 구글에서 이미지 처리 기술과 결합하여 주도적으로 연구(MetNet : 위성사진을 보고 구름의 분포를 예측하는 모델. 강수량은 순차데이터로 예측해 결합)
(4) 음성인식 : 음성에 포함된 단어나 소리를 추출. 애플 시리, 구글 어시스턴트. 사람이 말한 단어를 추출해야 하니 자연어처리랑 딥러닝이 결합되어 정확도가 높아짐
(5) 번역기 : 두 언어 간 문장 번역을 수행. 딥러닝의 발전 이후 번역의 자연스러움이 향상. 이미지 처리와 결합하여 실시간 번역도 제공. 구글번역기나 네이버 파파고 등
(6) 챗봇 : 사용자의 질문에 사람처럼 응답하고자 하는 프로그램. 사용자의 질문을 분석 후 질문에 적절한 응답을 생성. 딥러닝이 응답의 규칙을 찾아줘서 가능함

Recurrent Neural Network

❓ 순차데이터에서 fully connected layer를 사용하기 적절하지 않은 이유는?

fc layer는 입력 노드 개수와 출력 노드 개수가 미리 정해야함. 순차 데이터는 하나의 데이터를 이루는 개체 수가 다를 수 있음. 왜냐하면 문장은 모두 서로 다른 개수의 단어로 이루어짐. 또한 fclayer는 순서 고려가 불가능.

recurrent 순환한다.
따라서 순차 데이터 처리를 위한 딥러닝 모델이 등장. rnn의 대표적인 구성 요소로는 hidden state가 있음. 순환 구조를 구현하는 핵심 장치.

  • 입력 데이터 구조

    xn과 같이 데이터의 나열
    xt의 의미는 시계열 데이터에서는 일정 시간 간격으로 나눠진 데이터 개체 하나를 의미하고 자연어 데이터에서는 문장 내의 각 단어를 의미함.

  • 시게열 데이터의 벡터 변환
    입력 데이터의 각 xt는 벡터 형태. 값들로 이루어진 하나의 데이터로 만듦. 시계열 데이터의 경우 각 데이터를 이루는 feature값들을 원소로 하여 벡터로 변환

  • 자연어 데이터의 벡터 변환
    임베딩 : 각 단어들을 숫자로 이루어진 벡터로 변환.
    대표적인 임베딩 기법 : one hot encoding(단어를 하나의 벡터로 변환. 0과 1로만 이루어짐. 1의 위치가 다른걸로 구분하는데 전체 벡터에서 1은 항상 하나만 등장, 단점으로는 단어가 10개면 벡터가 10개, 즉 개수에 따라 벡터가 다 달라지고 비효율적이니 서로 다른 데이터에 다 적용할 수 없어서 단점이 많아 잘 사용되지 않음), word2vec(주어진 단어들을 벡터로 변환하는 기계학습 모델. 그림에서 각 색깔이 값을 의미.이렇게 해서 적절한 벡터를 찾아줌. 단어를 벡터로 바꿔주는 정교한 임베딩 방법이다)

Vanila RNN

가장 기초가 되고 수정이 덜 된 RNN. 가장 간단한 형태의 rnn 모델이라 simple rnn이라고도 함. 내부에 세개의 fc layer로 구성됨.

첫번째 과정.
현재 입력값(xt)에 대한 새로운 hidden state를 계산. 현재 시점의 hidden state를 계산하기 위해서 이전 hidden state의 값을 활용. 이전 층인 ht-1이 첫번째 fc layer를 통과, 현재 시점의 입력값 xt가 두번째 fc layer를 통과. 이 fclayer통과를 수식으로 ht-1 * whh로 표현. 곱한 결과를 더해서 tanh(탄젠트 하이퍼볼릭 함수)에 통과시킴. 이 연산을 수행하면 현재값은 hidden state가 나옴.

? 왜 이 탄젠트 하이퍼볼릭 함수를 사용하니?
컨볼루션 연산 수업을 상기. 컨볼루션 연산은 곱하고 더하는 것이 전부. 이런 연산은 선형 연산. 선형 연산은 딥러닝 학습에 좋지 않아서 활성화 함수를 추가해 비선형성을 추가해준것. 탄젠트 하이퍼볼릭은 활성화 함수인것임.

두번째 과정.
현재 입력값xt에 대한 새로운 출력값 계산. 앞은 동일한데 탄젠트 하이퍼볼릭 이후만 달라짐. 왜냐하면 계산을 위해 앞서 계산한 현재의 hidden state를 사용하기 때문. 여기서 3번째 fc를 사용하고 이미 앞에서 탄젠트 하이퍼볼릭을 거쳤지 때문에 따로 활성화 함수를 사용하지 않음.

첫번째 들어오는 값은 이전 hidden state가 없기 때문에 모델이 가지고 있는 것을 사용. 모델이 들어오는 각 시점의 데이터 xt마다 앞서 설명한 연산 과정을 수행. 입력값에 따라 반복해서 출력값과 hidden state를 계산. 그림에서 rnn은 펼쳐져 있지만 동일한 rnn을 사용하는데 시간순에 따라 늘어놓은 것 뿐. recurrent가 붙은 이유는 이전 시점에 생성된 hidden state를 다음 시점에 사용하기 때문이라고 할 수 있다.

vanila rnn의 의의

  • hidden state의 의의
    특정 시점 t까지 들어온 입력값들의 상관관계난 경향성 정보를 압축해서 저장.
    모델이 내부적으로 계속 가지는 값이므로 일종의 메모리(memory)로 볼 수 있음. cnn은 없었음.
    컴퓨터의 메모리와 일맥상통
  • parameter sharing(모든 시점에서 같은 모델과 hidden state사용. )
    hidden state 출력값 계산을 위한 fclayer를 모든 시점의 입력값이 재사용.
    fclayer 세개가 모델 파라미터의 전부.
    모든 시점에서 같은 모델과 hidden state사용.

vanila rnn의 종류

: 모델 구성이 아니라 입력값과 출력값의 구성에 따라 여러 종류의 rnn이 존재.

다대일 many to one : 출력값을 한 시점의 값만 사용
다대다 many to many : 여러 시점의 입력값과 여러 시점의 출력값을 사용. 입력값과 출력값에 사용하는 시점의 개수는 같을 수도 다를 수도 있음


인코더-디코더 : 입력값들을 받아 특정
인코딩한 후 이 hidden state로 새로운 출력값을 만드는 구조.
첫번째 모델에서는 입력값만 받아서 hidden state만 계산. 그리고 나온 최종 히든 스테이트를 새로운 rnn모델에 전송. 앞선 rnn과는 다른 모델. 새로운 rnn은 히든스테이트를 통해 출력값만 계산.

vanila rnn의 문제점

rnn은 출력값이 시간 순서에 따라 생성. 이 때 모델 학습을 위한 손실 함수는 각 시간에 대해 따로 구함. 그 후 오차역전파 알고리즘이 이 시간에 따라 작동. 구해진 각각의 손실 함수를 다 더해 하나의 손실 함수를 만든 후 역전파 실행. 이게 또 시간에 따라 작동하기 때문에 이것을 back-propagation through time(bptt)라고 함. 요즘은 역전파 알고리즘이 시간에 따라 작동. 그래서 (1) 입력값의 길이가 매우 길어질 경우 초기 입력값과 나중 출력값 사이에 전파되는 기울기 값이 매우 작아질 가능성이 높은 기울기 소실(vanishing gradient) 문제가 발생하기 쉬움. 다른 말로 장기의존성(long term dependency)을 다루기가 어려움. 먼 자료간의 의존성. 쉽게 말해 엄청 긴 문장에서 마지막에서 말한 단어의 선택에 영향을 줄 수 있는 것을 장기의존성이라고 말할 수 있음. vanila rnn은 기울기 소실 문제로 이러한 의존성을 파악하기가 매우 어려워짐.

? 기울기 소실로 위험한 모델은 resnet도 있었어!

profile
유가연

0개의 댓글