Δημιουργία ταξινομητή κειμένου τελευταίας τεχνολογίας με χρήση HuggingFace και Tensorflow

Δημιουργία ταξινομητή κειμένου τελευταίας τεχνολογίας με χρήση HuggingFace και Tensorflow

Oktober 1, 2022 0 Von admin

Αυτό το άρθρο δημοσιεύτηκε ως μέρος του Data Science Blogathon.

Εισαγωγή

Σε αυτό το ιστολόγιο, ας εξερευνήσουμε πώς να εκπαιδεύσουμε έναν ταξινομητή κειμένου τελευταίας τεχνολογίας χρησιμοποιώντας τα μοντέλα και τα δεδομένα από τη διάσημη βιβλιοθήκη HuggingFace Transformers. Θα δούμε πώς να φορτώνουμε το σύνολο δεδομένων, να εκτελούμε επεξεργασία δεδομένων, π.χ. tokenisation και στη συνέχεια να χρησιμοποιούμε τα επεξεργασμένα αναγνωριστικά εισόδου για να τελειοποιήσουμε τα προεκπαιδευμένα μοντέλα γλώσσας που είναι διαθέσιμα στο HuggingFace Hub. Ας χρησιμοποιήσουμε τη βιβλιοθήκη TensorFlow και HuggingFace για να εκπαιδεύσουμε το μοντέλο ταξινομητή κειμένου.

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

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

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

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

NLP|  ταξινομητής κειμένου

Σχετικά με το σύνολο δεδομένων

Θα χρησιμοποιήσουμε το tweet_eval σύνολο δεδομένων από το κέντρο αγκαλιάς προσώπου. Θα φορτώσουμε το σύνολο δεδομένων χρησιμοποιώντας το σύνολα δεδομένων βιβλιοθήκη. Αυτό το σύνολο δεδομένων αποτελείται από επτά ετερογενείς εργασίες στο Twitter, όλες πλαισιωμένες ως ταξινόμηση tweet πολλαπλών κλάσεων. Αυτές οι εργασίες περιλαμβάνουν – ειρωνεία, μίσος, προσβλητικό, στάση, emoji, συναίσθημα και συναίσθημα. Θα χρησιμοποιήσουμε το συναισθημα έργο του συνόλου δεδομένων. Πρέπει να ταξινομήσουμε κάθε ένα από τα κείμενα στις ακόλουθες κατηγορίες: θυμό, χαρά, αισιοδοξία και λύπη.

Πριν προχωρήσουμε, ας εγκαταστήσουμε μερικές βιβλιοθήκες που θα χρειαζόμασταν.

Χρήση συνόλων δεδομένων HuggingFace

Ας ξεκινήσουμε εγκαθιστώντας το μετασχηματιστές και το σύνολα δεδομένων βιβλιοθήκες,

!pip install transformers[sentencepiece] -q 
!pip install datasets -q
Now let's download the dataset from the hub using the datasets library.
from datasets import load_dataset
dataset = load_dataset("tweet_eval", "emotion")

Ο παραπάνω κώδικας θα κατεβάσει το σύνολο δεδομένων που ονομάζεται „tweet_eval“ με την εργασία/υποκατηγορία „συναισθημα“. Μπορούμε να εκτυπώσουμε και να ελέγξουμε το σύνολο δεδομένων,

# Print and check some details about the dataset
print(dataset)

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

# Select the training set from the dataset
train_ds = dataset['train']
print(train_ds)

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

# More details about the features
print(train_ds.features)
Here we can see that the text feature is of the type String and the label feature is ClassLabel. The ClassLabel type shows the total number of classes and their names, i.e. 4 in our example.

Μπορούμε εύκολα να εξερευνήσουμε το σύνολο δεδομένων εάν είναι τύπου Pandas Dataframe. Αυτό μπορεί να γίνει ως εξής,

# Convert the dataset to pandas dataframe
import pandas as pd
##########################################################
dataset.set_format("pandas")
train_df = pd.DataFrame(dataset["train"][:])
Now we can easily do basic checks like finding null values and the frequency of labels.  Now let's check for null values in the data frame,
# Check for null values 
train_df.isnull().sum()
Well, we don't have null values. Before we find the frequency of the labels, let's convert the integers to corresponding label names in the dataframe.
# Function to convert integer to string 
def label_int2str(x):
    return dataset["train"].features["label"].int2str(x)
