Connect with us

Inteligencia artificial

GPT-3: Aprendizaje de Pocos Disparos para Modelo de Lenguaje

mm

En los últimos años, la industria de la IA y el ML ha presenciado un aumento meteórico en el desarrollo y la aplicación de los sistemas de NLP, ya que los investigadores han podido implementar prácticas de NLP de manera altamente flexible y agnóstica de tareas para tareas de transferencia downstream.

Inicialmente, se utilizaban representaciones de una sola capa que utilizaban vectores de palabras y luego se alimentaban a la arquitectura específica de la tarea. Luego, fue la arquitectura RNN que utilizó representaciones de varias capas y estado contextual para formar mejores representaciones. Y más recientemente, tenemos los modelos de lenguaje de transferencia o modelos recurrentes preentrenados que han eliminado por completo la necesidad de arquitecturas específicas de tareas al ajustar estos modelos.

Los modelos de lenguaje de transferencia han demostrado ser un punto de inflexión importante en la industria de NLP, ya que han resultado en un progreso tremendo en tareas desafiantes como responder preguntas, comprensión lectora o bloques de texto, implicación textual y mucho más.

Sin embargo, a pesar de sus ventajas, los modelos de lenguaje de transferencia tienen una limitación importante, ya que requieren un ajuste fino específico de la tarea o un conjunto de datos específico de la tarea para lograr el rendimiento deseado en una tarea. Además, los modelos de lenguaje de transferencia también requieren que los desarrolladores ajusten los conjuntos de datos a cientos de miles de ejemplos específicos de una tarea.

No necesita decirse que eliminar el requisito de un conjunto de datos específico de la tarea y un ajuste fino específico de la tarea sería muy deseable y beneficioso para la industria de NLP por numerous razones.

Problemas con los modelos de lenguaje de transferencia preentrenados existentes o modelos recurrentes

  • Limitar la practicidad y la aplicabilidad

En primer lugar, el requisito de un gran conjunto de datos con datos etiquetados para cada tarea limita la aplicabilidad y la practicidad de los modelos de lenguaje. Los modelos de lenguaje encuentran sus aplicaciones en una amplia variedad de tareas que van desde generar una historia corta, corregir errores gramaticales, generar ejemplos sobre un concepto. A veces, es una tarea desafiante recopilar un gran conjunto de datos supervisado con datos etiquetados, especialmente cuando el proceso necesita repetirse para cada tarea individual.

  • Explotar correlaciones espurias en los datos de entrenamiento

Las limitaciones y la estrechez de la distribución de entrenamiento, combinadas con la expresividad del modelo, pueden resultar en un crecimiento fundamental en el potencial de explotar correlaciones espurias en los datos de entrenamiento. El potencial de explotar los datos de entrenamiento puede resultar en problemas durante el ajuste fino y el paradigma de preentrenamiento, porque los modelos de lenguaje de transferencia están diseñados para absorber una gran cantidad de información durante el preentrenamiento.

Además, el trabajo en modelos anteriores ha indicado que los grandes modelos no resultan en un mejor rendimiento fuera de la distribución cada vez. Además, también se ha indicado que la generalización lograda bajo dicho paradigma puede resultar en un rendimiento pobre, principalmente porque el modelo es altamente específico de los datos de entrenamiento y no puede realizar bien en situaciones más allá del alcance de los datos de entrenamiento.

  • Comparación con el aprendizaje humano

Finalmente, en comparación con los modelos de lenguaje de transferencia, los humanos no requieren un gran conjunto de datos de entrenamiento cuando se trata de aprender la mayoría de las tareas de lenguaje. Con frecuencia, una breve directiva en el lenguaje natural de una persona o una pequeña demostración de la tarea de lenguaje es adecuada para que un humano comprenda y realice una tarea de lenguaje con un cierto nivel de competitividad.

La capacidad de adaptación de los humanos tiene numerosas ventajas prácticas, ya que les permite cambiar entre diferentes conjuntos de habilidades o mezclarlos para realizar mejor durante un diálogo, algo que está más allá de las capacidades de los sistemas de NLP actuales.

Abordar los problemas con el aprendizaje de meta y GPT-3

