1.도입
지금까지는 feed forward 유형의 신경망을 보았다. 하지만 이러한 경우 시계열 데이터에서 문제가 발생한다. 따라서 순환 신경망인 recurrent neural network를 통해서 문제를 해결해보자. 이후 rnn의 구조와 구현을 알아본다'
2.문제점
이전에 말한 것처럼 word2vec을 확률의 관점에서 바라볼 수 있고 덕분에 아래와 같이 표현할 수 있다.
이렇게 맥락으로부터 타깃을 알아내는 것은 어디에 사용될 수 있을까? 언어모델에서 사용할 수 있다.
language model은 단어 나열에 확률을 부여해서 특정 단어 시퀀스에 대해서 그 시퀀스가 일어날 확률을 확인한다. 즉, 문장이 얼마나 자연스러운가를 본다.
예를 들어서 i say goodbye하면 확률이 높지만, you say good die라면 확률이 낮아진다.
이를 응용하여 질의응답에서 어떤 답변이 가장 자연스러운 흐름인지 확률을 통해서 답변을 내놓을 수 있다.
그런데, language model에서 가장 중요한 점은 확률이 타깃 단어보다 왼쪽에 있는 모든 단어를 맥락으로 했을 때 나타난다는 것이다.
w1, w2, ..., wm이라는 m개의 단어로 된 문장을 생각해보면 매우 많다.
앞서 우리가 배운 cbow 모델을 language model로 쓰게 되면 2가지 문제점이 발생한다.
첫번째는 윈도우의 크기고 두번째는 순서의 무시다.
예를 들어서, tom was watching tv in his room, mary came into the room. mary said hi to ????
????에 들어갈 단어는 tom일 확률이 매우 높은데 cbow는 2window를 통해서 tom을 못볼 수 있고, 윈도우 사이즈를 크게해서 본다고 해도 모델의 구조를 생각해보면 입력층의 벡터를 평균내서 계산하기때문에 앞의 단어들의 순서를 모두 무시하게 된다. (you, say)와 (say, you)를 같게 본다. 그렇다면 성능이 안좋을 확률이 높을 것이다.
이를 해결하기 위해서 처음에는 벡터들을 concatenate하는 방법을 생각했는데 이렇게 하면 벡터가 너무 길어지게 되고 매개변수가 많아진다. 따라서 최종 해결책인 RNN을 이용하게 되었다.
정리하자면 기존의 word2vec모델을 사용하면 맥락파악이 힘들어 시계열 데이터를 사용한 예측에 문제가 있었고, 이를 해결하기 위해서 RNN모델을 사용한다. word2vec은 자연어의 분산표현을 얻기위해서 사용된다고 기억하자.
3. RNN
순환해서 과거의 정보를 기억하는 동시에 최신 데이터로 갱신되는 모델이다.
문장을 단어로 바꿔서 생각해보면 각 단어를 단어벡터로 바꿔서 x1, x2, x3,...,xt 로 볼 수 있고, 이를 시계열의 입력데이터로 사용할 수 있다.
구조는 책을 참고하도록 하고 공식을 보면
여기서 h를 hidden state vector라고 표현한다.
-backpropagation through time == bptt
rnn의 기울기를 구하는 방법
솔직히 정확히 모르겠지만 너무 긴 시계열 데이터를 만나면, BPTT를 함에 있어서 메모리가 많이 필요하고 기울기가 불안정해지는 문제점이 있다.
그래서 truncated BPTT를 사용한다. 블록단위로 학습을 하게 된다.
원리는 우리가 아는 것과 같지만 두 가지를 기억해야한다.
1) 데이터를 순서대로 입력하기
2) 미니배치별로 데이터를 제공하는 시작 위치를 옮기기
4. RNN 구현
한 개의 RNN을 TIMERNN으로 바꾼다. T개 단계분의 작업을 한꺼번에 처리하는 계층이다.
그래서 먼저 RNN을 구현하고, 그 다음 TIME RNN을 구현해보자.
timeRNN을 사용하면 hidden state의 인계하는 작업을 하지 않아도 되는 장점이 생긴다. 왜냐면 timeRNN이 관리해주기 때문이다.
약간 공유하는 전역변수 느낌으로? 그리고 stateful로 hidden state를 인계받을지 정한다. 중요한 변수네.
솔직히 backward는 이해가 잘 안가는데 그냥 그 위에서 내려오는 값과 옆에서 오는 값의 더해서 그걸로 갱신을 계속 해주는 것 같음!
5. RNNLM
지금까지 입력된 단어를 기억하고 그것을 바탕으로 다음에 출현할 단어를 예측한다. 이것을 가능하게 해주는 것이 RNN의 존재!
평가는 perplexity를 사용하는데 이는 뭐냐면은 '확률의 역수' 혹은 '분기수'로 생각할 수 있다.
예를 들어서 say가 나올 확률이 0.8 그리고 goodbye가 나올 확률이 0.2라고 하면 역수 취하면 1.25와 5가 나오는데 1.25는 1개로 귀결된다는 것을 말하고 5는 5개로 가능성이 있다는 것을 말해서 1개로 귀결된 경우가 더 좋은 경우라고 할 수 있다. 즉, 모델의 perplexity가 낮을 수록 좋은 평가를 받는다.
'이제는 사용하지 않는 공부방 > Artificial intelligence' 카테고리의 다른 글
인공지능 (0) | 2021.07.03 |
---|---|
[머신러닝] cross validation, shuffle (0) | 2021.06.29 |
[밑바닥부터 시작하는 딥러닝2] word2vec 개선 (0) | 2021.06.20 |
[tensorflow] data에 대해서 알아보자! (0) | 2021.06.16 |
[머신 러닝] logistic regression 로지스틱 회귀 (0) | 2021.06.11 |