개발자로 후회없는 삶 살기
NLP PART.텍스트 마이닝 이론 본문
서론
※ 이 포스트는 다음 강의의 학습이 목표임을 밝힙니다.
https://www.youtube.com/playlist?list=PL7SDcmtbDTTzQ69rNQ85LyA2WAx438pxz
본론
- 유사도 분석
단어와 단어 사이에 문장과 문장 사이에 얼마나 유사성이 있나를 의미합니다.
1. 벡터 유사도
벡터는 크기와 방향을 가지고 있습니다. > 크기가 같고 방향이 다르면 cosine metric을 쓰고 이것은 두 벡터의 내적을 두 벡터의 크기로 나누면 공식에 따라서 cosine 값이 나옵니다. > 이게 무슨 의미냐면 각도입니다. (단어를 임베딩하면 벡터인데 그 벡터가 원점에서 바라보면 각도가 있습니다. 여러 벡터들끼리 각도가 작으면 근처에 있는 유사한 것입니다.)
+ cosine 0 : 1, cosine 90 : 0 cosine 180 : -1입니다. > 같은 크기와 방향을 가진 벡터가 유사합니다. 따라서 cosine 값이 크고 방향이 매우 다르면 -1입니다.
-> 문장 유사도 분석 ex
BoW(Bag-of-word)라는 개념을 이용합니다. > 불용어 처리하고 1) 문장마다 불용어하고 남은 단어마다의 출현하는 빈도수 체크!
=> 예제
love apple delicious love
1 1 0 0
1 1 1 0
0 1 1 0
0 0 0 0
1, 2 유사도 분석
둘의 cos 유사도를 구함 2/루트(6)
4, 2 유사도 분석
둘의 cos 유사도를 구함 0/루트(3)
1, 3 유사도 분석
둘의 cos 유사도를 구함 1/루트(6)
예제를 보면 2, 4가 제일 작고! > 1과3이 2등 1과2이 1등입니다. > 실제로 1, 2는 사과가 좋다고 하고 1, 3은 먹을 거 얘기를 하고 2, 4는 다른 얘기를 합니다. > 이런 식으로 bow 단어의 등장 횟수를 벡터화시켜서 유사도를 구할 수 있습니다. = 이것이 문장 유사도를 cos 유사도로 구하는 방법입니다. (비슷한 단어가 많은 문장이 유사하다는 것입니다.)
2. 유클리디안 유사도
거리값으로 두 벡터의 거리가 유사도입니다. 위 ex)가 문장 유사도를 하는데 cosine 유사도를 쓴 거고 유클리드 유사도를 써도 됩니다.
3. 레벤슈타인 거리
텍스트 전처리에서 굉장히 중요한 역할을 하는 거리입니다. > 단어와 단어 사이의 거리를 나타내는 척도로서 A를 B로 수정하기 위한 삽입, 삭제, 변경 최소 횟수를 나타냅니다. > ex) 위에 문장이 아래 문장으로 가려면 '유'는 변경하고 '사'와 '도'는 삭제해야 하는 등 5번 바꾸어야 하는구나를 알 수 있고 5가 거리입니다.
> 최소횟수를 뜻하는데 ex)
가장 우측 하단이 거리 값입니다.
-> 이제는 인코딩을 할 때 유사한 것들끼리 가까운 거리(cosine이나 유클리드를 씁니다.)를 갖도록 인코딩하는 법을 배워보겠습니다.
- 텍스트 마이닝
텍스트 마이닝 전에 해야 할 텍스트 전처리를 배웠습니다. 이제 배울 건 word2vec, glove입니다. > word2vec은 일반 정수 인코딩의 단점을 보완합니다.
> 단점
빈도순으로 인코딩했을 때 단어와 단어 사이에 상관관계가 전혀 없는 것입니다. > 하늘 1 지구 2 한국인 3 달 4라면 숫자들은 단어들의 관련성을 전혀 반영되어 있지 않습니다. 이를 보완해 보겠습니다.
1. word2vec
기존 정수 인코딩은 단어 사이의 상관관계를 파악하기 어려습니다. one-hot encoding의 한계는 메모리를 많이 먹고 상관 관계를 파악할 수 없으며 희소 표현으로 인해서 신경망 계산에(다중 분류) 좋지 않다는 문제가 있습니다.
> 임베딩 : 그래서 밀집 표현을 만들어서 one-hot encoding의 희소를 해결하고 벡터의 차원을 원하는 대로 설정하여 표현하고 이 벡터가 단어 사이의 연관성을 나타내면 좋겠다고 해서 밀집 표현을 사용합니다.
word2vec(NN을 사용하여 밀집 표현을 하는 것)
NN을 통해서 밀집 표현을 나타내도록 하는 것입니다. > word2vec로 단어를 벡터로 바꾸자는 것입니다. > "만약에 cosine 유사도가 높게 word2vec을 해서 단어를 벡터화할 수 있는 밀집 표현 방법을 개발할 수는 없을까?" 라는 생각에서 나왔습니다.
> 그렇게 하려면 이 단어가 어떤 카테고리에 속하는지 다 알아야 합니다. 그건 다 라벨링을 해야 하는 것인데 그건 무리고 > '한 문장 안에 자주 등장하는 단어나 붙어있는 단어들끼리 상관관계가 높지 않을까?'라는 생각을 했습니다.
> 그래서 나온 word2vec 방법 2가지
1) cbow(continuous bow) : 주변 단어를 활용해 중간에 있는 단어를 예측
2) skipgram : 중간 단어를 활용해 주변에 있는 단어를 예측(그 과정에서 고차원이 저차원이 되는 w를 학습합니다.)
1) cbow
중심 단어를 for라고 할 때 주변 단어는 무엇이냐 빨간색 이전 이후 2개를 주변 단어라고 본다고 하면 2가 파라미터로 주변 단어 2개를 본다는 의미이고 주변 단어는 "studied hard the exam"입니다. 1개만 본다고 하면 hard the입니다.
> 주변 단어 개수를 우리가 정해줘야 합니다.(하이퍼 파라미터) > 그러면 이렇게 생각할 수 있습니다. 'for가 나오면 주변에 이러한 단어가 나올 확률들이 높겠구나', 'studied가 나오면 주변에 저런 단어(i, hard, for)가 나올 확률이 높겠구나' 이런 주변 단어들을 레이블로 두는 것입니다.
> 데이터 셋을 만들자
준비한 모든 문장 1000개가 있을 때 일단 모든 단어를 토큰화 > 정제 및 추출> one-hot encoding까지 시킨다 첫 번째 단어부터 중심 단어 주변 단어, 두 번째 단어 중심 단어 주변 단어를 전 단어 전부 다 구합니다.
> 그러면 이게 데이터 셋을 만드는 것입니다. > 이제 이 데이터 셋을 토대로 NN을 학습할 것입니다. for 중심 나머지 4개가 주변이면 주변을 인풋(one-hot 인코딩 된 상태!)으로 모두 집어넣습니다. > 한 단어당 neighbor 하이퍼 파리미터 값 * 2 * one-hot encoding이 인풋의 사이즈입니다. 근데 one-hot encoding이 되어있는 상태입니다.
> 이걸 projection 하고 출력층에 가서 one-hot encoding 된 중심 단어와 비교하여 인풋이 주변이 들어가고 출력이 중심이 나오도록 데이터를 꾸미고 학습시킵니다. > 분류 문제로 학습을 시키고 원핫이니 모든 분류의 차를 전부 합친 게 loss입니다.
> 우리는 임베딩 벡터를 만드는 게 목표였습니다. 임베딩 벡터는 w메트릭스가 생깁니다. > 인풋에서 projection layer로 보내기 위한 w 메트릭스와 projection에서 아웃풋으로 보내기 위한 w 메트릭스가 나오는데 그것을 워드 임베딩 벡터 사전으로 사용을 합니다.
> 학습을 하면 바로 임베딩 벡터가 생겨버립니다. (임베딩 결과를 구한 것입니다. 스킵 그램이면 인풋에서 projection으로 가는 메트릭스이니 동일합니다.)
> 그러면 skip-gram은 중심 단어가 들어오면 projection 레이어에 가게 되고 중심 단어가 one-hot encoding이라서 one-hot encoding의 1과 projection의 하나만 곱해지고 나머지는 0이고 그 1과 곱한 결과가 임베딩 결과입니다.
★ 결론은 둘 다 인풋에서 프로젝션 > 아웃으로 가는 두 개의 메트릭스를 구할 수 있고 skip-gram과 cbow 모두 앞에 메트릭스가 임베딩 결과입니다. ★
2) nnlm(뉴럴 네트워크 language model)
n-gram : 빈칸을 예측하기 위해 앞의 n 개의 단어만 살펴보자라는 모델이었다 3개를 쓰면 3 그램 모델입니다.
> 그러면 "뉴럴 네트워크를 n-gram 모델에 적용시킬 수 있지 않을까?" 해서 나온 게 nnlm입니다. > 앞의 3개의 단어가 다음 것을 만듭니다. 3개의 one-hot encoding이 인풋으로 하고 다음 것의 one-hot encoding이 아웃풋으로 나오게 할 수 있습니다. > cbow 느낌이지만 cbow가 아니고 n-gram이니 통계 기반 언어 모델 내용이지 절대 같다고 보면 안 됩니다. 입력으로 w2v한 임베딩이 들어갈 수도 있습니다.
-> 모델 구조
인풋은 M차원의 one-hot encoding(열) N개의 n그램이니 n개 > 히든을 거쳐서 출력을 냅니다. > 출력은 이전 단어가 이렇게 들어왔을 때 나올 수 있는 다음 단어를 예측합니다.
> 한계 : 정해진 길이의 과거 정보만 참조하므로 long-term 정보를 파악할 수 없고 문장의 길이가 달라질 경우 한계점이 명확합니다.
-> nnlm과 워투백(cbow)의 차이점
1. 구조적 차이 : word2vec(cbow)은 주변 기준으로 중심을 보거나 중심 기준으로 주변을 봅니다. > nnlm은 앞에꺼 가지고 다음 걸 봅니다. (rnn 느낌!)
2. 연산량의 차이, 3. 예측 대상의 차이(중심, 다음 단어) ∴ cbow와 nnlm은 같은 게 절대 아닙니다.
=> 스킵 그램과 시보우의 한계
단어 수가 많아진다면 정적이라서 과학책으로 학습시키면 하늘 바름 별은 임베딩을 못합니다. (학습 단어가 과학, 주변 단어가 수학, 그 외 단어가 하늘 바람 별 과학 수학의 표현은 잘 학습한다 근데 다른 단어가 나오면 임베딩 못합니다.)
=> 그래서 negative sampling을 합니다.
뭔가요? word2vec 학습 과정에서 대상 단어와 관련이 높은 단어들에 보다 집중하는 것입니다.
> 스킵그램 : 중심 단어로부터 주변 단어 예측이었는데 skipgram negative sampling(sgns) : 선택된 두 단어가 중심 단어와 주변 단어 관계인가?의 o/x 이진 분류로 학습합니다.
ex) skip-gram은 중심이 들어오면 주변이 나옵니다, sgns는 두 단어를 선택한다고 했으니 두 단어를 넣어서 숫자가 나오고 이 두 개는 중심과 주변 관계다 or 아니다의 이진 분류 문제가 되는 것입니다 .
> skip-gram에서 가장 큰 문제가 one-hot encoding(다중분류)이라서 아까 one-hot encoding이 신경망 학습에 별로라 했습니다. 그래서 skip-gram 학습 시 분류 문제로 학습이 어려울 수 있습니다. > 그런데 sgns는 이중 분류로 되니 조금 더 연산량에서 우위입니다.
-> 학습방법
중심과 주변을 잡아서 레이블 1이라고 관계가 아니면 0이라고 레이블링을 하는데 중심과 관계 있는 애들은 1로 만족하고 관계없는 애들은 0으로 만족시켜서 (정적의 한계를) 둘 다 만족합니다, (관계없는 단어로도 학습을 하자!) 이때 관계없는 단어는 No인 sampling을 붙여주는 것이라서 negative sampling이라고 부릅니다. 이후에 묶은 것을 각각 one-hot encoding해서 입력으로 넣고 binary cross entropy으로 단일 분류 문제로 학습합니다.
> 따라서 정적의 한계인 처음 보는 단어가 나와도 임베딩을 할 수 있습니다.
- FastText
페이스북에서 만든 word2vec 알고리즘입니다. 단어 단위에서 더 쪼갠 sub word의 개념을 도입했습니다. ex) 마우스라는 단어를 글자 단위로 n-gram을 하겠다면 단어에서 끝나는 게 아니고 단어를 더 쪼개겠다는 것입니다. 마우스를 3개씩으로 하면 3개씩으로 나누겠다는 것입니다. > 마우스라는 단어를 표현하기 위해서는 5개의 임베딩 벡터가 필요하게 됩니다. 그러면 메모리를 엄청 먹습니다.
-> 이걸 왜 쓸까요?
1. oov 처리에 좋습니다.
데이터 셋의 단어의 수가 많아 봐야 몇 만개가 안됩니다. 따라서 한 언어의 모든 단어 학습이 불가능합니다. 하지만 실제로는 더 많은 단어가 있기 때문에 모르는 단어가 나오면 임베딩 벡터가 없어서 처리 불가능합니다.
> (왜냐면 word2vec은 사전입니다.) 그래서 모르는 단어를 넣었는데 얘에 대한 토큰화가 안 되어있고 정수 인코딩이 안 되어있으니 이 단어는 없는 단어라고 에러가 뜹니다. 따라서 word2vec에서는 모르는 단어는 처리가 불가능합니다. > 근데 back drop이 단어 목록에 없는 단어였다면 근데 자세히 보니 back+drop 이런 식으로 해석이 됩니다. "뒤에 있는 뭔가 있어요"라고 해석이 됩니다. = 단어의 느낌을 살릴 수 있습니다.
> dow+nside = "내려가는 쪽"이란 해석이 가능합니다. 제대로 된 해석은 아니지만★ 단어의 느낌은 알 수 있습니다. > 모르는 단어더라도 단어를 잘라보면 대충 해석은 가능할 것입니다. > FastText은 단어와 단어 사이를 자르기 때문에 대충 이러한 뜻이구나 하고 뉘앙스를 파악할 수 있기에 FastText이 oov에 좋습니다.
2. rare word(희귀 단어)를 제외하기도 합니다.
> 따라서 정체 및 추출에서 지워버리니 학습에 별로 안 쓰여서 word2vec의 임베딩 결과가 좋지 않습니다. > 그래서 rare word 처리에 좋습니다. oov처럼 볼 수 있고 rare word들을 쪼개고 쪼개고 쪼개면 이 쪼갠 것들이 다른 데서 많이 쓰였을 수도 있기 때문입니다.
3. 오타에 강인하다
오타를 내더라도 word2vec은 없는 단어라고 하니(cbow는 한 글자라도 틀리면 다른 단어입니다.) FastText은 한 단어를 5개로 쪼개는데 그중에 2개 3개 오류 나도 나머지를 쓰면 되기 때문에 오타겠거니 하고 넘어갈 수 있습니다.
정리 : n-gram word 임베딩 방법을 사용하는 임베딩 법입니다. (사전 훈련 모델입니다.)
-> 워투백 알고 총정리
cbow, skip-gram, sgns, glove, FastText
- 사전 훈련 모델
cbow, glove, FastText 등 사전 모델이 다 있고, 경제, 문화, 사회 등 특화 데이터로 학습시킨 모델도 존재합니다.
※ pca
word2vec시각화 분석 툴 : 3차원 평면 위에 데이터가 존재한다고 치면 2차원으로 매핑해서 끌어온 후 시각화합니다. > word2vec은 차원의 수가 커지니 시각화해 보면 "이쪽에는 그룹 A가 많네 word2vec이 잘 되어었네요!"라고 주장할 수 있는 툴입니다.
'[AI] > [네이버 BoostCamp | 학습기록]' 카테고리의 다른 글
NLP PART.BERT, GPT (0) | 2022.12.09 |
---|---|
NLP PART.Attention 메커니즘 (0) | 2022.12.06 |
NLP PART.RNN, Seq2Seq 구조 (0) | 2022.12.03 |
NLP PART.텍스트 전처리 이론 (0) | 2022.12.01 |
[22.05.01]딥러닝 PART.순환 신경망 (0) | 2022.11.08 |