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

Примеры открытых вопросов:

  • Расскажите мне о ваших отношениях со своим руководителем.
  • Каким ты видишь свое будущее?
  • Расскажи мне о детях на этой фотографии.
  • Какова цель правительства?
  • Почему вы выбрали именно этот ответ?

Проблема

Проблема заключается в простом вопросе и задаче ответа, где мы должны предсказать, является ли ответ правильным для данного вопроса или нет, но здесь есть кеш, что ответы являются описательными. Для заданных вопросов есть 10 ответов, из которых 9 неверны и 1 правильный. Пример набора вопросов и ответов:

1) симптомы воздействия загрязненного воздуха?

Ответ 1: Длительное воздействие загрязненного воздуха может иметь необратимые последствия для здоровья, например: 1 Ускоренное старение легких. 2 Потеря емкости легких и снижение функции легких. 3 Развитие таких заболеваний, как астма, бронхит, эмфизема и, возможно, рак. 4 Укороченная продолжительность жизни.

2) симптомы воздействия загрязненного воздуха?

Ответ 2: Длительное воздействие твердых частиц может привести к серьезным проблемам со здоровьем, включая: 1 Усиление респираторных симптомов, таких как раздражение дыхательных путей, кашель или затрудненное дыхание. 2 Снижение функции легких. 3 Обострение астмы. 4 Развитие хронических респираторных заболеваний у детей.

3) симптомы воздействия загрязненного воздуха?

Ответ 3: Кратковременное воздействие загрязнения воздуха на здоровье. Возможно, что очень чувствительные люди могут испытывать негативные последствия для здоровья даже в дни с низким уровнем загрязнения воздуха. Используйте Ежедневный индекс качества воздуха, чтобы понять уровни загрязнения воздуха и узнать о рекомендуемых действиях и советах по здоровью. Этот совет применим ко всем, у кого есть симптомы. Краткосрочные эффекты. Загрязнение воздуха имеет ряд последствий для здоровья. Однако не ожидается, что ежедневное загрязнение воздуха в Великобритании вырастет до уровней, при которых людям необходимо существенно изменить свои привычки, чтобы избежать воздействия; Никому не нужно бояться выходить на улицу, но они могут испытывать некоторые заметные симптомы в зависимости от того, к какой из следующих групп населения они принадлежат:

4) симптомы воздействия загрязненного воздуха?

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

5) симптомы воздействия загрязненного воздуха?

Ответ 5: Длительное воздействие загрязненного воздуха может иметь необратимые последствия для здоровья, например: ускоренное старение легких; Потеря емкости легких и снижение функции легких; Развитие таких заболеваний, как астма, бронхит, эмфизема и, возможно, рак; Сокращенная продолжительность жизни

6) симптомы воздействия загрязненного воздуха?

Ответ 6: Кратковременное воздействие твердых частиц может: обострить заболевание легких, вызывая приступы астмы и острый бронхит; Повышают восприимчивость к респираторным инфекциям; Вызывают сердечные приступы и аритмию у людей с сердечными заболеваниями; Даже если вы здоровы, у вас могут возникнуть временные симптомы, такие как: раздражение глаз, носа и горла; Кашляющий

7) симптомы воздействия загрязненного воздуха?

Ответ 7. Дети, страдающие астмой, могут заметить, что им необходимо увеличить количество приемов снотворных в дни, когда уровень загрязнения воздуха выше среднего. Взрослые и дети с проблемами сердца или легких подвержены большему риску появления симптомов. Следуйте обычным советам врача о физических упражнениях и управлении своим состоянием. Возможно, что очень чувствительные люди могут испытывать негативные последствия для здоровья даже в дни с низким уровнем загрязнения воздуха. Любой, у кого возникают симптомы, должен следовать предоставленным инструкциям.

8) симптомы воздействия загрязненного воздуха?

Ответ 8: Длительное воздействие загрязненного воздуха может иметь необратимые последствия для здоровья, например: ускоренное старение легких. Потеря емкости легких и снижение функции легких. Развитие таких заболеваний, как астма, бронхит, эмфизема, возможно, рак.

