자연어처리(NLP) 16일차 (Word Embedding 정리)

정민수
7 min readJun 19, 2019

--

2019.06.19

출처 : http://www.realworldnlpbook.com/blog/improving-sentiment-analyzer-using-elmo.html

핵심키워드

  • Word Embedding
  • ELMo
  • biLM
  • biLSTM

What are Word Embeddings?

ELMo에 대해 알아보기 전에, Word Embedding에 대해 깊에 알아보자. 워드 임베딩이란 무엇인가? 딥러닝에서의 임베딩은 보통 이산적이고 고차원의 연속된 벡터 표현이다. NLP에서 워드 임베딩은 보통 단어를 연속적인 벡터로 매핑하는 것이다.

word2vec과 같은 인기있는 워드 임베딩 테크닉이 출현하기 전에, 2013년 쯤에는 NLP에서는 연속적인 벡터 공간에 단어의 의미를 표현할 수 있는 방법들이 없었다. BoW 표현을 사용했다. Bag of Words는 N-차원의 공간에 단어 순서들을 고려하지 않고 토큰들을 맵핑 시키는 간단한 방법이다.

BoW는 몇 가지의 이슈를 가지고 있는데, 그 중하나는 단어들 간의 의미를 고려하지 못한다는 것이다. 예를 들어, “dog”, “cat”, 그리고 “pizza”라는 개념들의 가상 벡터 공간이 있다고 해보자. 각각의 단어가 유니크하기 때문에 벡터들은

  • v(“dog”) = (1, 0, 0)
  • v(“cat”) = (0, 1, 0)
  • v(“pizza”) = (0, 0, 1)

로 매핑될 것이다. 각각의 벡터들은 원-핫 벡터들이다. 벡터들로부터 확인할 수 있듯이, “dog”와 “cat”은 연관된 개념임을 알 방법이 없다. BoW와 원-핫 벡터의 관점에서 “dog”이 “pizza”보다 “cat”에 더 연관이 있는지 알 수 없다.

워드 임베딩은 이런 명확한 이슈를 원-핫 벡터가 아니라 연속된 숫자들의 표현으로부터 문제를 해결한다. 때문에 근래 NLP에서 워드 임베딩이 사용되는 것이다. “dog”, “cat”, “pizza”는 이렇게 표현될 수 있다.

  • v(“dog”) = (0.8, 0.3, 0.1)
  • v(“cat”) = (0.7, 0.5, 0.1)
  • v(“pizza”) = (0.1, 0.2, 0.8)

첫번째 요소는 “동물여부”와 “음식물”을 나타낸다. 위 벡터들은 자연어 텍스트로의 큰 코퍼스들로부터 학습된다. 그래서 문맥 상의 비슷하게 나타나는 단어들이 비슷한 벡터들로 할당될 수 있다. 원-핫 벡터 대신, Pre-trained word embedding 을 사용함으로써 모델은 이미 어떻게 lanugage work의 기초적인 블록을 쌓아야하는지 알고 있다.

예를 들어, “동물 이름 태거”를 학습시키고 싶다면, 모델은 워드 벡터의 첫번째 요소를 보고 값이 높은 지 확인해야 한다. 원-핫 벡터들 보다 훨씬 효율성을 타나낸다.

What is ELMo?

위에서 언급한 워드 임베딩은 다른 중요한 문제를 가지고 있다. 단어는 어디에 나타나고 어떻게 사용되는 지에 상관없이 동일한 벡터를 할당 받는다. 그렇기 때문에 워드 임베딩은 단지 테이블 룩업에만 의존한다. 다른 말로 다의어가 고려되지 않는 것이다.

원래의 word2vec 논문 [Mikolov, et al. 2013]은 데이터 중심 접근 방식을 사용하여 이러한 구문을 먼저 감지 한 다음 단일 토큰으로 처리함으로써 "New York" 이나 "Boston Globe"와 같은 관용구를 처리한다. 단어 하나씩 뿐만 아니라 단어 sense 마다 벡터 표현을 학습하는 데 중점을 두는 작업이 있다.
두 경우 모두 단어 삽입은 여전히 ​​정적 매핑 테이블을 기반으로하므로 word sense를 명확히하기 위해 별도의 단계가 필요하다.

