워드벡터 훈련 및 시각화

이 튜토리얼에서는 TensorFlow에서 Skip-gram 모델을 구현하여 작업중인 모든 텍스트에 대한 워드벡터를 생성 한 다음 Tensorboard를 사용하여 시각화하는 방법을 보여줍니다.

이 연습은

i) Skip-gram 모델을 이해하고

ii) CNN 또는 RNN에서 downstream을 사용하기 전에 이러한 벡터가 텍스트에 대해 캡처하는 관계의 종류에 대한 느낌을 얻는 데 매우 유용합니다.

필자는 영어 Wikipedia 기사 모음인 text8 데이터세트에서 Skip-gram 모델을 학습했습니다. Tensorboard를 사용하여 임베딩을 시각화했습니다. Tensorboard를 사용하면 PCA를 사용하여 데이터를 투영하기 위해 3개의 기본축을 선택하여 전체 워드 클라우드를 볼 수 있습니다. 단어를 입력하면 해당 단어가 표시됩니다. 가장 가까운 기본 포인트를 분리 할 수도 있습니다.

 

 

 

Github에서 전체 코드를 찾을 수 있습니다.

학습을 시각화하기 위해, 단어의 임의의 집합에 가장 가까운 예측 단어가 보입니다. 첫번째 반복에서 가장 가까운 예측 단어는 매우 임의적인 것처럼 보입니다. 이것은 모든 워드벡터가 무작위로 초기화되었으므로 의미가 있습니다.

  • cost와 가장 가까운 단어 : sensationalism, adversity, ldp, durians, hennepin, expound, skylark, wolfowitz,

  • engine와 가장 가까운 단어 : vdash, alloys, fsb, seafaring, tundra, frot, arsenic, invalidate,

  • construction과 가장 가까운 단어: dolphins, camels, quantifier, hellenes, accents, contemporary, colm, cyprian,

  • http와 가장 가까운 단어: internally, chaffee, avoid, oilers, mystic, chappell, vascones, cruciger,

학습이 끝날 무렵, 단어 사이의 관계를 찾는 데 모델이 훨씬 더 좋아졌습니다.

  • cost와 가장 가까운 단어: expense, expensive, purchase, technologies, inconsistent, part, dollars, commercial,

  • engines와 가장 가까운 단어 : combustion, piston, stroke, exhaust, cylinder, jet, thrust,

  • construction와 가장 가까운 단어: completed, constructed, bridge, tourism, built, materials, building, designed,

  • http와 가장 가까운 단어 : www, htm, com, edu, html, org, php, ac,

Word2Vec 및 Skip Gram 모델

워드벡터를 생성하는 것은 텍스트의 큰 코퍼스를 가져 와서 코퍼스의 공통 문맥을 공유하는 단어가 벡터 공간에서 서로 가깝게 위치하도록 각 단어에 대한 벡터를 만드는 과정입니다.

이러한 워드벡터는 단어 사이의 상관 관계를 놀라 울 정도로 잘 이해할 수 있습니다 (예 : 검정, 흰색 및 빨강의 예제 벡터는 서로 가깝습니다). 텍스트 분류 또는 새 텍스트와 같은 NLP 작업에 원시 단어 대신 이러한 벡터를 사용하면 성능이 훨씬 향상됩니다.

Continuous Bag of Word (CBOW)과 Skip Gram Model 이라는 두가지 주요 모델이 있습니다. CBOW 모델은 컨텍스트 단어가 주어진 가운데 단어를 예측하려고 시도하지만 Skip Gram 모델은 중심 단어가 주어진 컨텍스트 단어를 예측하려고 시도합니다. 단순화 된 예는 다음과 같습니다.

  • CBOW: The cat ate _____. Fill in the blank, in this case, it’s “food”.

              고양이는 _____을 먹었습니다. 공란을 채우십시오.이 경우에는 “음식”입니다.

  • Skip-gram: ___ ___ ___ food. Complete the word’s context. In this case, it’s “The cat ate”

                 ___ ___ ___ 음식. 단어의 문맥을 완성하십시오. 이 경우, 그것은 “고양이가 먹은”입니다.

이 두가지 방법을 더 자세히 비교하려면이 링크 를 참조하십시오 .

Tensorflow에서 Skip Gram 모델 구현

다음은 모델을 작성하기위한 주요 단계입니다. Github 에서 자세한 구현을 참조하십시오.

1. 데이터 전처리

먼저 데이터를 정리합니다. 문장 부호, 숫자를 제거하고 텍스트를 개별 단어로 분리하십시오. 프로그램이 단어보다 정수를 훨씬 잘 다루기 때문에 우리는 int 사전에 vocab을 생성하여 모든 단어를 int로 매핑합니다.

