"Внимание - это все, что вам нужно"

Новые модели глубокого обучения внедряются все чаще, и иногда сложно уследить за всеми новинками.

В этой статье мы поговорим о Трансформаторах с прикрепленной записной книжкой (пример классификации текста) - это набирающий популярность тип архитектуры нейронной сети.

В этом посте мы ответим на следующие вопросы, связанные с Трансформаторами:

Оглавление :

  • Зачем нам Трансформер?
  • Подробное описание трансформатора и его архитектуры.
  • Классификация текста с помощью преобразователя.
  • полезные статьи, чтобы иметь дело с Transformer.

I -Зачем нам трансформатор?

Трансформаторы были разработаны для решения проблемы преобразования последовательности или нейронного машинного перевода. Это означает любую задачу, которая преобразует входную последовательность в выходную последовательность. Это включает в себя распознавание речи, преобразование текста в речь и т. Д.

Чтобы модели могли выполнять преобразование последовательности, необходимо иметь какую-то память.

Ограничения долгосрочных зависимостей:

Transformer - это архитектура для преобразования одной последовательности в другую с помощью двух частей (кодировщика и декодера), но она отличается от ранее описанных / существующих моделей последовательность-последовательность, поскольку не подразумевает никаких рекуррентных сетей (GRU, LSTM). , так далее.).

В статье «Внимание - это все, что вам нужно» хорошо представлена ​​архитектура трансформатора, и, как видно из заголовка, архитектура трансформатора использует механизм внимания (мы сделаем подробную статью об этом позже)

давайте рассмотрим языковую модель, которая предсказывает следующее слово на основе предыдущих!

предложение: «Биткойн - лучшая криптовалюта»

здесь нам не нужен дополнительный контекст, настолько очевидно, что следующим словом будет «криптовалюта».

В этом случае RNN могут решить проблему и предсказать ответ, используя прошлую информацию.

Но в других случаях нам нужно больше контекста. Например, предположим, что вы пытаетесь угадать последнее слово текста: Я вырос в Тунисе ... Я бегло говорю .... Недавняя информация предполагает, что следующим словом, вероятно, будет язык, но если мы хотим сузить, какой язык, нам нужен контекст Туниса, который находится дальше по тексту.

RNN становятся очень неэффективными, когда разрыв между релевантной информацией и точкой, где она необходима, становится очень большим. Это связано с тем, что информация передается на каждом шаге, и чем длиннее цепочка, тем более вероятно, что информация будет потеряна по цепочке.

Я рекомендую хорошую статью, в которой подробно рассказывается о разнице между seq2seq и трансформатором.

II -Трансформатор и его архитектура подробно:

Изображение стоит тысячи слов, поэтому начнем с него!

Первое, что мы видим, это то, что он имеет архитектуру кодировщика-декодера «последовательность-последовательность».

Большая часть литературы по Трансформаторам, представленной в Интернете, использует именно эту архитектуру для объяснения Трансформеров.

Но это не тот, который использовался в модели GPT Open AI (или модели GPT-2, которая была просто увеличенной версией своего предшественника).

GPT - это 12-слойный преобразователь только для декодирования с параметрами 117M.

Transformer имеет стек из 6 кодировщиков и 6 декодеров, в отличие от Seq2Seq;

Кодировщик содержит два подуровня: уровень самовнимания с несколькими головками и полностью подключенную сеть прямого распространения.

Декодер содержит три подуровня: слой самовнимания с несколькими головками, дополнительный уровень, который выполняет самовнимание с несколькими головками по выходам кодировщика, и полностью подключенную сеть с прямой связью.

Каждый подуровень в кодировщике и декодере имеет остаточное соединение, за которым следует нормализация уровня.

Все входные и выходные токены для кодировщика / декодера преобразуются в векторы с использованием изученных встраиваний.

Эти входные вложения затем передаются в позиционное кодирование.

Архитектура Transformers не содержит повторений или сверток и, следовательно, не имеет понятия порядка слов.

Все слова входной последовательности передаются в сеть

без особого порядка или позиции, поскольку все они проходят одновременно через стек кодировщика и декодера.

