IT박스

TensorFlow에서 사전 학습 된 단어 임베딩 (word2vec 또는 Glove) 사용

itboxs 2020. 9. 14. 08:13
반응형

TensorFlow에서 사전 학습 된 단어 임베딩 (word2vec 또는 Glove) 사용


최근에 convolutional text classification에 대한 흥미로운 구현을 검토했습니다 . 그러나 내가 검토 한 모든 TensorFlow 코드는 다음과 같은 임의의 (사전 학습되지 않은) 임베딩 벡터를 사용합니다.

with tf.device('/cpu:0'), tf.name_scope("embedding"):
    W = tf.Variable(
        tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),
        name="W")
    self.embedded_chars = tf.nn.embedding_lookup(W, self.input_x)
    self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1)

아무도 Word2vec 또는 GloVe 사전 훈련 된 단어 임베딩의 결과를 무작위 대신 사용하는 방법을 알고 있습니까?


TensorFlow에서 사전 학습 된 임베딩을 사용할 수있는 몇 가지 방법이 있습니다. 하자 당신이라는 NumPy와 배열의 삽입이 말 embedding과 함께, vocab_size행과 embedding_dim열 그리고 당신은 텐서 만들려 W에 대한 호출에 사용할 수 있습니다 tf.nn.embedding_lookup().

  1. 그 가치 를 취하는 만들기 만하면 W됩니다 .tf.constant()embedding

    W = tf.constant(embedding, name="W")
    

    이것은 가장 쉬운 방법이지만 a 값이 tf.constant()메모리에 여러 번 저장 되기 때문에 메모리 효율성이 떨어 집니다. 때문에 embedding매우 클 수, 당신은 단지 장난감 예제는이 방법을 사용합니다.

  2. 로 생성 W하고 다음 tf.Variable통해 NumPy 배열에서 초기화합니다 tf.placeholder().

    W = tf.Variable(tf.constant(0.0, shape=[vocab_size, embedding_dim]),
                    trainable=False, name="W")
    
    embedding_placeholder = tf.placeholder(tf.float32, [vocab_size, embedding_dim])
    embedding_init = W.assign(embedding_placeholder)
    
    # ...
    sess = tf.Session()
    
    sess.run(embedding_init, feed_dict={embedding_placeholder: embedding})
    

    이렇게 embedding하면 그래프에의 복사본이 저장되는 것을 피할 수 있지만 한 번에 메모리에 행렬의 두 복사본을 보관할 수있는 충분한 메모리가 필요합니다 (하나는 NumPy 배열 용이고 다른 하나는 tf.Variable). 내가 그렇게, 당신이 훈련 도중 매입 매트릭스를 일정하게 유지하려는 것으로 가정 한 것을 참고 W로 작성됩니다 trainable=False.

  3. 임베딩이 다른 TensorFlow 모델의 일부로 학습 된 경우를 사용 tf.train.Saver하여 다른 모델의 체크 포인트 파일에서 값을로드 할 수 있습니다 . 이는 임베딩 행렬이 Python을 모두 우회 할 수 있음을 의미합니다. W옵션 2에서와 같이 생성 한 후 다음을 수행합니다.

    W = tf.Variable(...)
    
    embedding_saver = tf.train.Saver({"name_of_variable_in_other_model": W})
    
    # ...
    sess = tf.Session()
    embedding_saver.restore(sess, "checkpoint_filename.ckpt")
    

이 방법을 사용하여 임베딩을로드하고 공유합니다.

W = tf.get_variable(name="W", shape=embedding.shape, initializer=tf.constant_initializer(embedding), trainable=False)

@mrry의 대답은 네트워크가 실행될 때마다 임베딩 가중치 덮어 쓰기를 유발하기 때문에 옳지 않습니다. 따라서 네트워크를 훈련하기 위해 미니 배치 접근 방식을 따르는 경우 임베딩 가중치를 덮어 쓰게됩니다. 따라서 내 관점에서 사전 훈련 된 임베딩에 대한 올바른 방법은 다음과 같습니다.

embeddings = tf.get_variable("embeddings", shape=[dim1, dim2], initializer=tf.constant_initializer(np.array(embeddings_matrix))

임베딩 문제에 직면했기 때문에 데이터 세트로 자세한 튜토리얼을 작성했습니다. 여기에 내가 시도한 것을 추가하고 싶습니다.이 방법을 시도해 볼 수도 있습니다.

import tensorflow as tf

tf.reset_default_graph()

input_x=tf.placeholder(tf.int32,shape=[None,None])

#you have to edit shape according to your embedding size


Word_embedding = tf.get_variable(name="W", shape=[400000,100], initializer=tf.constant_initializer(np.array(word_embedding)), trainable=False)
embedding_loopup= tf.nn.embedding_lookup(Word_embedding,input_x)

with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        for ii in final_:
            print(sess.run(embedding_loopup,feed_dict={input_x:[ii]}))

Here is working detailed Tutorial Ipython example if you want to understand from scratch , take a look .

참고URL : https://stackoverflow.com/questions/35687678/using-a-pre-trained-word-embedding-word2vec-or-glove-in-tensorflow

반응형