Πώς να εκπαιδεύσετε ένα μοντέλο BERT από το Scratch

Κόμβος πηγής: 1013329

Πώς να εκπαιδεύσετε ένα μοντέλο BERT από το Scratch

Γνωρίστε τον Ιταλό ξάδερφο του BERT, FiliBERTo.


By Τζέιμς Μπριγκς, Επιστήμονας δεδομένων



BERT, αλλά στην Ιταλία — εικόνα από συγγραφέα

 

Πολλά από τα άρθρα μου έχουν επικεντρωθεί στο BERT — το μοντέλο που ήρθε και κυριάρχησε στον κόσμο της επεξεργασίας φυσικής γλώσσας (NLP) και σηματοδότησε μια νέα εποχή για τα γλωσσικά μοντέλα.

Για όσους από εσάς μπορεί να μην έχετε χρησιμοποιήσει μοντέλα μετασχηματιστών (π.χ. τι είναι το BERT), η διαδικασία μοιάζει κάπως έτσι:

  • pip install transformers
  • Αρχικοποιήστε ένα προεκπαιδευμένο μοντέλο μετασχηματιστών — from_pretrained.
  • Δοκιμάστε το σε ορισμένα δεδομένα.
  • Ίσως βελτιστοποιήστε το μοντέλο (εκπαιδεύστε το λίγο ακόμα).

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

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



Μερικά σχόλια που ρωτούν για μη αγγλικά μοντέλα BERT

 

Έτσι, σε αυτό το άρθρο, θα διερευνήσουμε τα βήματα που πρέπει να κάνουμε για να δημιουργήσουμε το δικό μας μοντέλο μετασχηματιστή — συγκεκριμένα μια περαιτέρω ανεπτυγμένη έκδοση του BERT, που ονομάζεται RoBERTa.

Μια επισκόπηση

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

  • Λήψη των δεδομένων
  • Κατασκευή ενός tokenizer
  • Δημιουργία αγωγού εισόδου
  • Εκπαίδευση του μοντέλου

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

Λήψη των δεδομένων

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



Περιήγηση βίντεο για τη λήψη δεδομένων OSCAR χρησιμοποιώντας τη βιβλιοθήκη συνόλων δεδομένων του HuggingFace

 

Και, αν υπάρχει κάτι που έχουμε άφθονο στο Διαδίκτυο - είναι μη δομημένα δεδομένα κειμένου.

Ένα από τα μεγαλύτερα σύνολα δεδομένων στον τομέα του κειμένου που έχει αφαιρεθεί από το διαδίκτυο είναι το σύνολο δεδομένων OSCAR.

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

Δυστυχώς, η μόνη γλώσσα που μπορώ να μιλήσω με οποιονδήποτε βαθμό ικανότητας είναι τα αγγλικά — αλλά η κοπέλα μου είναι Ιταλίδα, και έτσι αυτή — η Λόρα, θα αξιολογήσει τα αποτελέσματα του ιταλόφωνου μοντέλου BERT μας — FiliBERTo.

Έτσι, για να κατεβάσουμε το ιταλικό τμήμα του συνόλου δεδομένων OSCAR θα χρησιμοποιήσουμε το HuggingFace datasets βιβλιοθήκη — με την οποία μπορούμε να εγκαταστήσουμε pip install datasets. Στη συνέχεια κάνουμε λήψη του OSCAR_IT με:

Ας ρίξουμε μια ματιά στο dataset αντικείμενο.

Τέλεια, τώρα ας αποθηκεύσουμε τα δεδομένα μας σε μια μορφή που μπορούμε να χρησιμοποιήσουμε κατά την κατασκευή του tokenizer μας. Πρέπει να δημιουργήσουμε ένα σύνολο αρχείων απλού κειμένου που να περιέχει μόνο το text χαρακτηριστικό από το σύνολο δεδομένων μας και θα χωρίσουμε το καθένα δείγμα χρησιμοποιώντας μια νέα γραμμή n.

Πάνω στο δικό μας data/text/oscar_it κατάλογο θα βρούμε:


