Tf.nn.e এম্বেডিং_লুকআপ ফাংশনটি কী করে?


158
tf.nn.embedding_lookup(params, ids, partition_strategy='mod', name=None)

আমি এই ফাংশনটির কর্তব্য বুঝতে পারি না। এটি কি দেখার টেবিলের মতো? প্রতিটি আইডির সাথে সম্পর্কিত প্যারামিটারগুলি ফিরিয়ে আনার অর্থ কী?

উদাহরণস্বরূপ, skip-gramআমরা যদি মডেলটি ব্যবহার করি tf.nn.embedding_lookup(embeddings, train_inputs), তবে প্রতিটিটির জন্য train_inputএটি যথাযথ এম্বেডিং খুঁজে পাবে?


"এটি কি দেখার টেবিলের মতো?" tldr - হ্যাঁ প্রতিটি এক্স (আইডি) এর জন্য আমাকে সহযোগী y (প্যারাম) দিন।
ডেভিড রেফেলি

উত্তর:


147

embedding_lookupফাংশন সেন্সর সারি পুনরুদ্ধার params। আচরণটি বিন্যাসে অ্যারের সাথে ইনডেক্সিংয়ের অনুরূপ। যেমন

matrix = np.random.random([1024, 64])  # 64-dimensional embeddings
ids = np.array([0, 5, 17, 33])
print matrix[ids]  # prints a matrix of shape [4, 64] 

paramsযুক্তিটিও টেনারদের একটি তালিকা হতে পারে সেই ক্ষেত্রে টেনারদের মধ্যে idsবিতরণ করা হবে। উদাহরণ হিসেবে বলা যায়, 3 tensors একটি তালিকা দেওয়া [2, 64]ডিফল্ট আচরণটি যে, তারা প্রতিনিধিত্ব করবে ids: [0, 3], [1, 4], [2, 5]

partition_strategyকীভাবে idsতালিকার মধ্যে বিতরণ করা হয় তা নিয়ন্ত্রণ করে । বিভাজন বৃহত্তর স্কেল সমস্যার জন্য কার্যকর যখন ম্যাট্রিক্স এক টুকরো রাখতে খুব বড় হতে পারে।


21
কেন তারা এটিকে এভাবে ডাকবে এবং না select_rows?
লেনার হোয়েট

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

2
সেন্সরফ্লো এমবেডিং কাঠামোটি কীভাবে শিখবে? এই ফাংশনটি কি সেই প্রক্রিয়াটি পরিচালনা করে?
vgoklani

19
@vgoklani, না, embedding_lookupসহজেই আইডিতে অনুরূপ এম্বেডিংগুলি পুনরুদ্ধার করার জন্য একটি সুবিধাজনক (এবং সমান্তরাল) উপায় সরবরাহ করে idsparamsএকটি TF পরিবর্তনশীল যার উপাদান ব্যবহার করা হয়, একটি ক্ষতি ফাংশন (যেমন মধ্যে প্রত্যক্ষ বা পরোক্ষভাবে - টেন্সর একটি TF পরিবর্তনশীল যে প্রশিক্ষণ প্রক্রিয়ার অঙ্গ হিসাবে জানা যায় সাধারণত tf.l2_loss) যা অপটিমাইজার (যেমন দ্বারা অপ্টিমাইজ করা হয় tf.train.AdamOptimizer)।
শোভিত

5
@ রাফা জাজেফুইজ কেন "ডিফল্ট আচরণ হ'ল তারা আইডির প্রতিনিধিত্ব করবেন: [0, 3], [1, 4], [2, 5]?" আপনি ব্যাখ্যা করতে পারেন?
আয়ারিন

219

হ্যাঁ, আপনি পয়েন্টটি না পাওয়া পর্যন্ত এই ফাংশনটি বোঝা শক্ত is

এর সর্বাধিক আকারে এটির মতো tf.gather। এটি paramsনির্দিষ্ট করে সূচী অনুযায়ী উপাদানগুলি প্রদান করে ids

উদাহরণস্বরূপ (ধরে নিচ্ছেন আপনি ভিতরে আছেন tf.InteractiveSession())

params = tf.constant([10,20,30,40])
ids = tf.constant([0,1,2,3])
print tf.nn.embedding_lookup(params,ids).eval()