Чтобы понять смысл предложения,

важно понимать положение и порядок слов.

III - Классификация текста с использованием трансформатора (реализация Pytorch):

Слишком просто использовать ClassificationModel из simpletransformes:
ClassificationModel ('Архитектура', 'ярлык модели', use_cuda = True, num_labels = 4)
Архитектура: Берт, Роберта, Xlnet, Xlm… < br /> сокращенное название моделей для Роберты: roberta-base, roberta-large….
подробнее здесь

мы создаем модель, которая классифицирует текст по 4 классам [«искусство», «политика», «здоровье», «туризм»]

мы применяем эту модель в нашем предыдущем проекте

и мы интегрируем его в наше приложение flask здесь. (вы можете купить его, чтобы помочь нам создавать лучший контент и помочь сообществу)

Здесь вы найдете записную книжку с комментариями:

  • среда установки и конфигурация
!pip install --upgrade transformers
!pip install simpletransformers
# memory footprint support libraries/code
!ln -sf /opt/bin/nvidia-smi /usr/bin/nvidia-smi
!pip install gputil
!pip install psutil
!pip install humanize importing libraries
  • Импорт библиотек
import psutil
import humanize
import os
import GPUtil as GPU

import numpy as np
import pandas as pd
from google.colab import files
from tqdm import tqdm
import warnings
warnings.simplefilter('ignore')
import gc
from scipy.special import softmax
from simpletransformers.classification import ClassificationModel
from sklearn.model_selection import train_test_split, StratifiedKFold, KFold 
import sklearn
from sklearn.metrics import log_loss
from sklearn.metrics import *
from sklearn.model_selection import *
import re
import random
import torch
pd.options.display.max_colwidth = 200

#choose the same seed to assure that our model will be roproducible

def seed_all(seed_value):
    random.seed(seed_value) # Python
    np.random.seed(seed_value) # cpu vars
    torch.manual_seed(seed_value) # cpu  vars
    
    if torch.cuda.is_available(): 
        torch.cuda.manual_seed(seed_value)
        torch.cuda.manual_seed_all(seed_value) # gpu vars
        torch.backends.cudnn.deterministic = True  #needed
        torch.backends.cudnn.benchmark = False

seed_all(2)
  • Чтение данных
import pandas as pd
#We consider that our data is a csv file (2 columns : text and label)
#using pandas function (read_csv) to read the file
train=pd.read_csv()

feat_cols = "text"
  • Проверьте классы тем в данных
train.label.unique()
  • обучить модель
label_cols = ['art', 'politics', 'health', 'tourism']
train.head()
l=['art', 'politics', 'health', 'tourism']
# Get the numerical ids of column label
train['label']=train.label.astype('category')

Y = train.label.cat.codes
train['label']=Y
# Print initial shape
print(Y.shape)
from keras.utils import to_categorical
# One-hot encode the indexes
Y = to_categorical(Y)

# Check the new shape of the variable
print(Y.shape)

# Print the first 5 rows
print(Y[0:5])
for i in range(len(l)) :     
     train[l[i]] = Y[:,i]
#using KFOLD Cross Validation is important to test our model
%%time
err=[]
y_pred_tot=[]

fold=StratifiedKFold(n_splits=5, shuffle=True, random_state=1997)
i=1
for train_index, test_index in fold.split(train,train['label']):
    train1_trn, train1_val = train.iloc[train_index], train.iloc[test_index]
    model = ClassificationModel('roberta', 'roberta-base', use_cuda=True,num_labels=4, args={
                                                                         'train_batch_size':16,
                                                                         'reprocess_input_data': True,
                                                                         'overwrite_output_dir': True,
                                                                         'fp16': False,
                                                                         'do_lower_case': False,
                                                                         'num_train_epochs': 4,
                                                                         'max_seq_length': 128,
                                                                         'regression': False,
                                                                         'manual_seed': 1997,
                                                                         "learning_rate":2e-5,
                                                                         'weight_decay':0,
                                                                         "save_eval_checkpoints": True,
                                                                         "save_model_every_epoch": False,
                                                                         "silent": True})
    model.train_model(train1_trn)
    raw_outputs_val = model.eval_model(train1_val)[1]
    raw_outputs_vals = softmax(raw_outputs_val,axis=1)
    print(f"Log_Loss: {log_loss(train1_val['label'], raw_outputs_vals)}")
    err.append(log_loss(train1_val['label'], raw_outputs_vals))