Una posible solución a los desafíos anteriores es el uso del aprendizaje de meta, un concepto en la ML moderna que permite a un modelo desarrollar un conjunto más amplio y una mayor capacidad para reconocer patrones mientras se entrena, y luego utiliza estas habilidades aprendidas durante la interferencia para adaptarse rápidamente o reconocer la tarea requerida.

El aprendizaje de meta se está implementando en la arquitectura del modelo de lenguaje a través de una técnica llamada “aprendizaje en contexto” que utiliza la entrada de texto de un modelo de lenguaje preentrenado como una especificación de tarea. En el proceso, el modelo se basa en una instrucción en lenguaje natural y puede utilizar algunas demostraciones, y el modelo se espera que complete el resto de la tarea prediciendo los siguientes pasos.

El único problema importante con el aprendizaje de meta es que, aunque ha mostrado un potencial positivo, todavía es inferior al enfoque de ajuste fino en la arquitectura de lenguaje natural, y necesita una mejora adicional para convertirse en un método práctico para superar las tareas de lenguaje.

Además del aprendizaje de meta, otro método que está ganando popularidad es aumentar la capacidad de los modelos de lenguaje de transformadores. En los últimos años, los modelos de transferencia han presenciado un aumento sustancial en su capacidad con el modelo RNSS18 con 100 millones de parámetros, el modelo DCLT18 con 300 millones de parámetros, el modelo RWC19 con 1.500 millones de parámetros, el modelo SSP19 con 8.000 millones de parámetros, el modelo RSR19 con 11.000 millones de parámetros y el modelo TUR20 con 17.000 millones de parámetros.

Aumentar la capacidad del modelo o aumentar los parámetros ha resultado históricamente en mejoras en la síntesis de texto, y ha habido una indicación de que la pérdida de logaritmo, que se correlaciona con las tareas downstream, también sigue una tendencia suave de mejora con la escala.

Eso nos lleva al modelo GPT-3 que tiene más de 175.000 millones de parámetros, y cuando se lanzó, era el modelo de lenguaje de transferencia con la mayor capacidad. Ahora, hablemos sobre el modelo GPT-3.

Introducción al modelo GPT-3

El GPT-3 es un modelo de lenguaje autoagresivo con más de 175.000 millones de parámetros que fue lanzado por OpenAI en 2020. El GPT-3 también se clasifica como un modelo de lenguaje grande que, al igual que su predecesor el modelo GPT-2, es un modelo de transformador de aprendizaje profundo que utiliza una arquitectura basada en convoluciones para generar datos textuales.

El modelo GPT-3 mide sus propias capacidades de aprendizaje de contexto y el modelo GPT-3 se evalúa en más de dos docenas de conjuntos de datos de NLP y múltiples tareas nuevas. Para cada tarea individual, el modelo GPT-3 se evalúa bajo tres condiciones,

  • Aprendizaje de pocos disparos o aprendizaje en contexto: En el aprendizaje de pocos disparos, el modelo GPT-3 permite tantas distribuciones como puedan caber en la ventana de contexto del modelo.
  • Aprendizaje de un disparo: En el aprendizaje de un disparo, el modelo permite solo una demostración.
  • Aprendizaje de cero disparos: En el aprendizaje de cero disparos, no hay demostraciones y solo hay una instrucción en lenguaje natural que se alimenta al modelo.

En general, el modelo GPT-3 logra un rendimiento deseado en configuraciones de cero disparos y un disparo, y en la configuración de pocos disparos, supera a los modelos de transferencia estatales más avanzados la mayoría de las veces. Además, el modelo GPT-3 se desempeña bien en configuraciones de un disparo y cero disparos en tareas de lenguaje natural diseñadas para probar la razón en el acto o requieren una atención rápida como usar palabras nuevas después de una oración, o desenredar palabras, o realizar operaciones aritméticas. Por otro lado, cuando se opera en una configuración de pocos disparos, el modelo GPT-3 genera artículos de noticias sintéticos que se asemejan a la escritura humana cuando se pasa por evaluadores humanos.

Modelo GPT-3: Enfoque

El modelo GPT-3 utiliza un enfoque de preentrenamiento convencional que comprende modelo, datos y entrenamiento, y se asemeja al proceso de preentrenamiento seguido por el modelo de transferencia RWC-19. El modelo GPT-3 amplía el tamaño del modelo, el tamaño del conjunto de datos, la diversidad del conjunto de datos y aumenta la longitud del período de entrenamiento.

