Pytorch - XLNet modelo de pre-formación y el reconocimiento de entidades

introducción

Antes de presentar y utilizar el modelo de pre-BERT formación y GPT-2 modelos pre-formados, respectivamente, clasificación de texto y los tiempos de generación de texto. Vamos a introducir XLNet modelo de pre-formación y utilizarlo para tiempos de reconocimiento de entidades con nombre.

El conocimiento Point

  • XLNet BERT y mejoras en la GPT-2
  • la estructura del modelo XLNet
  • Uso XLNet veces el nombre entidad reconocimiento

Siguiendo el modelo de equipo BERT Google a mediados de 2019 y el modelo presentado XLNet . XLNet en tantos como 20 misiones han logrado resultados más allá de BERT, también como un sistema de pregunta y respuesta, el razonamiento del lenguaje natural, análisis de sentimientos, texto clasificación y otras tareas que los mejores resultados actuales.

Aquí es XLNet de pegamento en los resultados de las pruebas:

Modelo ferrocarriles QNLI QQP RTE SST-2 MRPC Reajuste salarial STS-B
BERT-Large 86.6 92.3 91.3 70.4 93.2 88.0 60.6 90.0
XLNet-Base 86,8 91.7 91.4 74.0 94.7 88,2 60.2 89.5
XLNet-Large 89.8 93.9 91.8 83.8 95.6 89.2 63.6 91.8

XLNet BERT y mejoras en la GPT-2

deficiencias BERT

BERT puede decirse que es una versión mejorada de XLNet, pero Bert hay muchas diferencias. A continuación, vamos a explicar en detalle.

En los primeros tiempos mencionados, es BERT modelo de auto-codificación (Autoencoding), dicho de otra manera, es, BERT para blindar el modelo de lenguaje (Lenguaje Modelo enmascarado) para los objetivos de formación. Formación de modelo de auto-regresión, algunas de las palabras de la frase de entrada será reemplazado al azar con [MASK]la etiqueta, y luego entrenar el modelo para predecir palabras etiqueta enmascarados.

Podemos ver dos inconvenientes de este proceso:

  1. Erróneamente supone que ser cubiertos son independientes de cada palabra y la palabra está cubierto.
  2. Entrar en el pre-entrenamiento y puesta a punto no es uniforme.

Desventajas 1 significa que al hacer una predicción, ya que algunas palabras están [MASK]cubiertas, por lo que cuando la predicción del modelo BERT está cubierto por una palabra, ignorando la influencia de otra cobertura a sus palabras. Es decir, suponiendo que todas las palabras no están cubiertos por relevante, es obvio que saben esta suposición es incorrecta.

2 se refiere a las deficiencias en la formación previa usamos la [MASK]etiqueta para cubrir parte de la palabra, y en el modelo de ajuste pre-formados, que no va a utilizar esta etiqueta, lo que llevó al proceso de formación previa al partido y afinar el proceso.

Desventaja de GPT-2

En un momento en que introdujimos, GPT-2 es un modelo de auto-regresión (autorregresivo), que se predice por el texto antes o después de la palabra a ser predicha como información contextual.

Matemáticamente, una secuencia de texto = X (x_1, ..., x_t) X = ( X . 1, ..., X ** T ), el modelo autorregresivo calcula el producto de la palabra a ser predicción hacia delante \ ( p (x) = \ prod ^ {T} * {t = 1} p (x_t | x * {<t}), en donde, en donde x _ {<t} denota representa una palabra antes de x_t del mismo modo, la palabra predicha. detrás del producto puede expresar como: palabra del mismo modo anterior, la palabra predicción hacia atrás se puede expresar como el producto de :. p (x) = \ prod ^ p {T} * {t = 1} (x_t | x * {> t}) \) .

Pero a partir de un modelo de regresión es desventaja obvia es que sólo se puede considerar el contexto de una sola dirección. Muchas veces las tareas posteriores, como la comprensión del lenguaje natural, lo hará también necesitan volver información contextual y hacia atrás en ambas direcciones.

Las deficiencias inherentes de introducción modelo de auto-codificación para representar BERT y modelo de auto-regresión de GPT-2 representan a continuación se explicará cómo mejorar XLNet se lleva a cabo para las deficiencias de estos dos tipos de modelos.

La mejora XLNet

