본문 바로가기

프로그래밍/AI:ML:DL

[NLP] Word2Vec 튜토리얼 - 스킵-그램 모델

반응형

Word2Vec 튜토리얼 - 스킵-그램 모델

http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/


2016 년 4 월 19 일


이 튜토리얼에서는 Word2Vec의 스킵 그램 신경망 아키텍처에 대해 다룹니다. 이 튜토리얼은 Word2Vec에 대해 일반적으로 소개하는 추상적인 통찰이 아닌, 조금 더 구체적인 내용을 살펴볼 것입니다. 특히 여기에서는 스킵 그램 신경망 모델을 다뤄 보겠습니다.


모델


스킵 그램 신경망 모델의 기본적인 개념은 사실 아주 간단합니다. 복잡해 지는 것은 세부적인 트릭과 개선사항에 대한 설명에 들어갔을 때라고 생각됩니다.


높은 수준의 직관에서부터 살펴봅시다. Word2Vec은 머신러닝의 다른 곳에서 아마 보았을 트릭을 사용합니다. 우리는 어떤 작업을 목표로 1개의 히든 레이어만 갖는 간단한 신경망을 훈련시킬 것입니다. 단 목표한 작업을 위해 신경망을 실제로 사용하지는 않을 것입니다. 대신 히든 레이어의 가중치만 학습시킬 것입니다. 이렇게 얻어진 가중치들이 바로 우리가 목표로하는 "단어 벡터"가 된다는 것을 알게 될 것입니다.


이 트릭은 입력벡터를 은닉층으로 압축하는 비지도 피쳐 학습 방법인 오토인코더에서 이미 보았을 수도 있습니다. 오토인코더에선  히든 레이어에서 입력 벡터를 압축하게 되고, 다시 출력 레이어를 통해서 원본으로 재생됩니다. 학습을 마친 후 출력 레이어 (압축 해제 단계)를 제거하고 히든 레이어만 사용합니다. 이렇게 레이블이 없는 비지도학습으로 좋은 이미지 피쳐를 학습해낼 수 있습니다.



가짜 작업


신경망을 구축하여 수행할 "가짜"작업에 대해 우선 이야기해 봅시다. 그 다음에 이것이 정말 우리가 원하는 단어 벡터를 만들어내는지 다시 살펴 보겠습니다.


다음과 같은 목적으로 신경망을 훈련 할 것입니다. 문장 중간에 어떤 단어(입력 단어)가 주어졌을 때, 근처의 단어 중 아무거나 하나를 선택합니다. 신경망은 전체 어휘사전 중 각 단어에 대해 그 단어가 "근처의 단어"가 될 확률을 알려주어야 합니다.


"근처"라고 말할 때 실제 알고리즘에는 이것을 정의하는 "윈도우 사이즈" 매개 변수가 있습니다. 자주 쓰는 5라는 값을 "윈도우 사이즈"로 선택한다면, 5단어 앞에서부터 5단어 뒤까지 총 10단어라는 뜻입니다.



출력 확률값들은 어휘사전의 각 단어가 주어진 입력단어 근처에 있을 가능성이 얼마나 큰가를 나타냅니다. 예를 들면,  학습된 신경망에 "소비에트"라는 입력 단어를 제공하면 "연합"과 "러시아"와 같은 단어에 대한 확률이 "수박"과 "캥거루"와 같은 관련없는 단어의 출력 확률보다 훨씬 높을 것입니다.


신경망 학습은 훈련용 문서에있는 단어쌍을 만들어 그것으로 훈련시킬 것입니다. 아래 예제는 "The quick brown fox jumps over the lazy dog."이란 문장에서 취할 수있는 몇 가지 학습 샘플 (단어쌍)을 보여줍니다. 아래 예에선 편의를 위해 작은 윈도우 사이즈인 2를 사용했습니다. 파란색으로 칠해진 단어가 입력 단어입니다.


