Κοινή χρήση τεχνολογίας

Απλή διάταξη του [Evaluate PEGASUS] / [Fine-tune PEGASUS] / [Δημιουργία σύνοψης συνομιλίας] του [Text Summary] του AGI's [Hugging Face]

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Απλή διάταξη του [Evaluate PEGASUS] / [Fine-tune PEGASUS] / [Δημιουργία σύνοψης συνομιλίας] του [Text Summary] του AGI's [Hugging Face]

Πίνακας περιεχομένων

Απλή διάταξη του [Evaluate PEGASUS] / [Fine-tune PEGASUS] / [Δημιουργία σύνοψης συνομιλίας] του [Text Summary] του AGI's [Hugging Face]

1. Σύντομη εισαγωγή

2. Περίληψη κειμένου

3. Αξιολογήστε το PEGASUS στο σύνολο δεδομένων CNN/DailyMail

4. Μοντέλο περίληψης εκπαίδευσης

1. Αξιολογήστε την απόδοση του PEGASUS στο SAMSum

2. Βελτιώστε τον ΠΗΓΑΣΟ

3. Δημιουργήστε περίληψη συνομιλίας


1. Σύντομη εισαγωγή

Το AGI, ή αλλιώς Artificial General Intelligence, είναι ένα σύστημα τεχνητής νοημοσύνης με επίπεδα ανθρώπινης νοημοσύνης. Μπορεί όχι μόνο να εκτελέσει συγκεκριμένες εργασίες, αλλά και να κατανοήσει, να μάθει και να εφαρμόσει τη γνώση για να λύσει ένα ευρύ φάσμα προβλημάτων, με υψηλή αυτονομία και προσαρμοστικότητα. Οι δυνατότητες του AGI περιλαμβάνουν αλλά δεν περιορίζονται στην αυτο-μάθηση, την αυτοβελτίωση, την αυτοπροσαρμογή και την ικανότητα επίλυσης διαφόρων σύνθετων προβλημάτων χωρίς ανθρώπινη παρέμβαση.

  • Αυτό που μπορεί να κάνει το AGI είναι πολύ ευρύ:

Εκτέλεση εργασιών μεταξύ τομέων: Το AGI μπορεί να χειριστεί εργασίες σε πολλούς τομείς και δεν περιορίζεται σε συγκεκριμένα σενάρια εφαρμογών.
Αυτόνομη μάθηση και προσαρμογή: Το AGI μπορεί να μάθει από την εμπειρία και να προσαρμοστεί σε νέα περιβάλλοντα και καταστάσεις.
Δημιουργική σκέψη: Η AGI είναι σε θέση να σκέφτεται καινοτόμα και να βρίσκει νέες λύσεις.
Κοινωνική αλληλεπίδραση: Το AGI είναι ικανό για περίπλοκες κοινωνικές αλληλεπιδράσεις με ανθρώπους και κατανοεί συναισθηματικά και κοινωνικά σήματα.

  • Όσον αφορά τις μελλοντικές προοπτικές ανάπτυξης του AGI, θεωρείται ένας από τους απώτερους στόχους της έρευνας της τεχνητής νοημοσύνης και έχει τεράστιες δυνατότητες αλλαγής:

Τεχνολογική καινοτομία: Με την πρόοδο τεχνολογιών όπως η μηχανική μάθηση και τα νευρωνικά δίκτυα, η υλοποίηση του AGI μπορεί να πλησιάζει.
Διεπιστημονική ολοκλήρωση: Η εφαρμογή του AGI απαιτεί την ενσωμάτωση γνώσεων από πολλούς κλάδους όπως η επιστήμη των υπολογιστών, η νευροεπιστήμη και η ψυχολογία.
Ηθικά και κοινωνικά ζητήματα: Η ανάπτυξη του AGI απαιτεί την εξέταση ηθικών και κοινωνικών θεμάτων όπως η ιδιωτική ζωή, η ασφάλεια και η απασχόληση.
Βελτιωμένη μάθηση και προσαρμοστικές ικανότητες: Τα μελλοντικά συστήματα AGI μπορούν να χρησιμοποιούν προηγμένους αλγόριθμους για να μαθαίνουν από το περιβάλλον και να βελτιστοποιούν τη συμπεριφορά.
Πολυτροπική αλληλεπίδραση: Το AGI θα έχει πολλαπλές μεθόδους αντίληψης και αλληλεπίδρασης για αλληλεπίδραση με ανθρώπους και άλλα συστήματα.

Ως μία από τις πιο δημοφιλείς κοινότητες και πλατφόρμες μηχανικής μάθησης ανοιχτού κώδικα στον κόσμο, το Hugging Face διαδραματίζει σημαντικό ρόλο στην εποχή του AGI. Παρέχει πλούσιους πόρους προεκπαιδευμένων μοντέλων και συνόλων δεδομένων, προωθώντας την ανάπτυξη του τομέα της μηχανικής μάθησης. Το Hugging Face χαρακτηρίζεται από ευκολία στη χρήση και διαφάνεια Μέσω της βιβλιοθήκης Transformers του, παρέχει στους χρήστες έναν βολικό τρόπο επεξεργασίας κειμένου. Με την ανάπτυξη της τεχνολογίας AI, η κοινότητα Hugging Face θα συνεχίσει να διαδραματίζει σημαντικό ρόλο στην προώθηση της ανάπτυξης και της εφαρμογής της τεχνολογίας AI, ειδικά στην ανάπτυξη της πολυτροπικής τεχνολογίας AI Η κοινότητα Hugging Face θα επεκτείνει την ποικιλομορφία των μοντέλων της και σύνολα δεδομένων, συμπεριλαμβανομένων Πολυτροπικών δεδομένων όπως εικόνες, ήχος και βίντεο.

  • Στην εποχή του AGI, το Hugging Face μπορεί να μπει στο παιχνίδι με τους εξής τρόπους:

Model Sharing: Ως πλατφόρμα κοινής χρήσης μοντέλων, το Hugging Face θα συνεχίσει να προωθεί την κοινή χρήση και τη συνεργασία προηγμένων μοντέλων AGI.
Οικοσύστημα ανοιχτού κώδικα: Το οικοσύστημα ανοιχτού κώδικα του Hugging Face θα βοηθήσει στην επιτάχυνση της ανάπτυξης και της καινοτομίας της τεχνολογίας AGI.
Εργαλεία και υπηρεσίες: Παρέχετε πληθώρα εργαλείων και υπηρεσιών για την υποστήριξη προγραμματιστών και ερευνητών στην έρευνα και τις εφαρμογές τους στον τομέα AGI.
Ηθική και κοινωνική ευθύνη: Το Hugging Face εστιάζει στην ηθική της τεχνητής νοημοσύνης και θα προωθήσει την ανάπτυξη και εφαρμογή υπεύθυνων μοντέλων AGI για να διασφαλίσει την τεχνολογική πρόοδο, ενώ συμμορφώνεται με τα ηθικά πρότυπα.

Το AGI, ως προηγμένη μορφή τεχνητής νοημοσύνης στο μέλλον, έχει ευρείες προοπτικές εφαρμογής και το Hugging Face, ως κοινότητα ανοιχτού κώδικα, θα διαδραματίσει βασικό ρόλο στην προώθηση της ανάπτυξης και εφαρμογής του AGI.

(Σημείωση: Ο παρακάτω κώδικας ενδέχεται να απαιτεί επιστημονική πρόσβαση στο Διαδίκτυο για να εκτελεστεί)