Los investigadores en el modelo XLNet diseño, teniendo en cuenta para superar las desventajas del modelo de regresión y auto-modelo de auto-codificación, y para combinar sus fuerzas para diseñar la disposición del modelo de lenguaje (Permutación Lanuage Modelo). Como se muestra a continuación, la idea es que la disposición modelo de lenguaje, ya que la única manera de obtener el modelo autorregresivo contexto de lenguaje, que cambiaría la forma en palabras están organizados por la ubicación de las dos vías a las declaraciones de disposición de un solo sentido.

img

fuente

En la parte superior derecha de la figura ejemplo, cuando la palabra de alineación se convierte en "2 -> 4 -> 3 -> 1", y la predicción de la formación objetivo tres palabras, dos palabras para el modelo de entrada y la palabra 4 información. Este modelo conserva las características del modelo de auto-regresión, sino también para hacer una de dos vías modelo de aprendizaje información contextual.

Tenga en cuenta que la modificación de la disposición en realidad no cambia los términos de la información de ubicación que se incluye en la posición tercera palabra vector o palabras serían los terceros bits de información.

En implementación específica, por la acción de una de las máscaras es variado mecanismo de atención para cambiar el propósito de la disposición, la porción de marco rojo puede referirse al diagrama,

img

fuente

Otras partes del significado de esta figura se explicará más adelante, aquí para hablar de la parte de la caja roja. El segundo medio del comportamiento de la realización anterior, cuando se expresa en la siguiente palabra 2 de predicción de palabras, se añade una máscara para cada palabra, y en este momento la orden es "3 -> 2 -> 4 -> 1." Por lo tanto, cuando se añade a la palabra valor de la máscara 2 y 3 deben ser 1, se puede ver la representación del modelo palabra del valor del término restante debe ser cero. También podemos ver la figura en la segunda fila y tres segundos máscara correspondiente están marcados en rojo. Otro línea de la mitad superior de la empatía.

Las diferentes figuras en la mitad inferior es la mitad inferior de la máscara puede ser añadido para que el modelo no puede ver cada palabra que se predijo, tales como modelos modelo predictivo tener la palabra no habría visto la palabra en cuestión 2 02:00.

la estructura del modelo XLNet

método de segmentación SentencePiece

XLNet modelo utiliza SentencePiece método de segmentación, SentencePiece es de código abierto conjunto de herramientas de procesamiento de lenguaje natural de Google. Su principio es más a menudo aparecen las estadísticas de fragmentos, el fragmento se considera que es una palabra.

SentencePiece herramienta es única, ya que no se basa en la formación antes, pero centrándose en el aprendizaje de la formación impartida, y que no será debido a los diferentes idiomas y tienen un rendimiento diferente, ya que trata a todos los caracteres de la cadena considerado un carácter Unicode.

Se puede decir para optimizar el uso del método SentencePiece BERT WordPiece utilizado para los problemas de bajo rendimiento palabra china.

Shuangliu mecanismo de auto-atención

En toda la estructura, las diferencias estructurales de la estructura del modelo XLNet BERT y poco, se basan Transformador-basa. Sin embargo modelo XLNet utiliza el mecanismo de atención especial, es decir, de los mecanismos dobles de atención (de dos corrientes Auto-atención), XLNet atención de la doble caracterizar el mecanismo utiliza dos unidades, respectivamente, y el contenido de la unidad de caracterización de interrogación contador .

Es una unidad que caracteriza el contenido de la información anterior, contendrá la palabra actual. Caracterización de la unidad de información interrogación incluye información que indica la palabra actual distinto de los anteriores, y la información de posición incluyendo la palabra actual, y no puede acceder a la información de contenido de la palabra actual.

Caracterización Caracterización unidad de interrogación contenido y dos unidades de flujo de información, tanto en el flujo continuo de información que se pasa hacia arriba, la información de salida al final de la unidad de interrogación. Podemos ver en la línea roja y la parte inferior de la figura., El mismo que el resultado previsto de la salida final correspondiente a la orden de las palabras de entrada.

img

fuente

La siguiente visión detallada de cada parte de esta figura, la primera figura (a) indica la parte de la atención flujo de contenido (atención flujo de contenido), parte de un diagrama que muestra (b) es para hacer el flujo de atención (Consulta atención stream). Podemos ver en la Fig. (B) sólo una palabra unidad de caracterización de interrogación correspondiente es de entrada, mientras que en la Fig. (A), el contenido de la palabra 1 tiene el testigo es de entrada. diagrama de sección que muestra (c) cómo se aplica el modelo de mecanismos de atención Shuangliu. Y la Fig. (C) es la máscara de enfoque correcto, hemos descrito anteriormente. Añadir un efecto de máscara, además de lograr el propósito de cambiar la disposición, también llegó a la atención del modelo en el flujo de contenido puede verse en la palabra actual, y en la atención que no se puede ver el fin de pedir el flujo de la palabra actual.

