টেনসরফ্লোতে প্রাক-প্রশিক্ষিত শব্দ এম্বেডিং (ওয়ার্ড 2 ওয়েভ বা গ্লোভ) ব্যবহার করে


95

আমি সম্প্রতি সমঝোতা পাঠ্য শ্রেণিবিন্যাসের জন্য একটি আকর্ষণীয় বাস্তবায়ন পর্যালোচনা করেছি । তবে আমি পর্যালোচিত সমস্ত টেনসরফ্লো কোডগুলি নীচের মতো এলোমেলো ভেক্টরগুলি এলোমেলোভাবে (প্রাক প্রশিক্ষণপ্রাপ্ত নয়) ব্যবহার করে:

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)

কেউ কীভাবে ওয়ার্ড 2vec বা গ্লোভের প্রাক-প্রশিক্ষিত শব্দ এম্বেডিংয়ের পরিবর্তে এলোমেলো ব্যবহারের ফলাফলগুলি ব্যবহার করতে জানেন?

উত্তর:


130

কয়েকটি উপায় রয়েছে যে আপনি টেনসরফ্লোতে প্রাক-প্রশিক্ষিত এম্বেডিং ব্যবহার করতে পারেন। ধরা যাক যে আপনার কাছে সারি এবং কলামগুলির embeddingসাথে ডাকা একটি NumPy অ্যারেতে এমবেডিং রয়েছে এবং আপনি একটি কল ব্যবহার করতে পারবেন এমন একটি টেনসর তৈরি করতে চান ।vocab_sizeembedding_dimWtf.nn.embedding_lookup()

  1. কেবলমাত্র তৈরি Wহিসেবে tf.constant()যে সময় লাগে embeddingএর মান হিসাবে:

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

    এটি সবচেয়ে সহজ পদ্ধিতি, তবে এটি মেমরি দক্ষ নয় কারণ একটিটির মান tf.constant()একাধিকবার মেমরিতে সঞ্চয় করা হয়। যেহেতু embeddingখুব বড় হতে পারে তাই খেলনা উদাহরণের জন্য আপনার কেবল এই পদ্ধতির ব্যবহার করা উচিত।

  2. Wএকটি হিসাবে তৈরি করুন tf.Variableএবং এটির মাধ্যমে নামপ্য অ্যারে থেকে সূচনা করুন 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গ্রাফের একটি অনুলিপি সংরক্ষণ করা এড়াতে পারে তবে ম্যাট্রিক্সের দুটি অনুলিপি একবারে মেমরিতে রাখার জন্য পর্যাপ্ত মেমরির প্রয়োজন নেই (একটি নুমপি অ্যারের জন্য এবং একটি tf.Variable) for নোট করুন যে আমি ধরে নিয়েছি যে প্রশিক্ষণের সময় আপনি এম্বেডিং ম্যাট্রিক্স ধ্রুবক রাখতে চান, তাই Wএটি তৈরি করা হয়েছে trainable=False

  3. যদি এম্বেডিংটি অন্য টেনসরফ্লো মডেলের অংশ হিসাবে প্রশিক্ষিত হয় তবে আপনি tf.train.Saverঅন্য মডেলের চেকপয়েন্ট ফাইল থেকে মানটি লোড করতে একটি ব্যবহার করতে পারেন । এর অর্থ এই যে এমবেডিং ম্যাট্রিক্স পুরোপুরি পাইথনকে বাইপাস করতে পারে। 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")
    