2. Περίληψη κειμένου

Ίσως χρειάστηκε να συνοψίσετε ένα έγγραφο, συμπεριλαμβανομένου ενός ερευνητικού άρθρου, μιας αναφοράς οικονομικών κερδών ή μιας σειράς μηνυμάτων ηλεκτρονικού ταχυδρομείου. Εάν το καλοσκεφτείτε, αυτό απαιτεί μια σειρά από ικανότητες, συμπεριλαμβανομένης της κατανόησης περιεχομένου μεγάλης μορφής, του συλλογισμού σχετικά με το περιεχόμενο και, στη συνέχεια, της παραγωγής ενός άπταιτου κειμένου που να περιλαμβάνει τα κύρια θέματα του αρχικού εγγράφου. Επιπλέον, η ακριβής σύνοψη ενός άρθρου ειδήσεων είναι πολύ διαφορετική από τη σύνοψη μιας νομικής σύμβασης και επομένως απαιτεί πολύπλοκες δυνατότητες γενίκευσης τομέα. Για αυτούς τους λόγους, η σύνοψη κειμένου (ο τεχνικός όρος είναι σύνοψη κειμένου) είναι μια δύσκολη εργασία για μοντέλα νευρωνικών γλωσσών, συμπεριλαμβανομένων των μοντέλων μετασχηματιστή. Παρά αυτές τις προκλήσεις, η σύνοψη κειμένων μπορεί να επιταχύνει σημαντικά τη ροή εργασίας των ειδικών του τομέα Οι εταιρείες μπορούν να χρησιμοποιήσουν τη σύνοψη κειμένου για να συμπυκνώσουν τις εσωτερικές γνώσεις, να συνοψίσουν τις συμβάσεις, να δημιουργήσουν αυτόματα περιεχόμενο δημοσίευσης μέσων κοινωνικής δικτύωσης κ.λπ. Επομένως, η εργασία σύνοψης κειμένου NLP είναι πολύτιμη.

Για να σας βοηθήσει να κατανοήσετε τις προκλήσεις, αυτή η ενότητα διερευνά πώς να αξιοποιήσετε τα προεκπαιδευμένα μοντέλα του Transformer για τη σύνοψη κειμένου. Η σύνοψη είναι μια κλασική εργασία αλληλουχίας σε ακολουθία (seq2seq) που απαιτεί εισαγωγή κειμένου και κείμενο στόχου.

Η σύνοψη κειμένου είναι μια εργασία επεξεργασίας φυσικής γλώσσας, στόχος της οποίας είναι να εξάγει συνοπτικές και σημαντικές πληροφορίες από ένα μεγάλο κείμενο και να δημιουργήσει μια σύντομη έκδοση. Η σύνοψη κειμένων μπορεί να χωριστεί σε δύο βασικούς τύπους: εξαγωγική περίληψη και γενετική σύνοψη.

  • Αποσπασματική περίληψη

Η αποσπασματική περίληψη επιλέγει σημαντικές προτάσεις ή παραγράφους στο αρχικό κείμενο και εξάγει απευθείας αυτά τα περιεχόμενα ως περιλήψεις. Αυτή η μέθοδος δεν αλλάζει τις λέξεις και τη δομή της πρότασης στο αρχικό κείμενο.

Αρχή εφαρμογής:

  1. Εξαγωγή χαρακτηριστικών: Αρχικά, πρέπει να εξαχθούν διάφορα χαρακτηριστικά του κειμένου, όπως συχνότητα λέξεων, θέση πρότασης, λέξεις-κλειδιά, ονομαστικές οντότητες κ.λπ.
  2. Βαθμολογία σημαντικότητας: Με βάση τα εξαγόμενα χαρακτηριστικά, υπολογίζεται μια βαθμολογία για κάθε πρόταση για να προσδιοριστεί η σημασία της.
  3. Επιλογή πρότασης: Με βάση τη βαθμολογία σπουδαιότητας, επιλέγονται οι πιο σημαντικές προτάσεις για τη δημιουργία της περίληψης.

δυσκολία:

  1. Μέτρηση σημασίας: Πώς να μετρήσετε με ακρίβεια τη σχετική σημασία των προτάσεων.
  2. Εξάλειψη πλεονασμού: Αποφύγετε την επιλογή προτάσεων με επαναλαμβανόμενο περιεχόμενο.

Τρόπος πραγματοποίησης:

  1. Προσέγγιση βάσει κανόνων: χρησιμοποιεί προκαθορισμένους κανόνες και στατιστικές μεθόδους για την επιλογή προτάσεων.
  2. Μέθοδος μηχανικής μάθησης: Χρησιμοποιήστε αλγόριθμους εποπτευόμενης μάθησης για να μάθετε πώς να επιλέγετε σημαντικές προτάσεις με βάση τα δεδομένα εκπαίδευσης.
  • Γενετική περίληψη

Η γενετική περίληψη λειτουργεί με την κατανόηση του αρχικού κειμένου και τη δημιουργία νέων προτάσεων για τη σύνοψη του περιεχομένου του. Αυτή η προσέγγιση δημιουργεί μια πιο φυσική και συνεκτική περίληψη, αλλά είναι επίσης πιο περίπλοκη.

Αρχή εφαρμογής:

  1. Αρχιτεκτονική κωδικοποιητή-αποκωδικοποιητή: Χρησιμοποιεί ένα μοντέλο αλληλουχίας σε ακολουθία (Seq2Seq), όπου ο κωδικοποιητής κωδικοποιεί κείμενο εισόδου σε διανύσματα περιβάλλοντος και ο αποκωδικοποιητής δημιουργεί περιλήψεις με βάση τα διανύσματα περιβάλλοντος.
  2. Μηχανισμός προσοχής: Κατά τη διαδικασία αποκωδικοποίησης, το μοντέλο μπορεί να εστιάσει σε διαφορετικά μέρη του κειμένου εισόδου για να δημιουργήσει πιο σχετικό περιεχόμενο.
  3. Προεκπαιδευμένο μοντέλο: Χρησιμοποιήστε προεκπαιδευμένα μοντέλα γλώσσας (όπως BERT, GPT, κ.λπ.) για να βελτιώσετε την ποιότητα των συνόψεων που δημιουργούνται.

δυσκολία:

  1. Συνοχή περιεχομένου: Η σύνοψη που δημιουργείται πρέπει να διατηρεί τη λογική συνοχή και να αποφεύγει τις διακοπές περιεχομένου.
  2. Ακεραιότητα πληροφοριών: Διασφαλίζει ότι η σύνοψη που δημιουργείται περιέχει βασικές πληροφορίες από το αρχικό κείμενο.
  3. Πολυπλοκότητα μοντέλων: Τα συνοπτικά μοντέλα παραγωγής είναι γενικά πιο περίπλοκα από τα συνοπτικά μοντέλα εξαγωγής και απαιτούν περισσότερους υπολογιστικούς πόρους και δεδομένα εκπαίδευσης.

Τρόπος πραγματοποίησης:

  1. Κλασικό μοντέλο Seq2Seq: όπως το μοντέλο κωδικοποιητή-αποκωδικοποιητή που βασίζεται στο LSTM.
  2. Προεκπαιδευμένα μοντέλα Transformer: όπως BERTSUM, T5, BART κ.λπ.
  • Σύνοψη κειμένου σε Αγκαλιασμένο πρόσωπο