신경망은 각 단어쌍이 나오는 횟수에서 학습할 것입니다. 예를 들어, 신경망은 아마도 ("Soviet", "Sasquatch") 보다는 ( "Soviet", "Union") 이라는 훈련 샘플을 더 많이 볼 것입니다. 훈련이 끝나면 "Soviet"라는 단어를 입력으로 줬을 때 "Sasquatch"보다 "Union" 또는 "Russia"ㅣ 더 높은 확률값을 갖게 됩니다.


모델 상세사항


그럼 이 모든 것을 어떻게 표현될까요?


우선 신경망에는 텍스트 문자열 형식으로 입력을 줄 수 없다는 것을 알기 때문에 단어를 신경망에 표현할 방법이 필요합니다. 이를 위해 우리는 먼저 학습 문서 집합에서 단어 어휘사전을 구축합니다. 10,000 개의 고유한 어휘가 있다고 가정해 봅시다.


우리는 "ants"와 같은 입력 단어를 one-hot 벡터로 나타낼 것입니다. 이 벡터는 10,000 차원 (어휘의 모든 단어에 대응해 하나씩)의 백터이며  "ants"라는 단어에 해당하는 위치에만 "1"이고 다른 모든 위치의 값은 "0"입니다..


신경망의 출력은 어휘의 모든 단어에 대해, 해당 단어가 입력단어 근처에 있을 확률을 표현하는 단일 벡터(10,000차원)입니다.


이것이 신경망의 구조입니다.




히든 레이어 뉴런에는 활성함수가 없으며 출력에선 softmax를 사용합니다. 이 부분은 나중에 다시 살펴볼 것입니다.


단어쌍으로 이 신경망을 훈련시킬 때 , 입력은 입력 단어를 나타내는 원 핫 벡터이고, 훈련 출력 또한 출력 단어를 나타내는 원 핫 벡터입니다. 그러나 학습된 신경망에 단어를 입력하면 출력 벡터는 실제로 확률 분포 (즉, 원 핫 벡터가 아닌 부동 소수점 값의 묶음 )가 됩니다.


히든 레이어


예를 들어, 300개의 특성을 가진 단어 벡터를 학습하고 있다고 합시다. 그러면 히든 레이어는 10,000개의 행 (어휘 전체의 단어의 갯수)과 300개의 열 (히든 레이어 뉴런의 갯수)이 있는 가중치 행렬로 표시됩니다.



300 이라는 수치는 뉴스 데이터 세트를 학습시킨 논문에서 Google이 사용한 값입니다 ( 여기 에서 다운로드 할 수 있음 ). 특성(피쳐)의 수는 어플리케이션이 따라 조정해야 하는 "하이퍼 패러미터"입니다 (즉, 더 좋은 결과를 위해 바꿔가며 실험적으로 최적값을 찾아야 함.).


이 가중치 행렬의 각 행 을 살펴보면, 실제로 이것이 우리의 단어 벡터가 됩니다!




결국 이 모든 작업의 최종 목표는 숨겨진 레이어 가중치 행렬을 학습해 내는 것입니다. 출력 레이어는 학습이 끝나면 필요가 없습니다!


하지만 잠시 우리가 훈련할 이 모델의 정의를 좀 더 연구해 봅시다.


지금 당신은 이렇게 질문하고 있을지도 모르겠습니다. "그 원 핫 벡터는 거의 0으로 채워져 있는데, 그 효과는 무엇이야?" 1 x 10,000 모양의 원 핫 벡터를 10,000 x 300 행렬로 곱하면, 이는 결국 그 행렬의 한 행을 선택하는 것과 똑같습니다. 아래 그림은 위 문장을 다시 설명합니다.




결국, 이 모델의 히든 레이어는 실제로 조회 테이블로만 작동하는 것이고, 히든 레이어의 출력은 입력 단어에 해당하는 "단어 벡터"입니다.


출력 레이어


