[python] 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 배열 embeddingvocab_size행과 함께 임베딩이 있다고 가정 해 보겠습니다.embedding_dim 열 그리고 당신은 텐서 만들려 W에 대한 호출에 사용할 수 있습니다 tf.nn.embedding_lookup().

  1. 간단하게 만들 WA와tf.constant()embedding그 가치 를 취하는 로 .

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

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

  2. a로 생성 W하고 a 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))


답변

2.0 호환 가능한 답변 : Google에서 개발하고 오픈 소스로 된 사전 훈련 된 임베딩이 많이 있습니다.

그들 중 일부는 Universal Sentence Encoder (USE), ELMO, BERT등이며 코드에서 재사용하기가 매우 쉽습니다.

를 재사용하는 코드는 Pre-Trained Embedding, Universal Sentence Encoder아래와 같습니다 :

  !pip install "tensorflow_hub>=0.6.0"
  !pip install "tensorflow>=2.0.0"

  import tensorflow as tf
  import tensorflow_hub as hub

  module_url = "https://tfhub.dev/google/universal-sentence-encoder/4"
  embed = hub.KerasLayer(module_url)
  embeddings = embed(["A long sentence.", "single-word",
                      "http://example.com"])
  print(embeddings.shape)  #(3,128)

Google에서 개발하고 오픈 소스로 제공하는 사전 학습 된 임베딩에 대한 자세한 내용은 TF Hub Link를 참조하세요 .


답변

Tensorflow 버전 2에서는 Embedding 레이어를 사용하면 매우 쉽습니다.

X=tf.keras.layers.Embedding(input_dim=vocab_size,
                            output_dim=300,
                            input_length=Length_of_input_sequences,
                            embeddings_initializer=matrix_of_pretrained_weights
                            )(ur_inp)


답변

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

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]}))

처음부터 이해하고 싶다면 자세한 튜토리얼 Ipython 예제를 살펴보세요.


답변