9) симптомы воздействия загрязненного воздуха?

Ответ 9: Фактический риск неблагоприятных последствий зависит от вашего текущего состояния здоровья, типа и концентрации загрязняющего вещества, а также продолжительности пребывания в загрязненном воздухе. Высокий уровень загрязнения воздуха может вызвать немедленные проблемы со здоровьем, в том числе: 1 Обострение сердечно-сосудистых и респираторных заболеваний. 2 Добавили нагрузку на сердце и легкие, которые должны усерднее работать, чтобы снабжать организм кислородом. 3 Поврежденные клетки дыхательной системы.

10) симптомы воздействия загрязненного воздуха?

Ответ 10: Воздействие таких частиц может повлиять как на ваши легкие, так и на сердце. Длительное воздействие твердых частиц может привести к серьезным проблемам со здоровьем, включая: усиление респираторных симптомов, таких как раздражение дыхательных путей, кашель или затрудненное дыхание; Снижение функции легких; Обострение астмы

Из всех этих ответов 9-й - правильный. Для всех правильных вопросов прогнозируемая метка должна быть 1, а для всех неправильных ответов прогнозируемая метка должна быть 1. Таким образом, это проблема бинарной классификации.

Вызов

Но вот некоторые из проблем при решении проблем:

  • Сильно несбалансированные данные. На один правильный ответ можно дать 9 неправильных ответов. Коэффициент дисбаланса составляет 9: 1.

  • Нет возможности для разработки функций. Поскольку каждый вопрос индивидуален и уникален, нет никаких возможностей для разработки каких-либо функций, которые можно было бы выполнить.

Эти проблемы необходимо преодолеть при решении проблемы.

Подход

1) Очистка данных

Выполняется простая техника обработки данных, такая как

  • Удаление HTML

Удаление некоторых HTML-тегов и сущностей, таких как ‹p›, ‹a›,

import re
#function to clean the word of any html-tags and make it lower case
def cleanhtml(sentence): 
    cleanr = re.compile('<.*?>')
    cleanentity = re.compile('&.*;')
    cleantext = re.sub(cleanr, ' ', sentence)
    cleantext = re.sub(cleanentity, ' ', cleantext)
    return cleantext.lower()
  • Удаление URL-адресов

Поскольку URL-адрес тоже имеет особую структуру, обычная обработка данных приведет к потере его смысла, также URL-адреса не несут какого-либо значимого значения, следовательно, его удаление делает данные эффективными.

url_regex = 'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+';
for i in range(preprocessed_questions.shape[0]):
    preprocessed_questions[i] = re.sub(url_regex, '', preprocessed_questions[i]);
  • Удаление знаков препинания и т. Д.

Знаки препинания, такие как;% &, следует удалить, поскольку они не несут особого значения. Также расширяются как нет, не имеют и т. Д., Как нет, не имеют и т. Д.

#function to clean the word of any punctuation or special characters
def cleanpunc(sentence): 
    cleaned = re.sub(r'[?|!|"|#|:|=|+|_|{|}|[|]|-|$|%|^|&|]',r'',sentence)
    cleaned = re.sub(r'[.|,|)|(|\|/|-|~|`|>|<|*|$|@|;|→]',r'',cleaned)
    return  cleaned

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

2) Используемые показатели

Учитывая, что данные сильно несбалансированы, метрики также должны учитывать этот факт. Следовательно, выбранные метрики

  • Матрица путаницы

  • точность
  • отзывать

  • F1-счет

Используется оценка F1, поскольку она будет высокой только при высокой точности и отзывчивости.

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

  • Средний взаимный ранг

Средний взаимный рейтинг рассчитывается следующим образом:
1) Каждый вопрос имеет 10 возможных ответов, и любой из них является правильным. Отсюда мы берем вероятность того, что все эти десять ответов будут правильными.
2 ) Мы сортируем эти вероятности и присваиваем рейтинг каждому из ответов. Ответ с наибольшей вероятностью получает ранг 1, второй по величине - ранг 2 и т. Д.
3) Мы берем ранг правильного ответа в нем и берем обратную величину от ранга. Таким образом мы складываем обратный ранг всех правильных ответов