El modelo también utiliza un enfoque de aprendizaje en contexto que una vez más se asemeja al enfoque del modelo RWC-19, pero ajusta las cosas un poco al explorar sistemáticamente diferentes configuraciones para el aprendizaje de patrones dentro del contexto del conjunto de datos.

Así que comencemos explorando estas configuraciones y evaluemos cómo se desempeña el modelo GPT-3 en diferentes configuraciones.

Ajuste fino

Ajustar el modelo ha sido el enfoque convencional en los modelos de lenguaje de transferencia, y este enfoque implica actualizar los pesos de un modelo preentrenado al entrenar el modelo en un conjunto de datos supervisado específico de la tarea deseada, y se utilizan cientos de miles de ejemplos etiquetados durante el proceso.

El enfoque de ajuste fino es beneficioso porque devuelve un rendimiento sólido en numerosos benchmarks. Por otro lado, la principal limitación del uso del enfoque de ajuste fino es que requiere un nuevo y gran conjunto de datos para cada tarea individual, tiene el potencial de explotar características espurias del conjunto de datos de entrenamiento, puede resultar en una comparación injusta con el rendimiento humano y una generalización pobre para fuera de la distribución.

El alcance actual del modelo GPT-3 no implementa el enfoque de ajuste fino debido a su rendimiento agnóstico de tareas, aunque el ajuste fino se puede aplicar al modelo GPT-3 en el futuro.

Pocos disparos

Pocos disparos es un término que se refiere a la configuración en la que el modelo GPT-3 se le da una demostración de la tarea durante la interferencia como acondicionamiento, pero los pesos del modelo no se actualizan. En la configuración de pocos disparos, el conjunto de datos generalmente tiene un ejemplo con un contexto y una finalización deseada (por ejemplo, una oración en francés y su traducción al inglés). La configuración de pocos disparos le da al modelo K ejemplos de contexto y finalización, y luego le proporciona al modelo un contexto final y espera que el modelo proporcione la finalización.

La principal ventaja de utilizar la configuración de pocos disparos es que reduce significativamente la necesidad de datos específicos de la tarea y también reduce el potencial de aprender una distribución estrecha de un gran conjunto de datos que se ajusta finamente. Por otro lado, la principal desventaja de utilizar el aprendizaje de pocos disparos es que los resultados entregados en la configuración de pocos disparos no están a la altura y son significativamente malos en comparación con otros modelos estatales que se ajustan finamente.

Un disparo

En la configuración de un disparo, el modelo se le proporciona solo una demostración y el resto es similar a la configuración de pocos disparos. La razón por la que la configuración de un disparo es relevante en los modelos de lenguaje de transferencia es porque, de las tres configuraciones, un disparo es la que se asemeja a la forma en que las tareas se comunican a los humanos mejor. Es porque en la mayoría de las tareas, es común dar una demostración de la tarea, de lo contrario puede ser difícil entender el contexto de la tarea.

Cero disparos

En la configuración de cero disparos, no hay demostraciones y el modelo se le da una instrucción en lenguaje natural que describe la tarea. El método de cero disparos es el que ofrece la máxima comodidad, es robusto y también evita correlaciones espurias, pero también es el más desafiante de las tres configuraciones. Es porque en algunos casos, es difícil incluso para los humanos averiguar el contexto de una tarea sin ver una demostración primero.

Sin embargo, para algunas tareas, la configuración de cero disparos es la que se asemeja a la forma en que los humanos realizan tareas de lenguaje natural más cercanamente.

La figura anterior compara la configuración de pocos disparos, la configuración de un disparo y la configuración de cero disparos al realizar una tarea de lenguaje natural que consiste en tomar una oración en inglés y traducirla al francés.

Arquitectura del modelo GPT-3

El modelo GPT-3 utiliza la misma arquitectura que se utilizó en el modelo GPT-2, e incluye prenormalización, inicialización modificada y técnicas de tokenización reversibles como se utilizaron en el modelo GPT con la excepción de utilizar una estrategia alternativa para patrones de atención locales en banda y capas densas alternas en las capas de transformador, similares a Sparse Transformer.

