Підручник з машинного навчання Google BERT NLP

Існує безліч додатків для машинного навчання, і одним із них є обробка природних мов або NLP.

НЛП обробляє такі речі, як текстові відповіді, з’ясування значення слів у контексті та ведення з нами розмов. Це допомагає комп’ютерам зрозуміти людську мову, щоб ми могли спілкуватися по-різному.

Від ботів чату до заявок на роботу до сортування електронної пошти в різні папки, NLP використовується повсюдно навколо нас.

По суті, обробка природної мови - це суміш інформатики та лінгвістики. Лінгвістика дає нам правила, які ми використовуємо для навчання наших моделей машинного навчання та отримання результатів, які ми шукаємо.

Є багато причин, завдяки яким обробка природних мов стала величезною частиною машинного навчання. Це допомагає машинам виявляти настрої за відгуками клієнтів, може допомогти сортувати квитки підтримки для будь-яких проектів, над якими ви працюєте, а також може послідовно читати та розуміти текст.

І оскільки він діє згідно з набором лінгвістичних правил, у нього немає таких упереджень, як у людини.

Оскільки НЛП - це така велика область досліджень, існує ряд інструментів, якими можна скористатися для аналізу даних для своїх конкретних цілей.

Існує підхід, заснований на правилах, де ви встановлюєте багато операторів if-then для обробки інтерпретації тексту. Зазвичай за це завдання відповідає мовознавець, і те, що вони виробляють, дуже легко зрозуміти людям.

Для початку це може бути добре, але воно стає дуже складним, коли ви починаєте працювати з великими наборами даних.

Інший підхід полягає у використанні машинного навчання там, де не потрібно визначати правила. Це чудово, коли ви намагаєтеся швидко та точно проаналізувати великі обсяги даних.

Вибір правильного алгоритму, щоб підхід машинного навчання працював, важливий з точки зору ефективності та точності. Існують загальні алгоритми, такі як Naive Bayes та Support Vector Machines. Тоді є більш конкретні алгоритми, такі як Google BERT.

Що таке BERT?

BERT - це бібліотека з відкритим кодом, створена в 2018 році в Google. Це нова техніка для НЛП, і вона застосовує зовсім інший підхід до навчальних моделей, ніж будь-яка інша техніка.

BERT - це абревіатура від Двонаправлених кодувальних подань від трансформаторів. Це означає, що на відміну від більшості методів, що аналізують речення зліва направо або справа наліво, BERT рухається в обох напрямках, використовуючи кодер Transformer. Його метою є створення мовної моделі.

Це надає неймовірну точність та продуктивність на менших наборах даних, що вирішує величезну проблему в обробці природною мовою.

Незважаючи на те, що доступна величезна кількість текстових даних, дуже мало їх було позначено для використання для навчання моделі машинного навчання. Оскільки більшість підходів до проблем НЛП використовують переваги глибокого навчання, вам потрібні великі обсяги даних для тренування.

Ви дійсно бачите величезні вдосконалення в моделі, коли вона пройшла навчання з використанням мільйонів точок даних. Щоб допомогти обійти цю проблему відсутності достатньої кількості маркованих даних, дослідники придумали способи підготовки моделей мовного подання загального призначення шляхом попередньої підготовки з використанням тексту з Інтернету.

Потім ці попередньо навчені моделі представлення можуть бути відрегульовані для роботи над конкретними наборами даних, які є меншими, ніж ті, що зазвичай використовуються в процесі глибокого навчання. Ці менші набори даних можуть бути для таких проблем, як аналіз настроїв або виявлення спаму. Саме так підходять до більшості проблем НЛП, оскільки це дає більш точні результати, ніж починаючи з меншого набору даних.

Тому BERT - це таке велике відкриття. Це забезпечує спосіб більш точної попередньої підготовки ваших моделей з меншою кількістю даних. Двоспрямований підхід, який він використовує, означає, що він отримує більше контексту для слова, ніж якби це було просто навчання в одному напрямку. Завдяки цьому додатковому контексту він може скористатися іншим методом, який називається маскований ЛМ.

Чим він відрізняється від інших алгоритмів машинного навчання

Маскований ЛМ випадково маскує 15% слів у реченні маркером [MASK], а потім намагається передбачити їх на основі слів, що оточують замасковане. Ось як BERT здатний дивитись на слова як зліва направо, так і справа наліво.

Це повністю відрізняється від будь-якої іншої існуючої мовної моделі, оскільки вона одночасно розглядає слова перед і після замаскованого слова. До цього можна віднести велику точність BERT.

Щоб BERT працював із вашим набором даних, вам потрібно додати трохи метаданих. Для початку та кінця речень потрібно буде вкласти символи . Вам потрібно мати вбудовані сегменти, щоб мати можливість розрізнити різні речення. Нарешті, вам знадобляться позиційні вставки, щоб вказати позицію слів у реченні.

Це буде виглядати приблизно так.

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

З метаданими, доданими до ваших точок даних, маскований ЛМ готовий до роботи.

Після закінчення передбачення слів BERT використовує перевагу передбачення наступного речення. Це розглядає співвідношення між двома реченнями. Це робиться для кращого розуміння контексту всього набору даних, беручи пару речень і передбачаючи, чи є друге речення наступним реченням на основі оригінального тексту.

Щоб передбачення наступного речення працювало в техніці BERT, друге речення надсилається через модель на основі трансформатора.

Існує чотири різні попередньо навчені версії BERT, залежно від масштабу даних, з якими ви працюєте. Ви можете дізнатись більше про них тут: //github.com/google-research/bert#bert

Недоліком цього підходу є те, що функція збитків враховує лише передбачення замаскованого слова, а не передбачення інших. Це означає, що техніка BERT збігається повільніше, ніж інші техніки справа наліво або зліва направо.

BERT можна застосовувати до будь-якої проблеми НЛП, яку ви можете придумати, включаючи передбачення намірів, програми для відповіді на запитання та класифікацію тексту.

Приклад коду

Налаштування

Зараз ми розглянемо приклад BERT в дії. Перше, що вам потрібно буде зробити, це клонувати репо Bert.

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

I felt it was necessary to go through the data cleaning process here just in case someone hasn't been through it before. Sometimes machine learning seems like magic, but it's really taking the time to get your data in the right condition to train with an algorithm.

BERT is still relatively new since it was just released in 2018, but it has so far proven to be more accurate than existing models even if it is slower.