'인공지능/Deeplearning'에 해당되는 글 2건

RNN

인공지능/Deeplearning 2017. 4. 10. 22:34

아래 내용들은 위 블로그들의 내용을 정리한 것입니다.

  • RNN 기반의 언어 모델
  • 언어 모델은 두 가지로 응용될 수 있음
    1. 실제 세상에서 어떤 임의의 문장이 존재할 확률이 어느 정도인지에 대한 스코어를 매기는 것
      • 문장이 문법적으로나 의미적으로 어느 정도 올바른지 측정할 수 있도록 해주고, 보통 자동 번역 시스템의 일부로 활용됨
    2. 새로운 문장의 생성
      • 셰익스피어의 소설에 언어 모델을 학습시키면 셰익스피어가 쓴 글과 비슷한 글을 네트워크가 자동으로 생성

RNN이란?

  • 기존의 신경망 구조에서는 모든 입력(과 출력)이 각각 독립적이라고 가정했지만 대부분의 경우는 이에 적합하지 않음
  • 순차적인 정보를 처리
  • 동일한 태스크를 한 시퀀스의 모든 요소마다 적용
  • 출력 결과는 이전의 계산 결과에 영향
  • RNN은 현재까지 계산된 결과에 대한 "메모리" 정보를 갖고 있다고 볼 수도 있음

- x_t 는 시간 스텝(time step) t에서의 입력값임 - s_t 는 시간 스텝 t에서의 hidden state. 네트워크의 '메모리' 부분 -

- 이 때 f는 보통 tanh 나 ReLU 가 사용됨 - 첫 hidden state를 계산하기 위한 s_t-1 은 0으로 설정됨 *** - s_t는 과거의 시간 스텝들에서 일어난 일들에 대한 정보를 전부 담고 있고, 출력값 o_t는 오로지 현재 시간 스텝 t의 메모리에만 의존 - 실제 구현에서는 너무 먼 과거에 일어난 일들은 잘 기억하지 못함 *** - 모든 시간 스텝에 대해 파라미터 값을 전부 공유하고 있음 (위 그림의 U, V, W) - 이는 RNN이 각 스텝마다 입력값만 다를 뿐 거의 똑같은 계산을 하고 있다는 것을 보여줌 - 이는 학습해야 하는 파라미터 수를 많이 줄여줌 *** - 위 다이어그램에서는 매 시간 스텝마다 출력값을 내지만, 문제에 따라 달라질 수 있음 - 예를 들어, 문장에서 긍정/부정적인 감정을 추측하고 싶다면 굳이 모든 단어 위치에 대해 추측값을 내지 않고 최종 추측값 하나만 내서 판단하는 것이 더 유용할 수도 있음 - 마찬가지로, 입력값 역시 매 시간 스텝마다 꼭 다 필요한 것은 아님 RNN에서의 핵심은 시퀀스 정보에 대해 어떠한 정보를 추출해 주는 hidden state이기 때문

RNN으로 할 수 있는 일

  • 가장 많이 사용되는 RNN의 종류는 LSTM
  • hidden state를 계산하는 방법이 조금 다를 뿐 나머지는 거의 같음
  1. 언어 모델링과 텍스트 생성
  • 주어진 문장에서 이전 단어들을 보고 다음 단어가 나올 확률을 계산해주는 모델
  • 어떤 문장이 실제로 존재할 확률이 얼마나 되는지 계산
  • 부수적인 효과로 생성(generative) 모델을 얻을 수 있음
  • 문장의 다음 단어가 무엇이 되면 좋을지 정하면 새로운 문장을 생성할 수 있음
  • 네트워크를 학습할 때에는 시간 스텝 t에서의 출력값이 실제로 다음 입력 단어가 되도록 o_t=x_{t+1}로 정해줌
  1. 자동 번역 (기계 번역)
  • 입력이 단어들의 시퀀스라는 점에서 언어 모델링과 비슷하지만, 출력값이 다른 언어로 되어있는 단어들의 시퀀스임
  • 입력값을 전부 다 받아들인 다음에서야 네트워크가 출력값을 내보냄
  • 언어마다 어순이 다르기 때문에 대상 언어의 첫 단어를 얻기 위해 전체를 봐야할 수도 있음
  1. 음성 인식
  • 사운드 웨이브의 음향 신호(acoustic signal)를 입력으로 받아들이고, 출력으로는 음소(phonetic segment)들의 시퀀스와 각각의 음소별 확률 분포를 추측할 수 있음
  1. 이미지 캡션 생성
  • CNN과 RNN을 함께 사용하여 임의의 이미지를 텍스트로 설명해주는 시스템을 만들 수 있음