Para estudiar la dependencia del rendimiento del modelo con respecto al tamaño del modelo, los desarrolladores han entrenado 8 tamaños de modelo diferentes que abarcan tres órdenes de magnitud desde 125 millones hasta más de 175.000 millones de parámetros, el último de los cuales se llama modelo GPT-3. El trabajo anterior relacionado con los modelos LLM ha indicado que la escalabilidad de la pérdida de validación con una cantidad suficiente de datos de entrenamiento debería ser una ley de potencia suave aproximada como una función de tamaño. Entrenar modelos de diferentes tamaños permite a los desarrolladores probar la hipótesis tanto para las tareas de lenguaje downstream como para la pérdida de validación.

La figura anterior compara el tamaño y la arquitectura de los 8 modelos diferentes utilizados para el desarrollo del GPT-3. Aquí, n(params) define la cantidad total de patrones entrenables, n(layers) define la cantidad total de capas en el modelo, d(model) define la cantidad de unidades en cada capa del cuello de botella y d(head) define las dimensiones de cada cabeza de atención. La ventana de contexto para cada modelo es la misma con 2048 tokens.

Además, para minimizar la transferencia de datos entre los nodos, el modelo se divide a lo largo de las GPU en la profundidad y el ancho de las dimensiones. Los parámetros arquitectónicos para cada modelo se han elegido sobre la base de la eficiencia computacional y el equilibrio de carga para maximizar la precisión en el diseño de los modelos en las GPU.

Conjuntos de datos de entrenamiento

Normalmente, los grandes modelos de lenguaje utilizan conjuntos de datos que han crecido significativamente con los desarrollos recientes y culminan en el conjunto de datos Common Crawl que consta de más de un billón de palabras diferentes. El tamaño del conjunto de datos es lo suficientemente grande como para entrenar el modelo GPT-3 sin actualizar en la misma secuencia múltiples veces. Sin embargo, los estudios y el análisis de rendimiento indican que las versiones ligeramente filtradas o no filtradas del conjunto de datos Common Crawl tienen una calidad baja en comparación con los conjuntos de datos más curados.

Para abordar el problema de la calidad promedio del conjunto de datos, los desarrolladores tomaron 3 pasos para mejorar la calidad del conjunto de datos.

  1. Los desarrolladores descargaron y filtraron una versión del conjunto de datos Common Crawl basada en un rango similar a los corpora de referencia de alta calidad.
  2. Los desarrolladores realizaron una duplicación difusa a nivel de documento en todo el conjunto de datos en un intento de preservar la integridad de su conjunto de validación como una medición efectiva de sobreajuste y también para prevenir la redundancia.
  3. Los desarrolladores también agregaron corpora de referencia de alta calidad a los datos de entrenamiento para complementar el conjunto de datos Common Crawl y aumentar aún más la diversidad del conjunto de datos.

La siguiente figura muestra la proporción final o la mezcla de los conjuntos de datos utilizados para entrenar el modelo GPT-3. Los datos de Common Crawl constaban de más de 45 TB de texto plano antes de filtrar que se redujeron a 570 GB de datos después de filtrar, un equivalente aproximado a más de 400.000 millones de tokens codificados por pares de bytes. Es digno de destacar que los conjuntos de datos en el entrenamiento que se consideran de mayor calidad se muestran con más frecuencia en lugar de muestrear el conjunto de datos en proporción a su tamaño. Como resultado, los conjuntos de datos como Books2 y Common Crawl se muestran menos de una vez durante el entrenamiento, mientras que los demás conjuntos de datos se muestran varias veces. Esto permite que el modelo acepte una pequeña cantidad de sobreajuste a cambio de entrenar en datos de entrenamiento de mayor calidad.

Una preocupación significativa con los grandes modelos de lenguaje preentrenados en una gran cantidad de datos de Internet con la capacidad de memorizar y aprender una gran cantidad de contenido es el potencial de contaminación de las tareas downstream al haber visto sus conjuntos de desarrollo o de prueba durante el proceso de preentrenamiento. Para reducir dicha contaminación potencial, los desarrolladores buscaron cualquier superposición con los conjuntos de desarrollo y de prueba de los benchmarks estudiados para GPT-3 y intentaron eliminar estas superposiciones.

