بناءً على رمز Andrej Karpathy https://github.com/karpathy/char-rnn و Samy Bengio's Paper http://arxiv.org/abs/1506.03099
جعل الكود يمكن أن يعالج الشخصيات الإنجليزية والصينية. هذه هي أول لمسة لي من لوا ، لذلك تبدو عملية السلسلة سخيفة ، لكنها تعمل بشكل جيد.
أقوم أيضًا بإضافة خيار يسمى "min_freq" لأن حجم المفردات باللغة الصينية كبيرة جدًا ، مما يجعل المعلمة NUM تزيد كثيرًا. حتى حذف بعض الطابع النادر قد يساعد.
تقترح ورقة Samy Bengio المجدولة للتنبؤ بالتسلسل مع الشبكات العصبية المتكررة في NIPS15 طريقة بسيطة ولكن القوة لتنفيذ RNN.
في تجربتي ، أجد أنه يساعد كثيرًا على تجنب الإفطار وجعل فقدان الاختبار أعمق. أنا فقط استخدم الانحلال الخطي.
استخدم -use_ss لتشغيل أو إيقاف أخذ العينات المجدولة ، يتم تشغيل الافتراضي. -start_ss هو بداية البيانات الحقيقية ، أقترح استخدام 1 لأن نموذجنا يجب أن يتعلم البيانات دون ضوضاء في البداية. -ما أن -min_ss مهم جدًا لأن الكثير من الضوضاء ستؤذي الأداء. أخيرًا ، -decay_ss هو معدل التحلل الخطي.
أقوم بإضافة برنامج نصي لتحويل ملف طراز مدرب بواسطة GPU إلى نموذج وحدة المعالجة المركزية. يمكنك تجربته على النحو التالي:
$ th convert.lua gpu_model cpu_modelتتم إضافة عرض تجريبي على شبكة الإنترنت للآخرين لاختبار النموذج بسهولة ، استنادًا إلى Sub/Pub of Redis. أستخدم REDIS لأنه لا يمكنني العثور على بعض RPC أو خادم الويب الجيد يعمل بشكل جيد مع Torch. يجب أن تلاحظ أن العرض التجريبي غير متزامن من قبل أياكس. لإعداد العرض التوضيحي على Ubuntu: قم بتثبيت redis وابدأه
$ wget http://download.redis.io/releases/redis-3.0.3.tar.gz
$ tar xzf redis-3.0.3.tar.gz
$ cd redis-3.0.3
$ make
$ sudo make install
$ redis-server &ثم قم بتثبيت Flask و Redis Plugin:
$ sudo pip install flask
$ sudo pip install redis
$ luarocks install redis-luaضع ملف نموذجك في Online_Model ، وقم بإعادة تسميته باسم "Model.t7" ، وبدء البرنامج النصي الخلفي والخلف:
$ nohup th web_backend.lua &
$ nohup python web_server.py & يرجى اتباع هذا لإعداد تجربتك.
ينفذ هذا الرمز الشبكة العصبية المتكررة متعددة الطبقات (RNN ، LSTM ، و GRU) للتدريب/أخذ العينات من نماذج اللغة على مستوى الأحرف. يتعلم النموذج التنبؤ باحتمال الحرف التالي في تسلسل. بمعنى آخر ، الإدخال هو ملف نصي واحد ويتعلم النموذج إنشاء نص مثله.
يتم وصف سياق قاعدة الكود هذه بالتفصيل في منشور مدونتي. صفحة المشروع التي لديها عدد قليل من المؤشرات لبعض مجموعات البيانات.
استند هذا الرمز في الأصل إلى فئة التعلم الآلي بجامعة أكسفورد العملية 6 ، والذي بدوره يعتمد على تعلم تنفيذ التعليمات البرمجية من Wojciech Zaremba. كما تم تطوير قطع منه بالتعاون مع زميلي جوستين جونسون.
هذا الرمز مكتوب في لوا ويتطلب الشعلة. بالإضافة إلى ذلك ، تحتاج إلى تثبيت حزم nngraph و optim باستخدام luarocks التي ستتمكن من القيام بها بعد تثبيت الشعلة:
$ luarocks install nngraph
$ luarocks install optim إذا كنت ترغب في استخدام CUDA GPU Computing ، فستحتاج أولاً إلى تثبيت مجموعة أدوات CUDA ، ثم حزم cutorch و cunn :
$ luarocks install cutorch
$ luarocks install cunn إذا كنت ترغب في استخدام حوسبة GPU OpenCl ، فستحتاج أولاً إلى تثبيت حزم cltorch و clnn ، ثم استخدم الخيار -opencl 1 أثناء التدريب:
$ luarocks install cltorch
$ luarocks install clnn يتم تخزين جميع بيانات الإدخال داخل data/ الدليل. ستلاحظ أن هناك مجموعة بيانات مثال مضمّنة في REPO (في data/tinyshakespeare ) والتي تتكون من مجموعة فرعية من أعمال شكسبير. أقوم بتقديم عدد قليل من مجموعات البيانات على صفحة المشروع.
بياناتك الخاصة : إذا كنت ترغب في استخدام البيانات الخاصة بك ، قم بإنشاء ملف واحد input.txt ووضعه في مجلد في data/ . على سبيل المثال ، data/some_folder/input.txt . في المرة الأولى التي تقوم فيها بتشغيل البرنامج النصي التدريبي ، ستقوم بكتابة ملفين آخران في data/some_folder .
لاحظ أنه إذا كانت بياناتك صغيرة جدًا (1 ميجابايت تعتبر بالفعل صغيرة جدًا) ، فلن يتعلم RNN بشكل فعال للغاية. تذكر أنه يجب أن يتعلم كل شيء تمامًا من الصفر.
على العكس من ذلك ، إذا كانت بياناتك كبيرة (أكثر من حوالي 2 ميغابايت) ، تشعر بالثقة في زيادة rnn_size وتدريب نموذج أكبر (انظر تفاصيل التدريب أدناه). ستعمل بشكل أفضل بشكل ملحوظ . على سبيل المثال مع 6 ميغابايت ، يمكنك بسهولة الوصول إلى rnn_size 300 أو أكثر. الأكبر الذي يناسب معالجة الرسومات الخاصة بي وأني تدربت مع هذا الرمز هو rnn_size 700 مع num_layers 3 (2 افتراضي).
ابدأ تدريب النموذج باستخدام train.lua ، على سبيل المثال:
$ th train.lua -data_dir data/some_folder -gpuid -1
تعتبر علامة -data_dir أكثر أهمية لأنها تحدد مجموعة البيانات التي يجب استخدامها. لاحظ أنه في هذا المثال ، نقوم أيضًا بإعداد gpuid إلى -1 والذي يخبر الكود بالتدريب باستخدام وحدة المعالجة المركزية ، وإلا فإنه الافتراضيات إلى GPU 0. هناك العديد من الأعلام الأخرى لمختلف الخيارات. استشر $ th train.lua -help للحصول على إعدادات شاملة. إليك مثال آخر:
$ th train.lua -data_dir data/some_folder -rnn_size 512 -num_layers 2 -dropout 0.5
بينما يتدرب النموذج ، سيكتب بشكل دوري ملفات نقاط التفتيش إلى مجلد cv . يتم التحكم في التردد الذي تتم به كتابة نقاط التفتيش هذه مع عدد التكرارات ، كما هو محدد مع خيار eval_val_every (على سبيل المثال إذا كان هذا هو 1 ، فسيتم كتابة نقطة تفتيش كل تكرار). يحتوي اسم ملف نقاط التفتيش هذه على رقم هيف للغاية: الخسارة . على سبيل المثال ، تشير نقطة تفتيش مع اسم الملف lm_lstm_epoch0.95_2.0681.t7 إلى أنه في هذه المرحلة كان النموذج على الحقبة 0.95 (على سبيل المثال ، قام تقريبًا بتمريرة كاملة على بيانات التدريب) ، وكانت الخسارة في بيانات التحقق من الصحة 2.0681. هذا الرقم مهم للغاية لأنه كلما كان الأمر أقل ، كلما كان عمل نقطة التفتيش أفضل. بمجرد البدء في إنشاء بيانات (تمت مناقشتها أدناه) ، ستحتاج إلى استخدام نقطة تفتيش النموذج التي لديها أدنى خسارة للتحقق. لاحظ أن هذا قد لا يكون بالضرورة نقطة تفتيش الأخيرة في نهاية التدريب (بسبب التورط المحتمل).
هناك كميات مهمة أخرى يجب أن تكون على دراية بها هي batch_size (تسميها ب) و seq_length (تسميها S) وإعدادات train_frac و val_frac . يحدد حجم الدُفعة عدد تدفقات البيانات التي تتم معالجتها بالتوازي في وقت واحد. يحدد طول التسلسل طول كل قطعة ، وهو أيضًا الحد الذي يتم عنده قطع التدرجات. على سبيل المثال ، إذا كان seq_length 20 ، فلن تقوم إشارة التدرج أبدًا بترقيب أكثر من 20 خطوة زمنية ، وقد لا يجد النموذج تبعيات أطول من هذا الطول في عدد الأحرف. في وقت التشغيل ، يحتوي ملف نصي الإدخال الخاص بك على أحرف n ، يتم تقسيمها أولاً إلى أجزاء من BXS الحجم. ثم يتم تخصيص هذه القطع لثلاثة انشقاقات: القطار/Val/اختبار وفقًا لإعدادات frac . إذا كانت بياناتك صغيرة ، فمن المحتمل أنه مع الإعدادات الافتراضية ، لن يكون لديك سوى عدد قليل جدًا من أجزاء قليلة جدًا (على سبيل المثال 100). هذا سيء: في هذه الحالات ، قد ترغب في تقليل حجم الدُفعة أو طول التسلسل.
يمكنك أيضًا بدء المعلمات من نقطة تفتيش تم حفظها مسبقًا باستخدام init_from .
يمكننا استخدام نقاط التفتيش هذه لإنشاء نص (تمت مناقشته بعد ذلك).
بالنظر إلى ملف نقطة التفتيش (مثل تلك المكتوبة إلى cv ) ، يمكننا إنشاء نص جديد. على سبيل المثال:
$ th sample.lua cv/some_checkpoint.t7 -gpuid -1
تأكد من أنه إذا تم تدريب نقطة التفتيش الخاصة بك باستخدام GPU ، فإنه يتم أخذ عينات منه أيضًا مع GPU أو العكس. وإلا فإن الرمز سوف يشكو (حاليًا). كما هو الحال مع البرنامج النصي للقطار ، انظر $ th sample.lua -help للحصول على خيارات كاملة. واحد مهم هو (على سبيل المثال) -length 10000 والتي من شأنها أن تولد 10000 حرف (افتراضي = 2000).
درجة حرارة . معلمة مهمة قد ترغب في لعبها مع الكثير هي -temperature ، والتي تأخذ رقمًا في النطاق [0 ، 1] (إشعار 0 غير مدرج) ، الافتراضي = 1. تقسم درجة الحرارة احتمالات السجل المتوقعة قبل Softmax ، لذلك فإن درجة الحرارة المنخفضة ستؤدي إلى جعل النموذج أكثر ترجيحًا ، ولكن أيضًا أكثر من التنبؤات المحافظة والمحافظة. تؤدي درجات الحرارة المرتفعة إلى قيام النموذج بمزيد من الفرص وزيادة تنوع النتائج ، ولكن بتكلفة المزيد من الأخطاء.
تحضير . من الممكن أيضًا تحديد النموذج مع بعض نص البداية باستخدام -primetext . هذا يبدأ من RNN مع بعض الشخصيات المتشددين لتسخينها مع بعض السياق قبل أن تبدأ في توليد النص.
أخذ عينات سعيدة!
إذا كنت جديدًا إلى حد ما في التعلم الآلي أو الشبكات العصبية ، فقد يستغرق الأمر بعض الخبرة للحصول على نماذج جيدة. أهم الكمية التي يجب تتبعها هي الفرق بين فقدان التدريب الخاص بك (مطبوع أثناء التدريب) وفقد التحقق من الصحة (طبع مرة واحدة في حين يتم تشغيل RNN على بيانات التحقق (افتراضيًا كل 1000 تكرار)). بخاصة:
المعلمتين الأكثر أهمية اللذين يتحكمان في النموذج هما rnn_size و num_layers . أود أن أنصح أنك تستخدم دائمًا num_layers من 2/3. يمكن ضبط rnn_size بناءً على مقدار البيانات التي لديك. الكميتان المهمينان لتتبع هنا هي:
يجب أن يكون هذان الاثنان نفس ترتيب الحجم. من الصعب بعض الشيء أن نقول. فيما يلي بعض الأمثلة:
rnn_size أكبر.تتمثل الإستراتيجية الفائزة في الحصول على نماذج جيدة للغاية (إذا كان لديك وقت حساب) هي أن تخطئ دائمًا في جعل الشبكة أكبر (بحجمك بقدر ما تكون على استعداد لانتظار حسابها) ثم تجربة قيم التسرب المختلفة (بين 0،1). أيا كان النموذج الذي يحتوي على أفضل أداء للتحقق من صحة (الخسارة ، المكتوبة في اسم ملف نقطة التفتيش ، فإن LOW جيدة) هو الأداء الذي يجب عليك استخدامه في النهاية.
من الشائع جدًا في التعلم العميق تشغيل العديد من النماذج المختلفة مع العديد من إعدادات الفائقة المختلفة ، وفي النهاية خذ أي نقطة تفتيش أعطت أفضل أداء للتحقق.
بالمناسبة ، حجم انقسامات التدريب والتحقق من صحة هو أيضا معلمات. تأكد من أن لديك كمية لائقة من البيانات في مجموعة التحقق من الصحة أو خلاف ذلك سيكون أداء التحقق من الصحة صاخبة وليست مفيدة للغاية.
معهد ماساتشوستس للتكنولوجيا