RNN을 이용한 글자 수준의 언어 모델(Character-level language model)

1. language model

 

주어진 token을 바탕으로 다음 token을 예측하는 task

 

character-level이라는 것은 character sequence에서 이전 character를 바탕으로 다음 character가 무엇인지 예측하는 task

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------

 

decoder 시작할 때는 생성하고자하는 문장의 단어에 앞서 start token이라는 별도의 token이 들어간다.

 

예를 들어 ‘난 널 사랑해’를 번역한다고 하자.

 

I love you라는 문장을 생성하도록 만들고 싶은 것인데

 

<start> I love you를 순차적으로 넣으면 I love you <end>라는 문장을 차례대로 생성하게 만드는 것이다.

 

decoder 입장에서는 처음에 무슨 단어를 생성할지 모르므로 I라는 단어를 바로 넣어줄 수 없기 때문에

 

<start token>이라는 문장의 시작을 나타내는 special token을 넣어서 생성을 시작하라고 명시해준다.

 

생성이 끝날 때도 <end token>이 나오면 생성을 멈추는 것.

 

그래서 학습시킬 때 <start> I love you를 넣으면 I love you <end>를 생성하도록 학습시켜서

 

다음 단어를 순차적으로 예측하도록 학습시키는데 이러한 task를 language modeling이라고 부른다.

 

 

학습시킨 language model을 test할 때는 어떻게 할까?

 

사전 구축된 vocabulary에서 현재 생성하고 있는 단어 다음으로 가장 나올 확률이 높은 단어를 순서대로 예측해준다.

 

예를 들어 ‘나는 널 싫어해’를 번역한다고 해보자.

 

encoder에 ‘나는 널 싫어해’를 넣어주고 decoder에는 start token을 넣어주면

 

encoder에서 이해한 맥락을 바탕으로 I를 먼저 뽑아내고

 

이 I와 구축된 Vocabulary, encoder에서 이해한 맥락을 바탕으로 hate를 뽑아낸다.

 

다음 hate와 vocabulary, encoder에서 이해한 내용을 바탕으로 you를 뽑아내고 마지막으로 end sign을 뽑아낸다.

 

이러한 선택을 잘 할 수 있도록 model을 학습시키는 것이 language modeling이다.

 

당연하지만 사전 구축된 vocabulary의 크기는 i,hate,you만 있는 것이 아니고 제한이 없다.

 

 

2. 예시로 이해하는 character-level language model

 

1) ‘hello’라는 word 문자열에서 unique한 character를 바탕으로 사전을 구축

 

>> [‘h’,’e’,’l’,’o’]

 

2) 사전 크기만큼의 각 character의 one-hot vector

 

 

3) RNN을 구축하여 각 input인 h,e,l,o의 one hot vector를 넣어 hidden state vector를 계산한다

 

 

여기서 중요한 점은 많은 경우 언급이 안되는데 x1에서 h1을 계산하기 위해 h0라는 가상의 default vector [0,0,0,0]도 주입해야한다.

 

그래야 계산이 되기 때문이다.

 

-------------------------------------------------------------------------------------------------------------------

 

h0에 [0,0,0,0]을 넣어야하냐 아니면 적절한 최적치를 넣어야하냐?

 

h1에는 x1의 정보만 적절하게 담고 h0는 빈 그릇 느낌으로 사용하는거라 [0,0,0,0]만 넣으면 적절하다

 

h0도 학습을 해야하는거라면 누구나 이거에 대해 언급했겠지

 

----------------------------------------------------------------------------------------------------------------------

 

Vanilla RNN에서 활성화함수로 tanh()를 제안해서 일반적으로 활성화함수는 tanh()로 계산한다.

 

 

4) 각 layer에서 예측을 수행해야할때는 현 시점의 hidden vector를 output layer에 넣고 prediction을 수행한다.

 

특히 굳이 softmax를 취하지 않아도 가장 큰 값을 가지는 차원에 대응하는 문자로 예측하면 된다.

 

prediction한 값은 다음 step의 input x로 들어간다.

 

이러한 방식으로 무한한 길이의 sequence input도 다룰 수 있게 되는 것이다.

 

재밌는 점은 3번째와 4번째에 같은 l이 들어가는데도 예측 결과는 l과 o로 다르게 나올 수 있게 설계가 되어야 한다.

 

어떻게 가능할까?

 

이전의 정보를 가진 hidden vector가 input으로 같이 들어가기 때문이다.

 

 

당연하지만 초반에는 예측값이 원하는 결과로 나오지 않음

 

그렇지만 정답을 알고 있기 때문에 정답이 나오도록 loss를 최소화하는 행렬 가중치 Wxh, Whh, Why를 조정해나가는 것이다.

 

또 하나의 예시로 주식 가격을 예측하는 모형도 위와 같이 만들 수 있다.

 

1일의 주가를 input으로 넣어 종가를 예측하고

 

이것을 2일의 종가를 예측하기 위한 input으로 넣어 2일의 종가를 예측하고

 

이 과정을 반복하여 다음 날 주식 가격을 예측한다.

 

 

3. 예시로 알아보는 character-level RNN

 

Write shakespeare’s plays by using RNN

 

 

그림과 같은 희곡을 input으로 넣어 학습을 시킨 뒤에 생성을 시켜보면 실제로 이렇게 쓸수있음

 

 

학습을 시키면 시킬수록 사람이 읽어볼정도로 더욱 글을 잘 쓰게됨

 

학습결과로 쓴 RNN의 글

사전을 구축하면서 :이나 \n이나 ,도 들어가고 이것들도 예측을 한다.

 

사람이름은 대문자로 쓸 수 있어야하고

 

:으로 끝나면 그 뒤로는 한줄을 띄고 대사를 생성해야한다.

 

학습하면서 이런 패턴을 이해한다는 점이 중요하다

 

 

write paper by using RNN

 

논문을 학습하면 RNN이 실제로 논문도 써내려간다

 

특히 논문은 수식이 있는데 latex언어를 이용하여 수식을 구성할 수 있다.

 

latex언어는 문자를 이용해서 수식을 구성한다

 

https://bskyvision.com/821

 

 

 

기본 영어문자 뿐만 아니라 수식을 표현하는 latex언어를 문자로 인식하여 예측할 수 있어야한다.

 

마찬가지로 단락을 구분하는 패턴, lemma로 구분하는 패턴 등도 모두 이해하여 예측을 한다

 

 

write c code by using RNN

 

 

RNN이 공백이나 각종 특수문자 모두 학습하여 패턴을 전부 예측한다

 

 

4. 실제 RNN 사용

 

nn.RNN()으로 사용가능

 

초기 hidden vector h0는 0으로 초기화한 것에 주목

 

 

TAGS.

Comments