Εκμάθηση μηχανικής εκμάθησης Google BERT NLP

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

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

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

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

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

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

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

Υπάρχει μια προσέγγιση βάσει κανόνων όπου μπορείτε να δημιουργήσετε πολλές δηλώσεις if-then για να χειριστείτε τον τρόπο ερμηνείας του κειμένου. Συνήθως ένας γλωσσολόγος θα είναι υπεύθυνος για αυτό το έργο και αυτό που παράγουν είναι πολύ εύκολο για τους ανθρώπους να κατανοήσουν.

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

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

Η επιλογή του σωστού αλγορίθμου έτσι ώστε να λειτουργεί η προσέγγιση μηχανικής μάθησης είναι σημαντική όσον αφορά την αποδοτικότητα και την ακρίβεια. Υπάρχουν κοινοί αλγόριθμοι όπως οι Naïve Bayes και Support Vector Machines. Στη συνέχεια, υπάρχουν οι πιο συγκεκριμένοι αλγόριθμοι όπως το Google BERT.

Τι είναι το BERT;

Το BERT είναι μια βιβλιοθήκη ανοιχτού κώδικα που δημιουργήθηκε το 2018 στο Google. Είναι μια νέα τεχνική για το NLP και ακολουθεί μια εντελώς διαφορετική προσέγγιση στα εκπαιδευτικά μοντέλα από οποιαδήποτε άλλη τεχνική.

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

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

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

Βλέπετε πραγματικά τις τεράστιες βελτιώσεις σε ένα μοντέλο όταν έχει εκπαιδευτεί με εκατομμύρια σημεία δεδομένων. Για να βοηθήσουν στην αντιμετώπιση αυτού του προβλήματος της έλλειψης επαρκών ετικετών δεδομένων, οι ερευνητές βρήκαν τρόπους για να εκπαιδεύσουν μοντέλα εκπροσώπησης γλωσσών γενικής χρήσης μέσω της προ-εκπαίδευσης χρησιμοποιώντας κείμενο από όλο το Διαδίκτυο.

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

Γι 'αυτό το BERT είναι μια τόσο μεγάλη ανακάλυψη. Παρέχει έναν τρόπο να προ-εκπαιδεύετε με μεγαλύτερη ακρίβεια τα μοντέλα σας με λιγότερα δεδομένα. Η αμφίδρομη προσέγγιση που χρησιμοποιεί σημαίνει ότι παίρνει περισσότερο από το περιεχόμενο μιας λέξης παρά εάν εκπαιδεύτηκε απλώς προς μία κατεύθυνση. Με αυτό το πρόσθετο πλαίσιο, είναι σε θέση να εκμεταλλευτεί μια άλλη τεχνική που ονομάζεται masked LM.

Πώς διαφέρει από άλλους αλγόριθμους μηχανικής μάθησης

Το Masked LM αποκρύπτει τυχαία το 15% των λέξεων σε μια πρόταση με ένα διακριτικό [MASK] και στη συνέχεια προσπαθεί να τις προβλέψει με βάση τις λέξεις που περιβάλλουν το καλυμμένο. Αυτός είναι ο τρόπος με τον οποίο ο BERT μπορεί να κοιτάζει λέξεις από αριστερά προς δεξιά και από δεξιά προς αριστερά.

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

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

Θα μοιάζει με αυτό.

[CLS] the [MASK] has blue spots [SEP] it rolls [MASK] the parking lot [SEP]

Με τα μεταδεδομένα που προστίθενται στα σημεία δεδομένων σας, το μασκαρισμένο LM είναι έτοιμο να λειτουργήσει.

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

Για την πρόβλεψη της επόμενης πρότασης να λειτουργήσει στην τεχνική BERT, η δεύτερη πρόταση αποστέλλεται μέσω του μοντέλου Transformer.

Υπάρχουν τέσσερις διαφορετικές προ-εκπαιδευμένες εκδόσεις του BERT ανάλογα με την κλίμακα των δεδομένων με τα οποία εργάζεστε. Μπορείτε να μάθετε περισσότερα για αυτά εδώ: //github.com/google-research/bert#bert

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

Το BERT μπορεί να εφαρμοστεί σε οποιοδήποτε πρόβλημα NLP μπορείτε να σκεφτείτε, όπως πρόβλεψη πρόθεσης, εφαρμογές απαντήσεων ερωτήσεων και ταξινόμηση κειμένου.

Παράδειγμα κώδικα

Ετοιμαστείτε

Τώρα θα δούμε ένα παράδειγμα του BERT σε δράση. Το πρώτο πράγμα που πρέπει να κάνετε είναι να κλωνοποιήσετε το Bert repo.

git clone //github.com/google-research/bert.git

Now you need to download the pre-trained BERT model files from the BERT GitHub page. Throughout the rest of this tutorial, I'll refer to the directory of this repo as the root directory.

These files give you the hyper-parameters, weights, and other things you need with the information Bert learned while pre-training. I'll be using the BERT-Base, Uncased model, but you'll find several other options across different languages on the GitHub page.

Some reasons you would choose the BERT-Base, Uncased model is if you don't have access to a Google TPU, in which case you would typically choose a Base model.

If you think the casing of the text you're trying to analyze is case-sensitive (the casing of the text gives real contextual meaning), then you would go with a Cased model.

If the casing isn't important or you aren't quite sure yet, then an Uncased model would be a valid choice.

We'll be working with some Yelp reviews as our data set. Remember, BERT expects the data in a certain format using those token embeddings and others. We'll need to add those to a .tsv file. This file will be similar to a .csv, but it will have four columns and no header row.

