المُقدّمة
هناك الكثير من الأدلة التي تشرح كيفية عمل المحولات ، ولإنشاء حدس حول عنصر أساسي منها - تضمين الرمز المميز والمواضع.
سمح التضمين الموضعي للرموز المميزة للمحولات بتمثيل العلاقات غير الصارمة بين الرموز (عادةً ، الكلمات) ، وهو أفضل بكثير في نمذجة خطابنا الذي يحركه السياق في نمذجة اللغة. في حين أن العملية بسيطة نسبيًا ، إلا أنها عامة إلى حد ما ، وسرعان ما تصبح التطبيقات نموذجية.
في هذا الدليل المختصر ، سنلقي نظرة على كيفية استخدام 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.