Affiner un modèle de PNL pré-entraîné

Bougez votre petite main pour faire fortune, donnez-lui un coup de pouce !

Un guide étape par étape pour affiner les modèles de PNL pré-entraînés pour n'importe quel domaine

Introduction

Dans le monde d'aujourd'hui, la disponibilité de modèles de PNL pré-entraînés simplifie grandement l'interprétation des données textuelles à l'aide de techniques d'apprentissage en profondeur. Cependant, bien que ces modèles fonctionnent bien sur des tâches générales, ils manquent souvent d'adaptabilité spécifique à un domaine. Ce guide complet [1] a pour objectif de vous guider tout au long du processus de réglage fin des modèles NLP pré-entraînés pour améliorer les performances spécifiques à un domaine.

motivation

Bien que les modèles NLP pré-entraînés tels que BERT et Universal Sentence Encoder (USE) puissent capturer efficacement la complexité du langage, leurs performances dans les applications spécifiques à un domaine peuvent être limitées en raison de la gamme d'ensembles de données d'apprentissage. Cette limitation devient évidente lors de l'analyse des relations au sein d'un domaine particulier.

Par exemple, lorsque nous travaillons avec des données sur l'emploi, nous souhaitons que le modèle reconnaisse une relation plus étroite entre les rôles de "Data Scientist" et "Machine Learning Engineer", ou une association plus forte entre "Python" et "TensorFlow". Malheureusement, les modèles généraux ignorent souvent ces relations subtiles.

Le tableau suivant montre la différence de similarité obtenue à partir du modèle USE multilingue de base :

autre

Pour résoudre ce problème, nous pouvons utiliser des ensembles de données de haute qualité et spécifiques à un domaine pour affiner les modèles pré-formés. Ce processus d'adaptation améliore considérablement les performances et la précision du modèle, libérant tout le potentiel des modèles NLP.

Lorsqu'il s'agit de grands modèles de PNL pré-entraînés, il est recommandé de déployer d'abord le modèle de base et d'envisager un réglage fin uniquement si ses performances ne répondent pas au problème spécifique à résoudre.

Ce didacticiel se concentre sur le réglage fin d'un modèle Universal Sentence Encoder (USE) à l'aide de données open source facilement accessibles.

Les modèles ML peuvent être affinés grâce à diverses stratégies telles que l'apprentissage supervisé et l'apprentissage par renforcement. Dans ce didacticiel, nous nous concentrerons sur les méthodes d'apprentissage à un coup (quelques coups) combinées aux architectures siamoises pour le processus de réglage fin.

cadre théorique

Les modèles ML peuvent être affinés grâce à diverses stratégies telles que l'apprentissage supervisé et l'apprentissage par renforcement. Dans ce didacticiel, nous nous concentrerons sur les méthodes d'apprentissage à un coup (quelques coups) combinées aux architectures siamoises pour le processus de réglage fin.

méthode

Dans ce didacticiel, nous utilisons un réseau de neurones siamois, qui est un type spécifique de réseau de neurones artificiels. Le réseau utilise des pondérations partagées pour traiter simultanément deux vecteurs d'entrée différents afin de calculer des vecteurs de sortie comparables. Inspirée de l'apprentissage ponctuel, cette approche s'est avérée particulièrement efficace pour capturer la similarité sémantique, bien qu'elle puisse nécessiter un temps d'apprentissage plus long et qu'elle n'ait pas de sortie probabiliste.

Les réseaux de neurones siamois créent un "espace d'intégration" dans lequel les concepts connexes sont étroitement situés, permettant au modèle de mieux discerner les relations sémantiques.

autre
  • 双分支和共享权重:该架构由两个相同的分支组成,每个分支都包含一个具有共享权重的嵌入层。这些双分支同时处理两个输入,无论是相似的还是不相似的。
  • 相似性和转换:使用预先训练的 NLP 模型将输入转换为向量嵌入。然后该架构计算向量之间的相似度。相似度得分(范围在 -1 到 1 之间)量化两个向量之间的角距离,作为它们语义相似度的度量。
  • 对比损失和学习:模型的学习以“对比损失”为指导,即预期输出(训练数据的相似度得分)与计算出的相似度之间的差异。这种损失指导模型权重的调整,以最大限度地减少损失并提高学习嵌入的质量。