Además del método antes mencionado, XLNet también utilizan una forma previsible, debido a que el modelo de lenguaje autorregresión se predice a partir de la primera palabra a la última palabra, pero en la predicción de la etapa inicial, debido al modelo de información de los estados menos conocida 1 / K después de una palabra es difícil a converger, sólo la parte de declaración de predicción seleccionado real de la parte delantera y 1-1 / K como información de contexto.

entidad denominada reconocimiento XLNet

Anterior, describimos en algunos métodos especiales XLNet BERT y GPT-2 sobre la base de la mejora, y el modelo utilizado XLNet. A continuación vamos a utilizar el modelo de pre-formación XLNet fueron nombrados tiempos de reconocimiento de entidad. NER (Named Entity Recognition, NER referido), son entidades que tienen un significado especial en el texto reconocido, incluidos los nombres de lugares, nombres de organizaciones y otros nombres propios. entidad denominada reconocimiento es un paso importante en la extracción de información, y es ampliamente utilizado en el procesamiento del lenguaje natural.

El segundo entrenamiento y prueba fuentes de datos que utilizamos para CoNLL-2003 , CoNLL-2003 conjunto de datos se basa en la recopilación de noticias, marcado cuatro entidades, a saber: empresas, ubicaciones y nombres no pertenecen a las anteriores tres categorías entidad. Llamada ORG, LOC, PER, MISCentidad, la primera palabra está marcada B-ORG, B-LOC, B-PER, B-MISC, segunda palabra etiquetada I-ORG, I-LOC, I-PER, I-MISC, etiquetado Opalabra indica que no pertenece a cualquiera de una frase.

Aquí vamos a utilizar biblioteca de modelos PyTorch-Transformadores de empaquetado XLNetTokenizer()y XLNetModelde clase para llevar a cabo en realidad algunos pre-entrenamiento de la solicitud de modelo XLNet. En primer lugar, es necesario instalar PyTorch-transformadores.

!pip install pytorch-transformers==1.0  # 安装 PyTorch-Transformers

Debido a que la estructura de datos original es más complejo, así que tuvimos que actualizar los datos de antemano, los datos se han etiquetado de acuerdo con la siguiente etiqueta.

# 标签数据所对应的字符串含义
label_dict = {'O':0, 'B-ORG':1, 'I-ORG':2, 'B-PER':3, 'I-PER':4, 'B-LOC':5, 'I-LOC':6, 'B-MISC':7, 'I-MISC':8, 'X':9, '[PAD]':10}

Se puede observar en la etiqueta sobre más Xy [PAD]etiquetas, sus significados son: porque la palabra hará alguna palabra original completa fuera, y la sección extra que establecen fuera de la etiqueta X. [PAD]Correspondiente a la etiqueta es la de rellenar los caracteres.

Al lado de descarga del conjunto de datos se ha descargado con mucha antelación, red de enlace de disco: https://pan.baidu.com/s/18jqTwLNM2Vmf7fOzkh7UgA código de extracción: zko3

Una vez que haya descargado el conjunto de datos, leer archivos de datos.

train_samples = []
train_labels = []

with open('./train.txt', 'r') as f:
    while True:
        s1 = f.readline()
        if not s1:
            # 如果读取到内容为空,则读取结束
            break
        s2 = f.readline()
        _ = f.readline()
        train_samples.append(s1.replace('\n', ''))
        train_labels.append(s2.replace('\n', ''))

len(train_samples), len(train_labels)

Debido a lo anterior, hacer algo de palabra completa palabra fuera, así que después de la palabra, queremos aumentar aún más la etiqueta en la base de datos original. Por ejemplo la palabra "Ella", se clasifican en "Ella", " '", 's', tres palabras, a continuación, la palabra será el original 'Ella' correspondiente a la etiqueta Omarcada en la palabra, 'Ella', y "'" "s" para las tablas, respectivamente X, y X. El siguiente código está configurado para modificar la etiqueta.

from pytorch_transformers import XLNetTokenizer