Идея состоит в том, чтобы все правильные ответы получали более высокий рейтинг, в идеале - 1.
Идеальное значение MRR - 1, а очень плохое - 0.

#Calulates the rank of the correct answer for each question based on the sorted order of its probability
#Takes the inverse of that rank and adds it together
def mrr(y_pred, y_true):
    count = 0
    mean_reciprocal_rank = 0
    while y_pred.shape[0]:
        y_pred_chunk = y_pred[0:10]
        y_pred = y_pred[10:]
        y_true_chunk = y_true[0:10]
        y_true = y_true[10:]
        y_true_array = np.argmax(y_true_chunk, axis=1)
        try:
            index_of_correct_answer = y_true_array.tolist().index(1)
        except Exception as e:
            continue
        prob_of_correct_answer = y_pred_chunk[index_of_correct_answer]
        sorted_prob_pred = np.array(sorted(y_pred_chunk, key=lambda x:(-x[1])))  
        sorted_prob_pred = np.array(sorted(sorted_prob_pred, key=lambda x:(x[0])))
        for rank in range(10):
            if (sorted_prob_pred[rank][0] == prob_of_correct_answer[0] and sorted_prob_pred[rank][1] == prob_of_correct_answer[1]):
                break
        rank = rank+1
        mean_reciprocal_rank += (1/rank)
        count = count+1
    return mean_reciprocal_rank/count

3) Используемая техника

Техника машинного обучения, используемая для решения этой проблемы, - это глубокое обучение.

Зачем использовать глубокое обучение?

Основные причины выбрать глубокое обучение для решения этой проблемы:

  • Проблема не требует интерпретируемости и задержки как ограничений. Если бы эти ограничения присутствовали, использование методов глубокого обучения было бы неправильным вариантом, поскольку модель глубокого обучения требует, чтобы входные данные передавались на все ее уровни, и требуется много времени, чтобы сделать прогноз метки, и нет никакого понятия интерпретируемости в глубоком обучении, поскольку они являются сложными моделями
  • Кажется, что для этой проблемы невозможно разработать функции. Следовательно, метод глубокого обучения, который автоматически изучает функции на основе данных, будет очень полезен для решения этой проблемы.

Почему BERT?

Испытываются несколько архитектур нейронных сетей, например:

Первые четыре модели обучаются с двумя типами встраивания данных:

  1. Векторы перчатки
  2. Векторы взвешенной перчатки TF-IDF

Пятый уровень - это уровень встраивания данных, который выполняет встраивание данных как часть обучения, но ни один из них не работал. Даже настройка гиперпараметров и увеличение объема данных не увеличились. Результаты прогнозирования для класса 1 по-прежнему очень плохие, и все обученные модели являются тупыми моделями, поскольку с помощью этих простых архитектур решить проблему намного сложнее.

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

Результаты предсказания для класса 1 немного лучше, но это произошло за счет предсказания класса 0. Мы можем наблюдать перетягивание каната, подобное происходящему между классами 0 и 1. Хотя предсказания для класса 1 довольно хороши, что действительно повлияло на предсказания класса 0

Каждая нейронная сеть связана с тензорной доской, чтобы глубже погрузиться в проблему. Изучая график градиентов на гистограмме тензорной доски, мы могли заметить, что большинство, почти все градиенты имеют правильные значения в том смысле, что они не являются ни тем, ни другим. слишком маленький или слишком большой. Следовательно, мы можем сделать вывод, что сети не сталкивались с проблемами исчезающего или взрывающегося градиента. Возможно, сеть не слишком мощна, чтобы изучить такую ​​сложную проблему.