আমি ডব্লিউটিকে নিম্নরূপে তৈরি করি: ডাব্লু = এনপি.লোডটেক্সট ("/ মিডিয়া / ডাব্লু 2 টিস্ট.টেক্সট", ডিটিপি = 'স্ট্রিং', ডিলিমিটার = '') যা একটি সারি হিসাবে তৈরি করে: ['' '0.070312 ...... এ '-0.0625']। এখানে সমস্যা আছে! 'ইন' সরানোর পরে এবং সংখ্যাগুলি স্ট্রিং থেকে ফ্লোট 32 এ রূপান্তর করার পরে কি আমি এটি আমার ডাব্লু হিসাবে বিবেচনা করব? যদি এটি হয়, তবে তার সংশ্লিষ্ট ভেক্টরের সাথে 'ইন' সংযুক্ত করবেন কীভাবে? বা আমার ফিগারগুলি ফ্লোট 32 এ রূপান্তর করতে হবে এবং তারপরে 'in' রেখে যেতে হবে; আশা করা যায় যে টেনস্রফ্লো সমস্ত প্রয়োজনীয় প্রক্রিয়াজাতকরণ করবে? ধন্যবাদ!
ব্যবহারকারী3147590

4
আহ, আপনার কাছে এখানে বেশ কয়েকটি বিকল্প রয়েছে। আপনি টেনসরফ্লো বিকল্পটি টেক্সট ফাইলটিকে একটি টেনসরে রূপান্তর করতে ব্যবহার করতে পারেন tf.decode_csv()তবে এটি ব্যয়বহুল হতে পারে (বিশেষত, এটির জন্য আপনাকে Tensorপ্রতি কলামে একটি তৈরি করতে হবে এবং তারপরে সংখ্যার সাথে একত্রে যুক্ত হওয়া প্রয়োজন)। সম্ভবত একটি সহজ বিকল্প হ'ল NumPy অ্যারে হিসাবে ইনপুট পেতে pandas.read_csv()এবং ব্যবহার করা pandas.DataFrame.as_matrix()
মিঃ

4
sess.run(embedding_init, ...)রিটার্নের কল করার পরে NumPy অ্যারে আবর্জনা সংগ্রহ করা উচিত (ধরে নিলে আপনি আপনার প্রোগ্রামে এটির কোনও রেফারেন্স রাখবেন না)। আপনার প্রোগ্রামের কাঠামোর উপর নির্ভর করে আপনি আগে অ্যারেটি প্রকাশ করতে del embedding( embeddingNumPy অ্যারেটি কোথায় ) করতে চাইতে পারেন ।
মি

4
@ মিঃ শ্রী: আপনি কি বিকল্প 1 এবং আরও নির্দিষ্ট করে "আরও বেশি কথা বলতে পারেন" এটি মেমরির দক্ষ নয় কারণ tf.constant () এর মান মেমরিতে একাধিকবার সঞ্চিত হয় "। জিপিইউ বা সিপিইউর জন্য মেমরি অক্ষম? আরও সাধারণভাবে, কেন tf.constant () এর মেমরিতে একাধিক কপি থাকতে হবে, যখন বিকল্প 2 এর টিফ.ভেরিয়েবল () + ফিডিং স্থানধারকটির এই সমস্যা নেই?
গ্যাব্রিয়েল

4
আপনার কাছে ভাবছি কেন "() একটি tf.constant মান মেমরি একাধিক বার সংরক্ষিত হয়" যদি এই উত্তর কটাক্ষপাত করা: stackoverflow.com/a/42450418/5841473
alyaxey

33

আমি এম্বেডিং লোড এবং ভাগ করতে এই পদ্ধতিটি ব্যবহার করি।

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

এম্বেডিংটি স্তম্ভিত ম্যাট্রিক্সের কলাম বা সারি হওয়া উচিত?
গ্রিশ্যাক

6

@ মিরির উত্তর সঠিক নয় কারণ এটি প্রতিটি নেটওয়ার্ক চালিত এম্বেডিং ওজনের ওভাররাইটিংকে প্ররোচিত করে, তাই আপনি যদি আপনার নেটওয়ার্কটি প্রশিক্ষণের জন্য একটি মিনিব্যাচ পদ্ধতির অনুসরণ করছেন তবে আপনি এমবেডিংয়ের ওজনগুলি ওভাররাইট করছেন। সুতরাং, আমার দৃষ্টিতে প্রাক-প্রশিক্ষিত এম্বেডিংয়ের সঠিক উপায় হ'ল:

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

লিউজিয়ার উত্তরের সঠিক সদৃশ d
টিমজামান

4
@ টিমজামান .. বাস্তবে, তিনি ট্রেনযোগ্য = ভুয়া যুক্তিটি অনুপস্থিত, এবং সুতরাং প্রক্রিয়াটিতে তার এমবেডিংগুলিকে সূক্ষ্ম সুরকরণের কাজ শেষ করবে।
শাতু

4
এছাড়াও, আমি মনে করি ইউজিনিওর যুক্তিটি ভুল। আপনাকে প্রতিটি মিনি-ব্যাচের সাথে "এম্বেডিং_ইনিট" ওপ চালাতে হবে না, এবং সবকিছু ঠিক থাকবে। তা হল, প্রশিক্ষণের শুরুতে কেবল একবার এমবেডিং সূচনাটি চালান।
শাতু

@ শাতু কীভাবে নিশ্চিত করব যে এম্বেডিং সূচনাটি কেবল প্রশিক্ষণের শুরুতে চালানো হবে?

4
@ ডাস্ট0 এক্স .. যদি এম্বেডিংগুলির আকারটি যথেষ্ট ছোট হয় তবে আপনি কেবলমাত্র তাদের প্রাথমিক মান হিসাবে নির্দিষ্ট করতে পারেন। যদি তারা বেশ বড় হয় তবে আপনি যখন সমস্ত ভেরিয়েবলের জন্য ইনিশিয়ালাইজারটি চালান তখন আপনি ফিড_ডিক্টে তাদের পাস করতে পারেন। এটি যথেষ্ট পরিষ্কার না হলে আমাকে জানান, এবং আমি উভয় পদ্ধতির জন্য কিছু নমুনা কোড পোস্ট করার চেষ্টা করব।
শাতু

5

2.0 সামঞ্জস্যপূর্ণ উত্তর : অনেকগুলি প্রাক-প্রশিক্ষিত এম্বেডিং রয়েছে, যা গুগল দ্বারা বিকাশিত এবং সেগুলি ওপেন সোর্স করা হয়েছে।

এর মধ্যে কয়েকটি Universal Sentence Encoder (USE), ELMO, BERTহ'ল ইত্যাদি and এবং আপনার কোডগুলিতে সেগুলি পুনরায় ব্যবহার করা খুব সহজ।

পুনরায় ব্যবহার করার জন্য কোড 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)

আরও তথ্যের জন্য প্রাক প্রশিক্ষিত এম্বেডিংগুলি গুগলের দ্বারা বিকাশিত এবং উন্মুক্ত উত্সযুক্ত, টিএফ হাব লিংকটি দেখুন


5

টেনসরফ্লো ভার্সন 2 সহ এটি এম্বেডিং স্তরটি ব্যবহার করা বেশ সহজ

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)


3

আমি এম্বেডিংয়ের সমস্যার মুখোমুখি হয়েছিলাম, তাই আমি ডেটাসেট সহ বিশদ টিউটোরিয়াল লিখেছিলাম। এখানে আমি যা চেষ্টা করেছি তা যুক্ত করতে চাই আপনি এই পদ্ধতিটিও দেখতে পারেন,

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

এখানে বিশদ টিউটোরিয়াল আইপিথনের উদাহরণ কাজ করছে আপনি যদি স্ক্র্যাচ থেকে বুঝতে চান তবে একবার দেখুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.