# 使用 XLNet 的分词器
tokenizer = XLNetTokenizer.from_pretrained('xlnet-base-cased')

input_ids = []
input_labels = []
for text, ori_labels in zip(train_samples, train_labels):
    l = text.split(' ')
    labels = []
    text_ids = []
    for word, label in zip(l, ori_labels):
        if word == '':
            continue
        tokens = tokenizer.tokenize(word)
        for i, j in enumerate(tokens):
            if i == 0:
                labels.append(int(label))
                text_ids.append(tokenizer.convert_tokens_to_ids(j))
            else:
                labels.append(9)
                text_ids.append(tokenizer.convert_tokens_to_ids(j))
    input_ids.append(text_ids)
    input_labels.append(labels)

len(input_ids), len(input_labels)

Después de preparar los datos utilizados aquí PyTorch ofreció DataLoader()al conjunto de datos de entrenamiento de construcción que el uso de TensorDataset()la construcción de datos de entrenamiento de iterador.

import torch
from torch.utils.data import DataLoader, TensorDataset

del train_samples
del train_labels

for j in range(len(input_ids)):
    # 将样本数据填充至长度为 128
    i = input_ids[j]
    if len(i) != 128:
        input_ids[j].extend([0]*(128 - len(i)))

for j in range(len(input_labels)):
    # 将样本数据填充至长度为 128
    i = input_labels[j]
    if len(i) != 128:
        input_labels[j].extend([10]*(128 - len(i)))

# 构建数据集和数据迭代器,设定 batch_size 大小为 8
train_set = TensorDataset(torch.LongTensor(input_ids),
                          torch.LongTensor(input_labels))
train_loader = DataLoader(dataset=train_set,
                          batch_size=8,
                          shuffle=True)
train_loader

Comprobar si la máquina tiene la GPU, si ejecuta la GPU, de lo contrario la CPU está en ejecución.

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
device

Debido al gran volumen XLNet, pre-modelo y alojado fuera de la red, así que empieza con el sitio Web para descargar modelo de pre-entrenamiento. Enlaces: https://pan.baidu.com/s/1CySwfsOyh9Id4T85koxAeg extracción de código: lah0

Las siguientes clases construidos para reconocimiento de entidades con nombre, el nombre entidad reconocimiento se realiza esencialmente modelo de clasificación XLNet añadido a una Dropoutcapa para prevenir overfitting, y una Linearcapa totalmente conectado.

import torch.nn as nn
from pytorch_transformers import XLNetModel

class NERModel(nn.Module):
    def __init__(self, num_class=11):
        super(NERModel, self).__init__()
        # 读取 XLNet 预训练模型
        self.model = XLNetModel.from_pretrained("./")
        self.dropout = nn.Dropout(0.1)
        self.l1 = nn.Linear(768, num_class)

    def forward(self, x, attention_mask=None):
        outputs = self.model(x, attention_mask=attention_mask)
        x = outputs[0]  # 形状为 batch * seqlen * 768
        x = self.dropout(x)
        x = self.l1(x)
        return x

la pérdida de la función definida. Como se usa en este documento, la entropía cruzada (Cross Entropy) como una función de pérdida.

def loss_function(logits, target, masks, num_class=11):
    criterion = nn.CrossEntropyLoss(reduction='none')
    logits = logits.view(-1, num_class)
    target = target.view(-1)
    masks = masks.view(-1)
    cross_entropy = criterion(logits, target)
    loss = cross_entropy * masks
    loss = loss.sum() / (masks.sum() + 1e-12)  # 加上 1e-12 防止被除数为 0
    loss = loss.to(device)
    return loss

clase de entidad, se define la función de pérdida, estableciendo el optimizador.

from torch.optim import Adam

model = NERModel()
model.to(device)
model.train()

optimizer = Adam(model.parameters(), lr=1e-5)

Inicio del entrenamiento.

from torch.autograd import Variable
import time

pre = time.time()

epoch = 3

for i in range(epoch):
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = Variable(data).to(device), Variable(target).to(device)

        optimizer.zero_grad()

        # 生成掩膜
        mask = []
        for sample in data:
            mask.append([1 if i != 0 else 0 for i in sample])
        mask = torch.FloatTensor(mask).to(device)

        output = model(data, attention_mask=mask)

        # 得到模型预测结果
        pred = torch.argmax(output, dim=2)

        loss = loss_function(output, target, mask)
        loss.backward()

        optimizer.step()

        if ((batch_idx+1) % 10) == 1:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss:{:.6f}'.format(
                i+1, batch_idx, len(train_loader), 100. *
                batch_idx/len(train_loader), loss.item()
            ))

        if batch_idx == len(train_loader)-1:
            # 在每个 Epoch 的最后输出一下结果
            print('labels:', target)
            print('pred:', pred)