counts = collections.Counter(words)
vocab = sorted(counts, key=counts.get, reverse=True)
vocab_to_int = {word: ii for ii, word in enumerate(vocab, 0)}

2. 서브 샘플링

“the”, “of”, “for”와 같이 자주 나타나는 단어는 근처 단어에 많은 내용을 제공하지 않습니다. 일부 데이터를 삭제하면 데이터에서 일부 노이즈를 제거하고 대신 신속한 학습과 우수한 표현을 얻을 수 있습니다. 이 과정을 Mikolov의 subsampling이라고 합니다. 학습세트의 각 단어에 대해 빈도의 역수로 주어진 확률로 폐기합니다.

3. 입력 및 대상 만들기

Skip-gram에 대한 입력은 각 단어 (int로 코딩 됨)이며 대상은 해당 윈도우 주변의 단어입니다. Mikolov 등은 이 윈도우의 크기가 다양하고 중심 단어에 더 가까운 단어가 더 자주 샘플링되면 성능이 더 좋아지는 것을 발견했습니다.

“더 먼 단어는 일반적으로 현재 단어와 관련이 거의 없으므로 우리는 학습의 예에서 단어를 덜 샘플링하여 원거리 단어에 덜 가중됩니다 … 윈도우 크기 = 5를 선택하면 각 학습마다 단어 1과 윈도우 크기 사이의 숫자 R을 무작위로 선택한 다음 현재 단어의 미래에서 R 단어를 올바른 레이블로 사용합니다.”

 R = np.random.randint(1, window_size+1)
start = idx — R if (idx — R) > 0 else 0
stop = idx + R
target_words = set(words[start:idx] + words[idx+1:stop+1])

4. 모델 만들기

 

우리는 “ants”와 같은 입력 단어를 one-hot 벡터로 나타낼 것입니다. 이 벡터는 10,000개의 구성 요소 (어휘의 모든 단어에 하나씩)를 가지며 “ants”라는 단어에 해당하는 위치에 “1”을 배치하고 다른 모든 위치에 “1”을 배치합니다.

네트워크의 출력은 어휘의 모든 단어에 대해 임의로 선택된 인접 단어가 그 어휘일 확률을 포함하는 단일 벡터 (10,000 구성 요소 포함)입니다.

훈련이 끝날 때 숨겨진 계층은 훈련된 워드벡터를 갖게됩니다. 숨겨진 레이어의 크기는 우리 벡터의 차원 수에 해당합니다. 위의 예에서 각 단어는 길이가 300인 벡터를 갖습니다.

Skip-gram 신경망에 엄청난 양의 가중치가 포함되어 있다는 사실을 알았을 것입니다. 300개의 기능과 10,000 단어의 어휘를 예로 들면, 숨겨진 레이어와 출력 레이어 각각에 3M의 가중치가 있습니다. 대용량 데이터세트에 대해 교육하는 것은 매우 어려울 수 있으므로 word2vec 제작자는 학습을 실현할 수 있도록 여러 가지 조정 방법을 도입했습니다. 다음 링크 에 자세한 내용을 볼 수 있습니다. Github 의 코드는 학습을 가속화하기 위해 이를 구현합니다.

5. Tensorboard를 사용한 시각화

Tensorboard에서 임베딩 프로젝터를 사용하여 임베딩을 시각화 할 수 있습니다. 이렇게 하려면 몇가지 작업을 수행해야합니다.

  • 학습이 끝나면 checkpoints 디렉토리에 모델을 저장하십시오.

  • Tensorboard가 int 대신 단어를 표시하도록 각 int에 대한 매핑을 가진 metadata.tsv 파일을 만듭니다. 이 tsv 파일을 동일한 checkpoints 디렉토리에 저장하십시오.

  • 다음의 코드를 실행하십시오 :

from tensorflow.contrib.tensorboard.plugins import projector
summary_writer = tf.summary.FileWriter(‘checkpoints’, sess.graph)
config = projector.ProjectorConfig()
embedding_conf = config.embeddings.add()
# embedding_conf.tensor_name = ‘embedding:0’
embedding_conf.metadata_path = os.path.join(‘checkpoints’, ‘metadata.tsv’)
projector.visualize_embeddings(summary_writer, config)

  • tensorboard를 checkpoints 디렉토리로 지정하여 엽니 다.

원문

https://towardsdatascience.com/training-and-visualising-word-vectors-2f946c6430f8

Tags:

워드임베딩

워드벡터

skip-gram

word2vec

CBOW

one hot

원핫벡터

skip gram

Tensorboard

TensorFlow

신경망