# Add a label name 
train_df['label_name'] = train_df["label"].apply(label_int2str)
Now let's check the distribution of the labels,
# Let's check the distribution of different labels 
import matplotlib.pyplot as plt
train_df["label_name"].value_counts(ascending=True).plot.barh()
plt.title("Frequency of Labels")
plt.show()
Συχνότητα ετικετών|ταξινομητής κειμένου
Πηγή: Σημειωματάριο Jupyter. Οικόπεδο ράβδων που εμφανίζει τη συχνότητα των ετικετών

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

# reset the format
dataset.reset_format()

Τώρα ας συνεχίσουμε περαιτέρω με το tokenisation.

Tokenization

Το tokenization είναι το πιο ουσιαστικό βήμα προεπεξεργασίας στην επεξεργασία φυσικής γλώσσας. Μετατρέπει μη δομημένα δεδομένα κειμένου σε έναν αριθμητικό πίνακα με βάση την αντιστοίχιση που υπάρχει στο λεξιλόγιο του κειμένου. Η Tokenization γίνεται ως εξής:

  • Βρείτε μια λίστα με όλες τις μοναδικές λέξεις στο σύνολο δεδομένων
  • Συσχετίστε κάθε λέξη/κουπόνι με έναν μοναδικό αριθμό. Αυτό λέγεται vocab.
  • Κωδικοποιήστε το σύνολο δεδομένων χρησιμοποιώντας την αντιστοίχιση που υπάρχει στο vocab.

Υπάρχουν διάφοροι τρόποι για την πραγματοποίηση tokenization. Μερικά από τα εξέχοντα είναι:

  • Tokeniser που βασίζεται σε λέξεις
  • Tokeniser με βάση χαρακτήρες
  • Tokeniser που βασίζεται σε υπολέξεις

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

Το πιο σημαντικό πράγμα που πρέπει να θυμάστε κατά τη χρήση της Βιβλιοθήκης HuggingFace είναι:

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

Χρησιμοποιούμε το μοντέλο Distill-Bert για να τελειοποιήσουμε το tweets_eval σύνολο δεδομένων. Περισσότερες πληροφορίες για το μοντέλο μπορείτε να βρείτε στην κάρτα μοντέλου εδώ. Μπορούμε να προσπελάσουμε τα βάρη του tokeniser και του μοντέλου χρησιμοποιώντας τη βιβλιοθήκη HuggingFace απλώς καθορίζοντας το όνομα του μοντέλου.

Τώρα ας κάνουμε λήψη και εισαγωγή του tokeniser χρησιμοποιώντας το AutoTokenizer μονάδα μέτρησης,

from transformers import AutoTokenizer
model_ckpt = "distilbert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(pretrained_model_name_or_path=model_ckpt)
HuggingFace will automatically download and cache the tokeniser locally. Now let's see how the tokeniser works with an example,
text = "This is an example of tokenization"
output = tokenizer(text)
tokens = tokenizer.convert_ids_to_tokens(output['input_ids'])
print(f"Tokenized output: {output}")
print(f"Tokenized tokens: {tokens}")
print(f"Tokenized text: {tokenizer.convert_tokens_to_string(tokens)}")

Ας ελέγξουμε μερικές σημαντικές πληροφορίες σχετικά με το tokeniser όπως voacb_size, model_max_length κ.λπ.,

print(f"Vocab size is : {tokenizer.vocab_size}")
print(f"Model max length is : {tokenizer.model_max_length}")
print(f"Model input names are: {tokenizer.model_input_names}")

Μέγιστο μήκος μοντέλου ορίζει τον μέγιστο αριθμό διακριτικών που μπορεί να έχει ένα μεμονωμένο δείγμα δεδομένων, δηλαδή στην παραπάνω περίπτωση, το μοντέλο μας DistilBert μπορεί να δεχτεί ακολουθίες κειμένου μήκους έως και 512 διακριτικών. Ονόματα εισαγωγής μοντέλων είναι τα πεδία που θα λάβει το μοντέλο ως εισροές για σκοπούς εκπαίδευσης και συμπερασμάτων.

Εφόσον έχουμε δει πώς λειτουργεί το tokeniser, ας κάνουμε τώρα το tokenize ολόκληρο το σύνολο δεδομένων.

# Tokenization function
def tokenize(batch):
    return tokenizer(batch["text"], padding=True, truncation=True)
# Tokenize entire dataset 
tokenized_dataset = dataset.map(tokenize, batched=True, batch_size=None)

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

Εκπαίδευση του ταξινομητή κειμένου

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

from transformers import TFAutoModelForSequenceClassification
num_labels = 4
model = TFAutoModelForSequenceClassification.from_pretrained(model_ckpt, 
                                                             num_labels=num_labels)

