تصوير العقل العميق on Unsplash
يعد ضرب المصفوفة عملية أساسية تستخدم في العديد من الأنظمة ، من الشبكات العصبية إلى إجراءات الحوسبة العلمية. يمكن أن يكون لإيجاد خوارزميات فعالة وصحيحة لمضاعفة المصفوفة تأثير كبير على جعل الحساب أسرع وأكثر كفاءة ، ولكنه مهمة صعبة للغاية. مساحة الخوارزميات الممكنة هائلة ، والطرق التقليدية لاكتشاف الخوارزميات ، مثل الاستدلال من تصميم الإنسان أو البحث التجميعي ، غالبًا ما تكون دون المستوى الأمثل.
العقل العميقإن الحل القائم على الذكاء الاصطناعي الذي اقترحته مؤخرًا للبحث الآلي يتجاوز الحدس البشري. يتكون الحل من وكيل تعليمي معزز عميق يسمى AlphaTensor، مبني فوقه AlphaZero. يتم تدريب هذا الوكيل على لعب لعبة لاعب واحد ، TensorGame ، حيث الهدف هو اكتشاف خوارزميات فعالة حسابيًا لمضاعفة المصفوفة.
يعتبر AlphaTensor جيدًا بشكل خاص في التعامل مع المصفوفات الكبيرة عن طريق تحليل مضاعفات المصفوفة الكبيرة إلى عمليات ضرب أصغر. علاوة على ذلك ، يمكن استخدام AlphaTensor لتحقيق أداء متطور لمضاعفة المصفوفة بمجرد ضبطها على جهاز معين.
يمتلك AlphaTensor إمكانات كبيرة لتسريع حوسبة التعلم العميق. في التعلم العميق ، يمكن تعيين العديد من العمليات التي تستغرق وقتًا طويلاً لمضاعفات المصفوفة. باستخدام AlphaTensor لتحسين هذه العمليات ، يمكن تحسين الأداء العام لنماذج التعلم العميق بشكل كبير.
في الآونة الأخيرة ، OpenAlphaTensor ، و أول تطبيق مفتوح المصدر لبرنامج AlphaTensor، والتي يمكن أن تحدث ثورة في القوة الحسابية لنماذج التعلم العميق.
موتر ضرب المصفوفة
بالنسبة لغير الخبراء في تحسين مضاعفة المصفوفة ، قد لا يكون من السهل فهم كيفية تعيين عملية مثل مضاعفة المصفوفة في موتر ثلاثي الأبعاد. سأحاول شرحه بكلمات بسيطة وبأمثلة.
لنفكر في المنتج C = A * B ، حيث من أجل التبسيط ، يكون كل من A و B مصفوفات مربعة بالحجم N. يمكن تعيين عملية الضرب في موتر ثلاثي الأبعاد للشكل (N ^ 3 ، N ^ 2 ، N ^ 2). يمثل بُعد الموتر الأول المصفوفة المسطحة A ، والبعد الثاني المصفوفة المسطحة B والبعد الثالث المصفوفة المسطحة C.
يحتوي الموتر على قيم ثنائية فقط (إما 1 أو 0) لكل إدخال. لاحظ أن الموتر يمثل عملية الضرب ، لذا فهو مستقل عن قيم المصفوفتين A و B.
كل إدخال للموتر يتوافق مع معامل العملية. على سبيل المثال ، لحساب C [1,1،1,1] ، من الضروري ضرب كل من A [1,1،0,0,0] و B [1,1،1,1]. لذلك ، فإن إدخال الموتر [1,1،1،1,1] ، الذي يتوافق مع A [2,1،1] و B [0،XNUMX] و C [XNUMX،XNUMX] ، سيكون له القيمة XNUMX. في المقابل ، لحساب C [XNUMX ، XNUMX] ، A [XNUMX،XNUMX] ليست هناك حاجة. وبالتالي ، فإن صف الموتر T [N + XNUMX ،: ، XNUMX] سيحتوي فقط على الأصفار.
تُظهر الصورة أدناه مثالاً على موتر لـ N = 2.
الصورة من ديب مايند ورقة نشرت في الطبيعة
كما هو مبين في (ب) و (ج) في الشكل أعلاه ، من الممكن تنفيذ خوارزمية لحساب المنتج باستخدام تحلل موتر ثلاثي الأبعاد. بشكل أكثر تحديدًا ، يمكن استخدام الخوارزمية أدناه لتحويل تحلل الموتر (المصفوفات U ، V ، W) إلى خوارزمية ضرب المصفوفة.
خوارزمية ميتا ذات معلمات لحساب منتج المصفوفة C=AB المقدم في DeepMind ورقة
لعبة التنسور
تعد مشكلة إيجاد خوارزميات فعالة لضرب المصفوفات صعبة للغاية لأن عدد الخوارزميات الممكنة للنظر فيها أكبر بكثير من عدد الذرات في الكون ، حتى بالنسبة للحالات الصغيرة من ضرب المصفوفة.
حولت DeepMind هذه المشكلة إلى لعبة لاعب واحد ، وأطلق عليها TensorGame. في هذه اللعبة ، يختار اللاعب كيفية دمج إدخالات المصفوفات المختلفة لمضاعفتها. يتم تعيين الدرجة بناءً على عدد العمليات المطلوبة لتحقيق نتيجة الضرب الصحيحة. تنتهي اللعبة عندما يتم الوصول إلى الصفر الموتر أو عندما يتم إجراء الحد الأقصى لعدد النقلات. يتم تقييم العامل النهائي بناءً على تقدير الرتبة المتبقية ومعايير تحسين معينة ، مثل تعقيد الوقت المقارب أو وقت التشغيل العملي.
الموضع الأولي في TensorGame يتوافق مع Matrix Multiplication Tensor معبرًا عنه على أساس عشوائي.
في كل خطوة من اللعبة ، يكتب اللاعب ثلاثة متجهات
، والتي تحدد موترات الرتبة 1 . يتم تحديث حالة اللعبة بطرح المتجهات المحددة من قبل اللاعب:
أين
هو موتر ضرب المصفوفة.إذا انتهت اللعبة بخطوات p ، فهذا يعني أن موتر ضرب المصفوفة
يمكن أن تتحلل إلى موتر p رتبة 1 ، أي أنه يحتوي على الأقل على رتبة p.يمكن بعد ذلك تفسير لعبة TensorGame على أنها خوارزمية تحلل الرتبة ويمكن اعتبار AlphaTensor بمثابة خوارزمية لتقدير رتبة الموتر.
هندسة AlphaTensor
لقد تعلمنا حتى الآن عن لعبة TensorGame وأوضحنا كيف يمكن اعتبار حلها بمثابة خوارزمية ضرب المصفوفة. دعنا الآن نستكشف المفاهيم الرئيسية لـ AlphaTensor ، الخوارزمية المستخدمة للعبة.
بنية AlphaTensor هي في الأساس بنية محول لجهاز فك التشفير حيث:
- يأخذ المشفر حالة اللعبة كمدخل ، n الإجراءات السابقة التي اتخذها النموذج (عادةً n = 7) ، ومؤشر الوقت t للإجراء الحالي. يتم تكديس المعلومات معًا في موتر بالشكل (ن + 1 ، N ^ 2 ، N ^ 2 ، N ^ 2). ثم يتم إعادة تشكيل هذا الموتر وتحويله (باستخدام ثلاث طبقات خطية) في موتر من الشكل (N ^ 2 ، N ^ 2 ، c) حيث c هو البعد الداخلي للنموذج.
- يولد مفكك التشفير الإجراءات n_steps من المتجه المدمج الذي يوفره المشفر بطريقة ارتداد تلقائي. كل إجراء يتوافق مع رمز من ثلاثة توائم يمثل واحدًا من ثلاثة توائم يحلل موتر اللعبة (أي تقليل رتبته)
يتم تدريب النموذج بالتناوب الخلفي والتناوب النموذجي. يتم استخدام التمثيل النموذجي لتوليد البيانات التي يتم استخدامها بعد ذلك لتدريب النموذج. في الممارسة العملية ، يتم تدريب النموذج بمزيج من البيانات التي تم إنشاؤها صناعياً والبيانات التي تم إنشاؤها بواسطة النموذج أثناء التمثيل. تتم خطوة التمثيل بأخذ موتر ثلاثي الأبعاد يتوافق مع عملية مصفوفة ولعب ألعاب n_actors عليها. يلعب كل ممثل لعبة إما على أساس قياسي أو على أساس بديل (يتم تطبيق تغيير الأساس باحتمالية معينة). ثم يتم جمع النتائج ويمكن استخدامها في خطوة التدريب مع البيانات التركيبية.
تعتمد خطوة التمثيل على نظام AlphaZero’s Monte Carlo Tree Search (MCTS)، والذي تم تعديله لدعم مساحات العمل الكبيرة. باختصار، قبل اختيار الإجراء، يتم استكشاف مسارات n_sims من مخرجات النموذج بحد أقصى للاستكشاف المستقبلي يبلغ 5 خطوات. يتم بعد ذلك تعديل الاحتمالات الناتجة عن النموذج مع مراعاة المسارات التي تم إنشاؤها. ثم يتم اختيار الإجراء ذو المسار (المسارات) المستقبلي الواعد لمواصلة اللعبة.
أثناء تدريب النموذج ، تكون المكافأة في الواقع مكافأة سلبية (عقوبة). تزداد قيمتها المطلقة مع كل خطوة إضافية مطلوبة لحل اللعبة. إذا أخذ النموذج m من الخطوات لحل لعبة TensorGame ، فإن المكافأة المرتبطة باللعبة هي r = -m. إذا لم يكن النموذج قادرًا على حل لعبة TensorGame بخطوات الحد الأقصى للترتيب ، فسيتم حساب المكافأة عن طريق تقدير رتبة الموتر المتبقي. يتم تقدير الرتبة على أنها مجموع رتب المصفوفات التي يتكون منها الموتر. التقدير هو الحد الأعلى على الرتبة الحقيقية للموتر.
عند ضبط النموذج، يجب أن تأخذ مكافأة العقوبة في الحالة الطرفية أيضًا في الاعتبار زمن الوصول للخوارزمية التي ينتجها النموذج. تصبح صيغة المكافأة rt'=rt+lectbt، حيث rt هو نظام المكافأة الموصوف سابقًا، وbt هو المكافأة المعيارية (غير الصفر فقط في الحالة النهائية)، و λ هو معامل محدد من قبل المستخدم.
تسريع (٪) من خوارزميات AlphaTensor المكتشفة والمصممة خصيصًا لوحدة معالجة الرسومات (GPU) و TPU ، المستخرجة من ورقة DeepMind. يتم قياس عمليات التسريع بالنسبة لمضاعفة المصفوفة القياسية (مثل cuBLAS لوحدة معالجة الرسومات) على نفس الجهاز ومقارنتها مع خوارزمية ستراسن سكوير. مصدر: العقل العميق.
لقد أطلقت مؤخرًا OpenAlphaTensor، أول تطبيق مفتوح المصدر لبرنامج AlphaTensor. في هذا القسم سوف أتناول عملية التنفيذ. كما ناقشنا سابقًا ، فإن بنية AlphaTensor واضحة إلى حد ما ، بناءً على محول قياسي بهندسة فك التشفير. المكونات الأكثر إثارة للاهتمام في AlphaTensor هي الطبقة الأولى في جزء المشفر والطريقة التي يتم بها أخذ عينات من الإجراءات.
لنبدأ بطبقة الترميز الأولى.
# x.size = (N, T, S, S, S)
# scalars.size = (N, s)
batch_size = x.shape[0]
S = x.shape[-1]
T = x.shape[1]
x1 = x.permute(0, 2, 3, 4, 1).reshape(batch_size, S, S, S * T)
x2 = x.permute(0, 4, 2, 3, 1).reshape(batch_size, S, S, S * T)
x3 = x.permute(0, 3, 4, 2, 1).reshape(batch_size, S, S, S * T)
input_list = [x1, x2, x3]
for i in range(3): temp = self.linears_1[i](scalars).reshape(batch_size, S, S, 1) input_list[i] = torch.cat([input_list[i], temp], dim=-1) input_list[i] = self.linears_2[i](input_list[i])
x1, x2, x3 = input_list
في المقتطف أعلاه ، نوضح كيف يتحلل موتر الإدخال إلى ثلاثة موترات ، والتي يتم استخدامها بعد ذلك كمدخلات استعلام ومفتاح وقيمة لطبقة المحولات.
- عبر أبعاد الموتر الثلاثة التي تمثل المصفوفات المسطحة (A ، B ، C) ، موتر الإدخال يتم تسويته على طول كل بُعد مع البعد الذي يمثل الإجراءات السابقة. بهذه الطريقة ، في كل نسخة مسطحة من موتر الإدخال ، يكون البعد المحدد عبارة عن تجميع لقيم T-1 الأخيرة والقيمة الفعلية ، لجميع قيم S للبعد المحدد ، حيث S = N ^ 2. من الناحية الفلسفية ، يبدو الأمر كما لو أننا ، لكل بُعد ، نركز على ما حدث في الإجراءات السابقة في هذا البعد.
- يتم تعيين الحجميات في ثلاث مساحات مختلفة من البعد S ^ 2 ، ثم إعادة تشكيلها ليتم ربطها مع الموترات التي تم الحصول عليها في النقطة السابقة. من الناحية المفاهيمية ، يتم تعيين الحجميات إلى مساحة التضمين ذات البعد S ^ 2 ، ثم يتم تقسيم المعلومات المضمنة في متجهات S وتجميعها معًا ، على غرار ما يحدث للنص عند ترميزه.
- يتم ربط الرموز المميزة العددية مع موتر الإدخال المعاد هيكلته ثم يتم إعطاؤها كمدخلات إلى طبقة خطية لتعيين الحجميات + معلومات تركيز تاريخ القناة في البعد الداخلي للنموذج.
يمكن تفسير هذه الخطوات الثلاث كطريقة لإعطاء النموذج معلومات حول الحجميات (كما في الخطوة الزمنية TensorGame) والتركيز على الإجراءات السابقة لكل قناة.
فيما يتعلق بالطريقة التي يتم بها إنتاج الإجراءات ، من المثير للاهتمام ملاحظة أن AlphaTensor يولد كناتج ثلاثي u ، v ، w ، والذي يهدف إلى تقليل مرتبة الموتر. النواقل الثلاثة لها حجم S ، وبما أنها متسلسلة ، يجب أن ينتج النموذج متجهًا بحجم 3 * S. يتم تدريب AlphaTensor باستخدام خوارزمية RL ، لذلك يجب التعبير عن جميع الإجراءات الممكنة من حيث الاحتمالات في مساحة معدودة ، أي أن النموذج ينتج احتمالية على الإجراءات المختلفة. هذا يعني أنه يجب تعيين كل متجه في الفضاء 3S لعمل مختلف. ينتج عن هذا مساحة عمل بالحجم | F | ^ (3S) ، حيث | F | هو عدد القيم المختلفة التي يمكن أن يأخذها عنصر u ، v ، w. عادةً ما تكون القيم مقيدة بـ (-2 ، -1 ، 0 ، 1 ، 2) ، مما ينتج عنه عدد العناصر المكونة من 5 عناصر.
هنا يأتي التحدي الرئيسي: لإنشاء احتمالات العمل لمنتج مصفوفة من مصفوفات بحجم 5 ، سنحتاج إلى ذاكرة 5 ^ 75 * 4 بايت ، مما يعني ~ 10 ^ 44 جيجا بايت من الذاكرة. من الواضح أننا لا نستطيع إدارة مساحة عمل كبيرة كهذه.
كيف نحل المشكلة؟ لتقليل أثر الذاكرة لاحتمالات الإجراء ، يمكننا تقسيم الثلاث توائم إلى أجزاء أصغر ، و "تحويلها إلى رموز مميزة" ، ومعالجة القطع على أنها رموز تم إنشاؤها في بنية المحولات ، أي يتم إعطاء الرموز المميزة كمدخلات إلى وحدة فك التشفير في الانحدار التلقائي طريق. في المثال أعلاه يمكننا تقسيم ثلاثة توائم إلى 15 قطعة ، مما يقلل من استهلاك الذاكرة إلى 15 * 5 ^ (75/15) * 4 ، أي 187.5 كيلوبايت.
def _eval_forward(self, e: torch.Tensor): bs = e.shape[0] future_g = ( torch.zeros((bs, self.n_samples, self.n_steps)).long().to(e.device) ) ps = torch.ones((bs, self.n_samples)).to(e.device) e = e.unsqueeze(1).repeat(1, self.n_samples, 1, 1) future_g = future_g.view(-1, self.n_steps) ps = ps.view(-1) e = e.view(-1, e.shape[-2], e.shape[-1]) for i in range(self.n_steps): o_s, z_s = self.core(future_g[:, : i + 1], e) future_g[:, i], p_i = sample_from_logits(o_s[:, i]) ps *= p_i future_g = future_g.view(bs, self.n_samples, self.n_steps) ps = ps.view(bs, self.n_samples) return ( future_g, ps, z_s[:, 0].view(bs, self.n_samples, *z_s.shape[2:]).mean(1), )
أعلاه نعرض مقتطف الشفرة لإنشاء الإجراء الكامل. في الكود ، يحتوي self.core على طبقة وحدة فك التشفير ويمثل tensor e ناتج طبقة التشفير. يمكن اعتبار الصفر بمثابة ملف يتم إنشاء الرموز المميزة في نماذج البرمجة اللغوية العصبية (NLP) وإجراءات n_steps التي تمثل الأجزاء n_steps بطريقة تدريجية.
يُرجع النموذج ثلاث كميات:
- الإجراءات التي تم إنشاؤها
- الاحتمال المرتبط بالعمل الكامل
- السجلات التي يتم إنتاجها لإنشاء الإجراء الأول (الجزء الأول) الذي سيتم استخدامه لحساب قيمة النموذج.
يجدر إنفاق بضع كلمات على معلمة n_samples. يتم استخدام المعلمة لخطوة التمثيل وتسمح للنموذج بإنشاء إصدارات مختلفة من الثلاثة توائم والتي سيتم استخدامها بعد ذلك لاستكشاف مساحة العمل في خوارزمية Monte Carlo Tree Search المستخدمة في عملية التمثيل. n_samples يتم أخذ عينات من الإجراءات المختلفة وفقًا للسياسة التي تم إنشاؤها بواسطة النموذج.
خطوة التمثيل
ربما يكون الجزء الأكثر صعوبة في الخوارزمية بأكملها هو خطوة التمثيل المستخدمة لحل لعبة TensorGame. لم يتم شرح الخوارزمية بعمق في ورقة AlphaTensor ، لأنها تستند إلى العديد من أوراق DeepMind السابقة التي تم الاستشهاد بها للتو وتم تقديمها على أنها معروفة. هنا ، سأعيد بناء كل الأجزاء المفقودة وأشرح تنفيذنا خطوة بخطوة.
يمكننا تنظيم خطوات التمثيل في ثلاثة مكونات مختلفة:
- بحث شجرة مونت كارلو
- محاكاة اللعبة
- تحسين حساب السياسة
دعونا نحللها واحدة تلو الأخرى.
مونت كارلو تري سيرش (MCTS)
Monte Carlo Tree Search (MCTS) هي تقنية ذكاء اصطناعي مستخدمة على نطاق واسع للعب الألعاب ، لا سيما في ألعاب الطاولة وألعاب الفيديو. تنشئ الخوارزمية شجرة لعبة تحاكي التحركات والنتائج المحتملة وتستخدم عينات عشوائية لتقييم المكافأة المتوقعة لكل حركة. ثم تختار الخوارزمية بشكل متكرر الحركة بأعلى مكافأة متوقعة وتحاكي النتائج حتى تصل إلى حالة طرفية أو حالة توقف محددة. تُستخدم المحاكاة لتقدير احتمالية الفوز لكل خطوة وتوجيه عملية اتخاذ القرار. لقد أثبت MCTS فعاليته في الألعاب المعقدة حيث يكون عدد الحركات والنتائج المحتملة كبيرًا ، وقد تم استخدامه في أنظمة AI الناجحة للعب الألعاب ، مثل AlphaGo.
في AlphaTensor يتم استخدام نسخة معدلة من MCTS الأصلي. على وجه الخصوص ، بدلاً من التحديد العشوائي للإجراء من مساحة الإجراء بالكامل ، يتم تحديد الإجراء من بين مجموعة فرعية تم إنشاؤها مباشرةً بواسطة النموذج (من خلال n_samples المقدمة من قبل). ثم يتم تطبيق تصحيح ترقية السياسة في خطوة حساب السياسة المحسّنة.
أثناء تنفيذنا ، قررنا الاحتفاظ بجميع المعلومات المتعلقة بشجرة مونت كارلو في قاموس يحتوي كمفتاح على نسخة التجزئة من حالة TensorGame وقيم المعلومات المرتبطة بالحالة نفسها. تبدأ كل خطوة من خطوات مونت كارلو من عقدة وتحاكي ألعاب n_sim المصغرة ، وتستكشف المستقبل بأفق مكون من 5 حركات. إذا تم استكشاف العقدة بالفعل في عمليات المحاكاة السابقة ، يتم تعديل n_sim مع مراعاة عدد الاستكشافات السابقة. لكل عقدة ، يتم تخزين عدد الزيارات في موتر N_s_a ، نظرًا لأن هذا الموتر يحتوي على عدد الزيارات لكل إجراء تابع للعقدة (من بين تلك التي تم أخذ عينات منها بواسطة النموذج).
def monte_carlo_tree_search( model: torch.nn.Module, state: torch.Tensor, n_sim: int, t_time: int, n_steps: int, game_tree: Dict, state_dict: Dict,
): """Runs the monte carlo tree search algorithm. Args: model (torch.nn.Module): The model to use for the simulation. state (torch.Tensor): The initial state. n_sim (int): The number of simulations to run. t_time (int): The current time step. n_steps (int): The maximum number of steps to simulate. game_tree (Dict): The game tree. state_dict (Dict): The dictionary containing the states. """ state_hash = to_hash(extract_present_state(state)) if state_hash in state_dict: with torch.no_grad(): N_s_a = state_dict[state_hash][3] n_sim -= int(N_s_a.sum()) n_sim = max(n_sim, 0) for _ in range(n_sim): simulate_game(model, state, t_time, n_steps, game_tree, state_dict) # return next state possible_states_dict, _, repetitions, N_s_a, q_values, _ = state_dict[ state_hash ] possible_states = _recompose_possible_states(possible_states_dict) next_state_idx = select_future_state( possible_states, q_values, N_s_a, repetitions, return_idx=True ) next_state = possible_states[next_state_idx] return next_state
يوضح الكود أعلاه تنفيذنا للخوارزمية. من أجل بساطة الكود ، يتم إجراء تصحيح السياسة في وظيفة simulate_game.
ألعاب المحاكاة
وظيفة simulate_game مسؤولة عن استكشاف الشجرة المكونة من عقد تمثل حالة معينة من لعبة TensorGame. كما يقوم بتشغيل النموذج كلما تمت مواجهة عقدة طرفية ويقوم بتخزين جميع معلومات العقدة في قاموس state_dict. دعونا نلقي نظرة عميقة على تنفيذه:
@torch.no_grad()
def simulate_game( model, state: torch.Tensor, t_time: int, max_steps: int, game_tree: Dict, states_dict: Dict, horizon: int = 5,
): """Simulates a game from a given state. Args: model: The model to use for the simulation. state (torch.Tensor): The initial state. t_time (int): The current time step. max_steps (int): The maximum number of steps to simulate. game_tree (Dict): The game tree. states_dict (Dict): The states dictionary. horizon (int): The horizon to use for the simulation. """ idx = t_time max_steps = min(max_steps, t_time + horizon) state_hash = to_hash(extract_present_state(state)) trajectory = [] # selection while state_hash in game_tree: ( possible_states_dict, old_idx_to_new_idx, repetition_map, N_s_a, q_values, actions, ) = states_dict[state_hash] possible_states = _recompose_possible_states(possible_states_dict) state_idx = select_future_state( possible_states, q_values, N_s_a, repetition_map, return_idx=True ) trajectory.append((state_hash, state_idx)) # state_hash, action_idx future_state = extract_present_state(possible_states[state_idx]) state = possible_states[state_idx] state_hash = to_hash(future_state) idx += 1 # expansion if idx = max_steps: trajectory.append((state_hash, None)) if not game_is_finished(extract_present_state(state)): state = state.to(model.device) scalars = get_scalars(state, idx).to(state.device) actions, probs, q_values = model(state, scalars) ( possible_states, cloned_idx_to_idx, repetitions, not_dupl_indexes, ) = extract_children_states_from_actions( state, actions, ) not_dupl_actions = actions[:, not_dupl_indexes].to("cpu") not_dupl_q_values = torch.zeros(not_dupl_actions.shape[:-1]).to( "cpu" ) N_s_a = torch.zeros_like(not_dupl_q_values).to("cpu") present_state = extract_present_state(state) states_dict[to_hash(present_state)] = ( _reduce_memory_consumption_before_storing(possible_states), cloned_idx_to_idx, repetitions, N_s_a, not_dupl_q_values, not_dupl_actions, ) game_tree[to_hash(present_state)] = [ to_hash(extract_present_state(fut_state)) for fut_state in possible_states ] leaf_q_value = q_values else: leaf_q_value = -int(torch.linalg.matrix_rank(state).sum()) # backup backward_pass(trajectory, states_dict, leaf_q_value=leaf_q_value)
تنقسم كل محاكاة إلى ثلاثة أجزاء:
- اختيار
- توسع
- دعم
في جزء التحديد ، يتم تشغيل المحاكاة على العقد الشجرية التي تم إنشاؤها بالفعل ، ويتم تحديد العقدة التالية باستخدام الوظيفة التالية:
def select_future_state( possible_states: List[torch.Tensor], q_values: torch.Tensor, N_s_a: torch.Tensor, repetitions: Dict[int, list], c_1: float = 1.25, c_2: float = 19652, return_idx: bool = False,
) -> torch.Tensor: """Select the future state maximizing the upper confidence bound."""
# q_values (1, K, 1) pi = torch.tensor( [ len(repetitions[i]) for i in range(len(possible_states)) if i in repetitions ] ).to(q_values.device) ucb = q_values.reshape(-1) + pi * torch.sqrt( torch.sum(N_s_a) / (1 + N_s_a) ) * (c_1 + torch.log((torch.sum(N_s_a) + c_2 + 1) / c_2)) if return_idx: return ucb.argmax() return possible_states[ucb.argmax()]
في الممارسة العملية ، الإجراء الذي يؤدي إلى تعظيم وظيفة ucb:
للحالة المحددة. تمثل Q هنا قيم Q التي تم إنشاؤها بواسطة النموذج و تمثل التوزيع العشوائي على الإجراءات التي تم أخذ عينات منها باستخدام سياسة النموذج. N (s ، a) يمثل عدد زيارات العقدة إلى الإجراء a من العقدة s.
بمجرد أن تصل مرحلة التحديد إلى عقدة طرفية ، إذا لم تصل المحاكاة إلى حالة نهائية (من حيث أقصى استكشاف ، أي الأفق المستقبلي أو نهاية اللعبة) ، يتم استخدام النموذج لاختيار n_samples للعقد البديلة (ستكون ورقة العقد في التكرار المتتالي). وهذا ما يسمى بمرحلة التوسع ، حيث يتم إضافة عقد جديدة إلى الشجرة. بعد ذلك ، لم يتم استكشاف أي عقدة أخرى في المحاكاة الحالية ، ولكن يتم إرسال الورقة q_value إلى خطوة المحاكاة التالية: النسخ الاحتياطي.
النسخ الاحتياطي هو المرحلة الأخيرة من كل محاكاة. أثناء النسخ الاحتياطي ، إذا كانت العقدة الطرفية حالة طرفية ، يتم حساب المكافأة النهائية ؛ وإلا يتم استخدام قيمة ورقة q كمكافأة تقديرية. ثم يتم نشر المكافأة مرة أخرى على مسار المحاكاة لتحديث كل من الحالة q_values وتحديث عداد الزيارة N (s ، a). في المقتطف أدناه ، نعرض رمز نشر المكافأة.
def backward_pass(trajectory, states_dict, leaf_q_value: torch.Tensor): """Backward pass of the montecarlo algorithm"""
reward = 0 for idx, (state, action_idx) in enumerate(reversed(trajectory)): if action_idx is None: # leaf node reward += leaf_q_value else: ( _, old_idx_to_new_idx, _, N_s_a, q_values, _, ) = states_dict[state] if isinstance(reward, torch.Tensor): reward = reward.to(q_values.device) action_idx = int(action_idx) if action_idx in old_idx_to_new_idx: not_dupl_index = old_idx_to_new_idx[int(action_idx)] else: not_dupl_index = action_idx reward -= 1 q_values[:, not_dupl_index] = ( N_s_a[:, not_dupl_index] * q_values[:, not_dupl_index] + reward ) / (N_s_a[:, not_dupl_index] + 1) N_s_a[:, not_dupl_index] += 1
تحسين نهج الحساب
بمجرد تشغيل جميع عمليات المحاكاة وتقديم MCTS لقطة مثيرة للاهتمام للمستقبل القريب ، فقد حان الوقت لتحديث السياسة المرتبطة بالعقد المتوقعة وإعادتها ، بحيث يمكن استخدامها أثناء التدريب. السياسة المحسنة ، باتباع الطريقة الموضحة في هوبرت وآخرون، يستخدم لإدارة مساحات العمل الكبيرة. في الواقع ، بالنسبة لمساحة البحث الصغيرة ، من الممكن خلال MCTS لأخذ عينات من إجراء ما بشكل عشوائي من مساحة العمل وتقييم تأثيره. قد يؤدي اتباع نهج مماثل في مساحة عمل أكبر بكثير إلى تباعد جميع المسارات في مسارات مختلفة وسيحتاج إلى كمية لا حصر لها من المسارات للحصول على إحصائيات ذات مغزى ثم تحديث السياسة. نظرًا لأننا هنا نستخدم نموذج MCTS لتجنب التشتت ، على سبيل المثال ، يتم أخذ عينات من إجراءات n_samples وفقًا لسياسة النموذج ثم تختار MCTS أحد الإجراءات التي تم أخذ عينات منها أثناء استكشاف الشجرة ، فنحن بحاجة إلى مراعاة تصحيح العينة عند الحوسبة السياسة النهائية المحدثة التي سيتم استخدامها أثناء تدريب النموذج.
في الممارسة العملية ، يتم حساب السياسة المحسنة كـ
أين
def compute_improved_policy( state_dict: Dict, states: List[str], model_n_steps: int, model_n_logits: int, N_bar: int,
): """Compute the improved policy given the state_dict, the list of states. The improved policy is computed as (N_s_a / N_s_a.sum())^(1/tau) where tau is (log(N_s_a.sum()) / log(N_bar)) if N_s_a.sum() > N_bar else 1. """ policies = torch.zeros(len(states), model_n_steps, model_n_logits) N_bar = torch.tensor(N_bar) for idx, state in enumerate(states): N_s_a = state_dict[state][3] actions = state_dict[state][5] if N_s_a.sum() > N_bar: tau = (torch.log(N_s_a.sum()) / torch.log(N_bar)).item() else: tau = 1 N_s_a = N_s_a ** (1 / tau) improved_policy = N_s_a / N_s_a.sum() for sample_id in range(actions.shape[1]): action_ids = actions[0, sample_id] for step_id, action_id in enumerate(action_ids): policies[idx, step_id, action_id] += improved_policy[ 0, sample_id ] return policies
لاحظ أنه في تنفيذنا بعد حساب السياسة من موتر N_s_a ، يتعين علينا إعادة تعيينها إلى موتر الإجراء الأصلي. في الواقع ، تنظر N_s_a فقط في الإجراءات التي تم أخذ عينات منها بواسطة النموذج ، بينما يجب أن تحتوي السياسة النهائية على احتمالات أيضًا للإجراءات التي لم يتم استكشافها.
الاختلافات فيما يتعلق بخوارزمية تدريب ChatGPT
AlphaTensor هو أحدث عضو في عائلة AlphaGo/AlphaZero لطرق الذكاء الاصطناعي من DeepMind. تعتمد هذه الأساليب على خوارزمية البحث عن شجرة مونت كارلو (MCTS)، والتي تم تحسينها وتحسينها بواسطة DeepMind لمعالجة المهام المعقدة بشكل متزايد. تم تدريب نظام آخر للذكاء الاصطناعي، وهو ChatGPT الخاص بشركة OpenAI، والذي أثار ضجة كبيرة بسبب أدائه الرائع، باستخدام نهج مختلف، يسمى التعلم المعزز بالملاحظات البشرية (RLHF).
RLHF هي تقنية ضبط دقيق تُستخدم لضبط نماذج اللغة لاتباع مجموعة من التعليمات المكتوبة. يستخدم تفضيلات الإنسان كإشارة مكافأة لضبط النموذج ، وبالتالي مواءمة سلوك نموذج اللغة مع التفضيلات المعلنة لمجموعة معينة من الأشخاص ، بدلاً من فكرة أوسع عن "القيم الإنسانية".
في المقابل ، MCTS عبارة عن خوارزمية بحث قائمة على الشجرة تستخدم لتحديد التحركات المثلى في الألعاب. إنه يحاكي الحركات المحتملة ويحدّث قيم كل حركة بناءً على نتائجها ، ويوجه اختيار أفضل حركة.
يجمع RLHF البيانات من العروض التوضيحية التي كتبها الإنسان والمقارنات التي تحمل علامات بشرية بين نماذج الذكاء الاصطناعي ، ويدرب نموذجًا للمكافأة للتنبؤ بتفضيلات مجموعة معينة من الأشخاص. ثم يتم استخدام نموذج المكافأة لضبط نماذج الذكاء الاصطناعي. من ناحية أخرى ، يستخدم MCTS عمليات المحاكاة والتقييمات لتحديد القرار الأفضل.
على الرغم من أنهما نهجان مختلفان ، إلا أن RLHF و MCTS لديهما أيضًا أوجه تشابه. تستخدم كل من تقنيات الذكاء الاصطناعي أساليب صنع القرار وحل المشكلات ، وكلاهما يستخدم نهج التجربة والخطأ لاستكشاف الخيارات المختلفة واتخاذ القرارات بناءً على المعلومات المتاحة. كلاهما أيضًا عمليات متكررة تتحسن بمرور الوقت حيث يتم جمع المزيد من المعلومات والخبرات.
الاختيار بين RLHF و MCTS يعتمد على المهمة في متناول اليد. يعتبر RLHF مثاليًا عندما لا يكون هناك مقياس واضح لتقييم أداء النموذج ، بينما أثبت MCTS فعاليته في المهام الشبيهة باللعبة حيث تمنح المعرفة واستكشاف المستقبل للنموذج ميزة كبيرة.
تحسين التعليمات البرمجية لتدريب AlphaTensor
يتطلب تنفيذ خوارزمية تدريب AlphaTensor إيجاد حل وسط مثالي بين سرعة التدريب واستهلاك الذاكرة. كما هو موضح في قسم النموذج ، فإن مجرد التفكير في رمز الإجراء يمكن أن يوفر الكثير من الذاكرة ، ولكن تقليل مساحة العمل العدوانية بشكل مفرط يمكن أن يؤدي إلى انخفاض في الدقة وأداء أبطأ. يحدث هذا الأخير لأن جميع الرموز يتم إنشاؤها بالتتابع بطريقة الانحدار التلقائي بواسطة وحدة فك ترميز النموذج. لذلك ، ينمو وقت الاستدلال خطيًا مع عدد الرموز لكل إجراء بمجرد أن يصبح softmax في مساحة العمل ليس عنق الزجاجة بعد الآن.
عند إعداد تدريب AlphaTensor ، تم العثور على الصعوبات الرئيسية في التعامل مع عملية التمثيل. إذا لم يتم تخزين الموترات بالتنسيق الصحيح ، يمكن أن يتسبب MCTS بسهولة في زيادة استخدام الذاكرة غير المنضبط. من ناحية أخرى ، إذا تم تقليل عدد الموترات المخزنة أثناء كل محاكاة بشكل كبير ، يمكن أن يقضي MCTS قدرًا غير محدود من الوقت في إعادة حساب الحالات المطلوبة.
لنأخذ مثالاً على خطوة محاكاة اللعبة، حيث يتم استكشاف اللعبة من خلال النظر في السيناريوهات المستقبلية المحتملة. بالنسبة لكل حالة، إذا لم نحفظ الإجراءات التي أنشأها النموذج وقررنا حفظ فقط البذور العشوائية المستخدمة لأخذ عينات من الإجراءات من السياسة، ففي كل مرة نستكشف فيها عقدة شجرة، سيتعين علينا إعادة حساب السياسة و ثم عينة من الإجراءات. من الواضح أننا قررنا تخزين الإجراءات التي تم أخذ عينات منها لتوفير الوقت ولتجنب الاضطرار إلى إدارة مشاركة النموذج بين العمليات المختلفة في حالة موازاة استكشاف MCTS. ومع ذلك، فإن مجرد حفظ الإجراءات لم يكن كافيًا للحصول على خطوة تمثيلية فعالة بما فيه الكفاية. في الواقع، فإن الوقت اللازم لتحويل إجراءات n_steps إلى الإجراءات الثلاثية (u، v، w)، وتقليل حالة موتر اللعبة وإنشاء موترات ثلاثية الأبعاد جديدة من إجراءات n_samples، سيكون بسهولة عنق الزجاجة للتدريب بأكمله. ثانيًا، لم نرغب في تخزين جميع الحالات المستقبلية المحتملة لكل إجراء تم أخذ عينات منه، لأن ذلك سيكون له تأثير كبير على الذاكرة التي تستخدمها الخوارزمية. لنفترض أننا قمنا بتعيين n_samples=3 وn=32 وN=7، ودعونا نتذكر أن N هو حجم منتج المصفوفة المربعة الذي نريد تقليله وأن n هو عدد الإجراءات السابقة التي يتذكرها النموذج. في هذه الحالة، سيكون لكل موتر حالة الشكل (5، 8، 25، 25)، والذي يؤدي ضربه في 25 إلى 3282525254 بايت لكل عقدة في الرسم البياني. الآن ، بالنظر إلى أن كل محاكاة في مرحلة التوسع تولد عقدة جديدة (و n_sim = 200) ، سيكون لدينا استهلاك نهائي للذاكرة يبلغ 200328252525 * 4 = 3.2 جيجابايت لأول عقدة MCTS وحدها. في أسوأ السيناريوهات ، أثناء استكشاف عمل عقد max_rank (حيث max_rank = 150) ، سيؤدي ذلك إلى استهلاك إجمالي للذاكرة يبلغ 150 * 3.2 جيجابايت = 480 جيجابايت في ذاكرة RAM (أو ذاكرة GPU إذا تم تخزين جميع الموترات على وحدة معالجة الرسومات) . أجرينا التدريب على محطة العمل الخاصة بنا باستخدام 128 جيجابايت من ذاكرة الوصول العشوائي و 48 جيجابايت من ذاكرة وحدة معالجة الرسومات ، لذلك كان علينا تقليل استهلاك الذاكرة.
نظرًا لأننا لم نرغب في زيادة وقت التنفيذ، فقد اعتمدنا تحسينًا يستغل التكرار في موترات الحالة المنتجة. في الواقع، تشترك الموترات في إجراءات n-1 السابقة، والتي يمكن بعد ذلك تخزينها مرة واحدة وعدم تكرارها لكل موتر مخزن. وينتج عن ذلك انخفاض في الذاكرة بنسبة 2/7~28%، مما يعني أنه في أسوأ الحالات يمكن تخزين 137 جيجابايت. في هذه المرحلة، من خلال تقليم الجزء غير المستخدم من الشجرة (مثل المسارات غير المحددة) وتخزين الموترات في ذاكرة وحدة المعالجة المركزية، تمكنا من تجنب أي خطأ في الذاكرة أثناء التدريب.
مع كون OpenAlphaTensor الآن مفتوح المصدر ، تم فتح العديد من السبل المثيرة لمزيد من التطوير.
التقدم الطبيعي هو ضبط OpenAlphaTensor على الأجهزة المستهدفة. من المتوقع أن يؤدي هذا إلى أداء حسابي تنافسي للغاية. سأقوم بنشر المزيد حول أداء OpenAlphaTensor على الأجهزة المختلفة GitHub جيثب:. في وقت كتابة هذا المقال ، كان OpenAlphaTensor يخضع للتدريب.
هناك تقدم مهم آخر يتمثل في دعم الترجمة عن بُعد ، مما يسمح للمستخدمين ببناء خوارزميات مُحسَّنة للأجهزة المتطورة. يمكن تحقيق ذلك من خلال تخزين نموذج OpenAlphaTensor على الخادم ، بينما يتم تقييم خوارزمية مضاعفة المصفوفة على أجهزة مختلفة.
قد يكون من المهم أيضًا توسيع نطاق الدعم للمجمعين المختلفين لحساب تصحيح المكافأة المستند إلى زمن الوصول. يمكن أن يؤدي المجمّعون المختلفون إلى خوارزميات محسّنة مختلفة على جهاز معين. على سبيل المثال ، أظهرت ورقة DeepMind نتائج واعدة باستخدام JAX ومجمع XLA على وحدات معالجة الرسومات TPU و Nvidia. سيكون من المثير للاهتمام تقييم ذلك باستخدام NCCL على Nvidia أو LLVM على وحدات المعالجة المركزية.
أخيرًا ، لا يزال توسيع النموذج وخوارزمية التدريب لدعم أحجام مصفوفة أكبر يمثل تحديًا كبيرًا مفتوحًا. حاليًا ، يدعم OpenAlphaTensor الحد الأقصى لحجم المصفوفة 5 ، ولكن يمكن تطبيقه عن طريق تقسيم مضاعفات المصفوفة الكبيرة إلى مجموعات من MMs الصغيرة بحجم أصغر من 5. هذا النهج هو دون المستوى الأمثل ، ويتم إجراء التخفيض مباشرة على الموتر الكبير المقابل لـ يمكن أن يؤدي MM الكامل نظريًا إلى نتائج أفضل.
دييغو فيوري هو المدير التنفيذي للتكنولوجيا في شركة Nebuly AI، وهي شركة ملتزمة بجعل تحسين الذكاء الاصطناعي جزءًا من مجموعة أدوات كل مطور.
- محتوى مدعوم من تحسين محركات البحث وتوزيع العلاقات العامة. تضخيم اليوم.
- بلاتوبلوكشين. Web3 Metaverse Intelligence. تضخيم المعرفة. الوصول هنا.
- المصدر https://www.kdnuggets.com/2023/03/first-open-source-implementation-deepmind-alphatensor.html?utm_source=rss&utm_medium=rss&utm_campaign=first-open-source-implementation-of-deepminds-alphatensor
- :يكون
- ] [ص
- $ UP
- 1
- 3d
- 8
- a
- ماهرون
- من نحن
- فوق
- مطلق
- تسريع
- وفقا
- وفقا لذلك
- حسابي
- دقة
- التأهيل
- تحقق
- اكشن
- الإجراءات
- في الواقع
- وأضاف
- إضافي
- تعديل
- اعتمد
- تقدم
- مميزات
- بعد
- الوكيل
- تجميع
- العدواني
- AI
- أنظمة الذكاء الاصطناعي
- وتهدف
- خوارزمية
- خوارزميات
- الكل
- السماح
- يسمح
- وحده
- سابقا
- البديل
- من بين
- كمية
- تحليل
- و
- آخر
- تطبيقي
- نهج
- اقتراب
- هندسة معمارية
- هي
- البند
- مصطنع
- الذكاء الاصطناعي
- AS
- تعيين
- أسوشيتد
- At
- الآلي
- متاح
- تجنب
- الى الخلف
- دعم
- على أساس
- في الأساس
- أساس
- BE
- لان
- يصبح
- قبل
- يجري
- أقل من
- مؤشر
- أفضل
- أفضل
- ما بين
- Beyond
- مجلس
- العاب طاولة
- ملزم
- أوسع
- BT
- نساعدك في بناء
- بنيت
- by
- تسمى
- CAN
- لا تستطيع
- حقيبة
- سبب
- تسبب
- معين
- تحدى
- تحدي
- تغيير
- قناة
- شات جي بي تي
- طفل
- خيار
- اختيار
- اختيار
- استشهد
- واضح
- بوضوح
- الكود
- يجمع
- دمج
- ملتزم
- مشترك
- حول الشركة
- مقارنة
- تنافسي
- مجمع
- تعقيد
- مكونات
- تتألف
- حل وسط
- حساب
- القوة الحسابية
- إحصاء
- الحوسبة
- المفاهيم
- من الناحية النظرية
- حالة
- الثقة
- نظر
- نظرت
- النظر
- وتعتبر
- استهلاك
- يحتوي
- استمر
- تباين
- تحويلها
- جوهر
- المقابلة
- يتوافق
- استطاع
- Counter
- وحدة المعالجة المركزية:
- يخلق
- خلق
- المعايير
- CTO
- حالياًّ
- حاليا
- البيانات
- تعامل
- تقرر
- قررت
- القرار
- اتخاذ القرار
- القرارات
- عميق
- التعلم العميق
- العقل العميق
- يعتمد
- وصف
- حدد
- المطور
- التطوير التجاري
- جهاز
- الأجهزة
- DICT
- مختلف
- الصعوبات
- بعد
- الأبعاد
- مباشرة
- اكتشف
- اكتشاف
- ناقش
- توزيع
- منقسم
- إلى أسفل
- قطرة
- أثناء
- e
- كل
- في وقت سابق
- بسهولة
- حافة
- الطُرق الفعّالة
- فعال
- إما
- العنصر
- عناصر
- جزءا لا يتجزأ من
- ينتهي
- تعزيز
- ضخم
- كاف
- دخول
- خطأ
- تقدير
- مقدر
- الأثير (ETH)
- تقييم
- تقييم
- تقييم
- التقييمات
- حتى
- كل
- مثال
- أمثلة
- المثيره
- توسع
- متوقع
- الخبره في مجال الغطس
- شرح
- شرح
- مآثر
- استكشاف
- اكتشف
- استكشاف
- استكشاف
- أعربت
- مد
- إطالة
- جدا
- بإنصاف
- للعائلات
- أسرع
- ردود الفعل
- قليل
- الشكل
- نهائي
- العثور على
- الاسم الأول
- تطفو
- تركز
- اتباع
- متابعيك
- البصمة
- في حالة
- النموذج المرفق
- شكل
- معادلة
- وجدت
- تبدأ من
- بالإضافة إلى
- وظيفة
- أساسي
- إضافي
- مزيد من التطوير
- مستقبل
- لعبة
- ألعاب
- توليد
- ولدت
- يولد
- توليد
- دولار فقط واحصل على خصم XNUMX% على جميع
- الحصول على
- منح
- معطى
- إعطاء
- هدف
- يذهب
- خير
- وحدة معالجة الرسوميات:
- وحدات معالجة الرسومات
- رسم بياني
- عظيم
- تجمع
- مجموعات
- ينمو
- التسويق
- توجيه
- يد
- معالجة
- حدث
- يحدث
- أجهزة التبخير
- جهاز
- الأجهزة المادية
- يملك
- وجود
- هنا
- أعلى
- الأفق
- كيفية
- كيفية
- لكن
- HTTPS
- ضخم
- الانسان
- i
- سوف
- المثالي
- IDX
- صورة
- التأثير
- تنفيذ
- التنفيذ
- أهمية
- تحسن
- تحسن
- in
- القيمة الاسمية
- الزيادات
- على نحو متزايد
- مستقل
- مؤشر
- معلومات
- في البداية
- إدخال
- بدلًا من ذلك
- تعليمات
- رؤيتنا
- وكتابة مواضيع مثيرة للاهتمام
- داخلي
- أدخلت
- حدس
- IT
- تكرير
- انها
- نفسها
- JPG
- KD nuggets
- احتفظ
- القفل
- المعرفة
- معروف
- لغة
- كبير
- أكبر
- اسم العائلة
- كمون
- آخر
- طبقة
- طبقات
- قيادة
- تعلم
- تعلم
- لينكدين:
- قائمة
- بحث
- أبحث
- الكثير
- صنع
- الرئيسية
- رائد
- جعل
- القيام ب
- إدارة
- إدارة
- كثير
- رسم خريطة
- رسم الخرائط
- مصفوفة
- أمر
- أقصى
- معنى
- ذات مغزى
- يعني
- عضو
- مكبر الصوت : يدعم، مع دعم ميكروفون مدمج لمنع الضوضاء
- طريقة
- طرق
- متري
- مفقود
- مزيج
- نموذج
- عارضات ازياء
- تم التعديل
- وحدة
- الأكثر من ذلك
- أكثر فعالية
- علاوة على ذلك
- أكثر
- خطوة
- التحركات
- مضاعف
- طبيعي
- الطبيعة
- قرب
- ضروري
- حاجة
- بحاجة
- سلبي
- الشبكات
- عصبي
- الشبكات العصبية
- جديد
- التالي
- البرمجة اللغوية العصبية
- العقدة
- العقد
- غير الخبراء
- Notion
- عدد
- NVIDIA
- تم الحصول عليها
- of
- عروض
- on
- ONE
- جاكيت
- المصدر المفتوح
- OpenAI
- عملية
- عمليات
- الأمثل
- التحسين
- الأمثل
- الأمثل
- مزيد من الخيارات
- أصلي
- أخرى
- وإلا
- الناتج
- الكلي
- ورق
- أوراق
- المعلمة
- جزء
- خاص
- خاصة
- أجزاء
- مجتمع
- أداء
- أداء
- مرحلة جديدة
- قطعة
- أفلاطون
- الذكاء افلاطون البيانات
- أفلاطون داتا
- بلايستشن
- لاعب
- لعب
- البوينت
- سياسات الخصوصية والبيع
- سياسة
- ان يرتفع المركز
- ممكن
- محتمل
- قوة
- عملية
- ممارسة
- تنبأ
- وتوقع
- التفضيلات
- قدم
- سابق
- الاحتمالات
- المحتمل
- المشكلة
- عملية المعالجة
- العمليات
- إنتاج
- أنتج
- منتج
- تقدم
- تقدمية
- واعد
- المقترح
- بصورة مبرهنة
- ثبت
- نشر
- نشرت
- رامات
- عشوائية
- الرتب
- بدلا
- التي تم الوصول إليها
- يصل
- مؤخرا
- تخفيض
- عقار مخفض
- تقليص
- مكرر
- تعزيز التعلم
- صدر
- المتبقية
- بقايا
- لافت للنظر
- تذكر
- عن بعد
- متكرر
- تمثل
- يمثل
- مطلوب
- يتطلب
- مسؤول
- مقيد
- نتيجة
- مما أدى
- النتائج
- عائد أعلى
- عائدات
- ثور
- مكافأة
- صف
- rt
- يجري
- s
- نفسه
- حفظ
- إنقاذ
- سيناريو
- سيناريوهات
- مخطط
- بحث
- الثاني
- القسم
- بذرة
- مختار
- اختيار
- اختيار
- SELF
- طقم
- ضبط
- عدة
- الشكل
- مشاركة
- قصير
- ينبغي
- إظهار
- أظهرت
- يظهر
- سيجنل
- هام
- بشكل ملحوظ
- مماثل
- التشابه
- الاشارات
- بساطة
- ببساطة
- محاكاة
- منذ
- حالة
- حجم
- الأحجام
- صغير
- الأصغر
- لقطة
- So
- حل
- حل
- حل
- بعض
- مصدر
- الفضاء
- المساحات
- محدد
- على وجه التحديد
- محدد
- سرعة
- أنفق
- الإنفاق
- انقسم
- مربع
- مرصوصة
- المسرح
- معيار
- بداية
- يبدأ
- الولايه او المحافظه
- دولة من بين الفن
- ذكر
- المحافظة
- إحصائيات
- خطوة
- خطوات
- وقف
- متجر
- تخزين
- فروعنا
- صريح
- ناجح
- هذه
- الدعم
- الدعم
- اصطناعي
- البيانات الاصطناعية
- صناعيا
- نظام
- أنظمة
- تناسب
- أخذ
- يأخذ
- مع الأخذ
- الهدف
- مهمة
- المهام
- تقنيات
- محطة
- سياسة الحجب وتقييد الوصول
- أن
- •
- المستقبل
- الرسم البياني
- المعلومات
- الدولة
- من مشاركة
- منهم
- وبالتالي
- وبالتالي
- تشبه
- الثالث
- ثلاثة
- ثلاثي الأبعاد
- عبر
- الوقت
- استهلاك الوقت
- إلى
- سويا
- رمز
- Tokenization
- المرمز
- الرموز
- جدا
- أدوات
- تيشرت
- شعلة
- الإجمالي
- تقليدي
- قطار
- متدرب
- قادة الإيمان
- القطارات
- مسار
- تحول
- علاج
- صحيح
- فهم
- الكون
- غير المستخدمة
- تحديث
- تحديث
- آخر التحديثات
- تحديث
- ترقية
- us
- الأستعمال
- تستخدم
- المستخدمين
- عادة
- قيمنا
- القيم
- مختلف
- الإصدار
- فيديو
- ألعاب الفيديو
- قم بزيارتنا
- الزيارات
- W
- طريق..
- ابحث عن
- التي
- في حين
- على نحو واسع
- ويكيبيديا
- سوف
- فوز
- مع
- كلمات
- محطة العمل
- قيمة
- سوف
- جاري الكتابة
- مكتوب
- X
- زفيرنت
- صفر