ফিরে আসবে [10 20 30 40], কারণ প্যারামের প্রথম উপাদান (সূচক 0) হ'ল 10, প্যারামের দ্বিতীয় উপাদান (সূচক 1) 20ইত্যাদি etc.

একইভাবে,

params = tf.constant([10,20,30,40])
ids = tf.constant([1,1,3])
print tf.nn.embedding_lookup(params,ids).eval()

ফিরে আসবে [20 20 40]

তবে এর embedding_lookupচেয়ে বেশি। paramsযুক্তি হতে পারে তালিকা একটি একক টেন্সর tensors এর বদলে।

params1 = tf.constant([1,2])
params2 = tf.constant([10,20])
ids = tf.constant([2,0,2,1,2,3])
result = tf.nn.embedding_lookup([params1, params2], ids)

এই জাতীয় ক্ষেত্রে, সূচীগুলি উল্লিখিত ids, পার্টিশন কৌশল অনুসারে টেনারগুলির উপাদানগুলির সাথে মিল রাখে , যেখানে ডিফল্ট পার্টিশন কৌশলটি 'মোড' থাকে।

'মোড' কৌশলটিতে, সূচক 0 তালিকার প্রথম টেনসারের প্রথম উপাদানটির সাথে মিলে যায়। সূচক 1 দ্বিতীয় টেনসারের প্রথম উপাদানটির সাথে মিলে যায় । সূচক 2 তৃতীয় টেনসারের প্রথম উপাদানটির সাথে মিলে যায় এবং আরও অনেক কিছু। কেবল সূচকগুলি (i + 1) তম সেন্সরের প্রথম উপাদানটির সাথে মিলে যায়, সমস্ত সূচকের জন্য , ধরে নেওয়া হয় যে প্যারামগুলি টেনারগুলির একটি তালিকা ।i0..(n-1)n

এখন, সূচকটি nটেনসর এন + 1 এর সাথে সামঞ্জস্য করতে পারে না, কারণ তালিকায় paramsকেবল nটেনার রয়েছে । সূচক সুতরাং nসাথে সঙ্গতিপূর্ণ দ্বিতীয় প্রথম টেন্সর এর উপাদান। একইভাবে, সূচকটি n+1দ্বিতীয় টেনসর ইত্যাদির দ্বিতীয় উপাদানের সাথে মিলে যায় etc.

সুতরাং, কোড

params1 = tf.constant([1,2])
params2 = tf.constant([10,20])
ids = tf.constant([2,0,2,1,2,3])
result = tf.nn.embedding_lookup([params1, params2], ids)

সূচক 0 প্রথম টেনসারের প্রথম উপাদানটির সাথে মিলে যায়: 1

সূচিপত্র 1 দ্বিতীয় টেনসারের প্রথম উপাদানটির সাথে মিলে যায়: 10

সূচক 2 প্রথম টেনসারের দ্বিতীয় উপাদানটির সাথে মিলে যায়: 2

সূচক 3 দ্বিতীয় টেনসারের দ্বিতীয় উপাদানটির সাথে মিলে যায়: 20

সুতরাং, ফলাফল হবে:

[ 2  1  2 10  2 20]

8
একটি নোট: আপনি ব্যবহার করতে পারেন partition_strategy='div', এবং পাবেন [10, 1, 10, 2, 10, 20], অর্থাত্ id=1প্রথম পরমের দ্বিতীয় উপাদান। মূলত: partition_strategy=mod(ডিফল্ট) id%len(params): id//len(params)partition_strategy=*div*
প্যারামে প্যারামের

3
@ অ্যাশার-স্টার্ন আপনি "মোড" কৌশলটি ডিফল্ট কেন তা ব্যাখ্যা করতে পারেন? দেখে মনে হচ্ছে যে "ডিভ" কৌশলটি স্ট্যান্ডার্ড টেনসর স্লাইসিংয়ের সাথে আরও সাদৃশ্যপূর্ণ (প্রদত্ত সূচকগুলির দ্বারা নির্বাচন-সারিগুলি)। "ডিভ" এর ক্ষেত্রে কিছু পারফরম্যান্স সমস্যা আছে?
svetlov.vsevolod

46

