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


97

কেরাস ডকুমেন্টেশন এগুলি আসলে কী তা পরিষ্কার নয়। আমি বুঝতে পারি আমরা এটি ইনপুট বৈশিষ্ট্যের স্থানটিকে আরও ছোটতে সংকুচিত করতে ব্যবহার করতে পারি। তবে কীভাবে এটি নিউরাল ডিজাইনের দৃষ্টিকোণ থেকে করা হয়? এটি কি কোনও অটোয়ানোডার, আরবিএম?

keras 

7
এটি এমন একটি
সন্ধানের

4
এটি কেবল একটি ওজন ম্যাট্রিক্স তৈরি এবং সূচী করে; নীচে আমার বিস্তারিত উত্তর দেখুন ( stackoverflow.com/a/53101566/9024698 )।
আউটকাস্ট

4
যদিও সর্বাধিক ভোট দেওয়া উত্তর এটি একটি ম্যাট্রিক্সের গুণকে বলে, উত্স কোড এবং অন্যান্য উত্তরগুলি দেখায় যে বাস্তবে তারা কেবল একটি প্রশিক্ষণযোগ্য ম্যাট্রিক্স। ইনপুট শব্দগুলি এই ম্যাট্রিক্সে কেবলমাত্র संबंधित সারিটি বাছাই করে।
ড্যানিয়েল মুলার

উত্তর:


67

যতদূর আমি জানি, এম্বেডিং স্তরটি একটি সরল ম্যাট্রিক্স গুণ হয় যা শব্দগুলিকে তাদের সম্পর্কিত শব্দ এম্বেডিংগুলিতে রূপান্তর করে।

এম্বেডিং স্তরের ওজনগুলি আকৃতির হয় (শব্দভান্ডার_ আকার, এম্বেডিং_ডিমেন্স)। প্রতিটি প্রশিক্ষণের নমুনার জন্য, এর ইনপুটটি পূর্ণসংখ্যা হয়, যা নির্দিষ্ট শব্দের প্রতিনিধিত্ব করে। পূর্ণসংখ্যাগুলি শব্দভান্ডার আকারের সীমার মধ্যে রয়েছে। এম্বেডিং স্তর প্রতিটি পূর্ণসংখ্যাকে আমি এমবেডিং ওজন ম্যাট্রিক্সের আইথ লাইনে রূপান্তর করে।

এটি ম্যাট্রিক্সের গুণকে দ্রুত করার জন্য, ইনপুট পূর্ণসংখ্যাগুলি পূর্ণসংখ্যার তালিকা হিসাবে সংরক্ষণ করা হয় না তবে ওয়ান-হট ম্যাট্রিক্স হিসাবে ব্যবহৃত হয়। সুতরাং ইনপুট আকারটি (এনবি_ওয়ার্ডস, ভোকাবুলারি_ সাইজ) প্রতি লাইনে একটি শূন্য-মান সহ। আপনি যদি এম্বেডিং ওজন দ্বারা এটি গুণ করেন তবে আপনি আউটপুটটি আকারে পাবেন

(nb_words, vocab_size) x (vocab_size, embedding_dim) = (nb_words, embedding_dim)

সুতরাং একটি সাধারণ ম্যাট্রিক্সের গুণ দ্বারা আপনি একটি নমুনার সমস্ত শব্দকে সংশ্লিষ্ট শব্দ এম্বেডিংগুলিতে রূপান্তর করেন।


4
অবশ্যই একটি বৈধ পন্থা ( আধা-তত্ত্বাবধানে সিকোয়েন্স লার্নিং দেখুন )। আপনি একটি অটোরকোডার দিয়ে এম্বেডিংগুলি শিখতে পারেন এবং তারপরে আপনার নিউরাল নেটওয়ার্কের জটিলতা কমাতে এম্বেডিং স্তরটির সূচনা হিসাবে ব্যবহার করতে পারেন (আমি ধরে নিই যে এম্বেডিং স্তরের পরে আপনি অন্য কিছু করেন)।
লরিট

4
শব্দ এম্বেডিং এবং তাদের সুবিধাগুলি সম্পর্কে এখানে একটি সুন্দর ব্লগপোস্ট is
sietschie

