3주차(1) - Character-Aware Neural Language Models

2019. 1. 23. 14:22풀잎스쿨 NLP Bootcamp

이 포스트는 다음 논문을 참고해서 작성했습니다.

참고자료: (이일구님 발표자료) https://github.com/modulabs/NLP-bootcamp/blob/master/1st/week03/Character-Aware%20Neural%20Language%20Models_%EC%9D%B4%EC%9D%BC%EA%B5%AC.pdf

참고자료2: https://github.com/YBIGTA/DeepNLP-Study/wiki/Character-Aware-Neural-Language-Model(2016)

논문링크: https://arxiv.org/pdf/1508.06615.pdf

내용 요약

  1. Convolutional Neural Network를 이용하여 Character-level의 Input을 사용하여 Word-level의 Language Model을 만드는 방법을 제시
    • 이를 위해서 Affine Transformation을 사용
  2. Semantic 의미를 파악/분석하기 위해서 Highway Network를 사용
  3. 이 논문에서 제시한 Language Model은 형태소가 많은 언어에 유리함
    • 여기서는 아랍어, 체코어, 독일어, 스페인어, 러시아어, 프랑스어를 대상으로 실험 진행

내용 상세

이 논문에서 가장 큰 Contribution은 Character-level input을 통해서 Word-level Language Model을 구축하는 방법을 제시했다는 점이다. 이를 위해서 Convolutional(ConvNet) Layer의 output을 Affine Transformation을 통해 변환하는 방식을 사용한다.


모델은 크게 두 부분으로 나눠볼 수 있는데, Concatenation of character embveddings (Lookup Layer)부터 Highway Network까지에 해당되는 Word-embedding by Character-aware CNN, 그리고 LSTM(RNN)부터 마지막 Output까지에 해당되는 Language Model 부분으로 나눠볼 수 있다. LSTM을 통한 Language Model을 구축하는 방식은 다른 논문에서도 많이 거론되고 있고, 또 생각보다 많이 흔한 방법이다. 따라서 Word-embedding by Character-aware CNN부분이 이 논문의 contribution이라고 할 수 있을 것이다.




일단 Lookup Layer부터 시작을 해보자. absurdity라는 단어를 각각의 글자로 따로 분리하고 Embedding을 한다면 (sentence length x embedding size)크기의 Matrix(행렬)가 나올 것이다. 이렇게 나온 input에 ConvNet Layer를 이용하여 각각의 Filter를 적용시켜 준다. 이렇게 되면 다음과 같은 결과를 보일 것이다. (아래 결과는 모두 No Padding, Stride 1로 고정한다)


Filter Size 2일 경우: 9(absurdity 글자수) - 2(Filter 크기) + 1 = 8 // Filter 갯수: 2 + 1 = 3

Filter Size 3일 경우: 9 - 3 + 1 = 7 // Filter 갯수: 3 + 1 = 4

Filter Size 4일 경우: 9 - 4 + 1 = 6 // Filter 갯수: 4 + 1 = 5


이를 각각 다시 Sequence-wise방향으로 Max-over-time pooling을 해준다면 다음과 같은 결과가 나오게 된다


Filter Size 2: Length 3의 Output (3 Filters)

Filter Size 3: Length 4의 Output (4 Filters)

Filter Size 4: Length 5의 Output (5 Filters)


3 + 4 + 5 = 12만큼의 길이를 가지게 된다.


이 길이는 단어의 길이가 아닌 각 Filter의 갯수에 의해 결정되게 되므로, Max-over-time Pooling을 거치고 난 Output의 길이는 항상 12로 고정되게 된다. 따라서 Highway Network에 들어가는 Input의 길이는 항상 12로 고정될 것이다. 실제 모델에서 사용할 수 있는 필터의 갯수는 100개 ~ 1000개로 언급하고 있다.


이러한 구조에서 Highway Network는 마치 Residual Connection과 같은 역할을 하게 되는데, 다음과 같은 공식으로 표현할 수 있다.

    =


여기서 = 부분은 transform gate, 그리고 (1 - t)부분은 carry gate라고 한다. Transform gate를 잘 살펴보면, 한쪽은 g로 (임의로) 구성되는 nonlinear 함수, 그리고 t는 Affine Transformation(Fully Connected)을 거쳐 Sigmoid가 적용되는 부분인 것을 알 수 있는데, 다시 수식 전체를 보면 한쪽은 t가 그대로 들어가고, 다른 한쪽(y)은 (1-t)만큼 들어가고 있는 것을 볼 수 있다. 여기서 t는 Vector로, 각 Embedding마다의 Transform의 Output과 원래 Output의 비율을 사용한다고 이해하면 될 것이다.


현재는 이러한 방식보다 Self-Attention을 통한 방식이 더 주목받고 있으며, 그렇다고 해서 Highway Network방식이 쓰이지 않는다는 이야기 정도의 사족을 붙일 수 있겠다.