Ένα στιγμιότυπο οθόνης που εμφανίζει ένα παράθυρο του Windows Explorer γεμάτο με αρχεία .txt — που αντιπροσωπεύει τα δεδομένα OSCAR απλού κειμένου
Ο κατάλογος που περιέχει τα αρχεία OSCAR απλού κειμένου

 

Κατασκευή Tokenizer

 
 
Επόμενο είναι το tokenizer! Όταν χρησιμοποιούμε μετασχηματιστές, συνήθως φορτώνουμε έναν tokenizer, μαζί με το αντίστοιχο μοντέλο μετασχηματιστή του — ο tokenizer είναι ένα βασικό συστατικό στη διαδικασία.



Περιήγηση βίντεο για τη δημιουργία προσαρμοσμένου tokenizer μας

 

Κατά την κατασκευή του tokenizer μας, θα το τροφοδοτήσουμε με όλα τα δεδομένα OSCAR μας, θα προσδιορίσουμε το μέγεθος του λεξιλογίου μας (αριθμός των διακριτικών στο tokenizer) και τυχόν ειδικά διακριτικά.

Τώρα, τα ειδικά διακριτικά RoBERTa μοιάζουν με αυτό:

Έτσι, φροντίζουμε να τα συμπεριλάβουμε στο special_tokens παράμετρος του tokenizer μας train κλήση μεθόδου.

Το tokenizer μας είναι τώρα έτοιμο και μπορούμε να το αποθηκεύσουμε για μελλοντική χρήση:

Τώρα έχουμε δύο αρχεία που ορίζουν το νέο μας FiliBERTo Tokenizer:

  • merges.txt — εκτελεί την αρχική αντιστοίχιση κειμένου σε διακριτικά
  • vocab.json — αντιστοιχίζει τα διακριτικά σε αναγνωριστικά διακριτικών

Και με αυτά, μπορούμε να προχωρήσουμε στην προετοιμασία του tokenizer μας, ώστε να μπορούμε να το χρησιμοποιήσουμε όπως θα χρησιμοποιούσαμε οποιοδήποτε άλλο from_pretrained tokenizer.

Εκκίνηση του Tokenizer

 
 
Αρχικά αρχικοποιούμε το tokenizer χρησιμοποιώντας τα δύο αρχεία που δημιουργήσαμε πριν — χρησιμοποιώντας ένα απλό from_pretrained:

Τώρα το tokenizer μας είναι έτοιμο, μπορούμε να δοκιμάσουμε να κωδικοποιήσουμε κάποιο κείμενο με αυτό. Κατά την κωδικοποίηση χρησιμοποιούμε τις ίδιες δύο μεθόδους που θα χρησιμοποιούσαμε συνήθως, encode και  encode_batch.

Από το αντικείμενο κωδικοποιήσεων tokens θα εξάγουμε το input_ids και  attention_mask τανυστές για χρήση με το FiliBERTo.

Δημιουργία του αγωγού εισόδου

 
 
Ο αγωγός εισαγωγής της εκπαιδευτικής μας διαδικασίας είναι το πιο περίπλοκο μέρος της όλης διαδικασίας. Συνίσταται στο να λαμβάνουμε τα ακατέργαστα δεδομένα εκπαίδευσης OSCAR, να τα μετατρέπουμε και να τα φορτώνουμε σε α DataLoader έτοιμο για προπόνηση.



Περιήγηση βίντεο του αγωγού εισόδου MLM

 

Προετοιμασία των Δεδομένων

 
 
Θα ξεκινήσουμε με ένα μόνο δείγμα και θα επεξεργαστούμε τη λογική προετοιμασίας.

Πρώτα, πρέπει να ανοίξουμε το αρχείο μας — τα ίδια αρχεία που αποθηκεύσαμε . Txt αρχεία νωρίτερα. Διαχωρίζουμε το καθένα με βάση χαρακτήρες νέας γραμμής n καθώς αυτό υποδεικνύει τα μεμονωμένα δείγματα.

Στη συνέχεια κωδικοποιούμε τα δεδομένα μας χρησιμοποιώντας το tokenizer — φροντίζοντας να συμπεριλάβετε βασικές παραμέτρους όπως max_lengthpadding, να truncation.

