رمز المحول ودمج الموضع مع ذكاء بيانات Keras PlatoBlockchain. البحث العمودي. عاي.

رمز محول وموقف تضمين مع Keras

المُقدّمة

هناك الكثير من الأدلة التي تشرح كيفية عمل المحولات ، ولإنشاء حدس حول عنصر أساسي منها - تضمين الرمز المميز والمواضع.

سمح التضمين الموضعي للرموز المميزة للمحولات بتمثيل العلاقات غير الصارمة بين الرموز (عادةً ، الكلمات) ، وهو أفضل بكثير في نمذجة خطابنا الذي يحركه السياق في نمذجة اللغة. في حين أن العملية بسيطة نسبيًا ، إلا أنها عامة إلى حد ما ، وسرعان ما تصبح التطبيقات نموذجية.

في هذا الدليل المختصر ، سنلقي نظرة على كيفية استخدام KerasNLP ، الوظيفة الإضافية الرسمية لـ Keras ، لأداء PositionEmbedding و TokenAndPositionEmbedding.

KerasNLP

KerasNLP هي إضافة أفقية للغة البرمجة اللغوية العصبية. حتى وقت كتابة هذا التقرير ، لا يزال الإصدار 0.3 صغيرًا جدًا ، ولا تزال الوثائق موجزة إلى حد ما ، ولكن الحزمة أكثر من مجرد قابلة للاستخدام بالفعل.

يوفر الوصول إلى طبقات Keras ، مثل TokenAndPositionEmbedding, TransformerEncoder و TransformerDecoderمما يجعل بناء المحولات المخصصة أسهل من أي وقت مضى.

لاستخدام KerasNLP في مشروعنا ، يمكنك تثبيته عبر pip:

$ pip install keras_nlp

بمجرد الاستيراد إلى المشروع ، يمكنك استخدام أي ملف keras_nlp طبقة كطبقة Keras القياسية.

Tokenization

تعمل أجهزة الكمبيوتر مع الأرقام. نحن نعبر عن أفكارنا بالكلمات. للسماح للكمبيوتر بالتغلب عليها ، سيتعين علينا تعيين الكلمات إلى أرقام بشكل ما.

الطريقة الشائعة للقيام بذلك هي ببساطة تعيين الكلمات إلى أرقام حيث يمثل كل عدد صحيح كلمة. مجموعة من الكلمات تخلق مفردات ، وكل كلمة في المفردات تحصل على فهرس. وبالتالي ، يمكنك تحويل سلسلة من الكلمات إلى سلسلة من المؤشرات المعروفة باسم رموز:

def tokenize(sequence):
    
    return tokenized_sequence

sequence = ['I', 'am', 'Wall-E']
sequence = tokenize(sequence)
print(sequence) 

يمكن بعد ذلك تضمين هذا التسلسل من الرموز المميزة في متجه كثيف يحدد الرموز المميزة في المساحة الكامنة:

[[4], [26], [472]] -> [[0.5, 0.25], [0.73, 0.2], [0.1, -0.75]]

يتم ذلك عادةً باستخدام ملف Embedding طبقة في Keras. لا تُشفِّر المحولات باستخدام معيار فقط Embedding طبقة. يؤدون Embedding و PositionEmbedding، ونجمعها معًا ، لتحل محل حفلات الزفاف العادية من خلال وضعها في الفضاء الخفي.

مع KerasNLP - الأداء TokenAndPositionEmbedding يجمع بين التضمين العادي للرموز (Embedding) مع التضمين الموضعي (PositionEmbedding).

الوظيفة

دعونا نلقي نظرة على PositionEmbedding أول. يقبل الموترات والموترات الممزقة ، ويفترض أن البعد النهائي يمثل الميزات ، بينما يمثل البعد الثاني إلى الأخير التسلسل.

# Seq
(5, 10)
     # Features