Here's what the four columns will look like.

  • Column 0: Row id
  • Column 1: Row label (needs to be an integer)
  • Column 2: A column of the same letter for all rows (it doesn't get used for anything, but BERT expects it)
  • Column 3: The text we want to classify

You'll need to make a folder called data in the directory where you cloned BERT and add three files there: train.tsv, dev.tsv, test.tsv.

In the train.tsv and dev.tsv files, we'll have the four columns we talked about earlier. In the test.tsv file, we'll only have the row id and text we want to classify as columns. These are going to be the data files we use to train and test our model.

Prepping the data

First we need to get the data we'll be working with. You can download the Yelp reviews for yourself here: //course.fast.ai/datasets#nlp It'll be under the NLP section and you'll want the Polarity version.

The reason we'll work with this version is because the data already has a polarity, which means it already has a sentiment associated with it. Save this file in the data directory.

Now we're ready to start writing code. Create a new file in the root directory called pre_processing.py and add the following code.

import pandas as pd # this is to extract the data from that .tgz file import tarfile from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import train_test_split # get all of the data out of that .tgz yelp_reviews = tarfile.open('data/yelp_review_polarity_csv.tgz') yelp_reviews.extractall('data') yelp_reviews.close() # check out what the data looks like before you get started # look at the training data set train_df = pd.read_csv('data/yelp_review_polarity_csv/train.csv', header=None) print(train_df.head()) # look at the test data set test_df = pd.read_csv('data/yelp_review_polarity_csv/test.csv', header=None) print(test_df.head())

In this code, we've imported some Python packages and uncompressed the data to see what the data looks like. You'll notice that the values associated with reviews are 1 and 2, with 1 being a bad review and 2 being a good review. We need to convert these values to more standard labels, so 0 and 1. You can do that with the following code.

train_df[0] = (train_df[0] == 2).astype(int) test_df[0] = (test_df[0] == 2).astype(int)

Whenever you make updates to your data, it's always important to take a look at if things turned out right. So we'll do that with the following commands.

print(train_df.head()) print(test_df.head())

When you see that your polarity values have changed to be what you expected. Now that the data should have 1s and 0s.

Since we've cleaned the initial data, it's time to get things ready for BERT. We'll have to make our data fit the column formats we talked about earlier. Let's start with the training data.

The training data will have all four columns: row id, row label, single letter, text we want to classify.

BERT expects two files for training called train and dev. We'll make those files by splitting the initial train file into two files after we format our data with the following commands.

bert_df = pd.DataFrame({     'id': range(len(train_df)),     'label': train_df[0],     'alpha': ['q']*train_df.shape[0],     'text': train_df[1].replace(r'\n', ' ', regex=True) }) train_bert_df, dev_bert_df = train_test_split(bert_df, test_size=0.01)

With the bert_df variable, we have formatted the data to be what BERT expects. You can choose any other letter for the alpha value if you like. The train_test_split method we imported in the beginning handles splitting the training data into the two files we need.

Take a look at how the data has been formatted with this command.

print(train_bert_df.head())

Now we need to format the test data. This will look different from how we handled the training data. BERT only expects two columns for the test data: row id, text we want to classify. We don't need to do anything else to the test data once we have it in this format and we'll do that with the following command.

test_bert_df = pd.DataFrame({     'id': range(len(test_df)),     'text': test_df[1].replace(r'\n', ' ', regex=True) })

It's similar to what we did with the training data, just without two of the columns. Take a look at the newly formatted test data.

test_bert_df.head()

If everything looks good, you can save these variables as the .tsv files BERT will work with.

train_bert_df.to_csv('data/train.tsv', sep='\t', index=False, header=False) dev_bert_df.to_csv('data/dev.tsv', sep='\t', index=False, header=False) test_bert_df.to_csv('data/test.tsv', sep='\t', index=False, header=False)

Training the model

One quick note before we get into training the model: BERT can be very resource intensive on laptops. It might cause memory errors because there isn't enough RAM or some other hardware isn't powerful enough. You could try making the training_batch_size smaller, but that's going to make the model training really slow.

Add a folder to the root directory called model_output. That's where our model will be saved after training is finished. Now open a terminal and go to the root directory of this project. Once you're in the right directory, run the following command and it will begin training your model.

python run_classifier.py --task_name=cola --do_train=true --do_eval=true --data_dir=./data/ --vocab_file=./uncased_L-12_H-768_A-12/vocab.txt --bert_config_file=./uncased_L-12_H-768_A-12/bert_config.json --init_checkpoint=./uncased_L-12_H768_A-12/bert_model.ckpt.index --max_seq_length=128 --train_batch_size=32 --learning_rate=2e-5 --num_train_epochs=3.0 --output_dir=./model_output --do_lower_case=False

You should see some output scrolling through your terminal. Once this finishes running, you will have a trained model that's ready to make predictions!

Making a predication

If you take a look in the model_output directory, you'll notice there are a bunch of model.ckpt files. These files have the weights for the trained model at different points during training so you want to find the one with the highest number. That will be the final trained model that you'll want to use.

Now we'll run run_classifier.py again with slightly different options. In particular, we'll be changing the init_checkpoint value to the highest model checkpoint and setting a new --do_predict value to true. Here's the command you need to run in your terminal.

python run_classifier.py --task_name=cola --do_predict=true --data_dir=./data --vocab_file=./uncased_L-12_H-768-A-12/bert_config.json --init_checkpoint=./model_output/model.ckpt- --max_seq_length=128 --output_dir=./model_output

Once the command is finished running, you should see a new file called test_results.tsv. This will have your predicted results based on the model you trained!

You've just used BERT to analyze some real data and hopefully this all made sense.

Other thoughts

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

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