4
যে ক্ষেত্রে আমি উপস্থাপন করেছি, প্রতিটি প্রশিক্ষণ ইনপুট শব্দের সংকলন (একটি বাক্য হতে পারে)। প্রতিটি শব্দকে এক-গরম ভেক্টর হিসাবে উপস্থাপিত করা হয় এবং ঘন ভেক্টরে এম্বেড করা হয়। এই পদ্ধতির অসুবিধা হ'ল যেহেতু ইনপুটটি ধ্রুব দৈর্ঘ্যের হওয়া দরকার, আপনার সমস্ত বাক্যে একই সংখ্যার শব্দ থাকা দরকার। একটি বিকল্প হ'ল অনুচ্ছেদে ভেক্টর , যা বাক্য, অনুচ্ছেদ বা এমনকি নথিগুলিকে ভেক্টরগুলিতে এম্বেড করতে পারে।
লোরিট

4
এম্বেডিং স্তরটি ক্ষয়টি হ্রাস করার জন্য এর ওজনগুলিকে কেবল অনুকূল করবে। সম্ভবত এর অর্থ এটি অর্থগত মিলটি বিবেচনা করবে, সম্ভবত তা হবে না। নিউরাল নেটওয়ার্কগুলির সাথে আপনি কখনই জানেন না। আপনি যদি নিশ্চিত হতে চান যে এম্বেডিং কোনও নির্দিষ্ট সূত্র অনুসরণ করে (যেমন ডাব্লু 2 ভি), সূত্রটি ব্যবহার করুন। আপনার যদি পর্যাপ্ত ডেটা থাকে তবে আপনি এম্বেডিং স্তরটি ব্যবহার করতে এবং এমবেডিংগুলি প্রশিক্ষণ দিতে চাইতে পারেন। এটি চেষ্টা করে দেখুন এবং ফলাফলগুলি আপনার পছন্দ হয়েছে কিনা তা পরীক্ষা করে দেখুন।
লরিট

4
আমি ব্যবহারকারীর সাথে একমত 666666২৪ (নীচে উত্তর)। তার না একটি সহজ ম্যাট্রিক্স গুণ।
ড্যানিয়েল মুলার

22

Keras Embeddingলেয়ার কোনো ম্যাট্রিক্স গুণ কিন্তু এটি শুধুমাত্র করণ নয়:

1. (ভোকাবুলারি_ সাইজ) এক্স (এম্বেডিং_ডাইমেনশন) মাত্রার একটি ওজন ম্যাট্রিক্স তৈরি করে

২. এই ওজন ম্যাট্রিক্সকে সূচক করে


কোনও শ্রেণি কী করে তা বোঝার জন্য উত্স কোডটি একবার ব্যবহার করা সর্বদা দরকারী। এই ক্ষেত্রে, আমরা কটাক্ষপাত থাকবে class এমবেডিং যা বেস স্তর থেকে উত্তরাধিকারী classনামক লেয়ার

(1) - (ভোকাবুলারি_ সাইজ) এক্স (এম্বেডিং_ডাইমেনশন) মাত্রার একটি ওজন ম্যাট্রিক্স তৈরি করা :

এটি এম্বেডিংয়েরbuild ক্রিয়াকলাপে ঘটছে :

def build(self, input_shape):
    self.embeddings = self.add_weight(
        shape=(self.input_dim, self.output_dim),
        initializer=self.embeddings_initializer,
        name='embeddings',
        regularizer=self.embeddings_regularizer,
        constraint=self.embeddings_constraint,
        dtype=self.dtype)
    self.built = True

আপনার যদি বেস ক্লাসের স্তরটির দিকে নজর থাকে তবে আপনি দেখতে পাবেন যে add_weightউপরের ফাংশনটি কেবল প্রশিক্ষণযোগ্য ওজনের একটি ম্যাট্রিক্স তৈরি করে (এই ক্ষেত্রে (শব্দভান্ডার_ আকার) x (এম্বেডিং_ডাইমেনশন) মাত্রাগুলি):

def add_weight(self,
               name,
               shape,
               dtype=None,
               initializer=None,
               regularizer=None,
               trainable=True,
               constraint=None):
    """Adds a weight variable to the layer.
    # Arguments
        name: String, the name for the weight variable.
        shape: The shape tuple of the weight.
        dtype: The dtype of the weight.
        initializer: An Initializer instance (callable).
        regularizer: An optional Regularizer instance.
        trainable: A boolean, whether the weight should
            be trained via backprop or not (assuming
            that the layer itself is also trainable).
        constraint: An optional Constraint instance.
    # Returns
        The created weight variable.
    """
    initializer = initializers.get(initializer)
    if dtype is None:
        dtype = K.floatx()
    weight = K.variable(initializer(shape),
                        dtype=dtype,
                        name=name,
                        constraint=constraint)
    if regularizer is not None:
        with K.name_scope('weight_regularizer'):
            self.add_loss(regularizer(weight))
    if trainable:
        self._trainable_weights.append(weight)
    else:
        self._non_trainable_weights.append(weight)
    return weight