数据概览

为了使用此方法对预训练的 NLP 模型进行微调,训练数据应由文本字符串对组成,并附有它们之间的相似度分数。

训练数据遵循如下所示的格式:

autre

在本教程中,我们使用源自 ESCO 分类数据集的数据集,该数据集已转换为基于不同数据元素之间的关系生成相似性分数。

准备训练数据是微调过程中的关键步骤。假设您有权访问所需的数据以及将其转换为指定格式的方法。由于本文的重点是演示微调过程,因此我们将省略如何使用 ESCO 数据集生成数据的详细信息。

ESCO 数据集可供开发人员自由使用,作为各种应用程序的基础,这些应用程序提供自动完成、建议系统、职位搜索算法和职位匹配算法等服务。本教程中使用的数据集已被转换并作为示例提供,允许不受限制地用于任何目的。

让我们首先检查训练数据:

import pandas as pd

# Read the CSV file into a pandas DataFrame
data = pd.read_csv("./data/training_data.csv")

# Print head
data.head()
autre

起点:基线模型

首先,我们建立多语言通用句子编码器作为我们的基线模型。在进行微调过程之前,必须设置此基线。

在本教程中,我们将使用 STS 基准和相似性可视化示例作为指标来评估通过微调过程实现的更改和改进。

STS 基准数据集由英语句子对组成,每个句子对都与相似度得分相关联。在模型训练过程中,我们评估模型在此基准集上的性能。每次训练运行的持久分数是数据集中预测相似性分数和实际相似性分数之间的皮尔逊相关性。

Ces scores garantissent que lorsque le modèle est affiné sur nos données de formation spécifiques au contexte, il conserve un certain niveau de généralisabilité.

# Loads the Universal Sentence Encoder Multilingual module from TensorFlow Hub.
base_model_url = "https://tfhub.dev/google/universal-sentence-encoder-multilingual/3"
base_model = tf.keras.Sequential([
    hub.KerasLayer(base_model_url,
                   input_shape=[],
                   dtype=tf.string,
                   trainable=False)
])

# Defines a list of test sentences. These sentences represent various job titles.
test_text = ['Data Scientist''Data Analyst''Data Engineer',
             'Nurse Practitioner''Registered Nurse''Medical Assistant',
             'Social Media Manager''Marketing Strategist''Product Marketing Manager']

# Creates embeddings for the sentences in the test_text list. 
# The np.array() function is used to convert the result into a numpy array.
# The .tolist() function is used to convert the numpy array into a list, which might be easier to work with.
vectors = np.array(base_model.predict(test_text)).tolist()

# Calls the plot_similarity function to create a similarity plot.
plot_similarity(test_text, vectors, 90"base model")

# Computes STS benchmark score for the base model
pearsonr = sts_benchmark(base_model)
print("STS Benachmark: " + str(pearsonr))
autre

Affiner le modèle

L'étape suivante consiste à construire une architecture de modèle siamois à l'aide du modèle de base et à l'affiner à l'aide de nos données spécifiques au domaine.

# Load the pre-trained word embedding model
embedding_layer = hub.load(base_model_url)

# Create a Keras layer from the loaded embedding model
shared_embedding_layer = hub.KerasLayer(embedding_layer, trainable=True)

# Define the inputs to the model
left_input = keras.Input(shape=(), dtype=tf.string)
right_input = keras.Input(shape=(), dtype=tf.string)

# Pass the inputs through the shared embedding layer
embedding_left_output = shared_embedding_layer(left_input)
embedding_right_output = shared_embedding_layer(right_input)

# Compute the cosine similarity between the embedding vectors
cosine_similarity = tf.keras.layers.Dot(axes=-1, normalize=True)(
    [embedding_left_output, embedding_right_output]
)

# Convert the cosine similarity to angular distance
pi = tf.constant(math.pi, dtype=tf.float32)
clip_cosine_similarities = tf.clip_by_value(
    cosine_similarity, -0.999990.99999
)
acos_distance = 1.0 - (tf.acos(clip_cosine_similarities) / pi)