La imagen anterior muestra el cómputo total utilizado durante el entrenamiento del modelo GPT-3. El modelo utiliza las leyes de escalabilidad para los modelos de lenguaje neuronal para entrenar modelos mucho más grandes en menos tokens que los típicos. Como resultado, tanto el modelo GPT-3 como el modelo RoBERTa-Large, que es 10 veces más pequeño que el GPT-3, tomaron casi 50 petaflops/día de cómputo durante el proceso de preentrenamiento.

Evaluación

Para el aprendizaje de pocos disparos, el modelo evalúa cada ejemplo presente en el conjunto de datos de evaluación dibujando K ejemplos al azar del conjunto de datos de entrenamiento de la tarea como acondicionamiento y lo delimita con 1 o 2 nuevas líneas dependiendo de la tarea. Para Storycloze y LAMBADA, el modelo dibuja ejemplos de acondicionamiento del conjunto de desarrollo y lo evalúa en el conjunto de prueba porque no hay un conjunto de entrenamiento supervisado disponible. Para Winograd, solo hay un conjunto de datos y, por lo tanto, las muestras de acondicionamiento se dibujan directamente de él.

K puede ser cualquier valor que oscile entre 0 y la cantidad máxima permitida por la ventana de contexto del modelo, que es next = 2048 para todos los modelos y generalmente cabe alrededor de 10 a 100 ejemplos. Los valores más grandes de K a menudo resultan en mejores resultados, pero no siempre, por lo que cuando el modelo tiene un conjunto de prueba y un conjunto de desarrollo separado disponible, el modelo experimenta con algunos valores de K en el conjunto de desarrollo y, según los resultados, ejecuta el mejor valor en el conjunto de prueba.

Además, en las tareas que requieren seleccionar una finalización correcta entre varias opciones, los desarrolladores proporcionan K ejemplos de corrección más contexto y finalización, y luego proporcionan un ejemplo de contexto solo y las tareas se comparan en función de la probabilidad de LM de cada finalización. Para las tareas que requieren clasificación binaria, los modelos a menudo dan opciones más semánticas y con nombres más significativos y luego tratan la tarea como una opción múltiple y, a veces, también enmarcan la tarea de manera similar a como lo hace el modelo RSR y la arquitectura.

Para las tareas que requieren una finalización de forma libre, el modelo utiliza una búsqueda de haz con parámetros idénticos a los utilizados en el marco RSR, con un haz de longitud 4 y una penalización de 0,6. El modelo se puntuación utilizando la puntuación de similitud F1, la coincidencia exacta o BLEU, dependiendo del estándar para el conjunto de datos.

Resultados

La figura anterior muestra las curvas de entrenamiento para los 8 modelos utilizados en la arquitectura del modelo GPT-3, como se describió en las secciones anteriores. Similar a los resultados del modelo de lenguaje KMH, el rendimiento del modelo GPT-3 sigue una ley adecuada cuando se utiliza el cómputo de entrenamiento de manera efectiva. Hay una ligera diferencia de la ley solo cuando la tendencia se extiende por dos órdenes de magnitud más. Puede ocurrir que las mejoras en la pérdida de entropía puedan ser el resultado de modelar detalles espurios del corpus de entrenamiento. Sin embargo, las mejoras en la pérdida de entropía conducen a ganancias consistentes en el rendimiento general en una amplia variedad de tareas de NLP.

Antes de evaluar los 8 modelos diferentes en una amplia gama de datos de entrenamiento, los conjuntos de datos se agrupan en 8 categorías diferentes que representan tareas similares. Estas categorías son

  1. Evaluación en tareas de modelado de lenguaje tradicionales y tareas que se asemejan al modelado de lenguaje, como tareas de Cloze o finalización de oraciones/párrafos.
  2. Evaluación en tareas de respuesta a preguntas de “libro cerrado”.
  3. Evaluación de la capacidad del modelo para traducir entre idiomas (especialmente de un disparo y de pocos disparos)
  4. Evaluación del rendimiento del modelo en tareas de esquema de Winograd.
  5. Evaluación en conjuntos de datos que involucran razonamiento de sentido común o respuesta a preguntas.
  6. Evaluación en tareas de comprensión lectora.
  7. Evaluación en el conjunto de pruebas SuperGLUE.
  8. Exploración de la inferencia de implicación de lenguaje natural.

Modelado de lenguaje, finalización y tareas de Cloze