Το Hugging Face παρέχει μια ποικιλία προεκπαιδευμένων μοντέλων και εργαλείων για την εύκολη υλοποίηση εργασιών σύνοψης κειμένου. Ακολουθούν ορισμένα μοντέλα σύνοψης κειμένου που χρησιμοποιούνται συνήθως και πώς να τα χρησιμοποιήσετε:

  1. Σύνοψη με χρήση προεκπαιδευμένων μοντέλων

Το παρακάτω είναι ένα δείγμα κώδικα για τη σύνοψη κειμένου χρησιμοποιώντας το μοντέλο BART που παρέχεται από το Hugging Face:

  1. from transformers import BartForConditionalGeneration, BartTokenizer
  2. # 加载预训练的BART模型和对应的tokenizer
  3. model_name = "facebook/bart-large-cnn"
  4. model = BartForConditionalGeneration.from_pretrained(model_name)
  5. tokenizer = BartTokenizer.from_pretrained(model_name)
  6. # 输入文本
  7. input_text = """Your text to summarize goes here."""
  8. # 对输入文本进行tokenize,并添加必要的模型输入
  9. inputs = tokenizer([input_text], max_length=1024, return_tensors='pt')
  10. # 使用模型生成摘要
  11. summary_ids = model.generate(inputs['input_ids'], num_beams=4, max_length=150, early_stopping=True)
  12. # 将生成的token序列转换回文本
  13. summary = tokenizer.decode(summary_ids[0], skip_special_tokens=True)
  14. print(summary)
  1. Υποστηριζόμενα μοντέλα σύνοψης

Το Hugging Face παρέχει μια ποικιλία προεκπαιδευμένων μοντέλων για σύνοψη κειμένου, συμπεριλαμβανομένων ενδεικτικά:

  1. BART (facebook/bart-large-cnn)
  2. T5 (t5-small, t5-base, t5-large, t5-3b, t5-11b)
  3. PEGASUS (google/pegasus-xsum, google/pegasus-cnn_dailymail)
  • Εκπαιδεύστε το δικό σας μοντέλο σύνοψης

Εάν χρειάζεται να προσαρμοστείτε καλύτερα σε εργασίες σύνοψης κειμένου για συγκεκριμένο τομέα, μπορείτε να ρυθμίσετε το προεκπαιδευμένο μοντέλο χρησιμοποιώντας το δικό σας σύνολο δεδομένων. Ακολουθεί ένα απλό παράδειγμα λεπτομέρειας:

  1. from transformers import Trainer, TrainingArguments, BartForConditionalGeneration, BartTokenizer
  2. from datasets import load_dataset
  3. # 加载数据集
  4. dataset = load_dataset("cnn_dailymail", "3.0.0")
  5. # 加载预训练的BART模型和tokenizer
  6. model_name = "facebook/bart-large-cnn"
  7. model = BartForConditionalGeneration.from_pretrained(model_name)
  8. tokenizer = BartTokenizer.from_pretrained(model_name)
  9. # 数据预处理
  10. def preprocess_function(examples):
  11. inputs = [doc for doc in examples['article']]
  12. model_inputs = tokenizer(inputs, max_length=1024, truncation=True)
  13. # 设定摘要作为目标
  14. with tokenizer.as_target_tokenizer():
  15. labels = tokenizer(examples['highlights'], max_length=150, truncation=True)
  16. model_inputs['labels'] = labels['input_ids']
  17. return model_inputs
  18. tokenized_dataset = dataset.map(preprocess_function, batched=True)
  19. # 定义训练参数
  20. training_args = TrainingArguments(
  21. output_dir="./results",
  22. evaluation_strategy="epoch",
  23. learning_rate=2e-5,
  24. per_device_train_batch_size=4,
  25. per_device_eval_batch_size=4,
  26. num_train_epochs=3,
  27. weight_decay=0.01,
  28. )
  29. # 使用Trainer进行训练
  30. trainer = Trainer(
  31. model=model,
  32. args=training_args,
  33. train_dataset=tokenized_dataset["train"],
  34. eval_dataset=tokenized_dataset["validation"],
  35. )
  36. trainer.train()

Η σύνοψη κειμένου είναι μια πολύπλοκη και προκλητική εργασία επεξεργασίας φυσικής γλώσσας. Με τη χρήση των προεκπαιδευμένων μοντέλων και εργαλείων που παρέχονται από το Hugging Face, η διαδικασία υλοποίησης της σύνοψης κειμένου μπορεί να απλοποιηθεί σημαντικά. Οι χρήστες μπορούν να επιλέξουν το κατάλληλο μοντέλο σύμφωνα με συγκεκριμένες ανάγκες και να το ρυθμίσουν με ακρίβεια για να αποκτήσουν το καλύτερο εφέ σύνοψης.

Σε αυτήν την ενότητα, θα δημιουργήσουμε το δικό μας μοντέλο κωδικοποιητή-αποκωδικοποιητή για τη συμπίεση των συνομιλιών πολλών ατόμων σε συνοπτικές περιλήψεις. Αλλά πριν από αυτό, ας ρίξουμε μια ματιά σε ένα κλασικό σύνολο δεδομένων στον τομέα της σύνοψης: CNN/DailyMail corpus.

τρία,στο ΓΝΝ/ρεέναΕγώμεγάλοyΜέναΕγώμεγάλοαριθμόςσύμφωνα μεσειράανώτεροςσχόλιοεκτίμησηΠμισολΕΝΑμικρόUμικρό

Τώρα οι προϋποθέσεις είναι πλήρεις για την πλήρη αξιολόγηση του μοντέλου: έχουμε το σύνολο δεδομένων του συνόλου δοκιμής CNN/DailyMail, τη μέτρηση ROUGE για αξιολόγηση και ένα συνοπτικό μοντέλο.

  1. # 导入所需的库
  2. import matplotlib.pyplot as plt # 导入 matplotlib.pyplot,用于绘制图形
  3. import pandas as pd # 导入 pandas,用于数据处理
  4. from datasets import load_dataset, load_metric # 从 datasets 库中导入 load_dataset 和 load_metric 函数
  5. from transformers import AutoModelForSeq2SeqLM, AutoTokenizer # 从 transformers 库中导入 AutoModelForSeq2SeqLM 和 AutoTokenizer
  6. # 加载 CNN/DailyMail 数据集,版本为 3.0.0
  7. dataset = load_dataset("cnn_dailymail", "3.0.0")
  8. # 加载 ROUGE 评价指标,用于计算文本摘要的质量
  9. rouge_metric = load_metric("rouge", cache_dir=None)
  10. # 定义要计算的 ROUGE 分数的名称列表
  11. rouge_names = ["rouge1", "rouge2", "rougeL", "rougeLsum"]

Απλά πρέπει να ενώσουμε τα κομμάτια. Αρχικά, αξιολογούμε την απόδοση του μοντέλου αναφοράς τριών προτάσεων:

  1. # 定义一个函数,用于评估基线模型生成的摘要
  2. def evaluate_summaries_baseline(dataset, metric, column_text="article", column_summary="highlights"):
  3. # 使用 three_sentence_summary 函数对数据集中的每篇文章生成摘要
  4. summaries = [three_sentence_summary(text) for text in dataset[column_text]]
  5. # 将生成的摘要和参考摘要添加到评价指标中
  6. metric.add_batch(predictions=summaries, references=dataset[column_summary])
  7. # 计算评价指标的分数
  8. score = metric.compute()
  9. # 返回评价指标的分数
  10. return score