Также при проверке MRR каждой сети, мы можем наблюдать, что он дает очень низкий MRR (0,33), что означает, что многие из неправильных наборов данных ответов ошибочно предсказываются как правильные метки ответа, что связано с тем, что большинство неправильных ответов предсказываются как правильные, а некоторые из правильные ответы имеют очень низкий рейтинг (означает, что они предсказаны с очень меньшей вероятностью
по сравнению с другими ошибочными ответами

Мы можем продолжить и попробовать и поэкспериментировать с другой архитектурой, которая работала бы для этой проблемы, но это потребовало бы больших вычислительных ресурсов. Для обучения и экспериментов с этими проблемами требуется много вычислительной мощности.

Вот где переносное обучение спасает положение. Вместо того, чтобы пробовать несколько архитектур, поскольку это требует больших вычислительных ресурсов, лучше всего использовать трансферное обучение и точно настроить предварительно обученную модель НЛП для решения этой проблемы. BERT - это современная модель НЛП, разработанная Google, и поэтому BERT выбран для трансферного обучения.

4) БЕРТ

BERT (Представления двунаправленного кодера от трансформаторов) - это недавний документ, опубликованный Google, и в настоящее время он представляет собой новейшую технику для всех моделей НЛП. Основным нововведением в BERT является техника внимания, при которой он маскирует несколько слов во входных данных. и попытайтесь предсказать это из контекстной информации, которая представляет собой слова вокруг него, и в отличие от предыдущей модели НЛП, которая обрабатывает данные слева направо, она обрабатывает ввод как слева направо, так и справа налево.

Pytorch предоставляет предварительно обученную модель BERT, которая точно настроена для наших данных. Модель обучается в Google Colab с использованием его графического процессора.

Чтобы обучить любую модель глубокого обучения с помощью графического процессора google colab, откройте блокнот jupyter в google colab и нажмите ИЗМЕНИТЬ → НАСТРОЙКИ ЗАПИСИ, а затем в появившемся диалоговом окне выберите графический процессор в качестве аппаратного ускорителя и нажмите СОХРАНИТЬ.

model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)
model.cuda()

Формат ввода:

Входные данные вводятся в форме «вопросы? ответы »на BERT. Этот метод работал лучше, чем простое объединение вопросов и ответов при обучении модели Берта, и поэтому он используется.

Методика обучения:

Поскольку google colab работает только в течение 12 часов без тайм-аута сеанса, и невозможно обучить модель BERT за 4 эпохи вместе, был сделан простой трюк, чтобы это произошло.
Модель BERT py torch обучена для 5L обучающих данных и проверяется с помощью данных проверки 10K только для одной эпохи.
После этого он сохраняется как файл, а затем запускается новый сеанс Google Colab, и снова ранее обученная модель обучается с данными 5L для другой эпохи.

Следуя этому подходу, мы обучаем модель BERT для 4 эпох, сохраняя и обучая модель BERT предыдущей эпохи.

param_optimizer = list(model.named_parameters())
no_decay = ['bias', 'gamma', 'beta']
optimizer_grouped_parameters = [
    {'params': [p for n, p in param_optimizer if not any(nd in n for nd in no_decay)],
     'weight_decay_rate': 0.01},
    {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)],
     'weight_decay_rate': 0.0}
]
optimizer = BertAdam(optimizer_grouped_parameters,
                     lr=2e-5,
                     warmup=.1)

Обучение модели BERT

# Store our loss and accuracy for plotting
train_loss_set = []
# Number of training epochs (authors recommend between 2 and 4)
epochs = 4
# trange is a tqdm wrapper around the normal python range
for _ in trange(epochs, desc="Epoch"):
  
  
  # Training
  
  # Set our model to training mode (as opposed to evaluation mode)
  model.train()
  
  # Tracking variables
  tr_loss, tr_accuracy, tr_f1_score = 0, 0, 0
  nb_tr_examples, nb_tr_steps = 0, 0
# Train the data for one epoch
  for step, batch in enumerate(train_dataloader):
    if nb_tr_steps%1000 == 0:
      print("Step", nb_tr_steps)
    # Add batch to GPU
    batch = tuple(t.to(device) for t in batch)
    # Unpack the inputs from our dataloader
    b_input_ids, b_input_mask, b_labels = batch
    # Clear out the gradients (by default they accumulate)
    optimizer.zero_grad()
    # Forward pass
    loss = model(b_input_ids, token_type_ids=None, attention_mask=b_input_mask, labels=b_labels)
    train_loss_set.append(loss.item())    
    # Backward pass
    loss.backward()
    # Update parameters and take a step using the computed gradient
    optimizer.step()
    
    with torch.no_grad():
      # Forward pass, calculate logit predictions
      logits = model(b_input_ids, token_type_ids=None, attention_mask=b_input_mask)
    
    # Move logits and labels to CPU
    #print("logits", logits)
    logits = logits.detach().cpu().numpy()
    label_ids = b_labels.to('cpu').numpy()