Και τώρα μπορούμε να προχωρήσουμε στη δημιουργία των τανυστών μας — θα εκπαιδεύσουμε το μοντέλο μας μέσω μοντελοποίησης με μάσκα (MLM). Άρα, χρειαζόμαστε τρεις τανυστές:

  • input_ids - μας token_ids με ~ 15% των μαρκών καλυμμένα χρησιμοποιώντας το διακριτικό μάσκας <mask>.
  • μάσκα προσοχής — ένας τανυστής του 1s και 0s, σημειώνοντας τη θέση των «πραγματικών» κουπονιών/κουμπιών πλήρωσης — που χρησιμοποιούνται στους υπολογισμούς προσοχής.
  • ετικέτες - μας token_ids με Όχι. συγκάλυψη.

Εάν δεν είστε εξοικειωμένοι με το MLM, το εξήγησα εδώ.

Τα attention_mask και  labels Οι τανυστές απλώς εξάγονται από το δικό μας batch. ο input_ids Ωστόσο, οι τανυστές απαιτούν περισσότερη προσοχή, για αυτόν τον τανυστή καλύπτουμε το ~15% των διακριτικών — αποδίδοντάς τους το αναγνωριστικό διακριτικού 3.

Στην τελική έξοδο, μπορούμε να δούμε μέρος ενός κωδικοποιημένου input_ids τανύων μύς. Το πρώτο αναγνωριστικό διακριτικού είναι 1 - ο [CLS] ένδειξη. Διάστικτη γύρω από τον τανυστήρα έχουμε πολλά 3 αναγνωριστικά διακριτικών — αυτά είναι που προστέθηκαν πρόσφατα [MASK] μάρκες.

Δημιουργία του DataLoader

 
 
Στη συνέχεια, ορίζουμε το δικό μας Dataset class — την οποία χρησιμοποιούμε για να αρχικοποιήσουμε τους τρεις κωδικοποιημένους τανυστές μας ως PyTorch torch.utils.data.Dataset αντικείμενα.

Τέλος, το δικό μας dataset φορτώνεται σε ένα PyTorch DataLoader αντικείμενο — το οποίο χρησιμοποιούμε για να φορτώσουμε τα δεδομένα μας στο μοντέλο μας κατά τη διάρκεια της εκπαίδευσης.

Εκπαίδευση του Μοντέλου

 
 
Χρειαζόμαστε δύο πράγματα για την προπόνηση, το δικό μας DataLoader και ένα μοντέλο. ο DataLoader έχουμε — αλλά κανένα μοντέλο.



Αρχικοποίηση του μοντέλου

 
 
Για την εκπαίδευση, χρειαζόμαστε ένα ακατέργαστο (όχι προεκπαιδευμένο) BERTLMHeadModel. Για να το δημιουργήσουμε, πρέπει πρώτα να δημιουργήσουμε ένα αντικείμενο διαμόρφωσης RoBERTa για να περιγράψουμε τις παραμέτρους με τις οποίες θα θέλαμε να αρχικοποιήσουμε το FiliBERTo.

Στη συνέχεια, εισάγουμε και αρχικοποιούμε το μοντέλο RoBERTa με μια κεφαλή μοντελοποίησης γλώσσας (LM).

Προετοιμασία Εκπαίδευσης

 
 
Πριν προχωρήσουμε στην προπόνησή μας, πρέπει να ρυθμίσουμε μερικά πράγματα. Αρχικά, ρυθμίσαμε τη χρήση GPU/CPU. Στη συνέχεια, ενεργοποιούμε τη λειτουργία εκπαίδευσης του μοντέλου μας — και, τέλος, αρχικοποιούμε το εργαλείο βελτιστοποίησης μας.

Εκπαίδευση

 
 
Επιτέλους — χρόνος προπόνησης! Προπονούμαστε όπως συνήθως όταν προπονούμαστε μέσω PyTorch.

Αν πάμε στο Tensorboard, θα βρούμε την απώλειά μας με την πάροδο του χρόνου - φαίνεται πολλά υποσχόμενο.