Στη συνέχεια εφαρμόζουμε τη συνάρτηση σε ένα υποσύνολο δεδομένων. Δεδομένου ότι το τμήμα δοκιμής του συνόλου δεδομένων CNN/DailyMail περιέχει περίπου 10 000 δείγματα, η δημιουργία περιλήψεων όλων αυτών των άρθρων απαιτεί πολύ χρόνο. Θυμηθείτε από το Κεφάλαιο 5 ότι κάθε διακριτικό που δημιουργείται πρέπει να μεταβιβαστεί προς τα εμπρός μέσω του μοντέλου. Η δημιουργία 100 διακριτικών ανά δείγμα θα απαιτούσε 1 εκατομμύριο περάσματα προς τα εμπρός και εάν χρησιμοποιούσαμε αναζήτηση δέσμης, αυτός ο αριθμός θα έπρεπε επίσης να πολλαπλασιαστεί με τον αριθμό των ακτίνων. Για να κάνουμε τον υπολογισμό πιο γρήγορο, θα υποδειγματίσουμε το σύνολο δοκιμών και τελικά θα χρησιμοποιήσουμε 1000 δείγματα για αξιολόγηση. Με αυτόν τον τρόπο, μπορούμε να ολοκληρώσουμε την αξιολόγηση του μοντέλου PEGASUS σε λιγότερο από μία ώρα σε μία μόνο GPU και να λάβουμε σταθερές εκτιμήσεις βαθμολογίας:

  1. # 从测试集中随机抽取1000条样本,用于评估
  2. test_sampled = dataset["test"].shuffle(seed=42).select(range(1000))
  3. # 使用基线模型生成摘要并评估其质量
  4. score = evaluate_summaries_baseline(test_sampled, rouge_metric)
  5. # 将评价指标的分数存储在字典中
  6. rouge_dict = dict((rn, score[rn].mid.fmeasure) for rn in rouge_names)
  7. # 将评价指标的分数转换为DataFrame格式,并转置以便显示
  8. pd.DataFrame.from_dict(rouge_dict, orient="index", columns=["baseline"]).T

αποτέλεσμα λειτουργίας:

 ρουζ1ρουζ2rougeLrougeLsum
γραμμή βάσης0.389280.1712960.2450610.354239

Οι βαθμολογίες είναι ως επί το πλείστον χειρότερες από το προηγούμενο παράδειγμα, αλλά εξακολουθούν να είναι καλύτερες από αυτές που επιτεύχθηκαν από το GPT-2! Τώρα ακολουθούμε το ίδιο μοτίβο για να αξιολογήσουμε το μοντέλο PEGASUS:

  1. # 导入 tqdm 模块,用于显示进度条
  2. from tqdm import tqdm
  3. # 导入 torch 模块,用于使用 GPU 或 CPU 进行计算
  4. import torch
  5. # 设置设备为 GPU(如果可用)或 CPU
  6. device = "cuda" if torch.cuda.is_available() else "cpu"
  7. def chunks(list_of_elements, batch_size):
  8. """将 list_of_elements 按 batch_size 切分成多个小块"""
  9. for i in range(0, len(list_of_elements), batch_size):
  10. yield list_of_elements[i : i + batch_size]
  11. def evaluate_summaries_pegasus(dataset, metric, model, tokenizer,
  12. batch_size=16, device=device,
  13. column_text="article",
  14. column_summary="highlights"):
  15. """评估使用 Pegasus 模型生成的摘要"""
  16. # 将文章和摘要分别按 batch_size 切分成多个小块
  17. article_batches = list(chunks(dataset[column_text], batch_size))
  18. target_batches = list(chunks(dataset[column_summary], batch_size))
  19. # 使用 tqdm 显示进度条,遍历每个文章批次和相应的摘要批次
  20. for article_batch, target_batch in tqdm(
  21. zip(article_batches, target_batches), total=len(article_batches)):
  22. # 对文章批次进行标记,将其转换为模型输入的张量
  23. inputs = tokenizer(article_batch, max_length=1024, truncation=True,
  24. padding="max_length", return_tensors="pt")
  25. # 使用 Pegasus 模型生成摘要
  26. summaries = model.generate(input_ids=inputs["input_ids"].to(device),
  27. attention_mask=inputs["attention_mask"].to(device),
  28. length_penalty=0.8, num_beams=8, max_length=128)
  29. # 解码生成的摘要,将其从张量转换为字符串
  30. decoded_summaries = [tokenizer.decode(s, skip_special_tokens=True,
  31. clean_up_tokenization_spaces=True)
  32. for s in summaries]
  33. decoded_summaries = [d.replace("", " ") for d in decoded_summaries]
  34. # 将生成的摘要和目标摘要添加到评价指标中
  35. metric.add_batch(predictions=decoded_summaries, references=target_batch)
  36. # 计算评价指标分数
  37. score = metric.compute()
  38. return score

Ας εξηγήσουμε λεπτομερώς αυτόν τον κωδικό αξιολόγησης. Αρχικά, χωρίζουμε το σύνολο δεδομένων σε μικρότερες παρτίδες, ώστε να μπορούν να υποβληθούν σε επεξεργασία ταυτόχρονα. Στη συνέχεια, για κάθε παρτίδα, κάνουμε διακριτικό στα άρθρα εισόδου και τα τροφοδοτούμε στη συνάρτηση generate() για να δημιουργήσουμε περιλήψεις χρησιμοποιώντας την αναζήτηση δέσμης. Χρησιμοποιούμε τις ίδιες παραμέτρους παραγωγής όπως στο χαρτί. Το νέο μήκος της παραμέτρου ποινής διασφαλίζει ότι το μοντέλο δεν δημιουργεί ακολουθίες που είναι πολύ μεγάλες.Τέλος, αποκωδικοποιούμε το κείμενο που προκύπτει, αντικαθιστώντας<n> διακριτικά και προσθέστε το αποκωδικοποιημένο κείμενο στη μέτρηση μαζί με το κείμενο αναφοράς. Τέλος υπολογίζουμε και επιστρέφουμε τη βαθμολογία ROUGE. Τώρα χρησιμοποιούμε ξανά την κλάση AutoModelForSeq2SeqLM για την εργασία δημιουργίας seq2seq για να φορτώσουμε το μοντέλο και να το αξιολογήσουμε:

  1. # 从 transformers 库中导入用于序列到序列任务的模型和标记器
  2. from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
  3. # 设置模型检查点名称,使用 Google 的 PEGASUS 模型,预训练于 CNN/DailyMail 数据集
  4. model_ckpt = "google/pegasus-cnn_dailymail"
  5. # 从预训练的模型检查点中加载标记器和模型,并将模型移动到指定的设备(CPU 或 GPU)
  6. tokenizer = AutoTokenizer.from_pretrained(model_ckpt)
  7. model = AutoModelForSeq2SeqLM.from_pretrained(model_ckpt).to(device)
  8. # 使用评估函数 evaluate_summaries_pegasus 评估 PEGASUS 模型生成的摘要
  9. # 输入参数包括测试数据、ROUGE 评价指标、模型、标记器和批处理大小
  10. score = evaluate_summaries_pegasus(test_sampled, rouge_metric,
  11. model, tokenizer, batch_size=8)
  12. # 从评估结果中提取 ROUGE 分数,将其转换为字典格式,其中键为 ROUGE 指标名称,值为 F-measure 分数
  13. rouge_dict = dict((rn, score[rn].mid.fmeasure) for rn in rouge_names)
  14. # 将 ROUGE 分数字典转换为 pandas 数据框,并以 "pegasus" 作为索引
  15. pd.DataFrame(rouge_dict, index=["pegasus"])