RNN 학습하기

  • 학습 과정은 기존의 뉴럴넷과 크게 다르지 않음
  • 다만 time step 마다 파라미터를 공유하기 때문에 기존의 backpropagation을 그대로 사용할 수는 없음
  • 대신 Backpropagation Through Time (BPTT)라는 알고리즘을 사용함(추후 다룰 예정)
  • vanishing/exploding gradient라는 문제 때문에 긴 시퀸스를 다루기 어려움
  • LSTM 과 트릭 등을 통해 이러한 문제점 해결

RNN - 확장된 모델들

  1. Bidirectional RNN
  • 시간 스텝 t에서의 출력값이 이전 시간 스텝 외에, 이후의 시간 스텝에서 들어오는 입력값에도 영향을 받을 수 있다는 아이디어에 기반
  • 출력값은 앞, 뒤 두 RNN의 hidden state에 모두 의존하도록 계산됨

  1. Deep (Bidirectional) RNN
  • 위의 구조에서 layer 의 개수가 늘어남
  • 학습할 수 있는 capacity가 늘어나며 그만큼 필요한 학습 데이터 또한 많이 필요함

  1. LSTM
  • 뉴런 대신에 메모리 셀이라고 불리는 구조 사용
  • 입력값으로 이전 state h_t-1와 현재 입력값 x_t를 입력으로 받는 블랙박스 형태(???)
  • 메모리 셀 내부에서는 이전 메모리 값을 그대로 남길지 지울지 정하고, 현재 state와 메모리 셀의 입력값을 토대로 현재 메모리에 저장할 값을 계산
  • 긴 시퀀스를 기억하는데 매우 효과적


'인공지능 > Deeplearning' 카테고리의 다른 글

weight 초기화  (0) 2017.03.06
블로그 이미지

NCookie

,

딥러닝에서는 weight 를 학습하여 모델을 최적화합니다.


weight 의 초기화르 어떻게 하느냐에 따라 학습 속도가 달라지는데, 자칫 잘못하면 모델 자체의 성능이 굉장히 떨어질 수 있습니다.


이 문제 때문에 Neural Winter 가 찾아왔었습니다. (용어가 정확히 맞는지는 잘 모르겠네요.)


Neural Winter 에는 weight 초기화 문제 외에도 다른 요인들이 겹쳐서 찾아오기는 했지만 중요하다는 사실은 부정할 수 없을 것입니다.


어쨌든 Godfather of Deeplearning 이라고 불리는 Jeffrey Hinton 교수님께서 기존 뉴럴넷의 문제들을 해결했는데 그 중 weight 초기화도 있었습니다.


그 분께서 제시한 방법은 RBM(Restricted Boltzmann machine)을 이용하여 network 의 weight 를 초기화하는 것이었습니다. 이 방법을 사용한 뉴럴넷을 Deep Belief Net 라고 부른다고 합니다.



그 이후로 많은 논문들이 나오면서 훨씬 성능이 좋은 initialization 들이 나왔습니다. 저 같은 사람들은 그런 것들을 모두 읽어보고 이해할 필요는 없고, 어떤 상황에서 사용하는 것이 적합할지 알기만 하면 될 것입니다. 왠만한건 Tensorflow 같은 프레임워크에서 쉽게 사용할 수 있도록 지원하기 때문입니다.


initialization 에는 여러 종류가 있는데 요즘 사용하는 것들 중 대표적으로 Xavier / He initialization 등이 있습니다. 자세한 내용은 나중에 다시 공부해서 추가하겠습니다.


# Xavior initialization

W = np,random.randn(fan_in, fan_out) / np.sqrt(fan_in)


참고로 weight 를 0으로 초기화하는 것은 절대로 안 됩니다. cost 를 줄이는 과정에서 weight 를 미분하게 되는데 0이면 값이 변하지 않기 때문입니다.



마지막으로 중요한 것은, 정해진 초기화 방법은 없다는 것입니다. 문제, 상황 등에 따라 적합한 알고리즘들이 다르기 때문입니다.



참고

https://www.youtube.com/watch?v=4rC0sWrp3Uw&feature=youtu.be

'인공지능 > Deeplearning' 카테고리의 다른 글

RNN  (0) 2017.04.10
블로그 이미지

NCookie

,