Πώς να εκπαιδεύσετε ένα μοντέλο 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
κατάλογο θα βρούμε:
Ο κατάλογος που περιέχει τα αρχεία 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_length
, padding
, να 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
- "
- &
- Όλα
- analytics
- γύρω
- άρθρο
- εμπορεύματα
- αυτόματη
- χτίζω
- Κτίριο
- κλήση
- σχόλια
- συστατικό
- περιεχόμενο
- δημιουργία
- δημιουργός
- ημερομηνία
- επιστημονικά δεδομένα
- επιστήμονας δεδομένων
- ημέρα
- βαθιά μάθηση
- Διευθυντής
- ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ
- μηχανικός
- Μηχανικοί
- Αγγλικά
- Χαρακτηριστικό
- Τελικά
- χρηματοδότηση
- Όνομα
- μορφή
- ανεξάρτητος
- πλήρη
- καλός
- GPU
- εξαιρετική
- κεφάλι
- εδώ
- Πως
- Πώς να
- HTTPS
- τεράστιος
- εικόνα
- Internet
- IT
- Ιταλία
- Κλειδί
- Γλώσσα
- Γλώσσες
- ΜΑΘΑΊΝΩ
- μάθηση
- Βιβλιοθήκη
- φορτίο
- Λονδίνο
- μάθηση μηχανής
- Κατασκευή
- χάρτες
- μάσκα
- ML
- μοντέλο
- μοντελοποίηση
- μετακινήσετε
- Φυσική γλώσσα
- Επεξεργασία φυσικής γλώσσας
- nlp
- διαδικτυακά (online)
- ανοίξτε
- ανοικτού κώδικα
- ΑΛΛΑ
- Απλό κείμενο
- παίχτης
- Αφθονία
- σχέδιο
- pytorch
- Ακατέργαστος
- Αποτελέσματα
- ανασκόπηση
- Επιστήμη
- επιστήμονες
- σειρά
- Μέγεθος
- So
- διαίρεση
- Εκκίνηση
- κατάστημα
- ιστορίες
- δοκιμή
- Δοκιμές
- δοκιμές
- ώρα
- ένδειξη
- κουπόνια
- κορυφή
- Εκπαίδευση
- μετασχηματίζοντας
- Uk
- UN
- us
- περιπτώσεις χρήσης
- Βίντεο
- Δες
- Ο ΟΠΟΊΟΣ
- παράθυρα
- εντός
- Εργασία
- κόσμος
- συγγραφέας
- X
- YouTube