Guía rápida de inicio rápido de Transformers

Primero presenta brevemente las características de la biblioteca de Transformers. Los transformadores se pueden usar para descargar modelos preentrenados para tareas de comprensión del lenguaje natural, como tareas de análisis de opiniones; también se pueden usar para descargar modelos preentrenados para tareas de generación de lenguaje natural, como tareas de traducción.

Use pipline para una tarea de procesamiento de lenguaje natural

Use pipline para usar rápidamente algunos modelos previamente entrenados.

Los transformadores proporcionan algunas tareas clásicas de lenguaje natural:

  1. Análisis de Sentimiento: Analiza si un texto es positivo o negativo.
  2. Generación de texto: proporcione una oración y el modelo generará la siguiente oración de esa oración.
  3. Reconocimiento de entidad nombrada: en la oración de entrada, cada palabra se tokeniza para revelar el significado de la palabra.
  4. Pregunta y respuesta: ingrese un fragmento de texto y una pregunta para extraer la respuesta a la pregunta del texto.
  5. Rellene el texto enmascarado: introduzca un fragmento de texto en el que algunas palabras se reemplacen por fichas [MÁSCARA] y el modelo rellenará el texto enmascarado.
  6. Generación de resumen: genere un resumen de un texto extenso.
  7. Traducir: convertir un idioma a otro.
  8. Extracción de características: obtenga una representación tensorial de un fragmento de texto.

Muestra de análisis de sentimiento

Código de entrada de declaración única:

from transformers import pipeline

classifier = pipeline("sentiment-analysis")
print(classifier("We are very happy to introduce pipeline to the transformers repository."))
print(classifier("I hate you!"))

Cuando este código se ejecuta por primera vez, se descargará de Internet un modelo de preentrenamiento predeterminado (modelo de preentrenamiento) y un tokenizador de texto (tokenizer). El rol del tokenizador es procesar el texto, y luego el modelo predecirá el texto después del procesamiento.

La salida del código es la siguiente:

[{
    
    'label': 'POSITIVE', 'score': 0.9996980428695679}]
[{
    
    'label': 'NEGATIVE', 'score': 0.9987472891807556}]

Además de la entrada de una sola frase, también se puede introducir en el modelo una lista que contenga varias frases para obtener resultados.

Entrada de declaración múltiple:

from transformers import pipeline

sentences = [
    "I am very happy!",
    "I am not happy."
]

classifier = pipeline("sentiment-analysis")
print(classifier(sentences))

La salida es la siguiente:

[{
    
    'label': 'POSITIVE', 'score': 0.9998728632926941}, 
{
    
    'label': 'NEGATIVE', 'score': 0.9997913241386414}]

Descarga el modelo deseado

Si piplineno especificamos un nombre de modelo en , se descargará el modelo predeterminado correspondiente a la tarea.

Como en el ejemplo anterior, descargará un “distilbert-base-uncased-finetuned-sst-2-english”modelo llamado .

Si no queremos usar este modelo, podemos ver algunos modelos en https://huggingface.co/models , este sitio web. Y en la página de detalles, puede probar el modelo y ver el código de importación del modelo.

Por favor agregue una descripción de la imagen

Uso de Tokenizadores

Los tokenizadores de texto son herramientas para preprocesar texto.

Cuando se usan tokenizadores, dividen una oración en oraciones individuales word, estas wordse llaman tokens.

Después de eso, el tokenizador tokensconvierte los valores en números y, después de convertirlos en números, podemos enviarlos al modelo.

Para realizar la función de convertir tokens en números, el tokenizador tiene un vocabulario, que se descarga cuando instanciamos y especificamos el modelo.El tokenizador usa esta tabla y el vocabulario usado por el modelo en el pre-entrenamiento del mismo.

Ejemplo:

from transformers import AutoTokenizer, AutoModelForSequenceClassification

model_name = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
sentence = "We are very happy to show you the Transformers library"
inputs = tokenizer(sentence)
print(inputs)

Resultado de salida:

{
    
    'input_ids': [101, 2057, 2024, 2200, 3407, 2000, 2265, 2017, 1996, 19081, 3075, 102], 
'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}

Como puede ver, el valor devuelto es un diccionario con dos pares clave-valor.

El primer par clave-valor "input_ids" es el resultado de convertir la oración de entrada en un número, y la longitud es igual a la cantidad de palabras en la oración.

El segundo par clave-valor "attention_mask", el valor es todo 1, lo que significa que el modelo debe prestar atención a todas las palabras que contiene.

Si queremos poner un lote de oraciones a la vez, podemos ingresar una lista de oraciones.

Ejemplo:

from transformers import AutoTokenizer, AutoModelForSequenceClassification

model_name = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
sentence = [
    "We are very happy to show you the Transformers library",
    "I am not happy."
]
inputs = tokenizer(sentence)
print(inputs)

Resultado de salida:

{
    
    'input_ids': 
[[101, 2057, 2024, 2200, 3407, 2000, 2265, 2017, 1996, 19081, 3075, 102], 
[101, 1045, 2572, 2025, 3407, 1012, 102]], 
'attention_mask': 
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
[1, 1, 1, 1, 1, 1, 1]]}

