2021. 7. 18. 13:22ㆍIT Study/Ai
이번 포스팅에서는 자연어 처리에서 단어의 분산 처리를 담당 해주는 Word2Vec을 알아보도록 하겠다.
일단 단어의 분산처리의 뜻부터 짚고 넘어가야 하는데 분산처리는 즉 단어를 여러 차원에 분산시켜 처리한다는 것이다.
예를들어 "i see you"라는 3가지의 단어로 이루어진 문장이 있을 때 "i"를 [0,0,1] "see"를[0,1,0] "you"를 [1,0,0]으로 3차원으로 분산시킨 것이다. 이상태만으로도 단어를 벡터화 해줄 수 있지만 이 방법은 여러 문제를 껴안고 있다. 그렇기에 많은 기술들이 나왔는데 이번에 알아볼 기술은 추론 기반 기법인 word2vec 그중에서도 CBOW모델이다.
CBOW 초기 모델
위 사진이 기본적인 CBOW모델의 모습이다.
CBOW모델에서 단어의 분산처리를 할 때 가장 기본이 되는 개념은 "맥락적 분석"이라고 할 수 있겠다.
예를 들어 "i see you"라는 문장을 볼 때 "see"라는 단어의 의미는 "i"와"you"두 단어 사이에 있어야 그 의미가 전달이 된다는 개념이다. 그렇기에 위 모델에서 입력은 총 2개의 단어의 원핫벡터를 받은 것을 볼 수가 있다.
CBOW기본 모델에서는 입력 때 받은 원핫 벡터와 W.in을 MatMul(합성곱)을 해서 은닉층을 얻어낸다. 여기서 W.in은 두 입력 값에 동일하다.
이렇게 얻은 은닉층은 다시 W.out을 거쳐 입력값과 똑같은 크기의 출력층으로 넘어가게 된다. 이 상태로 확률을 나타낼 수 있는 Softmax함수를 통해 확률이 산출이 되고 정답레이블과 비교가 되어 오차가 산출된다.
이렇게 만들어진 오차는 역전파에 사용되고 학습이되는 구조인 것이다.
CBOW 초기 모델의 단점
CBOW 초기 모델에는 여러가지 단점이 존재한다. 그리고 상당히 성능에 직결되는 문제가 있어 최적화에도 무리가 있다. 자연어 처리분야에서 단어의 분산 처리는 상당한 작업 시간을 요구하는 처리이다. 그렇기에 최적화는 필수 적인 요소라고 볼 수있다.
Embedding
첫번째로는 입력계층에서 은닉층으로 넘어갈때 불필요한 합성곱 연산을 한다는 것이다.
한번 예를 들어보자.
여기 2개의 행렬이 있다. 하나는 입력 계층의 원핫벡터로 7의 크기를 가지고 있다. 다른 하나는 W.in으로 가중치를 담당하는 7x3의 크기를 가지고 있다.
이 상태에서 두 행렬을 합성곱 하면 어떻해 될까? 답은 너무나도 자명하게 첫번째 행렬의 1인 인덱스 부분의 두번째 행렬의 행만 검출이 될 것이다. 위 행렬의 1은 3번째에 존재하니 두번째 행렬에서 [2,8,3]만 검출이 될 것이다. 이 작업은 굳이 합성곱으로 하지않고 연산이 가능한 간단한 처리이다. 오히려 인덱스만 필요한 작업이니 input값은 숫자 하나면 되는데 굳이 7의 사이즈로 늘어나고 그로인해 합성곱의 연산까지 늘어나게 되는 것이다.
이러한 불 필요한 작업을 개선하기위해 나온 것이 Embedding처리이다. 이렇게 들으니 어려워 보일 수 있는데 위에 설명한 내용에 의거하면 매우 간단한 작업이다. 먼저 단어의 index가 들어오면 가중치 행렬에서 해당 index의 행을 뽑아 다음 으로 넘겨주기만 하는 처리인 것이다.
역전파 또한 간단하다. 가중치행렬에서 index를 통해 뽑은 곳을 학습을 거쳐 다시 넣어주면 된다. 하지만 여기서 주의해야 할점이 하나 존재 하는데 바로 덮어쓰기가 아닌 덧셈을 통해 넣어준다는 것이다. 그 이유는 배치처리를 할때 중복되는 idx가 존재하게 되면 전에 학습한 가중치값이 덮어써져 버리기 때문이다.
Sigmoid With Loss
Softmax의 함수의 모습은 전체 클래스의 수를 exp(Si)에 제곱을 한 값을 분모로 두고 타깃의 원소를 Sk라 했을때 exp(Sk)를 분모로한 형태이다. 분모는 i가 1부터 전체 클래스에수까지 더해지는 시그마로 표현이 되는데 만약 분류해야 되는 단어의수 즉 클래스의 수가 10만개라고 가정했을 때 그 연산량은 어마무시하게 커진다.
그렇기에 SoftMax의 다중분류모델은 문제가 있음을 확인 이 것을 이진분류로 바꾸려는 시도가 생겼는데 바로 sigmoid를통한 교차엔트로피 확률 모델이다. sigmoid의 식은 유명하니 넘어가고 교차엔트로피의 식은
L = -(tlogy + (1-t)log(1-y))로 구성되는데 정답레이블이 1이면 y가 1에 가까워질수록 오차가 작아지고 0에 가까워 질 수록 무한대로 발산,정답레이블이 0이면 y가 1에 가까워질수록 오차가 무한대로 발산 0에 가까워질 수록 오차가 작아지는 구조이다.
이 y는 Sigmoid로 표현이 된다.
역전파는 두개를 합지면 y-t라는 간단한 식이 도출이 된다.
개선된 CBOW모델
윗 내용들을 적용을 하게되면 처음 CBOW에서 이러한 구조로 바뀌게 된다. 한가지 설명 안한 것은 입력계층의 임베딩을 거친 입력값들은 두개를더해 평균을 내준 1/2로 곱한 점이다. 이 것은 너무 직관적이니 설명은 건너 뛰겠다.
여기서 이 식을 더 간단히 하고 싶다면 출력측의 임베딩과 dot연산을 EmbeddingDot이라고 한꺼번에 만들 수도있다.
하지만 이 EmbeddingDot에선 헷갈리기 쉬운 부분이 있는데 그 것은 Dot연산을 그냥 평범한 곱셈과 Sum으로 대체한다는 것이다. 윗그림을보자 target_W는 인덱스를받아 추출된 임베딩out계층이다. 여기서 미니배치를 생각하지 않는다면 [0,1,2]가 맨처음으로 뽑혔을 것이다. 그리고 학습의 구조에 따라 h인[0,1,2]가 올 것이다. 여기서 dot연산을 실지하게 되면 원소하나하나 대응된 곱셈값이 될 것이다. 행과 열각각 하나씩 있기 때문이다.
이 것이 미니배치 처리로 넘어가게되도 같은 원리로 동작 할 수있다. 하지만 하나 차이점은 마지막에 이 미니배치 값들을 모두 더해서 out으로 낸다는점이다. 3개씩 받아 하나로 처리하는 구조인 것이다. 이것도 모두 마지막 계층이 다중분류 모델이아닌 확률모델인 sigmoid with loss로 이어졌기 때문에 할 수 있었던 것이다.(물론 embedding을 사용했을 때부터 다중분류는 사용할 수 없었다.)-원핫인코딩불가
이렇게 만들어진 모델은 W.in을 단어의 분산처리로 가져다 쓰게된다.
역전파의 모델은 정말 간단한데 Embedding모델은 이미 설명을 했고 dot연산 또한 곱셈과 Sum연산으로 바꿔 주었기 때문에 신경써줄 것이 거의 없다. sum역전파는 덧셈노드의 역전파와 같다. 상류층 기울기를 그대로 전파해주면 된다.
입력층쪽 또한 곱셈과 덧셈으로만 이루어져있으니 문제될 부분은 없다.
네거티브 샘플링
지금까지 CBOW의 개선 모델을 알아 봤는데 지금 이 모습만으로도 살짝 부족한 점이 있다. 지금 현재는 예를 들어 say를 정답레이블로 잡고 you와goodbye를 입력시키는 고정된 형태로 학습을 하고 있다. 즉 you와goodbye를 입력 했을때 hello 혹은 i등을 넣은 경우는 학습을 시킨적이 없다. input값을 결정할 때 항상 그에맞는 레이블을 골라 설정했기 때문이다.
위의 그림모습이 네거티브 샘플링을 적용한 CBOW의 최종 모습이다. 맨위 로직은 정답을 표현하는 지금까지 구현한 모델이다. say가 input두개 값의 정답이고 그거에 맞게 출력을 했을 때 정답레이블인 1이 출력이 된다 (0 or 1)
밑 두개의 로직이 네거티브 샘플링인데 i,hello사이에는 hello와 i가 들어갈 수 없다. 그렇기에 출력값이 hello와 i가 나왔을 때 정답 레이블이 0으로 설정된 것을 볼 수가 있다.
이 결과값들의 오차를 합한게 최종 오차가 된다.
CBOW모델의 의의
자연어처리에서 분산 표현이라는 것은 매우 중요한 요소이다. 결국 우리 일상에서 쓰는 언어들을 컴퓨터가 인식을 하게 하려면 우리가 쓰는 문자들을 데이터화 하는게 중요하다. 그렇기에 단어의 분산표현은 가장 기초가되고 뼈대가 되는 작업이라 할 수있다.
단어의 분산표현은 결국 차원 감소,단어의연관성 생성이 가장중요한 요소라고 볼 수있겠다. CBOW모델도 원핫인코딩을 쓰지않고 분산표현을 만들었다.이렇게 학습된 분산표현은 단어의 연관성도 충분히 내포를 하고있다.
예를들면 "너 + 나 = 우리", "먹었다 - 과거형 = 먹다" 이런식의 표현도 CBOW모델이 학습한 표현에서 가능하다는 것이다. 단어가 학습하는 과정에서 여러 차원들이 맞물리고 변화되어 이러한 복잡한 논리도 학습이 되는 것이다.
#출저 : 밑바닥부터 시작하는 딥러닝2
'IT Study > Ai' 카테고리의 다른 글
Seq2Seq 개선 (Reverse, Peeky, Attention-어텐션) (0) | 2021.08.14 |
---|---|
seq2seq(Sequence to Sequence) (0) | 2021.08.04 |
LSTM(Long Short-Term Memory) (0) | 2021.07.30 |
RNNLM(RNN Language Model) (0) | 2021.07.28 |
RNN, Truncated BPTT, Time RNN (0) | 2021.07.27 |