본문 바로가기
Study/DL

[밑시딥2] Chapter 2. 자연어와 단어의 분산 표현

by hyeon827 2024. 1. 20.

자연어 처리란

  • 자연어 : 우리가 평소에 쓰는 말(부드러운 언어)
  • 인공어: 프로그래밍 언어, 마크업 언어 등(딱딱한 언어)
  • 자연어 처리 : 우리가 평소에 쓰는 말(자연어)을 컴퓨터에게 이해시키기 위한 기술

단어의 의미

  • 단어 : 의미의 최소 단위
  • 자연어를 컴퓨터에게 이해시키는 데는 무엇보다 '단어의 의미'를 이해시키는 게 중요

   1. 시소러스를 활용한 기법

   2. 통계 기반 기법

   3. 추론 기반 기법

 

시소러스

  • 자연어 처리에서 일반적인 사전 아니라 시소러스 형태의 사전 애용 (WordNet이 가장 유명)
  • 시소러스: 유의어 사전으로, '뜻이 같은 단어(동의어)' '뜻이 비슷한 단어(유의어)'가 한 그룹으로 분류

  • 또한, 자연어 처리에 이용되는 시소러스는 단어 사이의 '상위와 하위' 혹은 '전체와 부분' 등 더 세세한 관계까지 정의
  • 이처럼 모든 단어에 대한 유의어 집합을 만든 후 단어들의 관계를 그래프로 표현하여 단어 사이 연결(단어 네트워크)
  • 이를 이용하여 컴퓨터에게 단어 사이의 관계를 가르칠 수 있음

시소러스의 문제점

사람이 수작업으로 레이블링하는 방식에는 크나큰 결점 존재

 

1) 시대 변화에 대응하기 어렵다

  • 때때로 새로운 단어가 생겨나고, 구닥다리 옛말은 언젠가 잊혀짐 ex) 신조어 "크라우드 펀딩"
  • 시대에 따라 언어의 의미가 변함 ex) "heavy" -> '심각하다'는 뜻 추가

2) 사람을 쓰는 비용이 크다

  • 시소러스를 만드는 데는 엄청난 인적 비용 발생
  • 현존하는 영어 단어 수는 1,000만 개가 넘음(WordNet에 등록된 단어는 20만 개)
  • 따라서, 이성적으로는 이 방대한 단어들 모두에 대해 단어 사이의 관계 정의해줘야 함

3) 단어의 미묘한 차이를 표현할 수 없다

  • 시소러스에서는 뜻이 비슷한 단어들을 묶음
  • 그러나 실제로 비슷한 단어들이라도 미묘한 차이가 있는 법

 

=> 이 문제를 피하기 위한 '통계 기반 기법' 과 신경망을 사용한 '추론 기반 기법' 

      두 기법은 대량으 텍스트 데이터로부터 '단어의 의미'를 자동으로 추출하여 사람은 수작업에서 해방

 

통계 기반 기법

  • 말뭉치(대량의 텍스트 데이터) 이용
  • 말뭉치 안에는 담긴 문장들은 사람이 쓴 글
  • 즉, 자연어에 대한 사람의 '지식'이 충분이 담겨 있다고 볼 수 있음
  • 이 기법을 사용해 단어를 벡터로 표현

   

   [단어의 분산 표현]

  • RGB 같은 벡터 표현이 색을 더 정확하게 명시 ex) '비색' (R,G,B) = (170,33,22) -> 빨강 계열
  • 즉, 우리가 원하는 것은 '단어의 의미'를 정확하게 파악할 수 있는 벡터 표현(밀집벡터로 표현)

   [분포 가설]

  • 단어를 벡터로 표현하는 연구에서의 아이디어 뿌리
  • 단어의 의미는 주변 단어에 의해 형성

  • 단어 자체에는 의미가 없고, 그 단어가 사용된 '맥락'이 의미를 형성
  • '맥락'이란 특정 단어를 중심에 둔 그 주변 단어
  • 맥락의 크기(주변 단어를 몇 개나 포함할 지) = '윈도우 크기'

   [동시발생 행렬]

  • 주변에 어떤 단어가 몇 번이나 등장하는지를 세어 집계하는 방법(=통계 기반 기법)
  • 윈도우 크기를 1로 하고, 단어 "you"의 맥락은 "say" 단어 하나 뿐
  • "you" = [0,1,0,0,0,0,0]

동시발생 행렬

 

 

  [벡터 간 유사도]

  • 단어 벡터의 유사도를 나타날 때는 코사인 유사도 자주 이용
  • 분자에는 벡터의 내적
  • 분모에는 각 벡터의 L2 노름

 

 

 

   [유사 단어의 랭킹 표시]

  • 말뭉치의 크기가 너무 작아 납득이 안되는 결과 도출

 

통계 기반 기법 개선하기

   [상호정보량]

  • 동시발생 행렬의 원소는 두 단어가 동시에 발생한 횟수를 나타냄
  • But, '발생' 횟수라는 것은 사실 그리 좋은 특징 X  ex) 'the car' > 'drive car' 문제 발생
  • 문제 해결을 위해 점별 상호정보량(PMI) 척도 사용

  • P(x)는 x가 일어날 확률, P(y)는 y가 일어날 확률, P(x,y)는 x와 y가 동시에 일어날 확률
  • PMI 값이 높을수록 관련성이 높다는 의미

  • PMI를 동시발생 행렬에 적용
  • C는 동시발생 행렬, C(x,y)는 단어 x와 단어 y 동시발생 횟수, C(x)와 C(y)는 각각 단어 x와 y 등장 횟수

  • PMI 이용하면 "car"는 "the"보다 "drive"와의 관련성이 강함(우리가 원하던 결과)
  • 이러한 결과가 나온 이유는 단어가 단독으로 출현하는 횟수를 고려했기 때문

  • 두 단어의 동시발생 횟수가 0이면 log0 = -무한대
  • 해당 문제를 피하기 위해 양의 상호정보량(PPMI) 사용

   

   [차원 감소]

  • '중요한 정보'는 최대한 유지하면서 벡터의 차원을 줄임

    특이값분해(SVD) 이용 

  • 임의의 행렬 X를 U,S,V 세 행렬의 곱으로 분해
  • U와 V는 직교행렬이고, 그 열벡터는 서로 직교
  • 또한, S는 대각행렬

  • U(직교행렬)은 어떠한 공간의 축(기저)를 형성 -> '단어 공간'
  • S(대각행렬) 대각성분에는 '해당 축'의 중요도라고 간주할 수 있는 '특잇값'이 큰 순서로 나열 
  • 행렬 S에서 특잇값이 작다면 중요도가 낮다는 뜻이므로, 행렬 U에서 여분의 열벡터를 깎아내어 원래 행렬에 근사
  • 행렬 X의 각 행에는 해당 단어의 ID의 단어 벡터가 저장, 그 단어 벡터가 행렬 U'라는 차원 감소된 벡터로 표현

 

 

 

   [PTB 데이터셋] - Peen Treebank

  • 너무 크지도 않고 적당한 말뭉치

    PTB 데이터셋 평가

  • PTB 데이터셋을 이용한 통계 기반 기법 적용
  • 말뭉치를 사용해 맥락에 속한 단어의 등장 횟수 
  • PPMI 행렬로 변환
  • SVD를 이용해 차원 감소 

   => 더 좋은 단어 벡터를 얻음. 이것이 단어의 분산 표현이고, 각 단어는 고정 길이의 밀집벡터로 표현