تقبل الطبقة ملف sequence_length حجة ، تدل على طول تسلسل المدخلات والمخرجات. دعنا نمضي قدمًا وندمج موترًا موحدًا عشوائيًا:

seq_length = 5
input_data = tf.random.uniform(shape=[5, 10])

input_tensor = keras.Input(shape=[None, 5, 10])
output = keras_nlp.layers.PositionEmbedding(sequence_length=seq_length)(input_tensor)
model = keras.Model(inputs=input_tensor, outputs=output)
    
model(input_data)

وينتج عنه:

<tf.Tensor: shape=(5, 10), dtype=float32, numpy=
array([[ 0.23758471, -0.16798696, -0.15070847,  0.208067  , -0.5123104 ,
        -0.36670157,  0.27487397,  0.14939266,  0.23843127, -0.23328197],
       [-0.51353353, -0.4293166 , -0.30189738, -0.140344  , -0.15444171,
        -0.27691704,  0.14078277, -0.22552207, -0.5952263 , -0.5982155 ],
       [-0.265581  , -0.12168896,  0.46075982,  0.61768025, -0.36352775,
        -0.14212841, -0.26831496, -0.34448475,  0.4418767 ,  0.05758983],
       [-0.46500492, -0.19256318, -0.23447984,  0.17891657, -0.01812166,
        -0.58293337, -0.36404118,  0.54269964,  0.3727749 ,  0.33238482],
       [-0.2965023 , -0.3390794 ,  0.4949159 ,  0.32005525,  0.02882379,
        -0.15913549,  0.27996767,  0.4387421 , -0.09119213,  0.1294356 ]],
      dtype=float32)>

TokenAndPositionEmbedding

يتلخص تضمين الرمز والموضع في استخدام Embedding على تسلسل الإدخال ، PositionEmbedding على الرموز المميزة المضمنة ، ثم إضافة هاتين النتيجتين معًا ، مما يؤدي بشكل فعال إلى إزاحة عمليات دمج الرمز المميز في الفضاء لتشفير علاقاتها ذات المغزى النسبية.

يمكن القيام بذلك تقنيًا على النحو التالي:

seq_length = 10
vocab_size = 25
embed_dim = 10

input_data = tf.random.uniform(shape=[5, 10])

input_tensor = keras.Input(shape=[None, 5, 10])
embedding = keras.layers.Embedding(vocab_size, embed_dim)(input_tensor)
position = keras_nlp.layers.PositionEmbedding(seq_length)(embedding)
output = keras.layers.add([embedding, position])
model = keras.Model(inputs=input_tensor, outputs=output)
    
model(input_data).shape 

يتم تضمين المدخلات ، ثم يتم تضمينها في موضعها ، وبعد ذلك يتم جمعها معًا ، مما ينتج عنه شكل جديد مدمج موضعياً. بدلاً من ذلك ، يمكنك الاستفادة من TokenAndPositionEmbedding الطبقة التي تقوم بذلك تحت الغطاء:

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!

... 
def call(self, inputs):
        embedded_tokens = self.token_embedding(inputs)
        embedded_positions = self.position_embedding(embedded_tokens)
        outputs = embedded_tokens + embedded_positions
        return outputs

هذا يجعله أكثر نظافة TokenAndPositionEmbedding:

seq_length = 10
vocab_size = 25
embed_dim = 10

input_data = tf.random.uniform(shape=[5, 10])

input_tensor = keras.Input(shape=[None, 5, 10])
output = keras_nlp.layers.TokenAndPositionEmbedding(vocabulary_size=vocab_size, 
                                                     sequence_length=seq_length, 
                                                     embedding_dim=embed_dim)(input_tensor)
model = keras.Model(inputs=input_tensor, outputs=output)
    
model(input_data).shape 

أصبحت البيانات التي مررناها إلى الطبقة مضمنة في موضعها في مساحة كامنة من 10 أبعاد:

model(input_data)
<tf.Tensor: shape=(5, 10, 10), dtype=float32, numpy=
array([[[-0.01695484,  0.7656435 , -0.84340465,  0.50211895,
         -0.3162892 ,  0.16375223, -0.3774369 , -0.10028353,
         -0.00136751, -0.14690581],
        [-0.05646318,  0.00225556, -0.7745967 ,  0.5233861 ,
         -0.22601983,  0.07024342,  0.0905793 , -0.46133494,
         -0.30130145,  0.451248  ],
         ...

المضي قدمًا - مشروع باليد من البداية إلى النهاية

طبيعتك الفضولية تجعلك ترغب في الذهاب إلى أبعد من ذلك؟ نوصي بالتحقق من مشروع موجه: "Image Captioning with CNNs and Transformers with Keras".

في هذا المشروع الإرشادي - ستتعلم كيفية إنشاء نموذج تسمية توضيحية للصورة ، والذي يقبل صورة كمدخلات وينتج تعليقًا نصيًا كإخراج.

ستتعلم كيفية:

  • نص العملية المسبقة
  • تحويل إدخال النص بسهولة
  • العمل مع tf.data API وبناء مجموعات البيانات عالية الأداء
  • قم ببناء المحولات من الصفر باستخدام TensorFlow / Keras و KerasNLP - الإضافة الأفقية الرسمية إلى Keras لبناء أحدث نماذج البرمجة اللغوية العصبية
  • قم ببناء معماريات هجينة حيث يتم ترميز ناتج إحدى الشبكات لشبكة أخرى

كيف نؤطر صورة توضيحية؟ يعتبره معظمهم مثالًا على التعلم العميق التوليدي ، لأننا ندرس شبكة لإنشاء الأوصاف. ومع ذلك ، أود أن أنظر إليها على أنها مثال على الترجمة الآلية العصبية - فنحن نترجم السمات المرئية للصورة إلى كلمات. من خلال الترجمة ، نقوم بإنشاء تمثيل جديد لتلك الصورة ، بدلاً من مجرد توليد معنى جديد. مشاهدتها على أنها ترجمة ، وفقط من خلال إنشاء الامتدادات ، تعمل على تحديد نطاق المهمة في ضوء مختلف ، وتجعلها أكثر سهولة.

إن صياغة المشكلة كإطار ترجمة يجعل من السهل معرفة البنية التي نريد استخدامها. تُعد المحولات المخصصة للتشفير فقط رائعة في فهم النص (تحليل المشاعر والتصنيف وما إلى ذلك) لأن أجهزة التشفير ترميز تمثيلات ذات مغزى. تعد نماذج وحدات فك التشفير فقط رائعة للتوليد (مثل GPT-3) ، حيث إن أجهزة فك التشفير قادرة على استنتاج تمثيلات ذات مغزى في تسلسل آخر بنفس المعنى. تتم الترجمة عادةً من خلال بنية وحدة فك التشفير، حيث تقوم أجهزة التشفير بترميز تمثيل ذي مغزى لجملة (أو صورة ، في حالتنا) وتتعلم أجهزة فك التشفير تحويل هذا التسلسل إلى تمثيل آخر ذي معنى يكون أكثر قابلية للتفسير بالنسبة لنا (مثل الجملة).

استنتاجات

لقد أحدثت المحولات موجة كبيرة منذ عام 2017 ، والعديد من الأدلة الرائعة تقدم نظرة ثاقبة حول كيفية عملها ، ومع ذلك ، فإنها لا تزال بعيدة المنال بالنسبة للكثيرين بسبب الحمل الزائد للتطبيقات المخصصة. تعالج KerasNLP هذه المشكلة ، حيث توفر اللبنات الأساسية التي تتيح لك بناء أنظمة معالجة اللغات الطبيعية المرنة والقوية ، بدلاً من توفير حلول معبأة مسبقًا.

في هذا الدليل ، ألقينا نظرة على تضمين الرمز المميز والمواضع باستخدام Keras و KerasNLP.

الطابع الزمني:

اكثر من ستاكابوز