ما هو الترميز الموضعي؟

ما هو الترميز الموضعي؟

الترميز الموضعي هو أسلوب يتم فيه حقن معلومات حول موضع الكلمات في تسلسل إلى بِنى المحول.

يلعب ترتيب الكلمات دورًا أساسيًا في فهم المعنى الدلالي للجملة. على سبيل المثال، العبارتان "Allen walks dog" و"dog walks Allen" لهما معنيان مختلفان تمامًا رغم وجود نفس الكلمات أو الرموز المميزة. عند تنفيذ تطبيقات معالجة اللغة الطبيعية (NLP) باستخدام التعلم العميق والشبكات العصبية، نحتاج إلى إنشاء آلية يمكن من خلالها للآلات الاحتفاظ بترتيب الكلمات في الجملة لإنتاج مخرجات منطقية.  

على نحو تقليدي، تحتوي النماذج مثل الشبكات العصبية المتكررة (RNN)، أو الذاكرة طويلة المدى قصيرة المدى (LSTM)، على آلية مدمجة تتعامل مع ترتيب الكلمات. حيث تقوم الشبكات العصبية المتكررة (RNN) أو الذاكرة طويلة المدى قصيرة المدى (LSTM) بمعالجة الإدخال بالتتابع، رمزًا مميزًا واحدًا في كل مرة، مع حفظ جميع مواضع الكلمات في تسلسل واحد. بعبارة أخرى، يتم معالجة المتجه ذي البُعد n والذي يُسمى أيضًا "متجه الإدخال"، واحدًا تلو الآخر، ليتعلم ترتيب البيانات بشكل ضمني. وعلى العكس، فإن البِنى الأخرى التي تستفيد من الشبكات العصبية التلافيفية (CNN) أو المحولات (Vaswani et al. 2017) لا تحتفظ بترتيب الكلمات وتعالج الرموز المميزة بالتوازي. لذا نحن نحتاج إلى تنفيذ آلية يمكنها تمثيل ترتيب الكلمات بشكل صريح في تسلسل، وهي طريقة تُعرَف باسم الترميز الموضعي. حيث يسمح لك الترميز الموضعي للمحول بالاحتفاظ بمعلومات ترتيب الكلمات، مما يتيح التوازي والتدريب الفعال على النموذج. يمكنك غالبًا العثور على تطبيقات الترميز الموضعي على موقع GitHub.  

أحدث اتجاهات الذكاء الاصطناعي، يقدمها لك الخبراء

احصل على رؤى منسقة حول أهم أخبار الذكاء الاصطناعي وأكثرها إثارةً للاهتمام. اشترِك في خدمة رسائل Think الإخبارية الأسبوعية. راجع بيان الخصوصية لشركة IBM.

شكرًا لك! لقد اشتركت بنجاح.

سيتم تسليم اشتراكك باللغة الإنجليزية. ستجد رابط إلغاء الاشتراك في كل رسالة إخبارية. يمكنك إدارة اشتراكاتك أو إلغاء اشتراكك هنا. راجع بيان خصوصية IBM لمزيد من المعلومات.

ما أهمية الترميز الموضعي؟

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

دعنا نُعِد النظر في المثال:

  • "Allen walks dog"
  • "dog walks Allen"

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

نحقق هذا الهدف من خلال معالجة كل كلمة أولًا كمتجه يمثل معناها؛ على سبيل المثال، سيتم ترميز "dog" مصفوفة عالية الأبعاد ترمز إلى مفهومها. وبالتعبير الفني المتخصص، يتم تعيين كل كلمة أو كلمة فرعية إلى تضمين إدخال بأطوال مختلفة. ومع ذلك، لا يخبرنا متجه المعنى من تلقاء نفسه بمكان ظهور كلمة "dog" في الجملة. بل يضيف الترميز الموضعي متجهًا ثانيًا؛ وهو متجه يقوم بتشفير فهرس الموضع، مثل "الكلمة الأولى" أو "الكلمة الثانية"، وما إلى ذلك. ثم يُضَاف المتجهان لتمثيل الكلمة وأين توجد الكلمة. وغالبًا ما يُشار إلى هذا المتجه الناتج باسم متجه الترميز الموضعي.   