হ্যাঁ, tf.nn.embedding_lookup()ফাংশনের উদ্দেশ্য হ'ল এম্বেডিং ম্যাট্রিক্সে একটি অনুসন্ধান করা এবং শব্দের এম্বেডিংগুলি (বা সাধারণ ভাষায় ভেক্টর উপস্থাপনা) ফিরিয়ে দেওয়া।

একটি সাধারণ এমবেডিং ম্যাট্রিক্স (আকৃতির vocabulary_size x embedding_dimension:) নীচের মত দেখাচ্ছে। (অর্থাত্ প্রতিটি শব্দ সংখ্যার ভেক্টর দ্বারা প্রতিনিধিত্ব করা হবে ; সুতরাং নাম ওয়ার্ড 2vec )


এম্বেডিং ম্যাট্রিক্স

the 0.418 0.24968 -0.41242 0.1217 0.34527 -0.044457 -0.49688 -0.17862
like 0.36808 0.20834 -0.22319 0.046283 0.20098 0.27515 -0.77127 -0.76804
between 0.7503 0.71623 -0.27033 0.20059 -0.17008 0.68568 -0.061672 -0.054638
did 0.042523 -0.21172 0.044739 -0.19248 0.26224 0.0043991 -0.88195 0.55184
just 0.17698 0.065221 0.28548 -0.4243 0.7499 -0.14892 -0.66786 0.11788
national -1.1105 0.94945 -0.17078 0.93037 -0.2477 -0.70633 -0.8649 -0.56118
day 0.11626 0.53897 -0.39514 -0.26027 0.57706 -0.79198 -0.88374 0.30119
country -0.13531 0.15485 -0.07309 0.034013 -0.054457 -0.20541 -0.60086 -0.22407
under 0.13721 -0.295 -0.05916 -0.59235 0.02301 0.21884 -0.34254 -0.70213
such 0.61012 0.33512 -0.53499 0.36139 -0.39866 0.70627 -0.18699 -0.77246
second -0.29809 0.28069 0.087102 0.54455 0.70003 0.44778 -0.72565 0.62309 

আমি ম্যাট্রিক্স এম্বেডিং উপরে বিভক্ত এবং শুধুমাত্র লোড শব্দ মধ্যে vocabযা আমাদের শব্দভান্ডার এবং সংশ্লিষ্ট ভেক্টর হতে হবে embঅ্যারে।

vocab = ['the','like','between','did','just','national','day','country','under','such','second']

emb = np.array([[0.418, 0.24968, -0.41242, 0.1217, 0.34527, -0.044457, -0.49688, -0.17862],
   [0.36808, 0.20834, -0.22319, 0.046283, 0.20098, 0.27515, -0.77127, -0.76804],
   [0.7503, 0.71623, -0.27033, 0.20059, -0.17008, 0.68568, -0.061672, -0.054638],
   [0.042523, -0.21172, 0.044739, -0.19248, 0.26224, 0.0043991, -0.88195, 0.55184],
   [0.17698, 0.065221, 0.28548, -0.4243, 0.7499, -0.14892, -0.66786, 0.11788],
   [-1.1105, 0.94945, -0.17078, 0.93037, -0.2477, -0.70633, -0.8649, -0.56118],
   [0.11626, 0.53897, -0.39514, -0.26027, 0.57706, -0.79198, -0.88374, 0.30119],
   [-0.13531, 0.15485, -0.07309, 0.034013, -0.054457, -0.20541, -0.60086, -0.22407],
   [ 0.13721, -0.295, -0.05916, -0.59235, 0.02301, 0.21884, -0.34254, -0.70213],
   [ 0.61012, 0.33512, -0.53499, 0.36139, -0.39866, 0.70627, -0.18699, -0.77246 ],
   [ -0.29809, 0.28069, 0.087102, 0.54455, 0.70003, 0.44778, -0.72565, 0.62309 ]])


emb.shape
# (11, 8)

টেনসরফ্লোতে এম্বেডিং লুকআপ

এখন আমরা কীভাবে কিছু স্বেচ্ছাসহ ইনপুট বাক্যটির জন্য এম্বেডিং লুকআপটি সম্পাদন করতে পারি তা আমরা দেখব ।

In [54]: from collections import OrderedDict