인간의 언어는 좀 더 동적이다. 단어의 의미는 전에 오냐 다음에 오냐에 따라 달라질 수 있다. “The horse raced past the barn fell.”을 보고 혼동하는 이유이다. 전체 문장을 한 번 훑고, 문장 전체를 고려한 word embedding을 하는 것을 고려하는 것은 지극히 자연스럽다. 이것이 바로 ELMo가 하는 일이다.

ELMo는 AllenNLP에서 제안된 비교적 최신 단어 표현 기법 중 하나이다. 과거의 워드 임베딩 기법과는 달리 ELMo는 동적이고, 같은 단어라 할지라도 문맥에 따라 워드 임베딩이 달라진다. 어떻게 이것이 가능할 지는 다음을 확인해보자.

How ELMo works

맵핑 테이블에 의존하기 보다는, ELMo는 pre-trained language model을 사용한다. 일반적으로 언어 모델은 어구나 문장과 같은 단어들의 시퀀스의 확률을 돌려준다. deep NLP에서는 RNN가 보통 언어 모델을 학습하는 데에 사용된다. RNN이 단어 단위로 문장을 읽으면, 내부 상태가 업데이트 되어 지금까지 본 문장의 내용을 반영한다.

Figure: ELMo uses internal representations of multi-layer biLM, http://www.realworldnlpbook.com/blog/improving-sentiment-analyzer-using-elmo.html

ELMo는 biLM이라는 특정 언어 모델을 사용하는데, biLM은 두 개의 양방향 언어 모델을 합쳐 놓은 것이다. 위 그림을 보면, forward와 backward 두 방향이 있다는 것을 확인할 수 있다. 이 것들은 양 방향으로 문장을 스캔하는 것으로 볼 수 있다. 특정 단어에 대한 순방향 전달의 내부 상태는 단어 자체와 그 전에 일어난 모든 것들을 반영한다. 이와 반대로 역방향 전달은 단어 자체와 그 후의 것들을 반영한다. 이 두 방향의 내부 상태는 concatenate되어 중간 word vector가 생성된다.

그러므로, 이 intermediate word vector는 단어의 의미뿐만 아니라 나머지 문장에서 어떤 것이 일어나며 단어가 어떻게 사용되는지 알고 있다.

ELMo의 또 다른 특징은 가중 레이어로 구성된 언어 모델을 사용한다는 점이다. backward, forward 전달은 그림에서 볼 수 있듯이, 다중 RNN 레이어 형태로 쌓이게 된다. 아래 layer에서 생성된 intermediate word vector는 다음 레이어의 input으로 전달된다. 이러한 과정이 레이어 수만큼 반복된다.

이 방법을 사용하면, 내부 상태가 레이어 사다리를 타고 올라갈 때 상위 레이어는 하위 레이어에서 캡처 할 수 없는 더 추상적인 의미를 나타낼 수 있도록 처린된다. downstream NLP tasks에서 사용되는 최종적인 표현은 서로 다른 intermediate word vector의 가중치 조합이다. 자세하게는, L+1 단어 벡터들의 가중치 합이다. L은 레이어의 수를 뜻한다. 왜 +1이 되냐면, biLM 입력 자체가 이미 결합된 것이기 때문이다. 이 가중치들은 task-dependent 방법으로 학습된다.

결과적으로, ELMo는 biLM의 첫번째 레이어로 전달하는 가공되지 않은 워드 임베딩을 계산하기 위해 character CNN(convolutional neural network)를 사용한다. biLM의 입력은 table look-up을 하지 않고, 단어 내의 문자(또는 문자 조합)으로 부터 계산된다. 이것이 왜 좋은 방법이냐면, 단어 내부의 구조를 파악할 수 있기 때문이다. 모델은 “dog”와 “doggy”가 문장에서 사용되기 전에도 어느 정도 연관이 있다는 것을 알 수 있을 것이다. 두번째로는, 훈련 중에 발생하지 않는 unkown words에 대해서도 robust하다.

주의 사항: ELMo에서 사용되는 biLM은 biLSTM과 비슷하지만 전혀 다르다. biLM은 단지 두 LM(forward, backward)을 concatenation한 것이지만, biLSTM은 두 LSTM을 합친 것 이상으로의 의미가 있다. biLSTM과 가장 다른 점은 두 방향의 내부 상태가 concatenate되어 다음 레이어로 전달되는 것이다. 반면 biLM은 내부 상태가 단순히 독립적인 LM 으로 부터 concatenate되는 것이다.

--

--

정민수
정민수

No responses yet