تتطور الترجمة الآلية العصبية (NMT) بسرعة كبيرة. اليوم ، من أجل تجميع المترجم الخاص بك ، لا تحتاج إلى الحصول على تعليمين عاليين. ولكن من أجل تدريب النموذج ، تحتاج إلى مجموعة متوازية كبيرة (مجموعة حيث ترتبط الترجمة في لغة المصدر بالجمل). في الممارسة العملية ، نحن نتحدث عن ما لا يقل عن مليون زوج من الجمل. حتى أن هناك مساحة كبيرة منفصلة من صندوق النقد الدولي تستكشف أساليب تدريس أزواج اللغات مع كمية صغيرة من البيانات في شكل إلكتروني (الإنجليزية منخفضة الموارد NMT).
نحن نجمع فيلق Chuvash-Russian وفي نفس الوقت ننظر إلى ما يمكن القيام به من خلال حجم البيانات المتاح. في هذا المثال ، تم استخدام 90،000 زوج من الجمل. أعطيت أفضل نتيجة في الوقت الحالي من خلال طريقة نقل المعرفة (تعلم نقل المهندس) ، وسيتم مناقشتها في المقال. الغرض من المقالة هو إعطاء مثال عملي للتنفيذ يمكن استنساخه بسهولة.
خطة التدريب هي على النحو التالي. نحن بحاجة إلى اتخاذ مبنى كبير (الوالدين) ، وتدريب نموذج عصبي عليه ، ثم تدريب نموذج ابنتنا. علاوة على ذلك ، فإن اللغة المستهدفة للترجمة ستكون هي نفسها: الروسية. حدسي ، ويمكن مقارنة هذا لتعلم لغة ثانية. من الأسهل التعلم مع معرفة لغة أجنبية واحدة. يبدو الأمر كما لو كنت تدرس منطقة ضيقة من لغة أجنبية ، على سبيل المثال ، المصطلحات الطبية للغة الإنجليزية: أولاً تحتاج إلى تعلم اللغة الإنجليزية بشكل عام.
كقوة الوالدين ، حاولوا الحصول على مليون زوج من الجمل
من السلك المتوازي الإنجليزية الروسية ومليون
من السلك الكازاخستاني الروسي . هناك 5 ملايين جملة في البيانات الكازاخستانية. من بين هؤلاء ، تم أخذ فقط أولئك الذين لديهم معامل امتثال (العمود الثالث) بأكثر من 2. أعطت النسخة الكازاخية نتائج أفضل قليلاً. يبدو من البديهي أن هذا أمر مفهوم ، لأن اللغتين التشفاشية والكازاخية تشبهان بعضهما البعض. ولكن في الواقع ، لم يثبت هذا ، ويعتمد أيضًا بشكل كبير على جودة القضية. يمكن الاطلاع على مزيد من التفاصيل حول اختيار هيئة الوالدين
في هذه المقالة . حول السلك الفرعي المكون من 90.000 زوج من العروض ، يمكنك
العثور على بيانات نموذجية وطلبها هنا.الآن إلى الرمز. إذا لم يكن لديك بطاقة رسومات سريعة خاصة بك ، يمكنك تدريب النموذج على موقع
Colab . للتدريب ، استخدمنا مكتبة
Sockeye . من المفترض أن Python3 مثبت بالفعل.
pip install sockeye
قد تضطر أيضًا إلى العبث بشكل منفصل مع
MXNet ، المسؤولة عن العمل باستخدام بطاقة الفيديو. كولاب يحتاج تثبيت مكتبة إضافية
pip install mxnet-cu100mkl
حول الشبكات العصبية ، من المقبول عمومًا أن يكفيها تغذية البيانات كما هي ، وأنها ستكتشفها. ولكن في الواقع هذا ليس هو الحال دائما. لذلك في حالتنا ، يحتاج الجسم إلى معالجة مسبقة. أولاً ، نقوم برمزها بحيث يسهل على النماذج فهم "القطة!" و "القطة" هي نفس الشيء تقريبًا. على سبيل المثال ، مجرد رمزية بيثون ستفعل.
from nltk.tokenize import WordPunctTokenizer def tokenize(src_filename, new_filename): with open(src_filename, encoding="utf-8") as src_file: with open(new_filename, "w", encoding="utf-8") as new_file: for line in src_file: new_file.write("%s" % ' '.join(WordPunctTokenizer().tokenize(line))) new_file.write("\n")
نتيجة لذلك ، نقوم بإطعام أزواج من الجمل من النموذج
ӗ ҫ ӳ ӑӑ. ӑ ӑ ӑ ӑӗ, ӑ ӑӑӗ, ӑ ӗӗ -ӑ ӗӗҫ, ҫӗ ӗ ӗҫ ӑӑ ӑӑ, ҫ ӗ ӗ ӑ ӑ ӑӑ ӑ .
و
. , , , , , .
الإخراج هو العروض المميزة التالية:
ӗ ҫ ӳ ӑӑ . ӑ ӑ ӑ ӑӗ , ӑ ӑӑӗ , ӑ ӗӗ - ӑ ӗӗҫ , ҫӗ ӗ ӗҫ ӑӑ ӑӑ , ҫ ӗ ӗ ӑ ӑ ӑӑ ӑ .
والروسية
. , , , , , .
في حالتنا ، سنحتاج إلى قواميس مجمعة لحالات الوالدين والطفل ، لذلك سننشئ ملفات مشتركة:
cp kk.parent.train.tok kkchv.all.train.tok cat chv.child.train.tok >> kk.parent.train.tok cp ru.parent.train.tok ru.all.train.tok cat ru.child.train.tok >> ru.all.train.tok
لأن التدريب الإضافي للنموذج الفرعي يتم في نفس القاموس.
الآن انحدار صغير ولكنه مهم. في MP ، تنقسم الجمل إلى ذرات في شكل كلمات ثم تعمل على الجمل كسلسلة من الكلمات. لكن هذا لا يكفي عادة ، لأن الذيل الضخم يتكون من الكلمات التي تحدث في الجسم مرة واحدة. بناء نموذج احتمالي لهم أمر صعب. هذا صحيح بشكل خاص بالنسبة للغات ذات التشكل المتطور (الحالة ، الجنس ، العدد). كل من الروسية و Chuvash ليست سوى هذه اللغات. ولكن هناك حل. يمكنك تقسيم الجملة إلى مستوى أدنى ، إلى كلمات فرعية. استخدمنا
ترميز زوج بايت. git clone https://github.com/rsennrich/subword-nmt.git
نحصل على مثل هذه التسلسلات تقريبا من الكلمات الفرعية
@@ ӗ ҫ ӳ@@ ӑӑ . @@ ӑ ӑ ӑ @@ ӑӗ , ӑ ӑӑ@@ ӗ , ӑ@@ @@ ӗӗ - ӑ@@ ӗ@@ ӗҫ , ҫӗ@@ ӗ ӗҫ@@ @@ ӑӑ ӑӑ , ҫ@@ @@ @@ ӗ ӗ @@ @@ @@ ӑ ӑ ӑӑ ӑ .
و
@@ @@ @@ . @@ @@ @@ @@ @@ , @@ , @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ , , @@ @@ @@ @@ @@ @@ @@ , @@ @@ @@ @@ @@ .
يمكن ملاحظة أن الملصقات مميزة جيدًا عن الكلمات: لالفترة طويلة وجيدة.
للقيام بذلك ، قم بإعداد قواميس bpe
python subword-nmt/subword_nmt/learn_joint_bpe_and_vocab.py --input kkchv.all.train.tok ru.all.train.tok -s 10000 -o bpe.codes --write-vocabulary bpe.vocab.kkchv bpe.vocab.ru
وتطبيقها على الرموز ، على سبيل المثال:
python subword-nmt/subword_nmt/apply_bpe.py -c bpe.codes --vocabulary bpe.vocab.kkchv --vocabulary-threshold 50 < kkchv.all.train.tok > kkchv.all.train.bpe !python subword-nmt/subword_nmt/apply_bpe.py -c bpe.codes --vocabulary bpe.vocab.ru --vocabulary-threshold 50 < ru.all.train.tok > ru.all.train.bpe
عن طريق القياس ، ما عليك القيام به لجميع الملفات: التدريب ، والتحقق من الصحة واختبار نماذج الوالدين والطفل.
الآن ننتقل مباشرة إلى تدريب النموذج العصبي. تحتاج أولاً إلى إعداد قواميس نموذج عامة:
python -m sockeye.prepare_data -s kk.all.train.bpe -t ru.all.train.bpe -o kkru_all_data
بعد ذلك ، قم بتدريب النموذج الأصل.
يتم وصف مثال بسيط بمزيد من التفاصيل
على صفحة Sockeye. من الناحية الفنية ، تتكون العملية من خطوتين: إعداد البيانات باستخدام قواميس النماذج التي تم إنشاؤها مسبقًا
python -m sockeye.prepare_data -s kk.parent.train.bpe -t ru.parent.train.bpe -o kkru_parent_data --source-vocab kkru_all_data/vocab.src.0.json --target-vocab kkru_all_data/vocab.trg.0.json
والتعلم نفسه
python -m sockeye.train -d kkru_parent_data -vs kk.parent.dev.bpe -vt ru.parent.dev.bpe --encoder transformer --decoder transformer --transformer-model-size 512 --transformer-feed-forward-num-hidden 256 --transformer-dropout-prepost 0.1 --num-embed 512 --max-seq-len 100 --decode-and-evaluate 500 -o kkru_parent_model --num-layers 6 --disable-device-locking --batch-size 1024 --optimized-metric bleu --max-num-checkpoint-not-improved 10
يستغرق التدريب في مرافق كولاب حوالي يوم. عند اكتمال تدريب النموذج ، يمكنك ترجمته باستخدامه
python -m sockeye.translate --input kk.parent.test.bpe -m kkru_parent_model --output ru.parent.test_kkru_parent.bpe
لتدريب نموذج الطفل
python -m sockeye.prepare_data -s chv.child.train.bpe -t ru.child.train.bpe -o chvru_child_data --source-vocab kkru_all_data/vocab.src.0.json --target-vocab kkru_all_data/vocab.trg.0.json
رمز بدء التدريب يشبه هذا
python -m sockeye.train -d chvru_child_data -vs chv.child.dev.bpe -vt ru.child.dev.bpe --encoder transformer --decoder transformer --transformer-model-size 512 --transformer-feed-forward-num-hidden 256 --transformer-dropout-prepost 0.1 --num-embed 512 --max-seq-len 100 --decode-and-evaluate 500 -o ruchv_150K_skv_dev19_model --num-layers 6 --disable-device-locking --batch-size 1024 --optimized-metric bleu --max-num-checkpoint-not-improved 10 --config kkru_parent_model/args.yaml --params kkru_parent_model/params.best
تتم إضافة المعلمات التي تشير إلى أنه يجب استخدام التكوين والأوزان للنموذج الأصل كنقطة بداية. التفاصيل
في المثال مع إعادة التدريب من Sockeye . تعلم نموذج الطفل يتلاقى في حوالي 12 ساعة.
لتلخيص ، قارن النتائج. حقق نموذج الترجمة الآلية المعتاد جودة 24.96 BLEU ، في حين كان نموذج نقل المعرفة 32.38 BLEU. الفرق مرئي أيضًا في أمثلة الترجمات. لذلك ، بينما نواصل تجميع الحالة ، سنستخدم هذا النموذج.