αποτέλεσμα λειτουργίας:

(Προσωρινό σφάλμα αναφέρεται εδώ:

TypeError: Couldn't build proto file into descriptor pool: duplicate file name sentencepiece_model.proto

, τα αποτελέσματα εκτέλεσης για αναφορά χρησιμοποιώντας παραδείγματα είναι τα εξής)

 ρουζ1ρουζ2rougeLrougeLsum
Πήγασος0.434380.2108830.3071950.373231

Αυτοί οι αριθμοί είναι πολύ κοντά στα αποτελέσματα της εργασίας. Το σημαντικό που πρέπει να σημειωθεί εδώ είναι ότι η απώλεια και η ακρίβεια κάθε διακριτικού είναι κάπως αποσυνδεδεμένα από το σκορ ROUGE. Η απώλεια είναι ανεξάρτητη από τη στρατηγική αποκωδικοποίησης, ενώ η βαθμολογία ROUGE είναι έντονα συνδεδεμένη.

Εφόσον το ROUGE και το BLEU επιτυγχάνουν καλύτερη απώλεια ή ακρίβεια από την ανθρώπινη αξιολόγηση, θα πρέπει να εστιάσετε σε αυτά κατά τη δημιουργία μοντέλων δημιουργίας κειμένου και να εξερευνήσετε προσεκτικά και να επιλέξετε στρατηγικές αποκωδικοποίησης. Ωστόσο, αυτές οι μετρήσεις απέχουν πολύ από το να είναι τέλειες, επομένως θα πρέπει πάντα να λαμβάνεται υπόψη η ανθρώπινη αξιολόγηση.

Τώρα που έχουμε τη λειτουργία αξιολόγησης, μπορούμε να εκπαιδεύσουμε το δικό μας συνοπτικό μοντέλο.

τέσσερα,εκπαίδευσηπρακτικήδιαλέγωθέλωμούχλατύπος