вывод:

Log_Loss: 0.35637871529928816

Время ЦП: пользовательское 11 мин 2 с, системное: 4 мин 21 с,

Всего: 15мин 23с Время на стене: 16мин 7с

Потеря журнала:

print("Mean LogLoss: ",np.mean(err))

вывод:

Среднее значение LogLoss: 0,34930175561484067

raw_outputs_vals

Вывод:

массив ([[9.9822301e-01, 3.4856689e-04, 3.8243082e-04, 1.0458552e-03],
[9.9695909e-01, 1.1522240e-03, 5.9563853e-04, 1.2927916e-03] ,
[9.9910539e-01, 2.3084633e-04, 2.5905663e-04, 4.0465154e-04],
...,
[3.6545596e-04, 2.8826005e-04, 4.3145564e-04, 9.9891484e-01],
[4.0789684e-03, 9.9224585e-01, 1.2752400e-03, 2.3997365e-03],
[3.7382307e-04, 3.4797701e- 04, 3.6257200e-04, 9.9891579e-01]],
dtype = float32)

  • протестировать нашу модель
pred = model.predict(['i want to travel to thailand'])[1]
preds = softmax(pred,axis=1)
preds

вывод:

массив ([[6.0461409e-04, 3.6119239e-04, 3.3729596e-04, 9.9869716e-01]],
dtype = float32)

мы создаем функцию, которая вычисляет максимальную вероятность и определяет тему
например, если у нас есть 0,6 политика 0,1 искусство 0,15 здоровье 0,15 туризм ›››› topic = политика

def estm(raw_outputs_vals):
 for i in range(len(raw_outputs_vals)):
   for j in range(4):
       if(max(raw_outputs_vals[i])==raw_outputs_vals[i][j]):
         raw_outputs_vals[i][j]=1
       else :
         raw_outputs_vals[i][j]=0
 return(raw_outputs_vals)
estm(preds)

вывод:

array ([[0., 0., 0., 1.]], dtype = float32)

наши ярлыки: ["искусство", "политика", "здоровье", "туризм"]
так что это правильно;)

Надеюсь, вы найдете это полезным и полезным!

Загрузите исходный код с нашего гитхаба.

III - полезные статьи по работе с Transformer:

вот список рекомендуемых статей для более подробного изучения трансформаторов (в основном модели Берта):

* Кросс-лингвистическая синтаксическая оценка моделей предсказания слов
* Возникающая кросс-языковая структура в предварительно обученных языковых моделях
* Поиск универсальных грамматических отношений в многоязычном BERT
* О межъязыковой переносимости одноязычных представлений
* Насколько многоязычным является Multilingual BERT?
* Свободно ли многоязычный BERT при создании языков?
* Все ли языки созданы равными в многоязычном BERT?
* Что такого особенного в слоях BERT? Более пристальный взгляд на конвейер НЛП в одноязычных и многоязычных моделях
* Исследование межъязычных способностей и информации, специфичной для языков в многоязычном BERT
* Межъязыковые возможности многоязычного BERT: эмпирическое исследование
* Многоязычия недостаточно: BERT для финского языка

Скачиваем все файлы с нашего github репо

III - Резюме:

Трансформеры представляют собой следующий фронт в НЛП.

Менее чем через пару лет с момента его появления,

эта новая архитектурная тенденция превзошла достижения архитектур на основе RNN.

Этот захватывающий темп изобретений, пожалуй, лучшая часть раннего освоения новой области, такой как глубокое обучение!

если у вас есть предложения или вопросы, свяжитесь с командой NeuroData:

Facebook

Linkedin

"Веб-сайт"

Github

Авторы :

Ясин Хамдауи

кодовые кредиты принадлежат Мед Клай Хелми: специалист по данным и наставник Зинди