목차
INTRO
[Review: Main idea of word2vec]
- word2vec 강의 정리 보러가기
- random word vectors로 시작한다.
- 단어에 대한 단어 벡터와 문맥벡터 사이의 내적의 관점에서 아래 확률분포 식으로 이를 수행
- 학습
- 벡터를 업데이트하여 주변 단어 예측을 더 잘하게 한다.
- 이러한 학습을 통해 벡터는 고차원에서 유사성이 높은 단어들과 가까이 있고 의미있는 방향을 갖게된다.
👀 강의 슬라이드 보기
Word2vec2
Word2vec2는 Word2vec의 단점을 보완한 것으로 크게 2가지 보완점을 갖고 나온 것이다.
- negative sampling
- embedding
그런데 강의에는 이 두가지 보완점 중 negative sampling만 설명한다고 되어있어 내가 따로 정리해둔 embedding 포스팅 링크를 추거해뒀다.
궁금하면 읽어보면 된다.
[Word2vec parameters의 특징]
- Word2vec의 유일한 매개변수(parameters)는 단어벡터이다.
- Word2vec는 “Bag of words” model 이다.
- Bag of words: 단어의 순서와 위치를 고려하지 않는다.
- 즉, 문맥안에 있는 단어들은 모두 같은 취급을 받는다는 것이다.
- 각 단어에 대해 외부단어 벡터(outside), 중앙단어 벡터가 있다.
[Word2vec parameters의 계산과정]
- 1) 특정 외부 단어가 중심 단어와 함께 발생할 가능성에 대한 점수를 얻기 위해 target 벡터와 context 벡터를 내적을 취한다.
- 2) 이 정수를 확률로 변환하기 위해서 softmax를 사용한다.
[Word2vec in space]
- 학습 결과 비슷한 단어끼리 고차원 공간에 가깝게 배치되어있다.
- 이 고차원 공간은 우리가 아는 2차원과 다르게 생겼다.
[Optimization: (Stochastic) Gradient Descent]
- Gradient Descent: 모든 벡터를 한꺼번에 업데이트
- 느림
- 우리가 앞에서 배웠던 \(J(θ)\)가 GD임
- Stochastic Gradient Descent: 말뭉치를 배치단위로 쪼개 배치단위로 업데이트
- 빠름
- 이걸 대부분 많이 씀
- Optimization 과정
- 1) 무작위(0에 가까운 숫자들)로 단어벡터의 가중치 초기화(randon initial value)
- 2) 지난시간에 정의한 손실함수 \(J(θ)\)로 손실을 계산한 다음 손실값이 낮은 곳으로 기울기 하강
- 이 최적화의 아이디어는 현재 위치에서 현개 기울기를 계산한 다음 음의 기울기 방향으로 작은 걸음을 내딛음
- step size(learning step): 작은 걸음의 보폭
- 이 사이즈가 너무 크면 왔다갔다함
- 이 사이즈가 너무 작으면 학습이 오래걸림
- 그러므로 적절함 사이즈로 조정하는것이 중요함
- 위와 같이 최적화하여 손실값이 낮은(minimum) 좋은 단어 벡터를 만드는것이 목표
[Word2vec algorithm family: More details]
- 왜 2개의 벡터인가?(왜 더 많은 벡터를 보지 않고 2개의 벡터만 보고 계산에 포함시키는가?)
- 우리가 보기로한 벡터들은 벡터끼리 내적을 수행해야하는데 2개를 넘어가면 계산이 너무 복잡해져서 오히려 더 비효율적이다.
- 특히 분모를 계산하는게 너무 cost가 높다.
- Word2vec의 모델
- Word2vec는 2개의 모델을 아우르는 표현이다.
- 1) Skip-grams (SG): target단어로 context단어 예측(성능이 좋아서 더 많이 씀)(이 강의에서 지금까지 배운 것)
- 2) Continuous Bag of Words (CBOW): context단어로 target단어 예측
👀 강의 슬라이드 보기
negative sampling
Word2vec를 더 최적화하기 위한 방법 중 하나이다.
이 강의에선 skip-gram의 negative sampling (SGNS)위주로 설명하겠다.
[기존 skip-gram의 문제]
- 아래 skip-gram의 식을 보면 분모가 모든 단어의 내적을 수행해야하기 때문에 계산이 너무 비싸다.
- 그러므로 모든 내적의 평균을 내는
softmax
대신negative sampling
을 수행해야한다.
📜 more about Softmax classifier 보기
[negative sampling: \(maximize\)]
- 여러 “noise” 쌍(random 단어와 짝을 이루는 center 단어) 대비 true 쌍(center 단어와 context창의 단어)에 대한 이항 로지스틱 회귀 분석 훈련
- Overall objective function(\(maximize\))
- \(log𝜎(u_{o}^{T} v_{c})\): 정답 쌍의 내적을 통해 두 단어가 동시에 발생할 확률을 최대화
- \(\sum_{i=1}^{k} E_{j~P(w)}[log𝜎(-u_{j}^{T} v_{c}]\): 정답이 아닌 오답값 중에서 랜덤으로 선택하여 오답값을 학습시켜 단어의 확률을 최소화, 즉 소수의 무작위의 단어에 대해 계산한다.(무작위 단어를 샘플링하는 비율은 확률에 따라 다르다)
- 여기서 softmax 대신 sigmoid(𝜎) 를 사용한다
- sigmoid = logisitc 함수 이다.
- 이걸 통해서 중심단어와 무작위로 고른 단어 사이의 내적을 구한다.
- 이 sigmoid를 통하면 이 내적값이 크면 사실상 1, 아니면 0이 된다.
- 이해가 안간다면? 더 알아보기
📜 more about binary logistic regression 보기
[negative sampling: \(minimize\)]
- 이 강의에서 내주는 과제를 위해 위의 식을 조금 더 분석해봤다.
- 이 식은 음의 로그 가능성을 최소화 하는 것으로 볼 수 있다.
- 즉 위의 식에다 -를 붙이고 이를 최소화 하는 것이다.
- 각 식에 대한 설명은 위와 같다.(대신 거기에 음을 취한다는 것만 다르다)
- \(k\):negative samples (using word probabilities)
- 실제 외부 단어가 나타날 확률 최대화, 중심 단어 주변에 임의 단어가 나타날 확률 최소화
➡ 이를 통해 주변 단어에만 국한된 학습이 아닌 좀 더 전체를 고려한 학습이 된다. - \(P(w)= U(w)^{3/4}/Z\)의 확률로 부정적인 예를 샘플링한다.
- 정답이 아닌 샘플(negative sample)을 무작위로 샘플링 할 때 단어들의 출변 빈도로 샘플링할 단어를 뽑는 것이 원칙이다.
그런데 말뭉치 출현 빈도가 낮은 정답이 아닌 샘플은 선택될 확률이 낮다.
그러므로 기본 확률(\(U(w)\))에 \(3/4\)을 제곱하여 낮은 빈도의 단어가 선택될 확률을 높이는 것이다. - 이해가 안간다면? 더 알아보기
- 정답이 아닌 샘플(negative sample)을 무작위로 샘플링 할 때 단어들의 출변 빈도로 샘플링할 단어를 뽑는 것이 원칙이다.
[negative sampling의 장점]
- softmax보다 효율적
- softmax는 내적이 많은데 모든 단어를 모두 내적하려면 계산비용, 시간이 상당하다.
- 반면, negative sampling은 모든 것을 계산하는 것이 아닌 정답값과 정답이 아닌 값을 각각 이진(정답이다, 정답이 아니다)분류하여 계산하기 때문에 확률을 구하는 softmax보다 효율적이다.
- context 범위에 없는 단어를 negative sampling하여 context에만 국한된 학습에서 벗어날 수 있다.
👀 강의 슬라이드 보기
aside
word2vec에서 추가 지식(TMI)을 쌓아보자!
[Stochastic gradients with negative sampling]
- 우리는 SGD에 대해 각 창에서 그레이디언트를 반복적으로 측정한다.
- 그런데 매 step마다 업데이트 되는 벡터는 매우매우 희소하다.
[벡터의 표현]
- 현재는 계속 단어를 열벡터로 표현했지만, 사실상 직접 컴퓨터로 계산한때는 행(row)벡터로 표현된다.
- 행으로 표현하면 연속으로 계산이 가능하여 메모리를 효율적으로 사용 가능하기 떄문이다.
📜 nore about neural word vectors 보기
👀 강의 슬라이드 보기
co-occurrence matrix
그렇다면 왜 단어 벡터를 표현할 때 동시발생 행렬(co-occurrence matrix)을 사용하지 않는가?
동시발생행렬(co-occurrence matrix)은 통계기반 기법이다.
- 통계기반 기법
- 한단어를 말뭉치 전체를 이용하여 표현
- 말뭉치가 조금 수정되도 모든 단어를 업데이트 해야함
- 비효율적
- PMI,SVD등을 통해서 차원 축소를 통해 필요없는 단어 표현 정보를 없애면서 성능 개선
- 추론기반 기법
- 한 단어를 표현할 때 말뭉치 전체가 아닌 몇개의 단어로 추론하여 단어 표현
- 말뭉치가 조금 수정되어도 이에 영향을 받는 몇몇 단어 벡터만 수정하면 됨
- 비교적 효율적
[동시발생행렬(co-occurrence matrix) 예시]
- 각 표의 칸의 숫자의 의미는 그 단어가 나오는 횟수이다.
- Window length 1 (more common: 5–10)
- Symmetric (irrelevant whether left or right context)
- Example corpus:
- I like deep learning
- I like NLP
- I enjoy flying
[동시발생행렬의 문제점]
- 단순히 개수를 센 벡터의 문제
- 벡터가 말뭉치 전체로 표현되기 때문에 어휘에 따라 크기가 커진다.
- 매우 높은 dimensional: 많은 저장소 필요
- 후속 분류 모델은 희소성 문제가 있다 → 모델은 덜 견고하다.
- 차원이 낮아 모델이 결고하지 못하다.
- 해결책
- 중요한 정보의 “대부분”을 소수의 고정된 정보에 저장 차원: 밀집 벡터
- 이렇게 기존 벡터를 밀집 벡터를 벡터를 통해 표현하면 word2vec와 비슷해진다.(Usually 25–1000 dimensions)
[해결책: SVD]
- 위 문제의 해결 방법으로 차원이 낮은 단순 벡터를 밀집 벡터로 만드는 것이다.
- 원래 x를 아래와 같이 3개로 나눠 표현한다.
- \(𝛴\)는 높은 수(중요한 수, 빈도가 높은 수)로 정렬되어있어 더 높은 밀집도의 벡터를 얻고싶으면 이 행렬의 아래(파란색)부터 지워 중요한 정보만 나타내게하면 된다.
- 노란색 부분이 없어지며 무시된다.
- 이해가 안된다면? 더 알아보기 ➡ 같은 LSA와 같은 맥락이다.
[SVD의 문제 해결]
- 문제점
- 위와 같은 SVD를 통해 중요한 단어(빈도가 높은 단어)위주로 표현하면 function words (the, he, has)가 많이 추출된다.
- 이는 의미와 연관이 없는 경우가 많으므로 이러한 단어들이 문제가 된다.
- 해결책: Hacks to X
- 위와 같이 너무 빈도가 높은 단어들을 지워준다.
- log the frequencies
- min(X, t), with t ≈ 100
- Ignore the function words
- 카운트 대신 Pearson 상관 관계를 사용한 다음 음수 값을 0으로 설정한다.
- 위와 같이 너무 빈도가 높은 단어들을 지워준다.
- 문제 해결 결과
- 단어의 상관관계를 보면 잘 학습되었다는 것을 알 수 있다.
- 단어의 상관관계를 보면 잘 학습되었다는 것을 알 수 있다.
👀 강의 슬라이드 보기
GLOVE
[Towards GloVe: Count based vs. direct prediction]
- Count based
- 빠른 학습
- 통계의 효율적 사용
- 주로 단어 유사성을 포착하는 데 사용됨
- 주어진 말뭉치에 대한 단어 개수의 불균형
- ex)
LSA
,HAL
,COALS
,Hellinger-PCA
- direct prediction
- 말뭉치 크기를 Scales
- 통계의 비효율적 사용
- 다른 작업에서 향상된 성능 생성
- 단어의 유사성을 넘은 복잡한 패턴 포착가능
- ex)
Skip-gram
/CBOW
,NNLM
,HLBL
,RNN
[Encoding meaning components in vector differences]
- 유추문제(meaning components)를 풀기 위해서는 동시발생확률의 비율로 표기해야한다.
- ‘ice’와 연관있는 ‘solid’, ‘water’의 동시 발생 비율은 ‘large’
- ‘ice’와 연관없는 ‘gas’, ‘ random’의 동시 발생 비율은 ‘samll’
- 이를 수치화해보면,
- 비슷한 수치끼리는 1에 가까운 수가 나온다는것 을 알 수 있다
- 로그쌍선형모델(Log-bilinear model)
- 이러한 동시발생확률의 비율을 선형 의미구성요소로 포착하는 방법
- \(w_i\), \(w_j\): 각각의 선형 쌍
- \(w_a - w_b\): 두 벡터의 차이
[Combining the best of both worlds GloVe]
- \(f(X_{ij})\): 높은 빈도의 단어 수 제한
- \(b\): 편향
- \(j\): 동시발생행렬에서 count작업 최적화 기능
- 특징
- Fast training
- Scalable to huge corpora
- Good performance even with small corpus and small vectors
- 결과
evaluate word vectors
그럼 이 단어 벡터들이 잘 설정되었는지 평가하는 방법들을 알아보겠다.
대표적으로 2가지 방법이 있다.
- Intrinsic: 내적
- Extrinsic: 외적
Intrinsic
[특징]
- 특정/중간 하위 작업에서의 평가
- 계산 속도 향상
- 시스템을 이해하는 데 도움이 됨
- 실제 작업에 대한 상관관계가 설정되지 않은 경우 실제로 도움이 되는지 명확하지 않음
[방법: Word Vector Analogies]
- 평가 방법: 단어 벡터를 추가 후 코사인 거리가 직관적인 의미론적 및 구문적 유사 질문을 얼마나 잘 포착하는지로 평가
- ex)
man:woman :: king:?
➡ Queen이란 답을 도출해야함
- 문제: 만약 정보가 거기에 있지만 선형적이지 않다면 문제가 된다.
📜 Glove 평가 보기
📜 추가 Intrinsic 보기
Extrinsic
- 실제 작업에 대한 평가
- 정확성을 계산하는 데 오랜 시간이 걸릴 수 있음
- 하위 시스템이 문제인지 상호 작용인지 또는 다른 하위 시스템인지 불분명함
- 정확히 하나의 서브시스템을 다른 서브시스템으로 교체하면 정확도가 향상됨 » Winning!
[방법: named entity recognition]
- 개인, 조직 또는 위치에 대한 참조 식별: Chris Manning은 Palo Alto에 산다
Word senses and word sense ambiguity
단어 의미의 모호성 문제: 한 단어가 여러개의 의미를 갖을 수 있다.
- 특히 흔한단어에서 많이 나타남
- 특히 존재한지 오래된 단어에서 많이 나타남
[Example: pike]
- 이 단어는 아래의 모든 의미를 갖고있음
- A sharp point or staff
- A type of elongated fish
- A railroad line or system
- A type of road
- The future (coming down the pike)
- A type of body position (as in diving)
- To kill or pierce with a pike
- To make one’s way (pike along)
- In Australian English, pike means to pull out from doing something: I reckon he could have climbed that cliff, but he piked!
즉 위의 간어의 의미에 대해 같은 벡터가 아닌 각 의미마다 다른 벡터를 갖는것이 목표이다.
[SOLUTION 1: Improving Word Representations Via Global Context And Multiple Word Prototypes (Huang et al. 2012)]
- 단어를 학습시키고 군집마다 다르게 위치된 같은 단어는 따로 벡터를 부여하고 따로학습시킴
- 다른 클러스터에 있는 같은 단어는 다른단어 취급하는 것
- 하지만 말뭉치마다 편차가 크게 학습된다는 단점이 있음
[SOLUTION 2: Linear Algebraic Structure of Word Senses, with Applications to Polysemy]
- 다른 단어는 따로 벡터를 만들어 학습시키고 아래와 같이 이에 대한 평균을 냄
- 하지만 이러한 평균은 더욱 큰 모호성을 갖고올 수 있다는 단점이 있음
- 그럼에도 아래와 같이 좋은 결과를 내긴 함