En esta sección, se evalúa el rendimiento del modelo GPT-3 en las tareas de modelado de lenguaje tradicionales, así como en tareas que requieren la predicción de una sola palabra de interés o la finalización de un párrafo o una oración, o la finalización de un trozo de texto. Hagamos un breve resumen.

Modelado de lenguaje

El modelo GPT-3 calcula la perplejidad de cero disparos en el conjunto de datos PTB o el Banco de Datos de Árbol de Pensilvania. El modelo omite las tareas relacionadas con Wikipedia porque ya están incluidas en los datos de entrenamiento del modelo y el benchmark de un billón de palabras también se omite porque causa una cantidad significativa de fricción del conjunto de datos que se encuentra en los datos de entrenamiento. Sin embargo, el conjunto de datos PTB aborda estos problemas porque puede predecir la moderna Internet. El modelo más grande en la arquitectura del modelo GPT-3 establece un nuevo estado de la técnica en el conjunto de datos PTB con un margen notable de 15 puntos y logra una perplejidad de 20,50.

LAMBADA

El conjunto de datos LAMBADA se utiliza para probar el modelado del modelo en dependencias de largo alcance en párrafos o textos. Significa que el modelo se le pide que prediga la última palabra de una oración después de leer el párrafo para el contexto. Además, la escalabilidad continua de los modelos de lenguaje produce rendimientos decrecientes en el benchmark.

El modelo GPT-3 logra una precisión del 76% en LAMBADA y tiene una ganancia de más del 8% sobre los mejores modelos anteriores. Además, el modelo LAMBADA demuestra la flexibilidad del aprendizaje de pocos disparos, ya que abordó el problema de una manera que ocurre clásicamente con el conjunto de datos. La finalización de una oración en LAMBADA es generalmente la última palabra de la oración, pero como un modelo de lenguaje no puede saber eso, asigna una probabilidad no solo a la finalización correcta, sino también a otras continuaciones en el párrafo.

Además, cuando los ejemplos alimentados al modelo GPT-3 se modifican de una manera determinada, el modelo devuelve una precisión de más del 86%, un aumento de más del 18% sobre los modelos anteriores. Además, los resultados también indicaron que el rendimiento del modelo en una configuración de pocos disparos aumenta proporcionalmente con el aumento del tamaño del modelo. Aunque esta estrategia reduce el modelo más pequeño en la arquitectura del GPT-3 en un 20%, mejora la precisión del modelo GPT-3 principal con 175.000 millones de parámetros en un 10%.

Respuesta a preguntas de “libro cerrado”

La respuesta a preguntas de “libro cerrado” es un intento de medir la capacidad del modelo GPT-3 para responder preguntas basadas en conocimientos factuales generales. Debido a que dichas preguntas a menudo tienen una gran cantidad de consultas posibles, la tarea se realiza normalmente utilizando un sistema de recuperación de información que permite al modelo encontrar texto relevante en combinación con el modelo que aprende a generar una respuesta a una pregunta dada y el texto recuperado.

La imagen anterior compara el resultado para el modelo GPT-3 en comparación con diferentes modelos y ejecutándose en diferentes conjuntos de datos. En el conjunto de datos TriviaQA, el modelo logra una puntuación de precisión del 64,3% en la configuración de cero disparos, mientras que logra una puntuación de precisión del 68% y del 71,2% en las configuraciones de un disparo y de pocos disparos, respectivamente.

Puede verse claramente que el modelo GPT-3 en la configuración de cero disparos supera al modelo T5-11B ajustado finamente en más del 14%.

La figura anterior muestra que el rendimiento del modelo GPT-3 crece suavemente con el aumento del tamaño del modelo. El rendimiento sugiere que los modelos de lenguaje continúan aprendiendo del conjunto de datos a medida que aumenta su capacidad.

Pensamientos finales

Sería seguro decir que GPT-3 fue una fase revolucionaria en la industria LLM, ya que GPT-3 ayudó a empujar los límites de lo que un modelo de lenguaje podría hacer. Fue el desarrollo y los obstáculos superados por GPT-3 lo que allanó el camino para el modelo de lenguaje grande más avanzado y preciso hasta la fecha, el GPT-4.

Un ingeniero por profesión, un escritor por corazón. Kunal es un escritor técnico con un profundo amor y comprensión de la IA y el ML, dedicado a simplificar conceptos complejos en estos campos a través de su documentación atractiva e informativa.