모바일 앱 환경에서는 latex 수식이 깨져 나타나므로 가급적 웹 환경에서 봐주시길 바랍니다.
오늘은 본격적으로 RNN에 들어가보도록 하자. 우선 이를 위해 워드 임베딩과 가장 대표적인 모델인 Word2Vec에 대해서 이야기하고자 한다.
Word embedding은 단어를 벡터로 변환하는 방법을 이야기하며 여기서의 벡터는 dense vector를 의미한다.
먼저 Sparse vector, Dense vector에 대해 이야기하자.
우리가 이미지 분류에서 라벨링을 할 때 가장 대표적인 방법이 '원핫인코딩', 즉 one-hot vector로 변환하는 것이었다.
여기서 one-hot vector는 하나의 성분만 $1$이고, 나머지 모든 성분은 $0$인 벡터를 의미한다.
만약, 이미지 분류에서 사진이 고양이 사진이었고 클래스가 10개였다면 고양이에 해당하는 인덱스 성분만 $1$이고 나머지 성분은 $0$인 벡터로 라벨링을 진행한다.
이러한 벡터들은 당연히 거의 모든 성분이 $0$이기 때문에 희소 (Sparse)하며 이런 벡터들을 Sparse vector라고 한다.
이 Sparse vector의 문제점은 단어의 개수가 늘어날수록, 클래스의 개수가 늘어날수록 그 차원이 한없이 커진다는 점이다.
만약 이미지 분류에서 클래스가 10개면 성분이 10이겠지만, 클래스가 $1,000$, $10,000$으로 늘어나면 라벨벡터의 차원도 $1,000$, $10,000$으로 늘어날 것이다.
이러한 Sparse vector의 반대되는 개념이 Dense vector이다. 이 벡터들은 그 차원이 단어 집합의 크기, 클래스의 개수 등과 같지 않고 그보다 훨씬 작다. Dense vector의 차원은 사용자가 설정한다.
또한 각 벡터의 성분은 $0$ 또는 $1$이 아니라, 모든 실수값이 된다.
예를 들어 벡터의 차원을 128로 고정짓는다면, 강아지를 Dense vector로 표현했을 때, $[0,2, 0.8, -1.1, \cdots, 0.5]$ 등으로 표현되는 것이다. 이는 어휘 사전의 크기가 1000일 떄 (즉 내가 미리 가지고 있는 단어의 개수가 1000개일때) One-hot vector로 변환하면 $1,000$ 차원의 벡터가 되는 것에 비하면 그 크기가 상당히 줄어든 것을 알 수 있다.
이렇게 단어들을 Dense vector로 변환하는 방법론을 우리는 'Word embedding'이라고 한다. 그리고 이렇게 나온 벡터들을 우리는 'Embedding vector'라고 한다.
이번 글에서 이야기할 것이 바로 이 word embedding의 시작이라 할 수 있는 'Word2Vec'이다.
Word2Vec의 학습 방식에는 Continuous Bag of Words (CBOW)와 Skip-Gram 두 가지가 있다.
우선 앞선 글에서 RNN의 대전제로 이야기했던 '분포 가설'을 다시 한 번 복습하자.
분포 가설 (Distributional hypothesis)은 '비슷한 문맥에서 등장하는 단어들은 비슷한 의미를 가진다.'라는 가정이고 현재의 언어 모델들은 이 가설을 대전제로 하여 구현되어지고 있다.
Word2Vec도 이 가설을 기초로 하여 현재 단어를 기준으로 주변 단어를 예측하거나, 주변 단어를 기준으로 현재 단어를 예측하는 방식으로 word embedding 학습을 진행한다.
구체적으로 CBOW는 주변에 있는 단어들을 입력으로 하여 중간에 있는 단어를 예측하는 방식으로 학습이 이뤄지고, Skip-Gram은 중심에 있는 단어를 입력으로 하여 주변 단어를 예측하는 방식으로 학습이 이뤄진다.
CBOW 먼저 간단한 예시를 보도록 하자.
'귀여운 강아지가 의자 위에 앉아있다.'
그렇다면 '의자'라는 단어를 예측하는 과정에서는 해당 단어 주변에 있는 문맥 단어들을 입력으로 집어넣을 것이다.
이때 얼마만큼의 단어를 집어넣을 것인가, 그 크기도 결정해야 하는데 이를 '윈도우' (window)라 한다.
예를 들어 윈도우 크기가 1이라면, '의자' 앞에 있는 '강아지가', '의자' 뒤에 있는 '위에' 라는 단어가 input으로 들어갈 것이다. 즉 $t$번째 있는 단어를 $w_t$라고 한다면, 윈도우 크기가 1이라면 $w_{t-1}, w_{t+1}$이 input으로 들어가서 $w_t$를 예측하는 방식인 것이다. 위 그림에서는 window size가 2이다.
당연히 내가 가지고 있는 전체 어휘 사전에서 어떤 단어가 들어가야 하는지 예측하는 것이기 떄문에 이때 정답 label $y$은 원핫인코딩으로 구현된 one-hot vector이고 마지막에 softmax function을 거쳐서 나온 모델 output $\hat{y}$과 $y$사이의 차이를 cross-entropy Loss function으로 측정하여 backpropgagation을 통해 학습이 진행된다.
또한 위 그림에서 볼 수 있듯이 CBOW, Skip-Gram 모두 Hidden layer=1인 '얕은' 신경망이다. 또한 Word2Vec는 activation function이 없기 때문에 단순한 선형 연산만 이뤄진다. 그리고 input layer와 hidden layer를 연결하는 가중치 행렬 $W_1$, hidden layer와 output layer를 연결하는 가중치 행렬 $W_2$는 크기가 서로 반대이다.
이 말이 무슨말이냐면 만약에 $W_1 \in \mathbb{R}^{m \times n}$이라면 $W_2 \in \mathbb{R}^{n \times m}$이다.
단 전치 행렬은 아니고 크기가 서로 반대인 다른 행렬이다.
그리고 이 행렬들의 성분은 backpropagation을 통해 학습이 이뤄진다.
그리고 이렇게 학습이 진행된 $W_1$, $W_2$를 우리는 임베딩 행렬로 이용하는 것이다.
Skip-Gram 또한 비슷하다. 다만 Skip gram은 중심 단어를 기준으로 주변 단어를 예측하는 방식으로 학습이 진행되며, 전반적으로 그 성능은 CBOW보다 우수하다고 알려져 있다.
'Deep dive into Deep learning' 카테고리의 다른 글
Deep dive into Deep learning part 23 : RNN (4) (1) | 2023.06.04 |
---|---|
Deep dive into Deep learning part 22 : RNN(3) (2) | 2023.05.31 |
Deep dive into Deep learning part 20 : RNN (1) (0) | 2023.05.20 |
Deep dive into Deep learning part 19 : Regularization(4) - Updated (2) | 2023.05.16 |
Deep dive into Deep learning part 18 : Regularization (3) - Updated (0) | 2023.05.11 |
댓글