Έχουμε εγκαταστήσει το προεκπαιδευμένο μοντέλο DistilBert μαζί με την κεφαλή μοντέλου που μόλις προσαρτήθηκε. Έτσι, αυτό το μοντέλο μπορεί τώρα να εκπαιδευτεί για εργασίες ταξινόμησης με 4 ετικέτες εξόδου. Τώρα ας προετοιμάσουμε τα δεδομένα μας για να τα εκπαιδεύσουμε με το μοντέλο μας χρησιμοποιώντας το πλαίσιο βαθιάς εκμάθησης Tensorflow.

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

batch_size=64
from transformers import DataCollatorWithPadding
data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf")

Τώρα ας δημιουργήσουμε τα σύνολα δεδομένων TensorFlow από το σύνολο δεδομένων με διακριτικό,

# Create tf datasets 
tf_train_dataset = tokenized_dataset["train"].to_tf_dataset(
    columns=column_names, 
    label_cols=["label"], 
    shuffle=True, 
    batch_size=batch_size,
    collate_fn=data_collator
)
tf_valid_dataset = tokenized_dataset["validation"].to_tf_dataset(
    columns=column_names, 
    label_cols=["label"], 
    shuffle=False, 
    batch_size=batch_size,
    collate_fn=data_collator
)

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

# Imports
import tensorflow as tf
from tensorflow.keras import optimizers
from tensorflow.keras import metrics
from tensorflow.keras import losses

Συγκεντρώστε το μοντέλο με το Adam Optimiser, τη συνάρτηση απώλειας SparseCategoricalCrossEntropy και SparseCategoricalAccuracy ως μέτρηση.

# Compile the model
model.compile(
    optimizer=optimizers.Adam(learning_rate=5e-5),
    loss=losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics=metrics.SparseCategoricalAccuracy()
)

Τώρα επιτέλους, ας χωρέσουμε το μοντέλο για 5 εποχές,

# Fit the model
model.fit(tf_train_dataset, 
          validation_data=tf_valid_dataset, 
          epochs=5)

Μεγάλος! Τώρα έχουμε εκπαιδεύσει το μοντέλο μας για 5 εποχές. Τώρα ας δοκιμάσουμε το μοντέλο σε μερικές προτάσεις.

outputs = model.predict(tokenizer("I feeling very happy")["input_ids"])
outputs['logits'][0].tolist()

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

# Apply softmax and pick the label with maximum probability
import numpy as np
label_int = np.argmax(tf.keras.layers.Softmax()(outputs['logits'][0].tolist()))
print(label_int.item())

Εφόσον το μοντέλο βγάζει μόνο τα logit, πρέπει να εφαρμόσουμε softmax ενεργοποίηση για τη μετατροπή των τιμών σε πιθανότητες. Χρησιμοποιούμε ενεργοποίηση softmax και όχι σιγμοειδούς, επειδή το softmax μετατρέπει logit πολλαπλών κλάσεων στο εύρος 0 έως 1, επομένως είναι κατάλληλο για ταξινόμηση πολλαπλών κλάσεων. Τώρα έχουμε τον δείκτη μέγιστης πιθανότητας και ας ελέγξουμε σε ποιον τύπο αντιστοιχεί.

print(label_int2str(label_int.item()))

Μεγάλος! Του Χαρά. Το μοντέλο μας έπιασε γρήγορα το συναίσθημα του se

Συμπέρασμα σχετικά με τον ταξινομητή κειμένου

Σε αυτήν την ανάρτηση ιστολογίου, είδαμε πώς να εκπαιδεύσουμε έναν ταξινομητή κειμένου τελευταίας τεχνολογίας, ρυθμίζοντας με ακρίβεια τα προεκπαιδευμένα μοντέλα από το HuggingFace Hub. Τα προεκπαιδευμένα μοντέλα που διατίθενται στο κοινό ως μέρος του HuggingFace Hub αποτελούν θησαυρό για την κοινότητα μηχανικής μάθησης. Όπως φαίνεται παραπάνω, μπορούμε γρήγορα να φορτώσουμε και να εκπαιδεύσουμε τα σύνολα δεδομένων μας αντί να εκπαιδεύουμε από την αρχή, κάτι που αποτελεί τη βάση για Εκμάθηση μεταφοράς. Μέσω του αριθμού των διαθέσιμων μοντέλων και πόρων, μπορούμε να πειραματιστούμε και να δημιουργήσουμε νέα μοντέλα που κάποια μέρα μπορεί να φέρουν επανάσταση στον κόσμο.

Τα μέσα που εμφανίζονται σε αυτό το άρθρο δεν ανήκουν στο Analytics Vidhya και χρησιμοποιούνται κατά την κρίση του συγγραφέα.