لكي يكون الذكاء الاصطناعي على الشبكات العصبية عالميًا ، تحتاج إلى فهم ما لا تكفي الشبكة العصبية لتعدد الاستخدامات. للقيام بذلك ، حاول تنفيذ التنفيذ الكامل لأي برامج على الشبكة العصبية.سيتطلب هذا انتقالات مشروطة وشروط وقراءة وكتابة هياكل البيانات. بعد ذلك ، سيكون من الممكن إنشاء شبكات عصبية موجهة للكائنات. يجب تقسيم المقالة إلى أجزاء.
فكر في الأنواع المختلفة من العناقيد العصبية. تم بالفعل الإشارة إلى العناقيد الحسية والمستجيبات.وإذا ، ويعرف أيضا باسم و - يتم تنشيط فقط إذا كانت كافة الشروط تنشط - وهذا هو، وجاءت إشارة على كل نقاط الاشتباك العصبي.أو- يتم تشغيله إذا تم تنشيط ميزة واحدة على الأقل. إذا كانت هذه المجموعة جزءًا من سلسلة ، فإن السلسلة الخلفية تكون إلزامية - فهي مرتبطة بالحالة And. بمعنى آخر ، لا يتم تنشيط الكتلة إلا إذا كانت الكتلة السابقة للسلسلة نشطة وأيًا من شروطها الخاصة عملت أيضًا. قياسا على لغات البرمجة ، يعمل الاتصال المتسلسل كمؤشر تعليمي في المعالج المركزي - وهي إشارة "أسمح بتنفيذ الشروط المتبقية للمجموعة". دعونا نلقي نظرة على بعض التعليمات البرمجية.class NC؛ // neurocluster
رابط الفصل {
عام:
NC & _from ؛
NC & _to ؛
...
} ؛
Class LinksO ؛ / * الحاوية للارتباطات الصادرة. مريحة للقيام على أساس التعزيز :: التدخل
- لحفظ الذاكرة وتحسين الأداء * /
فئة LinksI؛ // تستند أيضًا إلى التعزيز :: تدخلي
هيكلة NeuronA1 {
qreal _activation = 0 ؛
static const qreal _threashold = 1;// , .
bool activated()const {
return _activation >= _threshold;
}
};
struct NeuronAT {
qreal _activation = 0;
qreal _threashold = 1;//
bool activated()const {
return _activation >= _threshold;
}
};
class NC {
public:
LinksO _next;
LinksO _down;
LinksI _prev;
LinksI _up;
NeuronA1 _nrnSumPrev;
NeuronAT _nrnSumFromBottom;
...
}
// , _nrnSumPrev:
void NC::sendActivationToNext() {
for(Link& link: _next) {
link._to._nrnSumPrev._activation += 1;
}
}
// - and/or/not :
bool NC::allowedToActivateByPrevChain()const {
if(_prev.isEmpty())// , , .
return true;// , .
return _nrnSumPrev.activated();
// , .
// 0 .
// - , - , .
}
لاحظ أنه في _prev لا يوجد عادةً رابط أو رابط واحد. هذا يجعل شجرة البادئة خارج سلاسل الذاكرة: في _next يمكن أن يكون هناك العديد من الروابط كما تريد ، وفي _prev لا يمكن أن يكون هناك أكثر من واحد. فقط في أشجار البادئة العادية ، يوجد حرف واحد فقط في كل موضع ، وفي الشبكة العصبية يوجد عدد عشوائي من الأحرف. وبفضل هذا ، فإن تخزين قاموس Zalizniak لن يستهلك الكثير من الذاكرة.الآن ، من أجل الراحة ، سنمضي قدمًا وحتى لا نضطر لاحقًا إلى إعادة كتابة مثل هذا الرمز ، سنتخلص فورًا من الخلايا العصبية والتفعيلات.إذا احتفظت المجموعات بطريقة ما بسجل التنشيط ، ولم ترسل تنشيطها إلى الآخرين ، فيمكننا إعادة كتابة هذه الوظيفة على النحو التالي:قيمة منطقية NC :: allowToActivateByPrevChain () const {
عن (Link & link: _prev) {
NC & nc = link._from ؛
if (! nc.wasActivate ()) // تحقق من الدورة الأخيرة
إرجاع كاذبة
}
return true;
}
:
1) , — , . .
2) : , , — . - — .
3) : , , .
للقيام بذلك ، أضف معلمة متغيرة إلى الاتصال - وقت التأخير:رابط الفصل {
...
int _delay = 1 ؛
} ؛
ثم يتم تعديل الوظيفة على النحو التالي:قيمة منطقية NC :: allowToActivateByPrevChain () const {
عن (Link & link: _prev) {
NC & nc = link._from ؛
if (! nc.wasActivate (link._delay)) // check Nycles back
إرجاع كاذبة
}}
العودة صحيحة ؛
}}
4) نتخلص من التلعثم "العشب في الفناء ، الحطب على العشب ، ...": الإشارات من الدورات الجديدة لن تحل محل القديمة ، والعكس صحيح.5) لا يوجد خطر من أن يتلاشى التنشيط (في حد ذاته ، من وقت لآخر) عندما لا يزال مطلوبًا. يمكنك التحقق من الظروف في وقت بعيد.6) أخيرًا ، لا يمكنك كتابة عشرات المقالات حول موضوع "إدارة الشبكة العصبية من خلال إدارة النشاط الإيقاعي" و "طرق التصور لإشارات التحكم في تخطيط كهربية الدماغ" و "DSL خاص لإدارة تخطيط الدماغ الكهربائي" والتخلص من كل هذا:
الآن حول تنفيذ ذاكرة التخزين المؤقت للتنشيط:1) تعطينا ENS ثلاثة خيارات لوضع ذاكرة التخزين المؤقت للتنشيط: التنشيط الحالي في الكتلة العصبية نفسها في الخلايا العصبية ، والتنشيط (في شكل موجات تحديد؟) في الحصين (هنا يتم تخزينه لفترة أطول من الكتلة نفسها) ، والذاكرة طويلة المدى. اتضح مخبأ من ثلاثة مستويات ، تماما مثل المعالجات الحديثة.2) في نموذج البرنامج ، توجد ذاكرة التخزين المؤقت للتنشيط للوهلة الأولى بشكل ملائم في كل مجموعة.3) بشكل أكثر تحديدًا ، لدينا بالفعل هذا وذاك: الحصين في هذا النموذج يخلق سلسلة ذاكرة ، والروابط إلى جميع المجموعات التي كانت نشطة ولم يتم تثبيطها في تلك اللحظة من الوقت يتم إدخالها في سلسلة الذاكرة. ويتم تخزين كل اتصال في مجموعة واحدة على أنها صادرة وفي أخرى على أنها واردة. هذا يدل على أن "ذاكرة التخزين المؤقت" ليست في الواقع ذاكرة تخزين مؤقت ، ولكنها حتى ذاكرة طويلة المدى. فقط الشبكات العصبية البيولوجية لا يمكنها استخراج المعلومات من الذاكرة طويلة المدى مباشرة ، فقط من خلال التنشيط ، ويمكن لـ ANNs. هذه هي ميزة الذكاء الاصطناعي على ENS ، وهي سخيفة لا تستخدم - لماذا تهتم بالتنشيط إذا كنا بحاجة إلى معلومات دلالية؟لذلك ، للتحقق مما إذا كانت الكتلة نشطة بخطوات N مرة أخرى ، يمكنك استخدام الشفرة الكاذبة التالية (غير المحسنة):NC * Brain :: _ hippo؛ // الكتلة الحالية التي تتم إضافة الأحداث الجارية إليها
NC* NC::prevNC(int stepsBack)const {
// _prev
// link._delay, .
// , ()
}
bool NC::wasActivated(int stepsAgo)const {
NC* timeStamp = _brain._hippo->prevNC(stepsAgo);
if(!timeStamp)//
return false;
return linkExists(timeStamp, this);
// , boost intrusive ,
// , node 2 3
}
إذا كان من الضروري ، بدلاً من التنشيط الذي تم نسيانه ، الحفاظ ليس فقط على وجود الاتصال ، ولكن أيضًا على قوة التنشيط ، عندئذٍ يمكن إضافة الحقل المقابل إلى الاتصال نفسه. يمكن استخدام حقول أخرى لهذا الغرض ، دون إدخال حقول إضافية: على سبيل المثال ، "الأهمية" ، التي يعتمد عليها عمر الاتصال.ولكن ماذا عن المجموعات التي لا يصل فيها التنشيط إلى العتبة ، ولكنه لا يزال مفيدًا ، على سبيل المثال ، للاعتراف الغامض أو سوء تقدير الاحتمالات ، وما إلى ذلك؟ الحل غير الأمثل هو استخدام جميع الاتصالات نفسها. للقيام بذلك ، قم بإنشاء حاويات إضافية للروابط داخل المجموعة وأضفها هناك (حتى لا تختلط مع تلك العادية التي تعمل) ، أو حتى تتداخل مع كل شيء في كومة ، وافصلها فقط بالقوة. ستحتاج هذه الاتصالات إلى إزالتها بشكل أسرع ، نظرًا لأنها مرتبة بحجم أكبر من غيرها. حل أفضل: تقوم كل مجموعة بتخزين ذاكرة التخزين المؤقت العادية للتنشيط - على سبيل المثال ، مخزن دائري (حلقة) مكون من 16 عنصرًا ، حيث يقوم كل عنصر بتخزين رقم الدورة وقوة التنشيط لتلك الدورة. هناك ذاكرة تخزين مؤقت ذات مستويين: للإشارات الضعيفة والعتبة الفرعية والأحدث - مخزن مؤقت في المجموعة ،خلاف ذلك ، الاتصالات للذاكرة طويلة المدى. لا تنس أنه في هذه المقالات فقط يتم عرض الكود الزائف والخوارزميات الساذجة ، ويمكن أن تستهلك مشكلات التحسين مساحة أكبر بكثير.