# Package the model
encoder = tf.keras.Model([left_input, right_input], acos_distance)

# Compile the model
encoder.compile(
    optimizer=tf.keras.optimizers.Adam(
        learning_rate=0.00001,
        beta_1=0.9,
        beta_2=0.9999,
        epsilon=0.0000001,
        amsgrad=False,
        clipnorm=1.0,
        name="Adam",
    ),
    loss=tf.keras.losses.MeanSquaredError(
        reduction=keras.losses.Reduction.AUTO, name="mean_squared_error"
    ),
    metrics=[
        tf.keras.metrics.MeanAbsoluteError(),
        tf.keras.metrics.MeanAbsolutePercentageError(),
    ],
)

# Print the model summary
encoder.summary()
autre
  • Ajuster le modèle
# Define early stopping callback
early_stop = keras.callbacks.EarlyStopping(
    monitor="loss", patience=3, min_delta=0.001
)

# Define TensorBoard callback
logdir = os.path.join(".""logs/fit/" + datetime.now().strftime("%Y%m%d-%H%M%S"))
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)

# Model Input
left_inputs, right_inputs, similarity = process_model_input(data)

# Train the encoder model
history = encoder.fit(
    [left_inputs, right_inputs],
    similarity,
    batch_size=8,
    epochs=20,
    validation_split=0.2,
    callbacks=[early_stop, tensorboard_callback],
)

# Define model input
inputs = keras.Input(shape=[], dtype=tf.string)

# Pass the input through the embedding layer
embedding = hub.KerasLayer(embedding_layer)(inputs)

# Create the tuned model
tuned_model = keras.Model(inputs=inputs, outputs=embedding)

résultat de l'évaluation

Maintenant que nous avons le modèle affiné, réévaluons-le et comparons les résultats à ceux du modèle de base.

# Creates embeddings for the sentences in the test_text list. 
# The np.array() function is used to convert the result into a numpy array.
# The .tolist() function is used to convert the numpy array into a list, which might be easier to work with.
vectors = np.array(tuned_model.predict(test_text)).tolist()

# Calls the plot_similarity function to create a similarity plot.
plot_similarity(test_text, vectors, 90"tuned model")

# Computes STS benchmark score for the tuned model
pearsonr = sts_benchmark(tuned_model)
print("STS Benachmark: " + str(pearsonr))
autre

Sur la base d'un réglage fin du modèle sur un ensemble de données relativement petit, les scores de référence STS sont comparables à ceux du modèle de référence, ce qui indique que le modèle ajusté est toujours généralisable. Cependant, la visualisation de similarité montre que le score de similarité entre des titres similaires est amélioré, tandis que celui de titres dissemblables est diminué.

Résumer

Le réglage fin d'un modèle de PNL pré-entraîné pour l'adaptation au domaine est une technique puissante qui peut améliorer ses performances et sa précision dans des contextes spécifiques. En tirant parti d'ensembles de données spécifiques à un domaine de haute qualité et de réseaux de neurones siamois, nous pouvons améliorer la capacité du modèle à capturer la similarité sémantique.

Ce didacticiel fournit un guide étape par étape du processus de réglage fin, en utilisant le modèle Universal Sentence Encoder (USE) comme exemple. Nous explorons le cadre théorique, la préparation des données, l'évaluation du modèle de base et le processus pratique de mise au point. Les résultats démontrent l'efficacité du réglage fin dans l'amélioration du score de similarité dans le domaine.

En suivant cette approche et en l'adaptant à votre domaine spécifique, vous pouvez libérer tout le potentiel des modèles NLP pré-entraînés et obtenir de meilleurs résultats dans les tâches de traitement du langage naturel.

Référence

[1]

Source:https://towardsdatascience.com/domain-adaptation-fine-tune-pre-trained-nlp-models-a06659ca6668

Cet article est publié par mdnice multi-plateforme

Je suppose que tu aimes

Origine blog.csdn.net/swindler_ice/article/details/131649653
conseillé
Classement