모델을 평가하는 방법도 알아 둘 필요가 있는데, 여기서는 Perplexity를 기준으로 모델의 성능을 평가하고 있다. 여기서 Perplexity는 다음과 같이 계산하고 있다. (낮은 점수가 좋은 성능을 보이는 것)


=


여기서 T는 예측시에 사용되는 Sequence의 길이, 그리고 NLL은 Negative Log-Likelihood로 Test set대상으로 계산되는 Loss값이다. 이 모델의 Loss는 NLL을 사용하고 있으며, 학습을 위해서 CNN에서 일반적으로 사용하는 Backpropagation과는 달리 RNN에서 자주 사용되는 학습 방법인 Truncated Backpropagation Through Time(생략된 버전의 BPTT)를 사용하는데 현재 Time-step에서 일정 시간까지만의 BPTT를 진행하는 방법이다.


모델의 Learning rate를 decay하는 방식도 Perplexity에 기반하여 진행하고 있는데, Validation step에서의 perplexity가 1.0을 넘게 되면 learning rate를 절반으로 줄이는 방식을 택하고 있다.


Regularization은 Drop-out을 사용하는데 RNN에서의 방식은 Input-LSTM Cell 또는 LSTM Cell-Output 부분에만 사용하는 것이 일반적인 방법으로 알려져 있다. (이는 Cell-state의 경우 forget gate와 memory gate로 계속 기억해야 할 부분과 아닌 부분으로 나누어서 전달하기 때문으로 이해할 수 있다)


이번에는 Output에서 Softmax를 적용하는 방식을 알기 위해 공식을 살펴보자.

논문에서는 Vocabulary를 한번에 모두 사용하는 방식이 아닌 n개의 클러스터로 나누는 방식을 택하고 있는데, 쉽게 이해하자면 다음 두 단계로 나뉘어져 있다고 볼 수 있다.


  1. 단어가 Volcabulary 클러스터 r에 해당되는가?
  2. 만일 해당된다면 j라는 단어를 선택할 확률은 얼마나 될 것인가?
이러한 구조는 작은 데이터셋에는 해당되지 않는다. 또한 상세 구조는 다음 표를 참고하면 좋을 것이다.




결과

논문에서 결과에 대해 서술하는 부분이 굉장히 많은데, 이중 몇가지만 살펴보는 것으로 대신하겠다. 아래 내용 이외의 결과에 대해 알고싶다면 논문을 직접 참조하자.



일단 Small/Large 데이터셋에 대한 결과물이다.(평가지표는 perplexity기준) Character-level input이 기존 모델보다 모두 좋은 성능을 보이고 있으며, 여기서 사용된 언어는 체코어, 독일어, 스페인어, 프랑스어, 러시아어, 아라비아어이다. Small Dataset에서는 일반적으로 Word단위, 형태소 단위, 글자 단위 순으로 모델의 성능이 개선되는 것을 볼 수 있으며 특이한 점은 Large Dataset에서 몇몇 언어의 경우 perplexity 점수가 거의 동일하거나 오히려 형태소 단위가 단어 단위의 input일 경우보다 더 성능이 안좋다는 점이다.



다음으로는 Highway Network의 성능에 대한 언급이다. Highway Network가 없을때와 있을때의 차이가 있다. 일단 you라는 단어에 대해 유사한 단어를 찾는 부분을 살펴보자면 Highway Network가 없을시에는 글자의 구성 자체에 대한 유사성을 따져서 최대한 you라는 글자조합이 많이 포함되어있는 단어를 찾는 경향이 있다. (your, young, four, youth) Highway Network가 없을시에는 상대적으로 Semantic meaning을 더 많이 감안하는 모양이 보이는데 you의 원래 뜻에 가장 가까운 단어를 선택하는 패턴을 보인다. (we, your, doug, i)



또한 Highway Layer의 유무나 다른 네트워크로 대체했을 때의 결과를 보여주는데 논문에서는 Highway Layer를 1개이상 쓰는 것이 성능개선에 도움을 주지 않았다고 언급한다. 또한 ConvNet의 경우에도 Layer를 2개 이하로 사용하는 것을 추천한다.



Vocabulary 크기와 Token의 갯수에 따른 결과도 보여주는데, 흥미로운 점은 Vocabulary가 크다고해서 Perplexity가 무조건 좋아지는 것이 아니라는 점이다.



후기: 처음에는 Highway Network를 통해서 Semantic meaning을 잘 감안할 수 있다는 점을 이 논문의 주요 Contribution으로 꼽았었는데, 스터디를 진행하면서 그 점이 main contribution이 아니라 character-level input으로도 word-level language model을 만들 수 있다는 점이 메인이었다는 사실이 매우 충격적으로 다가왔다. 때문에 논문에 대한 이해가 아직도 더 많이 필요하다고 느낀 시간이었다.


추가로, 블로그 글씨 크기가 들쑥날쑥해서 매우 불편하다... 10pt로 맞췄으면 블로그 글 전체에서 동일한 글씨 크기를 가져야 하는데 이게 왜 안되니;;;