머신러닝&딥러닝

Deep Learning #5 NLP의 개요

seungbeomdo 2023. 2. 28. 17:18

1. NLP(Natural Language Processing)의 기본 관점

1.1. NLP의 정의

  • NLP, 또는 자연어 처리란 인간의 언어를 컴퓨터가 이해할 수 있도록 하는 과제를 말한다. 컴퓨터 비전(CV)과 더불어 딥러닝 기술이 활발하게 적용되고 있는 분야이다. 최근 주목받는 ChatGPT도 자연어 처리 딥러닝의 일종이다.

 

1.2. Word Embedding

  • Word embedding이란, 주어진 자연어를 일정한 차원의 벡터로 바꾸어주는 것을 말한다. 컴퓨터가 자연어를 받아들일 때는 사람처럼 직관적으로 받아들이는 것이 아니고 0과 1로 구성된 수열로서 받아들인다.

 

  • 따라서 NLP의 첫번째 과제는 주어진 자연어를 컴퓨터에 '입력'하는 것이다. 일반적으로 하나의 단어는 N차원의 기본단위벡터(하나의 원소만 1이고 나머지 N-1개의 원소는 0인 벡터)로 대표된다. 이를 Sparse Representation이라고 한다.
  • 이는 결국 자연어가 총 N개가 존재한다고 할 때, 각각의 자연어를 서로 직교하는 벡터로 나타내는 것이다. 

 

  • 그런데 이렇게 되면 문제가 생기는 게 첫째는 단어 간의 유사도를 계산할 수 없다. 서로 다른 두 단어는 직교하는 두 벡터이기 때문에 내적 연산을 하면 항상 0이 된다. 둘째는 단어들로 이루어진 공간이 너무 커서, 연산하기가 너무 힘들다는 것이다.

 

  • 따라서 단어를 Sparse Representation 상태에서 놔두지 말고 가중치행렬을 곱해 축소된 차원의 벡터로 매핑하는데, 매핑의 결과로 얻어진 벡터를 Word Vectot 또는 Embedding Vector라고 한다. 이때 곱해진 가중치행렬은 Embedding Matrix라고 한다.

 

  • 임베딩 행렬은 회귀/분류 과제에서 주어진 성능치를 극대화하는 방향으로 훈련된다. 결국 뉴럴넷이고 딥러닝 짱짱맨이다.

 

1.3. 분포적 의미론

  • 그럼 컴퓨터한테 임베딩된 단어 벡터를 입력한다는 것은 알겠다. 근데 이 임베딩된 단어들을 어떻게 컴퓨터가 '사과' 혹은 '포도'라고 인식할 것인가는 여전히 문제다.

 

  • 그냥 단어의 의미를 알려주면 되지 않냐라고 생각할 수 있지만,
    • 첫째로 컴퓨터는 '사과'라는 단어를 인간처럼 직관적으로 이해하는 것이 아니고 0과 1로 이루어진 수열로 받아들인다.
    • 둘째로 자연어는 다차원적이고 맥락적이다. 하나의 단어가 여러가지의 뜻을 동시에 가지는 것이 가능하며, 맥락에 따라서도 다양한 의미를 가진다.

 

  • 이런 자연어의 특징을 고려해서 어떤 방식이 컴퓨터를 학습시키는 데 가장 유리할까를 고민해왔는데, 대표적인 관점은 분포적 의미론(Distributional Semantics)이다.
    • 분포적 의미론이란 단어의 의미를 결정하는 것은 그 단어가 사용된 맥락에 있다고 보는 관점이다. 
    • 분포적 의미론이라는게 무슨 언어학에서 잘 정의돼서 쓰이는 개념어인지는 모르겠다. 그냥 딥러닝 분야에서 임시적으로 만들어서 쓰는 개념인 건지 어떤 건지. 

 

  • 만약 사과와 포도라는 단어가 있을 때, '사과'와 함께 사용되는 단어들의 집합이 있을 것이고 '포도'와 함께 사용되는 단어들의 집합이 있을 것이다. 두 집합 간의 원소가 겹치는 것이 많다면 '사과'와 '포도'는 유사한 의미를 갖는다고 보는 것이 분포적 의미론이다.

2. Word2Vec와 RNN