print('训练时间:', time.time()-pre)

Después del entrenamiento, que se puede utilizar para verificar el efecto del conjunto de entrenamiento para observar el modelo.

Construcción y conjuntos de datos de validación de datos leídos iterador misma manera que el conjunto de entrenamiento.

eval_samples = []
eval_labels = []

with open('./dev.txt', 'r') as f:
    while True:
        s1 = f.readline()
        if not s1:
            break
        s2 = f.readline()
        _ = f.readline()
        eval_samples.append(s1.replace('\n', ''))
        eval_labels.append(s2.replace('\n', ''))

len(eval_samples)

# 这里使用和训练集同样的方式修改标签,不再赘述
input_ids = []
input_labels = []
for text, ori_labels in zip(eval_samples, eval_labels):
    l = text.split(' ')
    labels = []
    text_ids = []
    for word, label in zip(l, ori_labels):
        if word == '':
            continue
        tokens = tokenizer.tokenize(word)
        for i, j in enumerate(tokens):
            if i == 0:
                labels.append(int(label))
                text_ids.append(tokenizer.convert_tokens_to_ids(j))
            else:
                labels.append(9)
                text_ids.append(tokenizer.convert_tokens_to_ids(j))
    input_ids.append(text_ids)
    input_labels.append(labels)

del eval_samples
del eval_labels

for j in range(len(input_ids)):
    # 将样本数据填充至长度为 128
    i = input_ids[j]
    if len(i) != 128:
        input_ids[j].extend([0]*(128 - len(i)))

for j in range(len(input_labels)):
    # 将样本数据填充至长度为 128
    i = input_labels[j]
    if len(i) != 128:
        input_labels[j].extend([10]*(128 - len(i)))

# 构建数据集和数据迭代器,设定 batch_size 大小为 1
eval_set = TensorDataset(torch.LongTensor(input_ids),
                         torch.LongTensor(input_labels))
eval_loader = DataLoader(dataset=eval_set,
                         batch_size=1,
                         shuffle=False)
eval_loader

El modelo se establece en el modo de autenticación, entrada de conjunto de datos de validación.

from tqdm import tqdm_notebook as tqdm

model.eval()

correct = 0
total = 0

for batch_idx, (data, target) in enumerate(tqdm(eval_loader)):
    data = data.to(device)
    target = target.float().to(device)

    # 生成掩膜
    mask = []
    for sample in data:
        mask.append([1 if i != 0 else 0 for i in sample])
    mask = torch.Tensor(mask).to(device)

    output = model(data, attention_mask=mask)

    # 得到模型预测结果
    pred = torch.argmax(output, dim=2)

    # 将掩膜添加到预测结果上,便于计算准确率
    pred = pred.float()
    pred = pred * mask
    target = target * mask

    pred = pred[:, 0:mask.sum().int().item()]
    target = target[:, 0:mask.sum().int().item()]

    correct += (pred == target).sum().item()
    total += mask.sum().item()

print('正确分类的标签数:{},标签总数:{},准确率:{:.2f}%'.format(
    correct, total, 100.*correct/total))

Podemos ver la tasa de precisión final por encima del 90%. En la extracción entidad de aplicación, y en ocasiones se extrae añadiendo reglas totalidad las palabras entidad, o será reemplazado cuando el último pronóstico capa Softmax etiquetados CRF mejorar la precisión, ya que el contenido no es el foco de tiempo, los estudiantes interesados pueden ser auto aprender a encontrar la información.

resumen

En este momento sabemos que el BERT y la versión mejorada XLNet GPT-2, que combina las ventajas de ambos modelos, que no introduce ruido de enmascaramiento etiqueta producido sin problemas el entrenamiento previo al partido y puesta a punto, y puede ser al mismo tiempo integración de la información contextual contexto. Entonces estábamos veces NER XLNet, ha sido un buen rendimiento.

Enlaces relacionados

Supongo que te gusta

Origin www.cnblogs.com/wwj99/p/12564136.html
Recomendado
Clasificación