relleno

En algunos casos, necesitamos truncar o completar oraciones para que la entrada del modelo sea consistente. Esta es la necesidad de agregar parámetros cuando se usa el tokenizador padding、truncation、max_length.

  • relleno: booleano, que indica si se debe rellenar.
  • truncamiento: booleano, que indica si se debe truncar.
  • max_length: Indica la longitud máxima del texto, si el texto supera esta longitud, se truncará, y si el texto es inferior a esta longitud, se rellenará.

Ejemplo:

from transformers import AutoTokenizer, AutoModelForSequenceClassification

model_name = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
sentence = [
    "We are very happy to show you the Transformers library",
    "I am not happy."
]
inputs = tokenizer(
    sentence,
    padding=True,
    truncation=True,
    max_length=10,
    return_tensors="pt"
)
print(inputs)

resultado de la operación:

{
    
    'input_ids': 
[[101, 2057, 2024, 2200, 3407, 2000, 2265, 2017, 1996, 102], 
[101, 1045, 2572, 2025, 3407, 1012, 102, 0, 0, 0]], 
'attention_mask': 
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0]]}

Se puede ver que todas las longitudes de entrada han cambiado a 10, y max_lengthlas oraciones con una longitud inferior a 0 se completarán en la parte posterior, y attention_maskla posición de llenado también se establece en 0, lo que indica que no es necesario prestar atención a estas palabras. .

Nota: Como se puede ver en los resultados de la ejecución, se llena una marca 101con un índice de suma antes y después de las dos oraciones 102Esta es una marca especial en la tarea, lo que tokenizersignifica [CLS]suma en este [SEP].

Usos del modelo

Después de que su texto de entrada haya sido tokenizerpreprocesado, puede introducirlo en el modelo. Porque incluye toda la información que hay que introducir.

Cabe señalar que cuando usa pytorchel modelo, no puede inputingresar directamente s, pero necesita usar **el desempaquetado variable.

Ejemplo:

from transformers import AutoTokenizer, AutoModelForSequenceClassification

model_name = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
sentence = [
    "We are very happy to show you the Transformers library",
    "I am not happy."
]
inputs = tokenizer(
    sentence,
    padding=True,
    truncation=True,
    max_length=10,
    return_tensors="pt"
)

pt_output = model(**inputs)
print(pt_output)

resultado de la operación:

(tensor([[-4.2644,  4.6002],
         [ 4.7293, -3.7452]], grad_fn=<AddmmBackward0>),)
  • Aviso:

    return_tensors="pt“, no menos, o se informará de un error.

    En los transformadores, todas las salidas son tuplas (pueden tener varios o solo un elemento). En este ejemplo, el resultado final que obtenemos es una tupla con un solo elemento.

    Todos los modelos de transformadores (ya sea Pytorch o Tensorflow) devuelven resultados que se producen antes de la función de activación final (como softmax) , porque la función de activación final a menudo se fusiona con la función de pérdida.

Use softmax para que el resultado sea más "agradable a la vista"

El valor absoluto de los resultados de salida en el ejemplo anterior es mayor que 1, que no es exactamente como el resultado que predijimos antes. En este momento, podemos aplicarlo a softmax. El código es el siguiente:

import torch.nn.functional as F
pt_predictions = F.softmax(pt_output[0], dim=-1)
print(pt_predictions)

El resultado es el siguiente:

tensor([[1.4128e-04, 9.9986e-01],
        [9.9979e-01, 2.0870e-04]], grad_fn=<SoftmaxBackward0>)

El resultado es mucho más cómodo.

Agregue el parámetro de etiquetas para obtener la pérdida

Además, si conocemos la etiqueta de la clasificación, también podemos ingresarla en el modelo y obtendremos una tupla como (loss, outputs)esta, un ejemplo es el siguiente:

import torch
# 假定消极为0,积极为1 
pt_outputs = model(**inputs, labels = torch.tensor([1, 0]))
print(pt_outputs)

El resultado es el siguiente:

(tensor(0.0002, grad_fn=<NllLossBackward0>),
 tensor([[-4.2644,  4.6002],
         [ 4.7293, -3.7452]], grad_fn=<AddmmBackward0>))

El modelo preentrenado descargado también se puede entrenar normalmente

Además de usarse para la predicción, estos modelos preentrenados también se pueden usar para el entrenamiento, porque la capa inferior de estos modelos se basa torch.nn.Moduleo tf.keras.Modelse implementa. Por supuesto, la biblioteca de Transformers también ha preparado cuidadosamente Tranierclases TFTrainerpara ayudar al entrenamiento, que se pueden usar para tareas como el entrenamiento distribuido y el progreso mixto. Estas clases se presentarán más adelante, pero las mencionaré aquí primero.

Guardar y cargar modelos

Cuando haya terminado de ajustar su modelo, puede guardar su suma tokenizercon model:

tokenizer.save_pretrained(save_directory)
model.save_pretrained(save_directory)