2.1. Word2Vec

  • Word2Vec는 주어진 단어를 벡터로 매핑하는 뉴럴넷을 말한다. 위에서 말한 임베딩 매트릭스를 훈련하는 뉴럴넷이다. 또한 이때 단어의 의미를 잘 반영하는 임베딩 벡터로 매핑이 이루어져야 하는데, '단어의 의미를 잘 반영한다'는 것은 위에서 서술한 분포적 의미론의 관점에서 측정된다.

 

  • Word2Vec은 크게 두 가지 방식이 있는데, 하나는 예측하려는 단어 A 주변을 둘러싸고 있는 단어들을 인풋으로 해서, A를 예측하는 방식이다. 다른 하나는 A가 인풋으로 주어질 때 그 주변을 둘러싸는 단어들을 예측하는 방식이다. 전자는 CBoW, 후자는 SkipGram이라고 한다.

 

  • CBoW를 중심으로 Word2Vec가 돌아가는 방식을 이해해보자. CBoW는 다음과 같은 뉴럴넷이다.

  • 인풋 레이어를 구성하는 복수의 벡터들이 있는데, 이 벡터들은 단어 $y$ 주변을 감싸고 있는 단어들이다. 가령 아래와 같은 문장에서 'sat'이라는 단어를 맞추길 원한다면 'fat', 'cat', 'on', 'the' 등이 인풋 벡터가 된다.

"The fat cat sat on the mat"

 

  • 이때 'sat' 주변의 단어를 몇 개나 인풋으로 쓸 것인가를 window라는 개념으로 정의한다. window가 1이라면 'cat'과 'on'이 인풋이 되고, winodow가 2라면 'fat', 'cat', 'on', 'the'가 인풋이 된다.

 

  • 각각의 인풋벡터들은 임베딩 매트릭스를 거쳐서 히든레이어로 들어온다.
    • 만약 window가 2라면 4개의 인풋 단어들이 one-hot-encoding된 단위벡터들로 주어질 것이다.
    • 이들을 각각 임베딩 매트릭스와 곱해준 후 얻은 4개의 activation vector들을 평균낸 것이 embedding vector가 된다.

 

  • 임베딩 벡터는 히든레이어들을 거치면서 아웃풋 레이어로 나오게 된다. 일반적인 뉴럴넷의 구조일 뿐이다. 아웃풋 레이어는 다시 인풋 벡터와 동일한 차원의 벡터가 된다. 그리고 그 벡터의 각 원소들은 확률이 되도록 soft max 함수를 activation function으로 사용한다.
  • 이게 뭔 말인지 해석해보자.
    • 인풋 벡터는 각 단어를 나타내는 N차원의 기본단위벡터였다. 한 단어를 특징 짓는 것은 유일하게 1의 원소를 갖는 벡터 상의 위치이다.
    • 아웃풋 벡터는 N차원의 벡터이고 각각의 원소들은 확률이므로, 아웃풋 벡터는 예측된 단어가 각각의 단어일 확률들을 나타내는 셈이다. 확률이 가장 높은 원소의 위치를 보고 어떤 단어인지 최종 예측이 결정된다. 

 

2.2. Word2Vec의 한계와 RNN

  • Word2Vec의 한계는 fixed window size에 있다. 고정된 window 바깥에 있는 단어들은 모델이 고려해줄 수가 없다는 것이다. 자연어가 얼마나 유연한데 이런 방법으로는 부족하다. 그래서 대안이 되는 것이 이전 포스팅에서 다루었던 RNN이다.

 

  • RNN은 hidden state를 활용해서 주어진 단어를 예측할 때 현재까지 주어진 모든 단어들을 '맥락' 정보로 사용한다. 이 방법은 고정된 window를 사용하는 것이 아니기 때문에 Word2Vec보다 훨씬 유연한 방법이다. 
  • 아래는 many-to-one 구조의 RNN을 사용해 문장의 감성을 측정하는 구조이다. window size의 문제가 없다는 것을 짐작할 수 있다. 물론 장기기억의 문제는 남아있지만..(근데 이것도 LSTM으로 많이 해결됐다)

 

  • RNN이 어떻게 작동하는 것인지는 이전 포스팅에서 자세히 다루었다.
 

[DL] RNN(순환신경망)

GitHub - SeungbeomDo/DataAnalysis: Practical Codes for Data Analysis using Machine Learning and Deep Learning Practical Codes for Data Analysis using Machine Learning and Deep Learning - GitHub - SeungbeomDo/DataAnalysis: Practical Codes for Data Analysis

seungbeomdo.tistory.com