Απώλεια / χρόνος — πολλαπλές προπονήσεις έχουν συνδυαστεί σε αυτό το γράφημα

 

Το πραγματικό τεστ

 
 
Τώρα είναι η ώρα για την πραγματική δοκιμή. Δημιουργήσαμε έναν αγωγό MLM — και ζητάμε από τη Laura να αξιολογήσει τα αποτελέσματα. Μπορείτε να παρακολουθήσετε την κριτική του βίντεο στο 22:44 εδώ:



Αρχικοποιούμε πρώτα το α pipeline αντικείμενο, χρησιμοποιώντας το 'fill-mask' διαφωνία. Στη συνέχεια, ξεκινήστε τη δοκιμή του μοντέλου μας ως εξής:

«ciao Ελάτε va;» είναι η σωστή απάντηση! Αυτό είναι τόσο προηγμένο όσο τα ιταλικά μου - οπότε, ας το παραδώσουμε στη Laura.

Αρχίζουμε με «Μπουοντζιόρνο, έλα βα;» - ή "καλή σου μέρα πώς είσαι?":

Η πρώτη απάντηση, "buongiorno, chi va?" σημαίνει "καλημέρα, ποιος είναι εκεί;" — π.χ. παράλογο. Όμως, η δεύτερη απάντησή μας είναι σωστή!

Στη συνέχεια, μια λίγο πιο δύσκολη φράση, «ciao, dove ci incontriamo oggi pomeriggio;» - ή «Γεια, πού θα βρεθούμε σήμερα το απόγευμα;»:

Και επιστρέφουμε μερικά ακόμη θετικά αποτελέσματα:

✅ "hi, where do we see each other this afternoon?"
✅ "hi, where do we meet this afternoon?"
❌ "hi, where here we are this afternoon?"
✅ "hi, where are we meeting this afternoon?"
✅ "hi, where do we meet this afternoon?"

Τέλος, μια ακόμη, πιο σκληρή πρόταση, «Cosa sarebbe successo se avessimo scelto un altro giorno;» — ή «τι θα είχε συμβεί αν είχαμε επιλέξει άλλη μέρα;»:

Επιστρέφουμε μερικές καλές ακόμα καλές απαντήσεις και εδώ:

✅ "what would have happened if we had chosen another day?"
✅ "what would have happened if I had chosen another day?"
✅ "what would have happened if they had chosen another day?"
✅ "what would have happened if you had chosen another day?"
❌ "what would have happened if another day was chosen?"

Συνολικά, φαίνεται ότι το μοντέλο μας πέρασε τις δοκιμές της Laura — και τώρα έχουμε ένα ικανό μοντέλο ιταλικής γλώσσας που ονομάζεται FiliBERTo!

Αυτό είναι όλο για αυτήν την πορεία εκπαίδευσης ενός μοντέλου BERT από την αρχή!

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

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

Ευχαριστώ για την ανάγνωση!

 

Έκπτωση 70%! Επεξεργασία φυσικής γλώσσας: NLP με μετασχηματιστές σε Python

Τα μοντέλα μετασχηματιστών είναι το de-facto πρότυπο στο σύγχρονο NLP. Έχουν αποδειχθεί ως οι πιο εκφραστικοί…
 

*Όλες οι εικόνες είναι του συγγραφέα εκτός αν αναφέρεται διαφορετικά

 
Bio: Τζέιμς Μπριγκς είναι επιστήμονας δεδομένων που ειδικεύεται στην επεξεργασία φυσικών γλωσσών και εργάζεται στον χρηματοοικονομικό τομέα, με έδρα το Λονδίνο, Ηνωμένο Βασίλειο. Είναι επίσης ανεξάρτητος μέντορας, συγγραφέας και δημιουργός περιεχομένου. Μπορείτε να επικοινωνήσετε με τον συντάκτη μέσω email (jamescalam94@gmail.com).

Πρωτότυπο. Αναδημοσιεύτηκε με άδεια.

Συγγενεύων:

Πηγή: https://www.kdnuggets.com/2021/08/train-bert-model-scratch.html

Σφραγίδα ώρας:

Περισσότερα από KDnuggets