Cuando desee cargar el modelo guardado localmente (tenga en cuenta que no se descarga en línea), puede usar from_pretrained()la función. Cabe señalar que el parámetro que se debe pasar en este momento es la ruta local del archivo en lugar del nombre del modelo .

Además, transformers también tiene una característica muy genial, es decir, puedes cambiar fácilmente entre Pytorch y Tensorflow, porque cualquier modelo guardado a través de transformers se puede importar directamente en Pytorch y Tensorflow. Si desea importar un modelo bajo Tensorflow en PyTorch, solo necesita hacer lo siguiente (simplemente cambie la clase correspondiente de PyTorch a Tensorflow):

# Tensorflow下导入Pytorch的模型
tokenizer = AutoTokenizer.from_pretrained(save_directory)
model = TFAutoModel.from_pretrained(save_directory, from_pt=True)

# Pytorch下导入Tensorflow的模型
tokenizer = AutoTokenizer.from_pretrained(save_directory)
model = AutoModel.from_pretrained(save_directory, from_tf=True)

# 如果是相同环境,则 from_xx 参数不需要加

Obtenga pesos de capa ocultos y pesos de atención

Si desea obtener todos los pesos de las capas ocultas y los pesos de atención, debe hacer lo siguiente:

pt_outputs = model(**inputs, output_hidden_states=True, output_attentions=True)
all_hidden_states, all_attentions = pt_outputs[-2:]

sobre el código

AutoModelLas AutoTonkenizerclases y son nuestros atajos para usar modelos previamente entrenados. Detrás de esto, la biblioteca de transformadores proporciona una clase de modelo para cada tipo de modelo, por lo que puede encontrar fácilmente el código y modificarlo cuando lo necesite.

Tomando como ejemplo el ejemplo anterior, el nombre de este modelo es “distilbert-base-uncased-finetuned-sst-2-english”, y su estructura es DustilBERT. La clase de modelo correspondiente es AutoModelForSequenceClassification(si está en el entorno TensorFlow, es TFAutoModelForSequenceClassification). Puede obtener más información sobre este modelo en la documentación o explorar su código fuente.

Si no desea utilizar la carga automática, también puede importar el mismo modelo de esta manera:

from transformers import DistilBertTokenizer, DistilBertForSequenceClassification
model_name = "distilbert-base-uncased-finetuned-sst-2-english"
model = DistilBertForSequenceClassification.from_pretrained(model_name)
tokenizer = DistilBertTokenizer.from_pretrained(model_name)

modelo personalizado

Si desea cambiar la estructura del modelo, puede personalizar la clase de configuración. Cada modelo de arquitectura tiene su propia configuración, como antes DistilBERT, su clase de configuración DistilBertConfiges Puede personalizar cualquier dimensión de función, relación de inactivación aleatoria, etc. en él. Cabe señalar que si modifica el núcleo del modelo, como modificar el tamaño de la capa oculta, ya no podrá usar el modelo previamente entrenado, debe entrenar el modelo desde cero. Pero aún puede instanciar el modelo a través de la configuración, solo que sin los pesos entrenados.

En el siguiente ejemplo, usamos un DistilBERTvocabulario predefinido y usamos la clase de configuración para inicializar aleatoriamente un modelo personalizado:

from transformers import DistilBertConfig, DistilBertTokenizer, DistilBertForSequenceClassification
config = DistilBertConfig(n_heads=8, dim=512, hidden_dim=4*512)
tokenizer = DistilBertTokenizer.from_pretrained('distilbert-base-uncased')
model = DistilBertForSequenceClassification(config)
  • Como se usa el predefinido Tokenizer, se usa el método from_pretrained.
  • Dado que se cambia la estructura del modelo, el modelo preentrenado no se puede cargar, por lo que configse utiliza la creación de instancias.

Para las operaciones que no modifican el núcleo del modelo, como modificar la cantidad de etiquetas, aún podemos usar el modelo preentrenado. A continuación, usamos el modelo preentrenado para crear un clasificador para 10 categorías. Puede usar labelsla clase de configuración predeterminada excepto la cantidad; también puede escribirla directamente from_pretrainedy modificará la clase de configuración predeterminada por sí misma. el código se muestra a continuación:

from transformers import DistilBertTokenizer, DistilBertForSequenceClassification
model_name = "distilbert-base-uncased"
model = DistilBertForSequenceClassification.from_pretrained(model_name, num_labels=10)
tokenizer = DistilBertTokenizer.from_pretrained(model_name)

sentence = [
    "I am happly"
]

inputs = tokenizer(
    sentence,
    return_tensors="pt"
)

print(model(**inputs))

resultado de la operación:

(tensor([[-0.0141, -0.1514,  0.0542,  0.0729,  0.1489, -0.1813,  0.0564, -0.0404,
          -0.0721,  0.0494]], grad_fn=<AddmmBackward0>),)

Se puede ver que se ha convertido en 10 categorías.

Supongo que te gusta

Origin blog.csdn.net/qq_42464569/article/details/121071756
Recomendado
Clasificación