هناك عدة طرق لإنشاء الترميز الموضعي في هذه المقالة، نستكشف المثال الأكثر شهرة لاستخدام دالة جيبية قدمها المؤلفون في الورقة البحثية "الانتباه هو كل ما تحتاجه1" لإنشاء ترميز موضعي.  

Mixture of Experts | 28 أغسطس، الحلقة 70

فك تشفير الذكاء الاصطناعي: تقرير إخباري أسبوعي

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

الترميز الموضعي في المحولات

في الورقة الأصلية التي قدمها Vaswani وآخرون في عام 2017، تتمثل الفكرة الرئيسية في إنشاء تشفير ثابت وحتمي لكل موضع في تسلسل باستخدام دالة جيبية - وعلى وجه الخصوص، دالة الجيب sin(x) ودالة جيب التمام cos(x) .  

ما هي الدوال الجيبية؟

الدوال الجيبية هي مفهوم رياضي أساسي ينتج نمطًا سلسًا وطولًا موجيًا. على وجه الخصوص، يتم استخدام وظائف جيب التمام والجيب من قِبل المؤلفين في وظائف المحول الأصلية للمساعدة على التشفير الموضعي.

إذا رسمنا sin(x) و cos(x) ، فسنرى منحنًى يرتفع وينخفض بين -1 و1 في نمط دوري متكرر.

فيما يلي بعض خصائص دالة الجيب (sine) التي تجعله قويًا في الترميز الموضعي: 

  • فهو دوري: يتكرر بانتظام على فترات، وهو أمر مفيد لتمثيل الأنماط المتكررة.

  • وهو سلس ومستمر: التغييرات الصغيرة في الإدخال تؤدي إلى تغييرات صغيرة في النتائج، مما يمنحنا طريقة لتمثيل المواضع في مساحة قابلة للتفاضل.

  • من خلال تغيير تردد الأطوال الموجية عبر الأبعاد، يمكننا إنشاء تمثيل ثري متعدد النطاقات للموضع. 

دعونا نرسم موجات دالة الجيب (sine) ودالة جيب التمام (cosine) لتوضيح شكلها:

import numpy as np 
import matplotlib.pyplot as plt 

# Create an array of 100 x values evenly spaced from 0 to 2π (approx 6.28)
x = np.linspace(0, 2 * np.pi, 100) 

# Compute the sine and cosine of each x value 
sin_values = np.sin(x) 

# Create the plot 
plt.figure(figsize=(5, 2)) 
plt.plot(x, sin_values, label='sin(x)', color='blue') 

# Customize the plot 
plt.title('Sine Function') 
plt.xlabel('x') 
plt.ylabel('Function value') 
plt.axhline(0, color='black', linewidth=0.5) # horizontal line at y=0 
plt.axvline(0, color='black', linewidth=0.5) # vertical line at x=0 
#plt.grid(True, linestyle='--', alpha=0.5) 
plt.legend() 
plt.tight_layout() 

# Show the plot 
plt.show() 

دالة الجيب (sine)

التمثيل البياني لدالة الجيب، وهو منحنى متكرر بمدى موجب وسالب.

والآن دعونا نلقِ نظرة على كيفية رسم دالة جيب التمام (cosine):

#apply the cosine function to the same array, x
cosine = np.cos(x) 

plt.figure(figsize = (5,2)) 
plt.plot(x, cosine, label = 'cos(x)', color = 'blue') 
plt.title('The Cosine Function') 
plt.xlabel('x') 
plt.ylabel('Function value') 
plt.axhline(0, color='black', linewidth=0.5) # horizontal line at y=0 
plt.axvline(0, color='black', linewidth=0.5) # vertical line at x=0 
#plt.grid(True, linestyle='--', alpha=0.5) 
plt.legend() 
plt.tight_layout() 
رسم بياني لدالة جيب التمام، يوضح طبيعتها الدورية وخصائصها الرئيسية.

يتم عرض صيغ ترميز الموضع الجيبي، التي حددها مؤلفو ورقة المحولات الأصلية (Vaswani et al. 2017)، على النحو التالي:

للمواضع الزوجية:

 PEpos,2i=sin(pos100002i/dmodel) 

للمواقف الفردية:

 PEpos,2i+1=cos(pos100002i/dmodel) 

  •  k موضع الكلمة في الجملة (على سبيل المثال، 0 للكلمة الأولى، و1 للكلمة الثانية، وهكذا.:

  •  i فهرس البُعد لمتجه التضمين. ويُطابق فهرس العمود. ستشير القيمة 2i إلى موضع زوجي، بينما ستشير القيمة 2i+1 إلى موضع فردي.

  •  dmodel : الأبعاد المحددة مسبقًا لتضمين الرمز (على سبيل المثال، 512)

  •  n قيمة قياس مُحددة بواسطة المستخدم (على سبيل المثال، 10000):

  •  PE وظيفة الموضع لتعيين الموضع K في تسلسل الإدخال للحصول على التعيين الموضعي

     

 

باستخدام هذه الصيغة، سيكون لكل كلمة، في الموضع k، قيمة تضمين استنادًا إلى موضع الكلمة. في المثال الذي استخدمناه، "Allen walks dog"، يمكننا حساب التضمين الموضعي لكل كلمة:

-  k1 = "Allen"

-  k2 = "walks"

-  k3 ="dog"

لنكتب دالة Python بسيطة لحساب قيمة  PE(k) :

import numpy as np 

import matplotlib.pyplot as plt 

  

# create the positional encoding function using the formula above 

def getPositionEncoding(seq_len, d, n=10000): 

    # instantiate an array of 0s as a starting point 

    P = np.zeros((seq_len, d)) 

    # iterate through the positions of each word  

    for k in range(seq_len): 

        #calculate the positional encoding for even and odd position of each word 

        for i in np.arange(int(d/2)): 

            denominator = np.power(n, 2*i/d) 

            P[k, 2*i] = np.sin(k/denominator) 

            P[k, 2*i+1] = np.cos(k/denominator) 
    return P 

بمجرد استدعاء الدالة وإدخال القيمة المقابلة في مثالنا، حيث يكون طول التسلسل 3، مع بُعد مبسط  d=4 ، و  n=10000 

P = getPositionEncoding(seq_len=3, d=4, n=10000) 

print(P) 

نحصل على مصفوفة الترميز التالية (يُشار إليها أيضًا باسم الموتر):

[[ 0.                      1.                      0.                       1.        ]

 [ 0.84147098  0.54030231  0.09983342  0.99500417]

 [ 0.90929743 -0.41614684  0.19866933  0.98006658]]

لتمثيل هذه النتيجة بشكل ملموس أكثر، نحصل على

موضع الكلمةDim 0
sin(pos ÷ 10000^(0 ÷ 4))
Dim 1
cos(pos ÷ 10000^(0 ÷ 4))
Dim 2
sin(pos ÷ 10000^(2 ÷ 4))
Dim 3
cos(pos ÷ 10000^(2 ÷ 4))
“Allen” k = 00.00000.00000.00001.0000
“walks” k = 10.8414710.5403020.0100000.999950
“dog” k = 20.909297-0.4161470.0200000.999800

هنا يمكننا أن نرى القيمة الملموسة لكل كلمة والقيمة الموضعية للتضمين المقابلة لها. ومع ذلك، لا يمكننا استخدام تضمينات الكلمات هذه مباشرة لتفسير ترتيب الكلمات. ويتم استخدام القيمة المحسوبة هنا لحقن معلومات حول الموضع في متجه إدخال المحول. ولأن مدخلات sin(x)  و cos(x) مختلفة، فإن كل موضع  k  سيستجيب لدالة جيبية مختلفة. يعطينا الموضع المقابل للدالة الجيبية المختلفة معلومات عن الموضع المطلق والموضع النسبي للكلمة في "Allen walks dog". بمعنى آخر، يمكن للنموذج استخدام هذه المعلومات بطريقة تمكنه من تعلم ربط هذه الأنماط بالترتيب والتباعد والبنية.  

الآن دعونا ننفذ دالة python لتصور المصفوفة الموضعية

import numpy as np 

import matplotlib.pyplot as plt 

  

def get_position_encoding(seq_len, d_model, n=10000): 

    P = np.zeros((seq_len, d_model)) 

    for pos in range(seq_len): 

        for i in range(d_model): 

            angle = pos / np.power(n, (2 * (i // 2)) / d_model) 

            P[pos, i] = np.sin(angle) if i % 2 == 0 else np.cos(angle) 

    return P 

  

# Parameters 

seq_len = 100   # Number of tokens 

d_model = 512   # Embedding dimensions 

  

# Generate positional encoding 

P = get_position_encoding(seq_len, d_model) 

  

# Plot 

plt.figure(figsize=(10, 6)) 

cax = plt.matshow(P, cmap='viridis', aspect='auto') 

plt.title("Sinusoidal Positional Encoding Heatmap") 

plt.xlabel("Embedding Dimension") 

plt.ylabel("Token Position") 

plt.colorbar(cax) 

plt.tight_layout() 

plt.show() 
خريطة حرارية جيبية

الأفكار النهائية

كما يمكننا أن نرى مع الترددات المختلفة بناءً على قيم x، فإن كل موضع مقابل من كلمة الإدخال k سيختلف على مقياس  [-1.1] —نطاق الدالة  sin(x) . من هناك سيتعلم نموذج المحولات الخاص بنا القائم على التشفير وفك التشفيرويحافظ على ترميز الموضع المختلف لكل كلمة، مما يسمح للنموذج بالاحتفاظ بالمعلومات للتدريب. ويظل متجه الموضع المشفر ثابتًا من خلال التدريب، مما يسمح بالحساب المتوازي.

حلول ذات صلة
IBM watsonx.ai

تدريب الذكاء الاصطناعي التوليدي والتحقق من صحته وضبطه ونشره، وكذلك قدرات نماذج الأساس والتعلم الآلي باستخدام IBM watsonx.ai، وهو استوديو الجيل التالي من المؤسسات لمنشئي الذكاء الاصطناعي. أنشئ تطبيقات الذكاء الاصطناعي بسرعة أكبر وببيانات أقل.

اكتشف watsonx.ai
حلول الذكاء الاصطناعي

استفد من الذكاء الاصطناعي في عملك بالاستعانة بخبرة IBM الرائدة في مجال الذكاء الاصطناعي ومحفظة حلولها المتوفرة لك.

استكشف حلول الذكاء الاصطناعي
الاستشارات والخدمات المتعلقة بالذكاء الاصطناعي

أعدّ ابتكار عمليات ومهام سير العمل الحساسة بإضافة الذكاء الاصطناعي لتعزيز التجارب وصنع القرارات في الوقت الفعلي والقيمة التجارية.

استكشف خدمات الذكاء الاصطناعي
اتخِذ الخطوة التالية

احصل على وصول شامل إلى القدرات التي تغطي دورة حياة تطوير الذكاء الاصطناعي. تمكَّن من إنتاج حلول ذكاء اصطناعي قوية بفضل الواجهات سهلة الاستخدام وعمليات سير العمل السلسة وإمكانية الوصول إلى واجهات برمجة التطبيقات ومجموعات تطوير البرامج القياسية في الصناعة.

استكشف watsonx.ai احجز عرضًا توضيحيًا مباشرًا
الحواشي

1. “Attention Is All You Need”, Ashish Vaswani et al., Proceedings of the 31st International Conference on Neural Information Processing Systems, arXiv:1706.03762v7, revised on 2 August 2023.

2. “Long Short-Term Memories”, Sepp Hochreiter and Jürgen Schmidhuber. 1997. Long Short-Term Memory. الحوسبة العصبية 9, 8 (November 15, 1997), 1735–1780., 

3. “Foundations of Recurrent Neural Networks (RNNs) and Long Short-Term Memories” Alex Sherstinsky et al., Elsevier “Physica D: Nonlinear Phenomena” journal, Volume 404, March 2020: Special Issue on Machine Learning and Dynamical Systems