أحدث اتجاهات الذكاء الاصطناعي، يقدمها لك الخبراء
احصل على رؤى منسقة حول أهم أخبار الذكاء الاصطناعي وأكثرها إثارةً للاهتمام. اشترِك في خدمة رسائل Think الإخبارية الأسبوعية. راجع بيان الخصوصية لشركة IBM.
الترميز الموضعي هو أسلوب يتم فيه حقن معلومات حول موضع الكلمات في تسلسل إلى بِنى المحول.
يلعب ترتيب الكلمات دورًا أساسيًا في فهم المعنى الدلالي للجملة. على سبيل المثال، العبارتان "Allen walks dog" و"dog walks Allen" لهما معنيان مختلفان تمامًا رغم وجود نفس الكلمات أو الرموز المميزة. عند تنفيذ تطبيقات معالجة اللغة الطبيعية (NLP) باستخدام التعلم العميق والشبكات العصبية، نحتاج إلى إنشاء آلية يمكن من خلالها للآلات الاحتفاظ بترتيب الكلمات في الجملة لإنتاج مخرجات منطقية.
على نحو تقليدي، تحتوي النماذج مثل الشبكات العصبية المتكررة (RNN)، أو الذاكرة طويلة المدى قصيرة المدى (LSTM)، على آلية مدمجة تتعامل مع ترتيب الكلمات. حيث تقوم الشبكات العصبية المتكررة (RNN) أو الذاكرة طويلة المدى قصيرة المدى (LSTM) بمعالجة الإدخال بالتتابع، رمزًا مميزًا واحدًا في كل مرة، مع حفظ جميع مواضع الكلمات في تسلسل واحد. بعبارة أخرى، يتم معالجة المتجه ذي البُعد n والذي يُسمى أيضًا "متجه الإدخال"، واحدًا تلو الآخر، ليتعلم ترتيب البيانات بشكل ضمني. وعلى العكس، فإن البِنى الأخرى التي تستفيد من الشبكات العصبية التلافيفية (CNN) أو المحولات (Vaswani et al. 2017) لا تحتفظ بترتيب الكلمات وتعالج الرموز المميزة بالتوازي. لذا نحن نحتاج إلى تنفيذ آلية يمكنها تمثيل ترتيب الكلمات بشكل صريح في تسلسل، وهي طريقة تُعرَف باسم الترميز الموضعي. حيث يسمح لك الترميز الموضعي للمحول بالاحتفاظ بمعلومات ترتيب الكلمات، مما يتيح التوازي والتدريب الفعال على النموذج. يمكنك غالبًا العثور على تطبيقات الترميز الموضعي على موقع GitHub.
احصل على رؤى منسقة حول أهم أخبار الذكاء الاصطناعي وأكثرها إثارةً للاهتمام. اشترِك في خدمة رسائل Think الإخبارية الأسبوعية. راجع بيان الخصوصية لشركة IBM.
من المعلوم أن ترتيب الكلمات في جملة أو تسلسل هو ما يملي المعنى المتأصل للجملة في اللغات الطبيعية. وبالإضافة إلى ذلك، في التعلم الآلي، يمنحنا ترميز ترتيب الكلمة "قاموسًا" حول المكان الذي يجب أن تكون فيه كل كلمة. حيث يتم الاحتفاظ بهذه المعلومات ويمكن تعميمها خلال تدريب نماذج المحولات، مما يتيح التوازي والتغلب على الشبكات العصبية المتكررة (RNN) أو الذاكرة طويلة المدى قصيرة المدى (LSTM) لكفاءة التدريب.
دعنا نُعِد النظر في المثال:
هاتان الجملتان اللتان لهما نفس الرموز المميزة الثلاثة لهما معاني مختلفة تمامًا بناء على ترتيب الكلمات. ونجد أن المحولات، التي تعتمد على آلية الانتباه الذاتي والانتباه متعدد الرؤوس، لا تمتلك تمثيلًا متأصلًا لترتيب الكلمات، وستتعامل مع الكلمات الفردية في أي تسلسل بنفس الطريقة إذا لم نوفر معلومات موضعية صريحة. ونريد أن يفهم النموذج مَن الذي يقوم بالمشي ومَن الذي يُجرَى تمشيته (مَن الفاعل ومَن المفعول به)، وهو ما يعتمد كليًا على المواقف.
نحقق هذا الهدف من خلال معالجة كل كلمة أولًا كمتجه يمثل معناها؛ على سبيل المثال، سيتم ترميز "dog" مصفوفة عالية الأبعاد ترمز إلى مفهومها. وبالتعبير الفني المتخصص، يتم تعيين كل كلمة أو كلمة فرعية إلى تضمين إدخال بأطوال مختلفة. ومع ذلك، لا يخبرنا متجه المعنى من تلقاء نفسه بمكان ظهور كلمة "dog" في الجملة. بل يضيف الترميز الموضعي متجهًا ثانيًا؛ وهو متجه يقوم بتشفير فهرس الموضع، مثل "الكلمة الأولى" أو "الكلمة الثانية"، وما إلى ذلك. ثم يُضَاف المتجهان لتمثيل الكلمة وأين توجد الكلمة. وغالبًا ما يُشار إلى هذا المتجه الناتج باسم متجه الترميز الموضعي.
هناك عدة طرق لإنشاء الترميز الموضعي في هذه المقالة، نستكشف المثال الأكثر شهرة لاستخدام دالة جيبية قدمها المؤلفون في الورقة البحثية "الانتباه هو كل ما تحتاجه1" لإنشاء ترميز موضعي.
في الورقة الأصلية التي قدمها Vaswani وآخرون في عام 2017، تتمثل الفكرة الرئيسية في إنشاء تشفير ثابت وحتمي لكل موضع في تسلسل باستخدام دالة جيبية - وعلى وجه الخصوص، دالة الجيب ودالة جيب التمام .
الدوال الجيبية هي مفهوم رياضي أساسي ينتج نمطًا سلسًا وطولًا موجيًا. على وجه الخصوص، يتم استخدام وظائف جيب التمام والجيب من قِبل المؤلفين في وظائف المحول الأصلية للمساعدة على التشفير الموضعي.
إذا رسمنا و ، فسنرى منحنًى يرتفع وينخفض بين -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)، على النحو التالي:
للمواضع الزوجية:
للمواقف الفردية:
موضع الكلمة في الجملة (على سبيل المثال، 0 للكلمة الأولى، و1 للكلمة الثانية، وهكذا.:
فهرس البُعد لمتجه التضمين. ويُطابق فهرس العمود. ستشير القيمة 2i إلى موضع زوجي، بينما ستشير القيمة 2i+1 إلى موضع فردي.
: الأبعاد المحددة مسبقًا لتضمين الرمز (على سبيل المثال، 512)
قيمة قياس مُحددة بواسطة المستخدم (على سبيل المثال، 10000):
وظيفة الموضع لتعيين الموضع K في تسلسل الإدخال للحصول على التعيين الموضعي
باستخدام هذه الصيغة، سيكون لكل كلمة، في الموضع k، قيمة تضمين استنادًا إلى موضع الكلمة. في المثال الذي استخدمناه، "Allen walks dog"، يمكننا حساب التضمين الموضعي لكل كلمة:
- = "Allen"
- = "walks"
- ="dog"
لنكتب دالة Python بسيطة لحساب قيمة :
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، مع بُعد مبسط ، و
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 = 0 | 0.0000 | 0.0000 | 0.0000 | 1.0000 |
| “walks” k = 1 | 0.841471 | 0.540302 | 0.010000 | 0.999950 |
| “dog” k = 2 | 0.909297 | -0.416147 | 0.020000 | 0.999800 |
هنا يمكننا أن نرى القيمة الملموسة لكل كلمة والقيمة الموضعية للتضمين المقابلة لها. ومع ذلك، لا يمكننا استخدام تضمينات الكلمات هذه مباشرة لتفسير ترتيب الكلمات. ويتم استخدام القيمة المحسوبة هنا لحقن معلومات حول الموضع في متجه إدخال المحول. ولأن مدخلات و مختلفة، فإن كل موضع سيستجيب لدالة جيبية مختلفة. يعطينا الموضع المقابل للدالة الجيبية المختلفة معلومات عن الموضع المطلق والموضع النسبي للكلمة في "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 سيختلف على مقياس —نطاق الدالة . من هناك سيتعلم نموذج المحولات الخاص بنا القائم على التشفير وفك التشفيرويحافظ على ترميز الموضع المختلف لكل كلمة، مما يسمح للنموذج بالاحتفاظ بالمعلومات للتدريب. ويظل متجه الموضع المشفر ثابتًا من خلال التدريب، مما يسمح بالحساب المتوازي.
تدريب الذكاء الاصطناعي التوليدي والتحقق من صحته وضبطه ونشره، وكذلك قدرات نماذج الأساس والتعلم الآلي باستخدام IBM watsonx.ai، وهو استوديو الجيل التالي من المؤسسات لمنشئي الذكاء الاصطناعي. أنشئ تطبيقات الذكاء الاصطناعي بسرعة أكبر وببيانات أقل.
استفد من الذكاء الاصطناعي في عملك بالاستعانة بخبرة IBM الرائدة في مجال الذكاء الاصطناعي ومحفظة حلولها المتوفرة لك.
أعدّ ابتكار عمليات ومهام سير العمل الحساسة بإضافة الذكاء الاصطناعي لتعزيز التجارب وصنع القرارات في الوقت الفعلي والقيمة التجارية.
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