tmp_tr_accuracy = flat_accuracy(logits, label_ids)
    tmp_f1_score = f1(label_ids, logits)
    
    tr_accuracy += tmp_tr_accuracy
    tr_f1_score += tmp_f1_score
    
    # Update tracking variables
    tr_loss += loss.item()
    nb_tr_examples += b_input_ids.size(0)
    nb_tr_steps += 1
  print("Train loss: {}".format(tr_loss/nb_tr_steps))
  print("Train Accuracy: {}".format(tr_accuracy/nb_tr_steps))
  print("Train f1-score: {}".format(tr_f1_score/nb_tr_steps))
    
    
# Validation
# Put model in evaluation mode to evaluate loss on the validation set
  model.eval()
# Tracking variables 
  eval_loss, eval_accuracy, eval_f1_score = 0, 0, 0
  nb_eval_steps, nb_eval_examples = 0, 0
# Evaluate data for one epoch
  for batch in validation_dataloader:
    # Add batch to GPU
    batch = tuple(t.to(device) for t in batch)
    # Unpack the inputs from our dataloader
    b_input_ids, b_input_mask, b_labels = batch
    # Telling the model not to compute or store gradients, saving memory and speeding up validation
    with torch.no_grad():
      # Forward pass, calculate logit predictions
      logits = model(b_input_ids, token_type_ids=None, attention_mask=b_input_mask)
    
    # Move logits and labels to CPU
    logits = logits.detach().cpu().numpy()
    label_ids = b_labels.to('cpu').numpy()
tmp_eval_accuracy = flat_accuracy(logits, label_ids)
    tmp_f1_score = f1(label_ids, logits)
    
    eval_accuracy += tmp_eval_accuracy
    eval_f1_score += tmp_f1_score
    nb_eval_steps += 1
print("Validation Accuracy: {}".format(eval_accuracy/nb_eval_steps))
  print("Validation f1-score: {}".format(eval_f1_score/nb_eval_steps))

4) Результаты

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

Модель BERT дает очень хорошие прогнозы для класса 1. Класс 0 имеет очень хорошее значение отзыва, равное 0,93, в то время как класс 1 дает сравнительно более низкое значение отзыва 0,644, полученный показатель F1 составляет 0,9472, а точность 0,89 указывает на то, что что модель показала себя неплохо.

Еще одним примечательным моментом является то, что MRR очень хороший, MRR 0,0.8862530 достигается с помощью этой модели BERT, которая показывает, что даже если некоторые из правильных ответов предсказаны неправильно, они находятся на более высоком уровне по сравнению с их коллегами. неправильные ответы точки данных.

Но результаты улучшатся, если мы обучим BERT для очень большого набора данных и для немного большого количества эпох. Из-за ограничений памяти и тайм-аута сеанса модели BERT было очень трудно обучить модель для более высоких эпох с большими количество данных, но с более высокой вычислительной мощностью и мощностью памяти результат можно было бы улучшить.

Приведенный выше тематический анализ был хорошим примером, показывающим, что для решения проблемы глубокого обучения, когда у нас нет достаточной инфраструктуры и вычислительных ресурсов, трансферное обучение - лучший метод, который работает как шарм :)

Использованная литература:

  1. Https://towardsdatascience.com/bert-explained-state-of-the-art-language-model-for-nlp-f8b21a9b6270
  2. Https://mccormickml.com/2019/07/22/BERT-fine-tuning/

Моя ссылка на git-хаб на всю работу: https://github.com/gayathriabhi/BERT-model-to-predict-the-correct-descriptive-answer

Профиль LinkedIn: https://www.linkedin.com/in/gayathri-s-a90322126/