(2) - এই ওজন ম্যাট্রিক্স সূচীকরণ

এটি এম্বেডিংয়েরcall ক্রিয়াকলাপে ঘটছে :

def call(self, inputs):
    if K.dtype(inputs) != 'int32':
        inputs = K.cast(inputs, 'int32')
    out = K.gather(self.embeddings, inputs)
    return out

এই ফাংশন আউটপুট ফেরৎ Embeddingস্তর যার K.gather(self.embeddings, inputs)Tf.keras.backend.gather ঠিক কী করে তা হ'ল ওয়েট ম্যাট্রিক্সকে self.embeddings( buildউপরে ফাংশনটি দেখুন ) inputsযা ধনাত্মক পূর্ণসংখ্যার তালিকা হওয়া উচিত according

উদাহরণস্বরূপ এই তালিকাগুলি পুনরুদ্ধার করা যেতে পারে যদি আপনি আপনার পাঠ্য / শব্দের ইনপুটগুলি কেরাসের ওয়ান_ হট ফাংশনে পাস করেন যা কোনও পাঠ্যকে মাপের শব্দের সূচকগুলির তালিকাতে এনকোড করে (এটি কোনও গরম এনকোডিং নয় - আরও তথ্যের জন্য এই উদাহরণটি দেখুন: https://machinelearningmastery.com/use-word-e এম্বেডিং-layers- ডিপি- বিসর্জন-keras/ )।


সুতরাং, সব। কোনও ম্যাট্রিক্স গুণ নেই।

বিপরীতভাবে, স্তর শুধুমাত্র দরকারী কারণ ঠিক একটি ম্যাট্রিক্স গুণ করণ এড়াতে হয় এবং অত: পর কিছু গণনীয় সম্পদের উপর economizes।Keras Embedding

অন্যথায়, আপনি ট্রেনযোগ্য ওজন ( (শব্দভাণ্ডার_ আকার) x (এম্বেডিং_ডাইমেনশন) মাত্রাগুলি) এর একটি ম্যাট্রিক্স পেতে কেবল একটি Keras ঘন স্তর (আপনার ইনপুট ডেটা এনকোড করার পরে) ব্যবহার করতে পারেন এবং তারপরে আউটপুট পেতে কেবল গুণটি করতে পারবেন যা হুবহু হবে স্তর আউটপুট সঙ্গে একই ।Embedding



4

কেরাসে Embeddingস্তরটি কোনও সাধারণ ম্যাট্রিক্সের গুণ গুণ নয় , তবে একটি টেবিল স্তর রয়েছে (নীচে কল ফাংশনটি দেখুন বা মূল সংজ্ঞাটি দেখুন )।

def call(self, inputs):
    if K.dtype(inputs) != 'int32':
        inputs = K.cast(inputs, 'int32')
    out = K.gather(self.embeddings, inputs)
    return out

এটি কী প্রতিটি একটি পরিচিত পূর্ণসংখ্যা মানচিত্র হয় nমধ্যে inputsএকটি trainable বৈশিষ্ট্য ভেক্টরকে W[n], যার মাত্রা তথাকথিত এমবেডেড বৈশিষ্ট্য দৈর্ঘ্য হয়।


আচ্ছা আপনি যখন ম্যাট্রিক্সের সাহায্যে ভ্যাক্টরের এক-উষ্ণ প্রতিনিধিত্বকারী সেটকে গুণাবেন, তখন পণ্যটি চেহারাতে পরিণত হয়। সুতরাং Embeddingস্তর হল প্রকৃতপক্ষে একটি ম্যাট্রিক্স গুণ।
ইয়ানিস

বাদে কোথাও কেরাস এই গুণটি সম্পাদন করে। এটি কেবল "এম্বেডিংস = একটি ট্রেনযোগ্য ম্যাট্রিক্স" সংজ্ঞায়িত করেছে এবং ম্যাট্রিক্স থেকে শব্দ সংগ্রহ করতে ইনপুট সূচকগুলি ব্যবহার করে।
ড্যানিয়েল মুলার

সুতরাং, এই এম্বেডিং ইনপুটগুলির কেবল কোনও এক-গরম সংস্করণ তৈরি না করে প্রচুর স্মৃতিকে বাঁচায়।
ড্যানিয়েল মুলার

1

সহজ কথায় (কার্যক্ষমতা দৃষ্টিকোণ থেকে), এটি একটি হট এনকোডার এবং সম্পূর্ণরূপে সংযুক্ত স্তর । স্তর ওজন প্রশিক্ষণযোগ্য।

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