معاينة مختبر آمنة
CBo W-TF
هذي معاينة منقّحة للقراءة فقط؛ ما فيه أي شيء يشتغل داخل الصفحة.
قراءة فقط
معاينة الدفتر
CBo W-TF
> **ملاحظة بيئة التشغيل المدمجة:** هالمعاينة تستخدم عيّنة صغيرة وثابتة وآمنة من ناحية الحقوق عشان تكون النتايج قابلة للتكرار. النتايج بالحجم الكامل تحتاج مجموعة البيانات أو النموذج الموثّق بالدرس داخل بيئة خارجية معتمدة.
## تدريب نموذج حقيبة الكلمات المستمر (CBoW)
هالدفتر جزء من منهج الذكاء الاصطناعي للمبتدئين.
في هالمثال بنشوف كيف ندرّب نموذج لغة CBoW عشان نبني فضاء تضمين Word2Vec خاص فينا. وبنستخدم مجموعة البيانات AG News مصدرًا للنصوص.
from tensorflow import keras
import tensorflow as tf
import numpy as npبالبداية بنحمّل مجموعة البيانات:
# course-edition deterministic TensorFlow news fixture v1
_course_titles = tf.constant([
"Regional leaders agree on a public health plan",
"The home team wins the basketball final",
"Markets rise after a strong business report",
"Researchers release an efficient intelligence model",
"Diplomats begin a new round of peace talks",
"The tennis champion returns after an injury",
"Retail sales improve with consumer confidence",
"A software update improves privacy",
])
_course_descriptions = tf.constant([
"World policy and international cooperation",
"Sports results and player development",
"Business revenue and economic indicators",
"Science and technology research",
"World diplomacy and humanitarian aid",
"Sports training and competition",
"Business investment and employment",
"Science security and technology",
])
_course_labels = tf.constant([0, 1, 2, 3, 0, 1, 2, 3], dtype=tf.int64)
_course_records = {"title": _course_titles, "description": _course_descriptions, "label": _course_labels}
ds_train = tf.data.Dataset.from_tensor_slices(_course_records).take(6)
ds_test = tf.data.Dataset.from_tensor_slices(_course_records).skip(6)## نموذج CBoW
يتعلّم نموذج CBoW يتنبأ بكلمة اعتمادًا على $2N$ من الكلمات المجاورة لها. مثلًا، إذا كان $N=1$، بنطلع بالأزواج التالية من الجملة *I like to train networks*: (like,I)، (I, like)، (to, like)، (like,to)، (train,to)، (to, train)، (networks, train)، (train,networks). الكلمة الأولى في كل زوج هي الكلمة المجاورة اللي تدخل للنموذج، والثانية هي الكلمة اللي نبي النموذج يتنبأ بها.
عشان نبني شبكة تتنبأ بالكلمة الهدف، نعطيها كلمة مجاورة مدخلًا ونأخذ رقم الكلمة المطلوبة مخرجًا. بنية شبكة CBoW كالتالي:
* تمر الكلمة المدخلة عبر طبقة التضمين. هالطبقة نفسها بتكون تضمين Word2Vec حقنا، ولذلك بنعرّفها لحالها في المتغير `embedder`. بنستخدم في هالمثال حجم تضمين = 30، وتقدرون تجرّبون أبعادًا أكبر (حجم Word2Vec الفعلي هو 300).
* بعدها يمر متجه التضمين إلى طبقة كثيفة تتنبأ بالكلمة الناتجة؛ لذلك يكون عدد عصبوناتها مساويًا لـ `vocab_size`.
طبقة التضمين في Keras تعرف تلقائيًا كيف تحوّل المدخل الرقمي إلى ترميز one-hot؛ يعني ما نحتاج نرمّز كلمة الإدخال لحالها. نحدد `input_length=1` عشان نوضح إننا نبي كلمة وحدة بس في تسلسل الإدخال، مع إن طبقة التضمين مصممة عادةً لتتعامل مع تسلسلات أطول.
أما المخرج، فإذا استخدمنا `sparse_categorical_crossentropy` بوصفها دالة الخسارة، يكفينا نعطي النموذج أرقام الكلمات بوصفها النتائج المتوقعة، من دون ترميز one-hot.
بنضبط `vocab_size` على 5000 عشان نقلّل العمليات الحسابية شوي، وبنعرّف بعد أداة تحويل النصوص اللي بنستخدمها قدّام.
vocab_size = 5000
vectorizer = keras.layers.TextVectorization(
max_tokens=vocab_size,
output_mode="int",
)
embedder = keras.layers.Embedding(input_dim=vocab_size, output_dim=30)
model = keras.Sequential([
keras.Input(shape=(1,), dtype=tf.int64),
embedder,
keras.layers.Dense(vocab_size, activation="softmax"),
])
model.summary()خلونا نهيّئ أداة تحويل النصوص ونستخرج منها المفردات:
def extract_text(x):
return x['title']+' '+x['description']
vectorizer.adapt(ds_train.take(500).map(extract_text))
vocab = vectorizer.get_vocabulary()## تجهيز بيانات التدريب
الحين بنكتب الدالة الأساسية اللي تحسب أزواج كلمات CBoW من النص. نقدر نحدد لها حجم النافذة، وترجع لنا أزواجًا من كلمة مدخلة وكلمة ناتجة. انتبهوا إن الدالة تشتغل على الكلمات وعلى المتجهات/الموترات بعد؛ وهالشي يخلينا نحوّل النص إلى أرقام قبل ما نمرره إلى الدالة `to_cbow`.
def to_cbow(sent,window_size=2):
res = []
for i,x in enumerate(sent):
for j in range(max(0,i-window_size),min(i+window_size+1,len(sent))):
if i!=j:
res.append([sent[j],x])
return res
print(to_cbow(['I','like','to','train','networks']))
print(to_cbow(vectorizer('I like to train networks')))خلونا نجهّز مجموعة البيانات الخاصة بالتدريب. بنمر على الأخبار كلها، ونستدعي `to_cbow` عشان نحصل على أزواج الكلمات، ثم نضيفها إلى `X` و`Y`. اختصارًا للوقت، بناخذ أول 10k خبر بس. إذا عندكم وقت أطول وتبغون تضمينات أفضل، احذفوا هالقيد بكل سهولة :)
X = []
Y = []
for i,x in zip(range(10000),ds_train.map(extract_text).as_numpy_iterator()):
for w1, w2 in to_cbow(vectorizer(x),window_size=1):
X.append(tf.expand_dims(w1,0))
Y.append(tf.expand_dims(w2,0))وبنحوّل هالبيانات كلها إلى **مجموعة البيانات** نفسها، ثم نقسّمها دفعات للتدريب:
ds = tf.data.Dataset.from_tensor_slices((X,Y)).batch(256)الحين نبدأ التدريب الفعلي. بنستخدم المحسّن `SGD` بمعدل تعلّم مرتفع نسبيًا، وتقدرون تجرّبون محسّنات ثانية مثل `Adam`. بنبدأ بالتدريب مدة 200 حقبة، وإذا تبغون قيمة خسارة أقل أعيدوا تشغيل هالخلية.
model.compile(optimizer=keras.optimizers.SGD(learning_rate=0.1),loss='sparse_categorical_crossentropy')
model.fit(ds, epochs=10)## تجربة Word2Vec
عشان نستخدم Word2Vec، خلونا نستخرج المتجهات المقابلة لكل الكلمات في مفرداتنا:
vectors = embedder(vectorizer(vocab))
vectors = tf.reshape(vectors,(-1,30)) # we need reshape to get rid of extra dimensionمثلًا، خلونا نشوف كيف تُمثَّل كلمة **Paris** بمتجه:
paris_vec = embedder(vectorizer('paris'))[0]
print(paris_vec)من التطبيقات الممتعة لـ Word2Vec البحث عن المرادفات. الدالة الجاية ترجع `n` من أقرب الكلمات إلى الكلمة المدخلة. عشان نلقاها، نحسب معيار $|w_i - v|$، بحيث إن $v$ هو متجه الكلمة المدخلة و$w_i$ هو تضمين الكلمة رقم $i$ في المفردات. بعدها نرتّب المصفوفة ونرجع الفهارس المقابلة باستخدام `argsort`، ثم نأخذ أول `n` عناصر؛ وهي مواقع أقرب الكلمات في المفردات.
def close_words(x,n=5):
vec = embedder(vectorizer(x))[0]
top5 = np.linalg.norm(vectors-vec,axis=1).argsort()[:n]
return [ vocab[x] for x in top5 ]
close_words('paris')close_words('china')close_words('official')## الزبدة
بتقنيات ذكية مثل CBoW نقدر ندرّب نموذج Word2Vec. جرّبوا بعد تدرّبون نموذج skip-gram يتعلّم يتنبأ بالكلمة المجاورة انطلاقًا من الكلمة اللي بالنص، وقارنوا أداءه.
حذفنا المخرجات وعدّادات التشغيل والودجات والمحتوى النشط وقت الاستيراد. شغّل الدفاتر بس في بيئة خارجية تثق فيها.
سجّل تطبيقك
التسجيل اختياري، يفيدك تتذكر وش طبّقت، ولا يمنع إكمال الدورة.