23.01.09
단어 표현 (Word Representation) ⭐⭐⭐⭐⭐
단어 표현이란 단어를 컴퓨터에서 판단할수 있도록 하기 위하여 단어를 수치화하고,
또한 주로 벡터 형태로 데이터를 저장하므로 벡터화 해주는 것을 의미한다.
다른 이름으로 단어 임베딩(word embedding), 혹은 단어 벡터(word vector)라고도 불린다.
즉, 단어 표현이란
자연어 처리 과정에서 모델에 들어가기전
어떻게 컴퓨터가 자연어를 받게끔 만드는 과정이다.
분류 모델이면 목적성에 맞게끔 자연어를 준비시켜
컴퓨터에게 표현해 주기 위한 과정이다.
이 단어는 이렇게 관계가 있어라고
컴퓨터에게 보여주게끔 준비시키는 과정? 이다.
단어 표현 방법은 크게
국소 표현(Local Representation)
= 이산 표현(Discrete Representation)
= 해당 단어 자체만 보고 특정 값을 맵핑하여 단어를 표현하는 방법
분산 표현(Distributed Representation)
= 연속 표현(Continuous Represnetation)
= 해당단어를 표현하고자 주변을 참고하여 단어를 표현하는 방법
으로 나뉜다.
가장 먼저 국소 표현(Local Representation)의
표현 방법 부터 보도록 하자.
🔵 Local Representation (국소 표현)
✨원-핫 인코딩(One-Hot Encoding) ✨
컴퓨터나 기계는 문자보다 숫자를 더 잘 처리한다.
자연어 처리에 있어서 문자를 숫자로 바꾸는 방법이 다양한데
그 중 가장 기본적인 표현 방법이 원-핫 인코딩이다.
💡 단어 집합(Vocabulary)
서로 다른 단어의 집합을 말한다.
✔ 원-핫 벡터(One-Hot vector)⭐
= 희소 벡터(sparse vector)
단어 집합의 크기를 벡터의 차원으로 하고
필요한 단어의 인덱스에 1의 값을 표현하고
나머지는 0으로 표현한다.
🚨 원- 핫 인코딩의 한계
1. 단어의 개수가 늘어날 수록 벡터의 저장공간이 늘어남.
2. 단어의 유사도를 표현하지 못함
3. 검색 시스템 등에서는 문제가 될 수 있다.
✨ N-gram ✨
횟수를 사용하여 단어를
벡터로 표현(Counter-based-representation) 하는 방법이다.
한 단어 이상의 시퀀스를 분석 대상으로 삼는다.
N은 몇 개를 기준으로 할지 정하는 수를 의미한다.
🚨 N-gram의 한계
1. 시퀀스의 횟수만을 가지고 판단하기 때문에
문맥을 고려하지 않은채 선택한다.
2. N(개수)이 커지면 희소성 문제가 부활한다.N이 적으면 문맥을 파악하지 못한다.
= 적절한 개수가 중요.
= 상충(Trade-off)문제
✨ BoW(Bag of Words) ✨
문서 내 단어의 순서와 의미는 고려하지 않고
오직 출현 빈도만 고려하여 단어를 표현하는 방법
= Count-based
말 그대로 단어들의 가방
꺼내서 문장을 만들면 뒤죽박죽 섞여있다.
✔ BoW 생성 순서
1. 각 단어에 고유한 정수 인덱스를 부여
2. 각 인덱스의 위치에 단어 토큰의 등장 횟수를 기록한 벡터를 만듬
✨ 문서 단어 행렬(Document-Term Matrix, DTM) ✨
서로 다른 문서들의 BoW들을 결합한 표현 방법
다수의 문서에서 등장하는 각 단어들의
빈도를 행렬로 표현한다.
💡 TDM
= DTM을 전치한것
🚨 DTM의 한계
1. 희소 표현(Sparse representation)
= 각 문서 벡터 차원은 전체 단어 집합의 크기이다.
때문에 많은 데이터가 들어오면 그만큼 수 많은 차원을 가진다.
텍스트 전처리를 거쳐 단어 집합의 크기를 줄일 수 있다.
2. 단순 빈도 수 기반 접근
단순 빈도로만 의미를 부여하기 때문에
한계가 있다.
무조건 빈도수가 높다고 유사한 문서라고 판단하면 안된다.
ex) 영어 the, 불용어
✨ TF-IDF (Term Frequency-Inverse Document Frequency) ✨
단어 빈도 - 역 문서 빈도
DTM 내 단어마다 중요도를 고려하여 가중치를 주는
통계적인 단어 표현법
문서 간 유사도 검사
중요 문서 위주의 검색 결과
핵심어 추출에 활용
TF-IDF는 TF와 IDF를 곱한 값을 의미한다.
TF-IDF = TF * IDF
TF(Text Frequency) = 특정 문서에서의 특정 단어의 등장 횟수
DF(Document Frequency) = 특정 단어가 등장한 문서의 수IDF = DF의 반비례
즉, TF-IDF는 대부분의 문서에서 빈출하면 값이 낮아진다.
그럼 자연스레 자주 등장하지 않는 단어들은
중요도가 높게 측정되어 살아 남아 우리에게 보여진다.
🔴 Continuous Representation (분산 표현)
✨ NNLM ✨
= Neural Network Language Model
앞서 본 one-hot-vector, DTM, N-gram등등
희소성의 문제, 즉 단어 간의 관계성을 고려하지
못하는 문제를 직면했다.
이를 해결하기 위해선
단어간의 관계성을 밝혀주면 되는데
이를 해결한 방식이
학습한 언어모델을 넣어주는 것이다.
즉, 언어 모델에 단어의 의미적 유사성을
학습할 수 있도록 설계하는것이다.
NNLM은 N-gram모델처럼
정해진 단어의 개수를 참고한다.
이때 정해진 단어의 개수(=범위)를
윈도우(window)라 한다.
구조는 이러하다.
처음 N개의 원-핫 벡터를 입력받은 NNLM은
이를 투사층(projection layer)을 지나게 한다.
💡 투사층(projection layer) or 은닉층(hidden layer)?
입력층과 출력층 사이에 있는 층을
보통 은닉층 이라 불리지만
NNLM의 투사층은 활성화 함수가 없어서
은닉층이라고 부르지 않는다.
투사층을 지난 벡터들은
임베딩 벡터들로 바뀐다.
그리고 임베팅 벡터들의 값은 연결된다.
✔ 연결 된다는 뜻은 차원 벡터 * N개 = N*차원 벡터
✔ 일반 은닉층은 활성화 함수를 사용하는 비선형층
투사층은 활성화 함수가 없는 선형층
이를 다시 은닉층에 넣어줘서
가중치를 곱하고 편향을 더해서 활성화 함수까지
거치게 한다.
그리고 비로소 우리는 출력층에 나온 값을
원-핫 벡터의 값과 가까워지게 하기 위해
손실 함수로 Cross-Entropy 함수를 사용한다.
이런 과정을 거치고 얻는 모델은 과연 전과 뭐가 다를까?
충분한 양의 훈련 코퍼스를 학습한다면
수많은 문장에서 유사한 목적으로 사용되는 단어들은
결국 유사한 임베딩 벡터값을 갖게 된다.
이는 훈련 코퍼스에 없었던
단어를 훈련된 모델에 넣으면 다음 단어를 선택할 수 있게 해준다.
= 희소성의 문제 해결에 도움이 된다.
✨ Word2Vec ✨
Word2Vec 는
문자 그대로 단어를 벡터로 바꾸는데
2개의 층이 있는 신경망을 사용하여
단어간의 유사성을 표현한다.
위의 사진과 같이 원-핫 인코딩과 다른점은
벡터화의 결과가 확률이라는 점이다.
💡 Word2Vec의 두 가지 방법
1. CBOW (Continuous Bag of Words)
주변 단어(context word)로 부터 중간의 단어(center word)의 관계를 예측
2. Skip-gram
중간 단어(center word)로 주변 단어(context word)의 관계를 예측
# Skip-gram은 벡터들의 평균을 구하는 과정은 없다.
🚨 Word2Vec의 한계
1. one-hot encoding한 데이터를 이용하기에
희소성 문제가 사라지진 않았다.
2. 단어 뜻을 구별하지는 못한다.
# 네커티브 샘플링(Negative Sampling)을 통해
문제를 해결하고자 함
✔ 샘플링(Sampling) = 표본추출
✨ FastText ✨
Facebook에서 만든 단어 임베딩 및 텍스트 분류 학습을 위한 라이브러리.
294개 언어로 사전 훈련된 모델을 제공한다.
💡 Word2Vec의 확장 버전,내부 단어. 즉, 서브 워드(subword)를 고려하여 학습
· FastText에서는 각 단어는 글자 단위 N-gram의 구성으로 취급한다.
💡 모르는 단어(Out Of Vocabulary, OOV)에 대한 대응
1. FastText를 학습한 이후에는 데이터 셋의 모든 단어의 각 N-gram에 대해 워드 임베딩이된다.
2. 내부 단어(subword)를 통해 모르는 단어(OOV)에 대해서도 유사도를 계산 가능하다.
💡 빈도 수가 적었던 단어(Rare Word)에 대한 대응
1. FastText의 경우 N-gram이 다른 단어의 N-gram과 겹치면, Word2Vec와 비교해
비교적 높은 임베딩 벡터값을 얻는다.
💡 한국어의 FastText
음절단위와 자모단위(초성, 중성, 종성 단위)로 N-gram화 할 수 있다.
✨ ELMo (Embeddings from Language Model) ✨
✔ 언어 모델로 하는 임베딩 ELMo는 사전 훈련된 언어 모델을
사용한다는게 특징이다.
✔ ELMo는 워드 임베딩할때 문맥을 고려해서 임베딩 하는데
이를 통해 문맥을 반영한 워드 임베딩을 한다.
💡 biLM (Bidirctional Language Model)
양 방향의 언어 모델을 둘 다 학습하여 활용하는 모델
RNN을 이용한것을 예로 들면
각 시점의 입력이 되는 단어 벡터는
합성곱 신경망을 이용한 문자 임베딩을 통해 얻은
단어 벡터이다.
주의해야 할 점은 순방향과 역방향 모델을
서로 별개의 모델로 보고 학습한다는 것이다.
✔ ELMo 표현= ELMo의 임베딩 벡터 얻는 과정
✔ ELMo 표현 + 임베딩 벡터
NLP 작업 전 들어가는 과정= 임베딩 과정
이렇게도 가능하다.
✨ LSA (Latent Semantic Analysis) ✨
= 잠재 의미 분석 : DTM의 잠재된(Latent) 의미를 이끌어내는 방법
✔ BoW에 기반한 DTM이나 TF-IDF는
단어의 빈도 수를 이용한 수치화 방법이므로
단어의 의미를 고려하지 못함
LSA는 특이값 분해를 이용하여
단어의 의미를 고려하는데
우선 특이값 분해가 뭔지 보자.
💡 특이값 분해 SVD(Singular Value decomposition)
특이값 분해란 A = m(행)*n(열)행렬을
3개의 행렬의 곱으로 분해(decomposition)하는 것을 말한다.
3개의 행렬 곱을 알아보기 전기본 개념을 정리해보자.
💡 Full SVD
위와 같은 행렬곱의 연산 결과 = SVD(특이값 분해)
에서 나온 대각 행렬의 대각 원소의 값을
행렬 A의 특이값(Singular value)라고 한다.
💡 절단된 SVD (Truncated SVD)
▶ 풀 SVD에서 나온 3개의 행렬에서 일부 벡터들을 삭제 시킨것
LSA의 경우 절단된 SVD를 사용하게 된다.
✔ 절단된 SVD는 대각 행렬 ∑의 대각 원소의 값 중에서 상위값 t만 남게 된다.
✔ 절단된 SVD 수행 시 값의 손실이 일어나므로 기존 행렬 복구 불가
✔ 절단된 SVD 수행 시 U행렬과 V행렬의 t열까지만 남긴다.
💡 여기서 t 란?
우리가 찾고자하는 토픽의 수를 반영한 하이퍼 파라미터 값
▶ t를 크게 잡을 경우 : 기존 행렬 A로부터 다양한 의미를 가져갈 수 있다.
▶ t를 작게 잡을 경우 : 노이즈를 제거할 수 있다.
✔ 일부 벡터들을 삭제
▶ 데이터의 차원을 줄이는 것 = Full SVD보다 계산 비용이 낮아짐
▶ 중요하지 않은 정보를 삭제
= 비전 분야에서 노이즈를 제거.
= 자연어 처리에서 설명력이 높은 정보를 남김.
기존 행렬 A에서 심층적인 의미를 확인 가능
🚨 LSA의 장단점
✔ LSA는 쉽고 빠르게 구현 가능
✔ 단어의 잠재적 의미 이끌어 낼 수 있음
✔ 새로운 데이터 추가 시 처음부터 다시 해야함
✨ GloVe (Global Vectors for Word Representation) ✨
글로브는 카운트 기반 + 예측 기반을 모두 사용한다.
LSA(카운트 기반) 와 Word2Vector(예측 기반)의
단점을 보완하는 목적성을 가지고 탄생
LSA는 DTM, TF-IDF 행렬과 같이 각 문서에서의 각 단어의 빈도수를 카운트한 행렬에서전체적인 통계 정보를 입력으로 받아 차원을 축소(Truncated SVD)하여잠재된 의미를 끌어내는 방법론이다.
▶ 단어의 유추 작업(Analogy task)에는 성능이 떨어진다.
Word2Vec는 실제값과 예측값에 대한 오차를 손실 함수를 통해 줄여나가며 학습하는 예측 기반의 방법론
▶ 임베딩 벡터가 윈도우 크기 내에서만 주변 단어를 고려하기에
코퍼스의 전체적인 통계 정보를 반영하지 못한다.
그렇다면 GloVe는 어떻게 위의 두 가지를 사용할까?
💡 윈도우 기반 동시 등장 행렬(Window based Co-occurrence Matrix)
윈도우 기반 동시 등장 행렬이란
윈도우, 즉 내가 정한 범위에서
동시 등장한 횟수를 기재한 행렬을 뜻한다.
✔ 위 행렬은 행렬을 전치(Transpose)해도 동일한 행렬이 된다.
💡 동시 등장 확률(Co-occurrence Probability)
동시 등장 확률 P(k | i)는 동시 등장 행렬로부터
특정 단어 i의 전체 등장 횟수를 카운트하고
특정 단어 i가 등장했을 때
어떤 단어 k가 등장한 횟수를 카운트하여 계산한 조건부 확률
여기서 특정 단어 i = 중심 단어(center Word)
어떤 단어 k = 주변 단어(Context word)라고 했을 때
동시 등장 행렬에서
분모는 중심단어 i의 행의 모든 값을 더한 값
분자는 i행 k열의 값으로 한다.
위의 개념 + 가중치 함수
💡 가중치 함수
= GloVe 손실 함수
모델로 만든게 GloVe다.
'Developer Diary' 카테고리의 다른 글
NLP(자연어 처리)2 (0) | 2023.01.09 |
---|---|
Toy Project 6일차 (0) | 2023.01.05 |
Toy Project 5일차 (0) | 2023.01.03 |
Toy Project 4일차 (0) | 2023.01.03 |
NLP (자연어 처리) (0) | 2023.01.01 |