Σε αυτό το σημείο, έχουμε περάσει από πολλές λεπτομέρειες σύνοψης και αξιολόγησης κειμένου, τώρα χρησιμοποιούμε αυτή τη γνώση για να εκπαιδεύσουμε ένα προσαρμοσμένο μοντέλο σύνοψης κειμένου! Για την προσαρμοσμένη εφαρμογή μας, θα χρησιμοποιήσουμε το σύνολο δεδομένων SAMsum που αναπτύχθηκε από τη Samsung (ηttΠμικρό://οrμιΕγώμεγάλο.μεγάλοy/n1σολσολq ), αυτό το σύνολο δεδομένων περιέχει μια σειρά από συνομιλίες και σύντομες περιλήψεις. Αυτές οι συνομιλίες μπορούν να αντιπροσωπεύουν αλληλεπιδράσεις μεταξύ πελατών και τηλεφωνικών κέντρων, δημιουργώντας ακριβείς περιλήψεις που θα βοηθήσουν στη βελτίωση της εξυπηρέτησης πελατών και στον εντοπισμό κοινών μοτίβων στα αιτήματα πελατών. Ας φορτώσουμε πρώτα το σύνολο δεδομένων και ας δούμε ένα δείγμα:

  1. # 从 datasets 库中导入用于加载数据集的函数
  2. from datasets import load_dataset
  3. # 加载 SamSum 数据集,该数据集包含对话和相应的摘要
  4. dataset_samsum = load_dataset("samsum",trust_remote_code=True)
  5. # 获取数据集的每个划分(训练集、验证集、测试集)的长度,并存储在列表 split_lengths 中
  6. split_lengths = [len(dataset_samsum[split]) for split in dataset_samsum]
  7. # 打印每个数据集划分的长度
  8. print(f"Split lengths: {split_lengths}")
  9. # 打印训练集中列的名称(特征)
  10. print(f"Features: {dataset_samsum['train'].column_names}")
  11. # 打印测试集中第一个对话样本
  12. print("nDialogue:")
  13. print(dataset_samsum["test"][0]["dialogue"])
  14. # 打印测试集中第一个对话样本的摘要
  15. print("nSummary:")
  16. print(dataset_samsum["test"][0]["summary"])

(Σημείωση: Ίσως χρειαστεί να εγκαταστήσετε το py7zr, το pip install py7zr)

αποτέλεσμα λειτουργίας:

Split lengths: [14732, 819, 818]
Features: ['id', 'dialogue', 'summary']

Dialogue:
Hannah: Hey, do you have Betty's number?
Amanda: Lemme check
Hannah: <file_gif>
Amanda: Sorry, can't find it.
Amanda: Ask Larry
Amanda: He called her last time we were at the park together
Hannah: I don't know him well
Hannah: <file_gif>
Amanda: Don't be shy, he's very nice
Hannah: If you say so..
Hannah: I'd rather you texted him
Amanda: Just text him 🙂
Hannah: Urgh.. Alright
Hannah: Bye
Amanda: Bye bye

Summary:
Hannah needs Betty's number but Amanda doesn't have it. She needs to contact Larry.

Οι συνομιλίες μοιάζουν σαν να συνομιλείτε μέσω μηνύματος κειμένου ή WhatsApp, συμπεριλαμβανομένων των emoji και των placeholders για GIF. Το πεδίο διαλόγου περιέχει το πλήρες κείμενο, ενώ το πεδίο περίληψης είναι μια σύνοψη του διαλόγου. Μπορεί ένα μοντέλο που έχει ρυθμιστεί με ακρίβεια στο σύνολο δεδομένων CNN/DailyMail να χειριστεί αυτό το σύνολο δεδομένων; Ας ΡΙΞΟΥΜΕ μια ΜΑΤΙΑ!

1 σχόλιοεκτίμησηΠμισολΕΝΑμικρόUμικρόυπάρχειμικρόΕΝΑΜμικρόuΜανώτεροςτουφύλοικανός

Αρχικά, θα εκτελέσουμε την ίδια διαδικασία σύνοψης χρησιμοποιώντας το PEGASUS για να δούμε την έξοδο. Μπορούμε να χρησιμοποιήσουμε ξανά τον κώδικα που δημιουργήθηκε από τη σύνοψη του CNN/DailyMail:

  1. # 使用已加载的summarization管道对测试集中的第一个对话样本进行摘要
  2. pipe_out = pipe(dataset_samsum["test"][0]["dialogue"])
  3. # 打印生成的摘要标题
  4. print("Summary:")
  5. # 打印生成的摘要文本,并将每个句子的句号后面的空格替换为换行符
  6. # 这行代码会输出生成的摘要,其中 ". " 替换为 ".n" 使其更易读
  7. print(pipe_out[0]["summary_text"].replace(" .", ".n"))

αποτέλεσμα λειτουργίας:

Summary:
Hannah asks Amanda for Betty's number. Amanda can't find it. Hannah asks Larry. Amanda asks Larry to text him. Hannah says she'll text him back. Hannah calls it a day and says she's going to go home. Hannah: "Bye bye"

Μπορούμε να δούμε ότι το μοντέλο προσπαθεί κυρίως να συνοψίσει εξάγοντας βασικές προτάσεις στη συνομιλία. Αυτό μπορεί να λειτουργεί σχετικά καλά στο σύνολο δεδομένων CNN/DailyMail, αλλά στο SAMsum, η περίληψη είναι πιο αφηρημένη και το αποτέλεσμα μπορεί να μην είναι καλό. Μπορούμε να το επιβεβαιώσουμε εκτελώντας την πλήρη αξιολόγηση ROUGE στο σετ δοκιμών:

  1. # 使用评估函数 evaluate_summaries_pegasus 对 SamSum 数据集的测试集进行摘要生成评估
  2. # 传入的参数包括数据集、评价指标、模型、tokenizer、文本列名、摘要列名和批量大小
  3. score = evaluate_summaries_pegasus(dataset_samsum["test"], rouge_metric, model,
  4. tokenizer, column_text="dialogue",
  5. column_summary="summary", batch_size=8)
  6. # 创建一个字典 rouge_dict,用于存储 ROUGE 评分的中值 F-measure 值
  7. rouge_dict = dict((rn, score[rn].mid.fmeasure) for rn in rouge_names)
  8. # 将 ROUGE 评分字典转换为 Pandas 数据框,并以 "pegasus" 为索引
  9. pd.DataFrame(rouge_dict, index=["pegasus"])

αποτέλεσμα λειτουργίας:

(Προσωρινό σφάλμα αναφέρεται εδώ:

TypeError: Couldn't build proto file into descriptor pool: duplicate file name sentencepiece_model.proto

, τα αποτελέσματα εκτέλεσης για αναφορά χρησιμοποιώντας παραδείγματα είναι τα εξής)

 ρουζ1ρουζ2rougeLrougeLsum
Πήγασος0.296170.0878030.2296040.229514

Αν και τα αποτελέσματα δεν είναι εξαιρετικά, δεν είναι απροσδόκητο καθώς απέχει πολύ από τη διανομή δεδομένων CNN/DailyMail. Ωστόσο, η ρύθμιση της διαδικασίας αξιολόγησης πριν από την εκπαίδευση έχει δύο πλεονεκτήματα: μπορούμε να χρησιμοποιήσουμε απευθείας μετρήσεις για να μετρήσουμε την επιτυχία της εκπαίδευσης και έχουμε μια καλή βάση. Η λεπτομερής ρύθμιση του μοντέλου στο σύνολο δεδομένων μας θα πρέπει να βελτιώσει αμέσως τη μέτρηση ROUGE, εάν δεν υπάρξει βελτίωση, τότε γνωρίζουμε ότι κάτι δεν πάει καλά με τον βρόχο εκπαίδευσης.

2. ΜικροαρμονίαΠμισολΕΝΑμικρόUμικρό

Πριν εκπαιδευτούμε στα δεδομένα, ρίχνουμε μια γρήγορη ματιά στις κατανομές μήκους εισόδου και εξόδου:

  1. # 编码训练集中的对话文本和摘要,并计算其长度
  2. d_len = [len(tokenizer.encode(s)) for s in dataset_samsum["train"]["dialogue"]]
  3. s_len = [len(tokenizer.encode(s)) for s in dataset_samsum["train"]["summary"]]
  4. # 创建一个包含两个子图的图形对象
  5. fig, axes = plt.subplots(1, 2, figsize=(10, 3.5), sharey=True)
  6. # 绘制对话文本的长度分布直方图
  7. axes[0].hist(d_len, bins=20, color="C0", edgecolor="C0")
  8. axes[0].set_title("Dialogue Token Length")
  9. axes[0].set_xlabel("Length")
  10. axes[0].set_ylabel("Count")
  11. # 绘制摘要的长度分布直方图
  12. axes[1].hist(s_len, bins=20, color="C0", edgecolor="C0")
  13. axes[1].set_title("Summary Token Length")
  14. axes[1].set_xlabel("Length")
  15. # 调整子图布局,使其更加紧凑
  16. plt.tight_layout()
  17. # 显示绘制的图形
  18. plt.show()

αποτέλεσμα λειτουργίας:

(Προσωρινό σφάλμα αναφέρεται εδώ:

TypeError: Couldn't build proto file into descriptor pool: duplicate file name sentencepiece_model.proto

, τα αποτελέσματα εκτέλεσης για αναφορά χρησιμοποιώντας παραδείγματα είναι τα εξής)

Μπορούμε να δούμε ότι οι περισσότερες συνομιλίες είναι πολύ πιο σύντομες από τα άρθρα του CNN/DailyMail, με περίπου 100 έως 200 διακριτικά το καθένα. Ομοίως, οι περιλήψεις είναι πολύ πιο σύντομες, περίπου 20 έως 40 μάρκες (το ίδιο μήκος με το μέσο tweet).

Ας θυμηθούμε πρώτα αυτά τα αποτελέσματα, θα τα χρησιμοποιήσουμε αργότερα. Πρώτα, πρέπει να κάνουμε tokenize το σύνολο δεδομένων. Ορίσαμε τη μέγιστη διάρκεια διαλόγου και περίληψης σε 1024 και 128 αντίστοιχα:

  1. def convert_examples_to_features(example_batch):
  2. """
  3. 将示例批处理转换为模型输入特征。
  4. Args:
  5. - example_batch (dict): 包含对话和摘要的示例批处理字典。
  6. Returns:
  7. - dict: 包含转换后特征的字典,包括输入编码和目标编码。
  8. """
  9. # 对对话文本进行编码处理,生成输入编码
  10. input_encodings = tokenizer(example_batch["dialogue"], max_length=1024,
  11. truncation=True)
  12. # 使用目标编码器处理摘要文本,生成目标编码
  13. with tokenizer.as_target_tokenizer():
  14. target_encodings = tokenizer(example_batch["summary"], max_length=128,
  15. truncation=True)
  16. # 返回包含输入编码、目标标签和注意力掩码的字典
  17. return {
  18. "input_ids": input_encodings["input_ids"],
  19. "attention_mask": input_encodings["attention_mask"],
  20. "labels": target_encodings["input_ids"]
  21. }
  22. # 使用 map 方法将 SamSum 数据集转换为 PyTorch 格式
  23. dataset_samsum_pt = dataset_samsum.map(convert_examples_to_features,
  24. batched=True)
  25. # 设置数据集格式为 Torch 张量类型,并指定列名
  26. columns = ["input_ids", "labels", "attention_mask"]
  27. dataset_samsum_pt.set_format(type="torch", columns=columns)

αποτέλεσμα λειτουργίας:

(Προσωρινό σφάλμα αναφέρεται εδώ:

TypeError: Couldn't build proto file into descriptor pool: duplicate file name sentencepiece_model.proto)

Υπάρχει ένα νέο πράγμα στο βήμα του tokenization: το περιβάλλον tokenizer.as_target_tokenizer(). Ορισμένα μοντέλα απαιτούν ειδικά διακριτικά στην είσοδο του αποκωδικοποιητή, επομένως είναι σημαντικό να διαχωρίσετε τα βήματα δημιουργίας διακριτικών για τις εισόδους κωδικοποιητή και αποκωδικοποιητή. Μέσα σε μια δήλωση με (που ονομάζεται διαχείριση περιβάλλοντος), το tokenizer γνωρίζει ότι κάνει tokenizing για τον αποκωδικοποιητή.

Τώρα, πρέπει να δημιουργήσουμε τον οργανωτή δεδομένων. Στις περισσότερες περιπτώσεις μπορούμε να χρησιμοποιήσουμε τον προεπιλεγμένο κολλητή, ο οποίος συλλέγει όλους τους τανυστές σε μια παρτίδα και απλώς τους στοιβάζει. Για την εργασία σύνοψης, δεν χρειάζεται μόνο να στοιβάξουμε τις εισόδους, αλλά και να προετοιμάσουμε τους στόχους στην πλευρά του αποκωδικοποιητή. Το PEGASUS είναι ένας μετασχηματιστής κωδικοποιητή-αποκωδικοποιητή και επομένως έχει μια κλασική αρχιτεκτονική seq2seq. Σε μια ρύθμιση seq2seq, μια κοινή προσέγγιση είναι η εφαρμογή δασκάλου εξαναγκασμού στον αποκωδικοποιητή. Κατά τη χρήση αυτής της στρατηγικής, ο αποκωδικοποιητής λαμβάνει διακριτικά εισόδου (όμοια με ένα μοντέλο μόνο για αποκωδικοποιητή, όπως το GPT-2), τα οποία μετατοπίζονται μία θέση προς τα δεξιά από τον σχολιασμό, επιπλέον της εξόδου του κωδικοποιητή. Επομένως, κατά την πρόβλεψη του επόμενου διακριτικού, ο αποκωδικοποιητής θα λάβει ως είσοδο την πραγματική τιμή μετατοπισμένη μία θέση προς τα δεξιά, όπως φαίνεται στον παρακάτω πίνακα:

  1. # 示例文本序列和标签生成过程
  2. text = ['PAD', 'Transformers', 'are', 'awesome', 'for', 'text', 'summarization']
  3. # 初始化存储每步结果的列表
  4. rows = []
  5. # 循环生成每步的数据行
  6. for i in range(len(text)-1):
  7. rows.append({
  8. 'step': i+1, # 步骤号,从1开始
  9. 'decoder_input': text[:i+1], # 解码器输入序列,从文本开始到当前位置
  10. 'label': text[i+1] # 标签,当前位置的下一个词
  11. })
  12. # 创建数据帧,并以步骤号作为索引
  13. pd.DataFrame(rows).set_index('step')

αποτέλεσμα λειτουργίας:

βήμααποκωδικοποιητής_εισόδουεπιγραφή
1[ΜΠΛΟΚ]Μετασχηματιστές
2[PAD, Transformers]είναι
3[PAD, Transformers, είναι]φοβερός
4[Το PAD, οι μετασχηματιστές, είναι υπέροχοι]Για
5[Το PAD, οι μετασχηματιστές, είναι υπέροχοι, για]κείμενο
6[Το PAD, οι μετασχηματιστές, είναι φοβερό, για, κείμενο]συνόψιση

Το μετακινούμε μια θέση προς τα δεξιά, έτσι ώστε ο αποκωδικοποιητής να βλέπει μόνο τον προηγούμενο σωστό σχολιασμό, όχι τους τρέχοντες ή μελλοντικούς σχολιασμούς. Αρκεί μόνο η μετατόπιση, επειδή ο αποκωδικοποιητής έχει έναν καλυμμένο μηχανισμό αυτοπροσοχής που καλύπτει όλες τις τρέχουσες και μελλοντικές εισόδους.

Επομένως, κατά την προετοιμασία της παρτίδας, ορίζουμε την είσοδο στον αποκωδικοποιητή μετακινώντας τον σχολιασμό μία θέση προς τα δεξιά. Στη συνέχεια, διασφαλίζουμε ότι τα διακριτικά πλήρωσης στη συνάρτηση απώλειας αγνοούνται ορίζοντας τα σε -100 στον σχολιασμό. Στην πραγματικότητα, δεν χρειάζεται να εκτελέσουμε αυτά τα βήματα με μη αυτόματο τρόπο, επειδή το DataCollatorForSeq2Seq τα κάνει όλα για εμάς:

  1. # 导入 Seq2Seq 数据集整理器模块
  2. from transformers import DataCollatorForSeq2Seq
  3. # 创建 Seq2Seq 数据集整理器实例
  4. seq2seq_data_collator = DataCollatorForSeq2Seq(tokenizer, model=model)

Στη συνέχεια, ως συνήθως, δημιουργήσαμε ένα TrainingArguments για εκπαίδευση:

  1. # 导入训练参数和训练器模块
  2. from transformers import TrainingArguments, Trainer
  3. # 定义训练参数
  4. training_args = TrainingArguments(
  5. output_dir='pegasus-samsum', # 模型输出目录
  6. num_train_epochs=1, # 训练的轮数
  7. warmup_steps=500, # 学习率预热步数
  8. per_device_train_batch_size=1, # 每个设备的训练批次大小
  9. per_device_eval_batch_size=1, # 每个设备的评估批次大小
  10. weight_decay=0.01, # 权重衰减率
  11. logging_steps=10, # 训练日志记录步数
  12. push_to_hub=True, # 是否推送到模型中心
  13. evaluation_strategy='steps', # 评估策略
  14. eval_steps=500, # 评估步数间隔
  15. save_steps=1e6, # 模型保存步数间隔
  16. gradient_accumulation_steps=16 # 梯度累积步数
  17. )

Η διαφορά από τις προηγούμενες ρυθμίσεις είναι ότι αυτή τη φορά υπάρχει μια νέα παράμετρος gradient_accumulation_steps. Επειδή το μοντέλο είναι πολύ μεγάλο, πρέπει να ορίσουμε το μέγεθος παρτίδας σε 1. Ωστόσο, τα μεγέθη παρτίδων που είναι πολύ μικρά μπορούν να επηρεάσουν τη σύγκλιση. Για να λύσουμε αυτό το πρόβλημα, μπορούμε να χρησιμοποιήσουμε ένα έξυπνο κόλπο που ονομάζεται συσσώρευση κλίσης. Όπως υποδηλώνει το όνομα, αντί να υπολογίζουμε τις διαβαθμίσεις για ολόκληρη την παρτίδα ταυτόχρονα, υπολογίζουμε και συγκεντρώνουμε τις διαβαθμίσεις σε παρτίδες. Όταν έχουμε συγκεντρώσει αρκετές διαβαθμίσεις, εκτελούμε ένα βήμα βελτιστοποίησης. Αυτό είναι φυσικά πιο αργό από το να τα κάνουμε όλα με μία κίνηση, αλλά μας εξοικονομεί πολλή μνήμη GPU.

Τώρα, συνδεόμαστε στο Hugging Face για να μπορέσουμε να ωθήσουμε το μοντέλο στο Hub μετά την προπόνηση:

  1. from huggingface_hub import notebook_login
  2. notebook_login()

αποτέλεσμα λειτουργίας:

Τώρα έχουμε όλα όσα χρειαζόμαστε για την προετοιμασία του εκπαιδευτή, συμπεριλαμβανομένων του μοντέλου, του tokenizer, των παραμέτρων εκπαίδευσης, των οργανωτών δεδομένων και των συνόλων δεδομένων εκπαίδευσης και αξιολόγησης:

  1. from transformers import TrainingArguments, Trainer
  2. # 创建一个 Trainer 实例用于训练序列到序列模型。
  3. trainer = Trainer(
  4. model=model, # 要训练的序列到序列模型
  5. args=training_args, # 定义的训练参数
  6. tokenizer=tokenizer, # 用于预处理输入数据的分词器
  7. data_collator=seq2seq_data_collator, # 用于批处理数据的数据整理器
  8. train_dataset=dataset_samsum_pt["train"], # 训练数据集
  9. eval_dataset=dataset_samsum_pt["validation"] # 评估数据集
  10. )

αποτέλεσμα λειτουργίας:

(Προσωρινό σφάλμα αναφέρεται εδώ:

TypeError: Couldn't build proto file into descriptor pool: duplicate file name sentencepiece_model.proto)

Είμαστε έτοιμοι να προπονηθούμε. Μόλις ολοκληρωθεί η εκπαίδευση, μπορούμε να εκτελέσουμε τη συνάρτηση αξιολόγησης απευθείας στο σύνολο δοκιμών για να δούμε πώς απέδωσε το μοντέλο:

  1. from transformers import TrainingArguments, Trainer
  2. # 开始训练模型
  3. trainer.train()
  4. # 使用评估函数评估 Pegasus 模型的摘要质量
  5. score = evaluate_summaries_pegasus(
  6. dataset_samsum["test"], rouge_metric, trainer.model, tokenizer,
  7. batch_size=2, column_text="dialogue", column_summary="summary")
  8. # 提取 ROUGE 指标结果
  9. rouge_dict = dict((rn, score[rn].mid.fmeasure) for rn in rouge_names)
  10. # 创建 DataFrame 显示 ROUGE 指标
  11. pd.DataFrame(rouge_dict, index=[f"pegasus"])

αποτέλεσμα λειτουργίας:

(Προσωρινό σφάλμα αναφέρεται εδώ:

TypeError: Couldn't build proto file into descriptor pool: duplicate file name sentencepiece_model.proto

, τα αποτελέσματα εκτέλεσης για αναφορά χρησιμοποιώντας παραδείγματα είναι τα εξής)

 ρουζ1ρουζ2rougeLrougeLsum
Πήγασος0.427610.2005710.3406480.340738

Μπορούμε να δούμε ότι η βαθμολογία ROUGE έχει βελτιωθεί σημαντικά σε σχέση με το μοντέλο χωρίς τελειοποίηση, επομένως, παρόλο που το προηγούμενο μοντέλο ήταν επίσης εκπαιδευμένο για σύνοψη, δεν προσαρμόστηκε καλά στον νέο τομέα. Ας προωθήσουμε το μοντέλο μας στο Hub:

  1. # 将训练完成的模型推送到 Hub 上
  2. trainer.push_to_hub("Training complete!")

Στη συνέχεια θα χρησιμοποιήσουμε αυτό το μοντέλο για να δημιουργήσουμε κάποιες περιλήψεις για εμάς.

Μπορείτε επίσης να αξιολογήσετε τα αποτελέσματα που δημιουργούνται ως μέρος ενός βρόχου εκπαίδευσης: χρησιμοποιήστε την επέκταση TrainingArguments που ονομάζεται Seq2SeqTrainingArguments και καθορίστε predict_with_generate=True. Περάστε το σε έναν αποκλειστικό Εκπαιδευτή που ονομάζεται Seq2SeqTrainer, ο οποίος χρησιμοποιεί τη συνάρτηση generate() αντί για ένα εμπρός πέρασμα του μοντέλου για να δημιουργήσει προβλέψεις για αξιολόγηση. Δοκίμασε το!

3. ΔημιουργήστεσωστάΜΙΛΑ ρεδιαλέγωθέλω

Εξετάζοντας τις βαθμολογίες απώλειας και ROUGE, το μοντέλο φαίνεται να παρουσιάζει σημαντική βελτίωση σε σχέση με το αρχικό μοντέλο που εκπαιδεύτηκε μόνο στο CNN/DailyMail. Μια σύνοψη που δημιουργείται από ένα δείγμα στο σύνολο δοκιμής μοιάζει με αυτό:

  1. import transformers
  2. # 设置transformers的日志级别为错误,以减少输出日志
  3. transformers.logging.set_verbosity_error()
  4. # 定义生成摘要时的参数
  5. gen_kwargs = {"length_penalty": 0.8, "num_beams": 8, "max_length": 128}
  6. # 从测试集中选择一个示例
  7. sample_text = dataset_samsum["test"][0]["dialogue"]
  8. reference = dataset_samsum["test"][0]["summary"]
  9. # 使用预训练的pegasus-samsum模型创建摘要管道
  10. pipe = pipeline("summarization", model="transformersbook/pegasus-samsum")
  11. # 输出对话和参考摘要
  12. print("Dialogue:")
  13. print(sample_text)
  14. print("nReference Summary:")
  15. print(reference)
  16. # 使用模型生成摘要并输出
  17. print("nModel Summary:")
  18. print(pipe(sample_text, **gen_kwargs)[0]["summary_text"])

αποτέλεσμα λειτουργίας:

Dialogue:
Hannah: Hey, do you have Betty's number?
Amanda: Lemme check
Hannah: <file_gif>
Amanda: Sorry, can't find it.
Amanda: Ask Larry
Amanda: He called her last time we were at the park together
Hannah: I don't know him well
Hannah: <file_gif>
Amanda: Don't be shy, he's very nice
Hannah: If you say so..
Hannah: I'd rather you texted him
Amanda: Just text him 🙂
Hannah: Urgh.. Alright
Hannah: Bye
Amanda: Bye bye

Reference Summary:
Hannah needs Betty's number but Amanda doesn't have it. She needs to contact
Larry.

Model Summary:
Amanda can't find Betty's number. Larry called Betty last time they were at the
park together. Hannah wants Amanda to text Larry instead of calling Betty.

Αυτό μοιάζει πολύ με μια περίληψη αναφοράς. Φαίνεται ότι το μοντέλο έχει μάθει να συνθέτει συνομιλίες σε περιλήψεις αντί να εξάγει απλώς αποσπάσματα. Τώρα για την τελική δοκιμή: Πώς λειτουργεί το μοντέλο σε προσαρμοσμένες εισόδους;

  1. # 自定义对话示例
  2. custom_dialogue = """
  3. Thom: Hi guys, have you heard of transformers?
  4. Lewis: Yes, I used them recently!
  5. Leandro: Indeed, there is a great library by Hugging Face.
  6. Thom: I know, I helped build it ;)
  7. Lewis: Cool, maybe we should write a book about it. What do you think?
  8. Leandro: Great idea, how hard can it be?!
  9. Thom: I am in!
  10. Lewis: Awesome, let's do it together!
  11. """
  12. # 使用预训练的pegasus-samsum模型生成摘要,并输出摘要结果
  13. print(pipe(custom_dialogue, **gen_kwargs)[0]["summary_text"])

αποτέλεσμα λειτουργίας:

Thom and Lewis wanted to write a book about transformers. They came up with the idea with the help of Hugging Face's Leandro. The book will be called "Transformers: The Power of Transformers" and will be published in 2015. The project is currently in the planning stages.

Η σύνοψη προσαρμοσμένης συνομιλίας που δημιουργήθηκε έχει νόημα. Κάνει καλή δουλειά να συνοψίζει αυτό που όλοι στη συζήτηση ήθελαν να γράψουν ένα βιβλίο μαζί, αντί να εξάγουν απλώς μια πρόταση. Για παράδειγμα, συνδυάζει τις σειρές 3 και 4 σε έναν λογικό συνδυασμό.