# embedding as TF tensor (for now constant; could be tf.Variable() during training)
In [55]: tf_embedding = tf.constant(emb, dtype=tf.float32)

# input for which we need the embedding
In [56]: input_str = "like the country"

# build index based on our `vocabulary`
In [57]: word_to_idx = OrderedDict({w:vocab.index(w) for w in input_str.split() if w in vocab})

# lookup in embedding matrix & return the vectors for the input words
In [58]: tf.nn.embedding_lookup(tf_embedding, list(word_to_idx.values())).eval()
Out[58]: 
array([[ 0.36807999,  0.20834   , -0.22318999,  0.046283  ,  0.20097999,
         0.27515   , -0.77126998, -0.76804   ],
       [ 0.41800001,  0.24968   , -0.41242   ,  0.1217    ,  0.34527001,
        -0.044457  , -0.49687999, -0.17862   ],
       [-0.13530999,  0.15485001, -0.07309   ,  0.034013  , -0.054457  ,
        -0.20541   , -0.60086   , -0.22407   ]], dtype=float32)

আমাদের শব্দভাণ্ডারে শব্দের সূচকগুলি ব্যবহার করে আমরা কীভাবে আমাদের মূল এমবেডিং ম্যাট্রিক্স (শব্দের সাথে) থেকে এম্বেডিং পেয়েছি তা পর্যবেক্ষণ করুন ।

সাধারণত, এই জাতীয় এম্বেডিং লুক্কিট প্রথম স্তর (যা এম্বেডিং স্তর নামে পরিচিত ) দ্বারা সঞ্চালিত হয় যা এরপরে পরবর্তী প্রক্রিয়াজাতকরণের জন্য এই এম্বেডিংগুলি আরএনএন / এলএসটিএম / জিআরইউ স্তরগুলিতে পাস করে।


পার্শ্ব দ্রষ্টব্য : সাধারণত ভোকাবুলারিতে একটি বিশেষ unkটোকেনও থাকবে। সুতরাং, যদি আমাদের ইনপুট বাক্যটির একটি টোকেন আমাদের শব্দভাণ্ডারে উপস্থিত না থাকে, তবে এর সাথে unkসূচকগুলি এম্বেডিং ম্যাট্রিক্সে দেখানো হবে।


দ্রষ্টব্য লক্ষ্য করুন embedding_dimensionএকটি hyperparameter এক তাদের আবেদন কিন্তু মত জনপ্রিয় মডেলের জন্য সুর রয়েছে Word2Vec এবং দস্তানা ব্যবহার 300প্রতিটি শব্দ প্রতিনিধিত্বমূলক জন্য মাত্রা ভেক্টর।

বোনাস রিডিং ওয়ার্ড 2 ওয়েভ স্কিপ-গ্রাম মডেল


17

এখানে এম্বেড লুকিংয়ের প্রক্রিয়াটি চিত্রিত করে এমন একটি চিত্র।

চিত্র: এম্বেডিং লুকিং প্রক্রিয়া

সংক্ষিপ্তভাবে, এটি আইডির একটি তালিকা দ্বারা নির্দিষ্ট করে একটি এমবেডিং স্তরের সাথে সম্পর্কিত সারিগুলি পায় এবং এটি একটি সেন্সর হিসাবে সরবরাহ করে। এটি নিম্নলিখিত প্রক্রিয়া মাধ্যমে অর্জন করা হয়।

  1. একটি স্থানধারক সংজ্ঞা দিন lookup_ids = tf.placeholder([10])
  2. একটি এম্বেডিং স্তর সংজ্ঞায়িত করুন embeddings = tf.Variable([100,10],...)
  3. টেনসরফ্লো অপারেশন সংজ্ঞায়িত করুন embed_lookup = tf.embedding_lookup(embeddings, lookup_ids)
  4. চালিয়ে ফলাফল পান lookup = session.run(embed_lookup, feed_dict={lookup_ids:[95,4,14]})

6

যখন প্যারামগুলির সেন্সরটি উচ্চ মাত্রায় থাকে তখন আইডিগুলি কেবল শীর্ষ মাত্রায় বোঝায়। সম্ভবত এটি বেশিরভাগ মানুষের কাছেই সুস্পষ্ট তবে এটি বুঝতে আমার নীচের কোডটি চালাতে হবে:

embeddings = tf.constant([[[1,1],[2,2],[3,3],[4,4]],[[11,11],[12,12],[13,13],[14,14]],
                          [[21,21],[22,22],[23,23],[24,24]]])
ids=tf.constant([0,2,1])
embed = tf.nn.embedding_lookup(embeddings, ids, partition_strategy='div')

with tf.Session() as session:
    result = session.run(embed)
    print (result)

কেবল 'ডিভ' কৌশলটি ব্যবহার করে এবং একটি সেন্সরের জন্য, এটি কোনও পার্থক্য করে না।

এখানে ফলাফল:

[[[ 1  1]
  [ 2  2]
  [ 3  3]
  [ 4  4]]

 [[21 21]
  [22 22]
  [23 23]
  [24 24]]

 [[11 11]
  [12 12]
  [13 13]
  [14 14]]]

3

এটি দেখার আরও একটি উপায় হ'ল ধরুন যে আপনি টেনারগুলি এক মাত্রিক অ্যারে সমতল করেছেন এবং তারপরে আপনি একটি অনুসন্ধান করছেন

(উদাঃ) টেনসর0 = [1,2,3], টেনসর 1 = [4,5,6], টেনসর 2 = [7,8,9]

সমতল আউট টেন্সর নীচে হবে [1,4,7,2,5,8,3,6,9]

এখন আপনি যখন [0,3,4,1,7] এর অনুসন্ধান করেন তখন এটি [1,2,5,4,6] টি শোনাবে

(i, e) উদাহরণস্বরূপ যদি অনুসন্ধানের মান 7 হয় এবং আমাদের কাছে 3 টি টেনার (বা 3 সারি সহ একটি টেন্সর) থাকে,

7/3: (অনুস্মারকটি 1, কোটিরটি 2) সুতরাং টেনসর 1 এর দ্বিতীয় তৃতীয় উপাদানটি প্রদর্শিত হবে, যা 6


2

যেহেতু আমিও এই ফাংশনটির দ্বারা আগ্রহী ছিলাম, তাই আমি আমার দুটি সেন্ট দেব।

আমি 2 ডি ক্ষেত্রে এটি যেভাবে দেখছি তা হ'ল ম্যাট্রিক্সের গুণ হিসাবে (অন্যান্য মাত্রায় সাধারণীকরণ করা সহজ)।

এন প্রতীক সহ একটি শব্দভান্ডার বিবেচনা করুন। তারপরে, আপনি এক্স- প্রতীকটি এনএক্স 1, এক-হট-এনকোডযুক্ত মাত্রার ভেক্টর হিসাবে উপস্থাপন করতে পারেন ।

তবে আপনি এই প্রতীকটির একটি প্রতিনিধিত্ব চান Nx1 এর ভেক্টর হিসাবে নয়, Mx1 মাত্রাযুক্ত য হিসাবে y বলে

সুতরাং, রুপান্তর এক্স মধ্যে Y , আপনি ব্যবহার এবং ম্যাট্রিক্স এম্বেডিং করতে মাত্রা MXN সঙ্গে:

y = E x

এই একই কথা tf.nn.embedding_lookup (প্যারাম, আইডি, ...), সামান্য পার্থক্য সঙ্গে করছে যে আইডি শুধু একটা সংখ্যা এক গরম এনকোডেড ভেক্টর 1 -এর অবস্থান প্রতিনিধিত্ব করে হয় এক্স


0

আশের স্টারনের উত্তরে যুক্ত করা একটি বড় এমবেডিং টেনসরের বিভাজনparams হিসাবে ব্যাখ্যা করা হয় । এটি সম্পূর্ণ এম্বেডিং টেনসরের প্রতিনিধিত্বকারী একক টেনসর বা প্রথম মাত্রা ব্যতীত এক্স টেনারগুলির একটি তালিকা হতে পারে যা শার্বেড এম্বেডিং টেনারগুলির প্রতিনিধিত্ব করে।

tf.nn.embedding_lookupএম্বেডিং (প্যারাম) বড় হবে এই বিষয়টি বিবেচনা করে ফাংশনটি লেখা হয়েছে। সুতরাং আমাদের প্রয়োজন partition_strategy

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