1 x 300 차원의 "개미" 단어 벡터는 다음 출력층에 주어집니다. 출력 계층은 softmax 회귀 분류기입니다. 소프트 맥스 회귀 분석에 대한 심층적인 튜토리얼은 여기에 있습니다. 이 튜토리얼의 요지는 결국 각 출력 뉴런(우리 신경망에서는 전체 어휘의 각 단어당 하나!)이 0과 1 사이의 값을 갖고, 모든 출력 값의 합이 1이 된다는 것입니다.


특히, 각 출력 뉴런은 가중치 벡터를가집니다.이 가중치 벡터는 히든 레이어의 단어 벡터에 곱 해지고, 그 값은 함수 exp(x)를 거칩니다.. 마지막으로 출력을 합계 1로 만들기 위해 이 결과치를 모든 10,000 개의 출력 노드의 결과의 합으로 나눕니다 .


다음 그림은 단어 "car" 출력 뉴런의 출력값을 계산하는 예입니다.




신경망은 입력 단어와 출력 단어의 상대적 위치에 대해서는 아무것도 모릅니다. 신경망은 어떤 단어가 앞에 올 확률과 나중에 나올 확률의 차이는 학습하지 않습니다. 이것이 갖는 의미를 이해하기 위해 학습 샘플에서 'york'라는 단어 앞에는 반드시 'new'가 있었다고 가정해 봅시다 . 즉, 적어도 학습 샘플에 따르면 'New'가 'York'부근에있을 확률은 100 %입니다. 그러나 'york'부근에서 10 단어를 무작위로 선택했을 때 이것이 'new'라는 확률은 100 % 가 아닙니다 . 당신은 근처에있는 다른 단어 중 하나를 골랐을 수 있습니다.


직관


좋습니다. 이 신경망에 대한 흥미로운 통찰력을 얻을 준비가 되셨습니까?


두 개의 다른 단어가 매우 유사한 "문맥"(즉, 단어 주위에 나타날 가능성이 높은 단어들이 비슷)에 있다면, 우리 모델은이 두 단어에 대해 매우 유사한 결과를 출력해야합니다. 그리고 이 신경망이 두 단어에 대해 유사한 문맥 예측치를 출력하는 한 가지 방법은 두 단어의 단어 벡터가 비슷한 경우 입니다. 그래서, 두 단어가 비슷한 문맥을 갖는다면, 신경망은 이 두 단어에 대해 유사한 단어 벡터를 학습할 가능성이 높아집니다!


두 단어가 비슷한 문맥을 갖는다는 것은 무슨 뜻일까요? "지적이다”와  “똑똑하다"란 동의어는 매우 비슷한 문맥을 가질 것이라고 기대할 수 있습니다. 또는 "엔진"과 "트랜스미션"과 같은 관련 단어 또한 비슷한 문맥을 가지고있을 것입니다.


더 나아가 신경망은 동일한 어근을 알아낼 수도 ​​있습니다. - "ant"와 "ants" 또한 비슷한 문맥을 갖고 있을 것이므로, 신경망은 이 두 단어에 대해 유사한 단어 벡터를 학습하게 됩니다.


다음은


스킵 그램 신경망에 엄청난 양의 가중치 변수가 포함되어 있다는 사실을 알아챘을 지도 모릅니다. 300개의 특성과 10,000 단어의 어휘를 예로 들면, 히든 레이어와 출력 레이어 각각 3백만 개씩의 변수가 있습니다! 이런 신경망을 대용량 데이터로 학습하는 것은 매우 어렵기 때문에 word2vec 제작자는 여러 계산적 트릭을 이용했습니다. 이것에 대해서는이 튜토리얼의 파트 2 에서 다시 다룹니다 .


기타 리소스

다른 포스팅에서 word2vec 튜토리얼, 논문, 구현물에 대한 설명과 링크를 모아 두었습니다.


인용

McCormick, C. (2016, April 19). Word2Vec 튜토리얼 - 스킵 그램 모델 . 원본 주소 http://www.mccormickml.com



728x90