Hola a todos, hoy vamos a explorar la técnica de los participios en Large Language Modelling (LLM). Por desgracia, la desambiguación es una parte más compleja y delicada de los mejores LLM actuales, pero entender algunos de sus detalles es muy necesario porque mucha gente culpa a las redes neuronales u otras razones aparentemente misteriosas de algunas de las deficiencias de los LLM, cuando en realidad el origen de estos problemas suelen ser las técnicas de desambiguación.
Texto original:https://github.com/karpathy/minbpe

Anteriormente: segmentación basada en caracteres

¿Qué es un subtexto? En realidad, en nuestro vídeo anterior [Crear una GPT desde ceroEn [ ], hemos hablado de la palabra fraccionaria, pero eso es sólo una forma muy simple y primitiva del nivel de carácter. Si vas a ese video de [Colaboración con Googleverás que estamos utilizando nuestros datos de entrenamiento ([obras de Shakespeare], que no es más que una cadena muy larga en Python:

Primer ciudadano: Antes de continuar, por favor, escúcheme.
Adelante, dilo.
Primer ciudadano: ¿Estáis todos decididos a morir antes que pasar hambre?
Decidido. Determinado.
Primer Ciudadano: En primer lugar, sabes que Cayo Marcio es el enemigo número uno del pueblo.
Lo sabemos, lo sabemos.

Pero, ¿cómo introducimos secuencias de caracteres en el modelo lingüístico? El primer paso que damos para ello es construir una tabla de vocabulario que incluya todos los caracteres diferentes que encontramos a lo largo del conjunto de datos de entrenamiento:

``python# Este es el único carácter que aparece en el texto chars = sorted(list(set(text)))vocab_size = len(chars)print(''.join(chars))print(vocab_size)
# !$&',-.3:;?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz# 65 ```

Inmediatamente después, crearemos una tabla de búsqueda para convertir entre caracteres individuales y palabras enteras, basándonos en el vocabulario enumerado anteriormente. Esta tabla de búsqueda es en realidad un diccionario Python:

``` pythonstoi = { ch:i for i,ch in enumerate(chars) }itos = { i:ch for i,ch in enumerate(chars) }# Codificador: recibe una cadena y devuelve una lista de los enteros correspondientes encode = lambda s: [stoi[c ] for c in s]# Decodificador: toma una lista de enteros y la reduce a una cadenadecode = lambda l: ''.join([itos[i] for i in l])
print(encode("hola")) print(decode(encode("hola")))
# [46, 47, 47, 1, 58, 46, 43, 56, 43]# hii there``.

Después de convertir las secuencias en números enteros, veremos que cada número entero se utiliza como índice en una matriz de incrustación entrenable bidimensional. Como el tamaño del vocabulario es `vocab_size=65`, esta matriz de incrustación también tiene 65 filas:

```pythonclass BigramLanguageModel(nn.Module).
def __init__(self, tamaño_vocabulario):super(). __init__()self.token_embedding_table = nn.Embedding(vocab_size, n_embd)
def forward(self, idx, targets=None):tok_emb = self.token_embedding_table(idx) # (B,T,C) ```

Aquí, el "entero" extrae una fila de la tabla de incrustación, que es un vector que representa el token. A continuación, este vector se introduce en el transformador como entrada para el paso temporal correspondiente (Transformador).

Tokenización de "bloques de caracteres" mediante el algoritmo de codificación por pares de bytes (BPE)

Esto es suficiente para un modelo de lenguaje rudimentario a nivel de caracteres. En la práctica, sin embargo, los modelos de lenguaje más avanzados utilizan esquemas más complejos para construir vocabularios de marcado. Estos esquemas no funcionan a nivel de caracteres, sino de bloques de caracteres. Estos vocabularios de bloques de caracteres se construyen mediante algoritmos como el Byte Pair Encoding (BPE), un enfoque que explicaremos con más detalle a continuación.
Volviendo al desarrollo histórico de este enfoque, el documento GPT-2 de OpenAI publicado en 2019, titulado "Language Models as Unsupervised Multitasking Learners", condujo a la popularidad de los algoritmos BPE a nivel de byte para el etiquetado de modelos de lenguaje. Lea la sección 2.2 de este documento sobre "Representación de entrada" para su descripción y motivación para este algoritmo. Los verá mencionados al final de esta sección:

El vocabulario se ha ampliado a 50.257. También hemos aumentado el tamaño del contexto de 512 a 1024 tokens y utilizado un tamaño de lote mayor, de 512.

Recordemos que en la capa de atención del Transformer, cada token es una atención a un número finito de tokens de la secuencia anterior. El documento menciona que la longitud de contexto del modelo GPT-2 es de 1024 tokens, lo que supone una mejora respecto a los 512 de GPT-1. En otras palabras, los tokens son las unidades básicas que sirven de entrada al modelo de Memoria Lingüística a Largo Plazo (LLM). La tokenización es el proceso de convertir cadenas de texto en Python en listas de tokens y viceversa. Para dar otro ejemplo popular de la ubicuidad de esta abstracción, si ve [Llama 2En [The] paper, de nuevo, busque "markers" y obtendrá 63 menciones. Por ejemplo, el artículo afirma que se entrenaron con dos billones de fichas, etcétera.
Antes de adentrarnos en los detalles de implementación, exploremos brevemente por qué necesitamos adentrarnos en el proceso de tokenización. La tokenización está en el centro de muchas de las rarezas de las LLM, y yo recomendaría que no la tomáramos a la ligera. Muchos problemas que parecen estar relacionados con la estructura de las redes neuronales en realidad tienen su origen en la tokenización. He aquí algunos ejemplos:

  • ¿Por qué LLM no puede deletrear correctamente las palabras?
  • ¿Por qué LLM no puede realizar tareas sencillas de manipulación de cadenas, como la inversión de cadenas?
  • ¿Por qué el LLM funciona tan mal cuando se trata de lenguas no inglesas (por ejemplo, el japonés)?
  • ¿Por qué el LLM no funciona bien cuando se realizan operaciones aritméticas sencillas?
  • ¿Por qué GPT-2 tiene dificultades adicionales para programar en Python?
  • ¿Por qué mi LLM deja de funcionar de repente cuando encuentra la cadena ""?
  • ¿Qué es esta extraña advertencia que recibo sobre los "espacios finales"?
  • Cuando pregunto por "SolidGoldMagikarp", ¿por qué se bloquea LLM?
  • ¿Por qué debería preferir utilizar YAML en lugar de JSON para interactuar con los LLM?
  • ¿Por qué el LLM no es un verdadero modelo lingüístico integral?
  • ¿Cuál es exactamente la raíz del sufrimiento?

Volveremos sobre estos temas al final del vídeo.
A continuación, vamos a cargar este [Tokenización Herramientas en línea] La ventaja de esta herramienta en línea es que el proceso de tokenización tiene lugar en tiempo real en su navegador web. Puede introducir fácilmente una cadena de texto en el cuadro de entrada y ver inmediatamente el resultado de la tokenización a la derecha. La parte superior de la página muestra que actualmente estamos utilizandogpt2podemos ver que la cadena del ejemplo se divide en 300 tokens. Estos tokens se muestran claramente en diferentes colores:

Tokenization(分词标记化)

Por ejemplo, la cadena "Tokenización" se codifica como token 30642, seguido del token 1634. el índice del token "es" (nótese que aquí hay tres caracteres, incluido el espacio anterior, ¡que es importante!) El índice del token es 318. Observe el espacio, ya que efectivamente está presente en la cadena y debe ser tokenizado junto con todos los demás caracteres, pero suele omitirse para mayor claridad visual. Puede cambiar la visualización de los espacios en la parte inferior de la herramienta. Del mismo modo, el token "en" es 379, "el" es 262, etc.
Veamos a continuación un sencillo ejemplo aritmético. En este caso, el tokenizador puede descomponer los números de forma incoherente. Por ejemplo, el número 127 se descompone en un único token formado por tres caracteres, mientras que el número 677 se descompone en dos tokens: el token " 6" (¡nótese de nuevo el espacio inicial!) y el token "77". Para comprender esta arbitrariedad nos basamos en grandes modelos lingüísticos. El modelo debe aprender, tanto en sus parámetros como durante el entrenamiento, que los dos tokens ("6" y "77") en realidad se combinan para representar el número 677. Del mismo modo, si el LLM quiere predecir que el resultado de esta suma será el número 804, debe emitir el número en dos pasos: primero, emite el token "8" y, a continuación, el token "04". Nótese que todas estas descomposiciones parecen ser completamente arbitrarias. En el ejemplo siguiente, vemos que 1275 se descompone en "12" y "75", 6773 es en realidad dos tokens "6" y "773", y 8041 se descompone en "8" y "041".
(Continuará...) (TODO: A menos que encontremos una forma de generar automáticamente este contenido a partir de vídeos, probablemente continuaremos con esto).

© declaración de copyright
AiPPT

Artículos relacionados

Sin comentarios

Debe iniciar sesión para participar en los comentarios.
Acceder ahora
ninguno
Sin comentarios...