Ir al contenido principal
OpenAI

28 de junio de 2022

Publicación

Mitigaciones previas al entrenamiento de DALL·E 2

Vista aérea de una multitud de espaldas con sombreros y banderas

DALL·E

Cargando…

Antes de compartir la magia de DALL·E 2 con un público más amplio, teníamos que reducir los riesgos asociados a los potentes modelos de generación de imágenes como este. Así pues, pusimos en marcha varias barreras de protección(se abre en una ventana nueva) para evitar que las imágenes infringieran nuestra política de contenidos(se abre en una ventana nueva).

En este artículo nos centramos en las mitigaciones previas al entrenamiento, un subconjunto de barreras de protección que se encarga de modificar directamente los datos con los que aprende DALL·E 2. Específicamente, DALL·E 2 se entrena con cientos de millones de imágenes con metadatos procedentes de internet. Por nuestra parte, nosotros nos ocupamos de eliminar o reponderar algunas de estas imágenes para cambiar lo que el modelo aprende.

Este artículo está organizado en tres secciones. En cada una, describiremos las diferentes mitigaciones previas al entrenamiento:

  • En la primera sección, describimos la forma en la que filtramos las imágenes que pueden resultar violentas o con contenido sexual del conjunto de datos de entrenamiento de DALL·E 2. Sin esta mitigación, el modelo aprendería a crear imágenes gráficas o explícitas si se le pidiera con un prompt. De hecho, podría ofrecer esas imágenes involuntariamente como respuesta a prompts que son, aparentemente, inofensivos.
  • En la segunda sección, hablamos de cómo descubrimos que filtrar los datos de entrenamiento puede ampliar los sesgos y describimos nuestra técnica para mitigar este efecto. Por ejemplo, sin esta mitigación, observamos que los modelos entrenados con datos filtrados, en ocasiones, generaban más imágenes de hombres que de mujeres en comparación con los modelos entrenados con el conjunto de datos original.
  • En la última sección, nos centramos en el tema de la memorización. Hemos descubierto que, a veces, los modelos como DALL·E 2 replican las imágenes con las que se han entrenado en vez de crear imágenes nuevas. En la práctica, observamos que esta regurgitación de imágenes está causada por imágenes que se replican muchas veces en el conjuntos de datos. Por lo tanto, para mitigar el problema, eliminamos aquellas imágenes que son visualmente similares a otras dentro del conjunto de datos.

Reducir los datos de entrenamiento gráficos y explícitos

Si tenemos en cuenta que los datos de entrenamiento determinan las capacidades de cualquier modelo, es obvio que el filtrado de datos es una poderosa herramienta para limitar las funciones no deseadas del modelo. Así pues, hemos aplicado este enfoque en dos categorías: imágenes que muestran violencia gráfica e imágenes que muestran contenido sexual. Hemos utilizado clasificadores para filtrar las imágenes del conjunto de datos que entren dentro de estas categorías antes de entrenar a DALL·E 2 con él. Además, hemos entrenado estos clasificadores de imágenes nosotros mismos y seguimos estudiando los efectos de filtrar los conjuntos de datos en nuestro modelo entrenado.

Para entrenar nuestros clasificadores de imágenes, hemos reutilizado un enfoque que ya habíamos utilizado antes para filtrar los datos de entrenamiento de GLIDE(se abre en una ventana nueva). A continuación, explicamos los pasos básicos de este enfoque. Para empezar, creamos una especificación para las categorías de imágenes que queremos etiquetar. Después, recopilamos cientos de ejemplos positivos y negativos de cada categoría. Tras esto, utilizamos un procedimiento de aprendizaje para recopilar más datos y mejorar la relación precisión-exhaustividad. Para finalizar, ejecutamos el clasificador resultante en todo el conjunto de datos con un umbral conservador para que prime la exhaustividad sobre la precisión. Hemos dado prioridad a filtrar todos los datos malos en lugar de conservar todos los datos buenos. Hacemos esto porque siempre podemos optimizar nuestro modelo con más datos más adelante para enseñarle cosas nuevas. Por el contrario, hacer que el modelo olvide algo que ya ha aprendido es mucho más difícil.

Cargando...

Durante la fase de aprendizaje activo, mejoramos con regularidad nuestros clasificadores mediante la recopilación de etiquetas humanas para imágenes potencialmente difíciles o mal clasificadas. Concretamente, hemos usado dos técnicas de aprendizaje activo para elegir las imágenes de nuestro conjunto de datos (que contiene cientos de millones de imágenes sin etiquetar) y presentárselas a humanos para que las etiquetasen. Primero, hemos asignado las etiquetas humanas a las imágenes que el modelo actual presentaba como positivas para reducir la tasa de falsos positivos de nuestro clasificador. Es decir, para reducir la frecuencia con la que clasifica de forma errónea una imagen inofensiva como violenta o sexual. Para que este paso funcionase correctamente, hemos ajustado nuestro umbral de clasificación a casi el 100 % de exhaustividad, pero con un alto índice de falsos positivos. Así, nuestros etiquetadores han etiquetado, en su mayoría, casos realmente negativos. Aunque esta técnica ayuda a reducir los falsos positivos y reduce la necesidad de que los etiquetadores tengan que ver imágenes potencialmente dañinas, no ayuda a encontrar más casos positivos que, actualmente, el modelo no está detectando.

Por otra parte, para reducir la tasa de falsos negativos de nuestro clasificador, usamos una segunda técnica de aprendizaje activo: la búsqueda del vecino más próximo. En concreto, hemos realizado una validación cruzada múltiple para encontrar aquellos ejemplos positivos de nuestro conjunto de datos etiquetados actual que el modelo solía clasificar de forma errónea como negativos. Para ello, hemos entrenado cientos de versiones del clasificador con diferentes divisiones de entrenamiento y validación. Tras esto, hemos escaneado nuestra amplia colección de imágenes sin etiquetar en busca de los vecinos más próximos a estos ejemplos en un espacio de características de percepción y hemos asignado etiquetas humanas a las imágenes que hemos descubierto. Gracias a nuestra infraestructura informática, ampliar tanto el entrenamiento del clasificador como la búsqueda de vecinos más próximos a muchas GPU resulto muy sencillo. Esto permitió que el paso de aprendizaje activo se llevara a cabo en cuestión de minutos en vez de llevar horas o, incluso, días.

Asimismo, para comprobar la eficacia de nuestros filtros de datos, hemos entrenado dos modelos GLIDE con los mismo hiperparámetros: uno con datos sin filtrar y otro con datos filtrados. Ahora, denominamos al primer modelo modelo sin filtrar, y al último, modelo filtrado. Como cabría esperar, descubrimos que el modelo filtrado crea, por norma general, menos contenido explícito o gráfico cuando recibe solicitudes para crear esa clase de contenido. No obstante, también descubrimos un efecto secundario inesperado del filtrado de datos: este creaba o amplificaba los sesgos del modelo hacia determinados grupos demográficos.

Cargando...

Corregimos los sesgos que los filtros de datos han introducido

Los modelos generativos intentan ajustarse a la distribución de sus datos de entrenamiento. Esto incluye los sesgos que los datos puedan contener. Como resultado, filtrar los datos de entrenamiento podría, potencialmente, crear o amplificar los sesgos en los modelos posteriores. Corregir los sesgos del conjunto de datos original, en general, es una tarea sociotécnica que todavía estamos estudiando y que, por el momento, queda fuera del alcance de este artículo. Por ello, el problema que abordamos aquí es la amplificación de los sesgos causada, específicamente, por el propio filtrado de datos. Con nuestro enfoque, el objetivo es evitar que el modelo filtrado tenga más sesgos que el modelo sin filtrar, lo que, esencialmente, reduce el cambio de la distribución que causa el filtrado de datos.

Un caso concreto de la amplificación del sesgo causado por el filtrado es el prompt «CEO». Cuando nuestro modelo sin filtrar generaba imágenes para este prompt, tendía a producir más imágenes de hombres que de mujeres. Esperábamos que este sesgo, en su mayor parte, sea un reflejo de nuestros datos de entrenamiento actuales. Sin embargo, cuando ejecutamos el mismo prompt en nuestro modelo filtrado, el sesgo aparentemente se amplificó. De hecho, lo que generaba eran casi exclusivamente imágenes de hombres.

Nuestra hipótesis es que este caso concreto de amplificación del sesgo proviene de dos lugares. Por un lado, aunque las mujeres y los hombres tienen, más o menos, la misma representación en el conjunto de datos original, el conjunto de datos puede estar sesgado hacia mostrar mujeres en contextos más sexualizados. Por otro lado, nuestros propios clasificadores pueden estar sesgados. A pesar de nuestros esfuerzos durante las fases de recopilación y validación de datos para que este no fuera el caso, esto es posible, ya sea debido a la implementación o a la definición de clases. Por culpa de estos dos efectos, nuestro filtro puede eliminar más imágenes de mujeres que de hombres, lo que cambia la proporción de género que el modelo observa en el entrenamiento.

Para poder investigar más a fondo este sesgo que había introducido el filtro, buscamos una forma de medir hasta qué punto nuestros filtros de datos afectaban al sesgo respecto a varios conceptos. Concretamente, nuestros filtros de violencia y contenido sexual se basan exclusivamente en imágenes, pero la naturaleza multimodal de nuestro conjunto de datos nos permite medir directamente los efectos de estos filtros en el texto. Puesto que cada imagen va acompañada de un pie de foto, hemos podido observar la frecuencia relativa de palabras clave seleccionadas a mano dentro del conjunto de datos filtrados y sin filtrar para estimar hasta qué punto los filtros afectaban a un concepto determinado.

Hemos usado Apache Spark para poner esto en práctica y calcular las frecuencias de varias palabras clave (por ejemplo, «progenitor», «mujer» o «infante») en todos los pies de fotos de nuestros conjuntos de datos filtrados y sin filtrar. Aunque nuestro conjunto de datos contiene cientos de millones de pares de texto e imagen, calcular las frecuencias de estas palabras clave solo nos llevó unos minutos gracias a nuestro clúster de cálculo.

Después de calcular las frecuencias de las palabras clave, hemos podido confirmar que los filtros de nuestros conjuntos de datos habían sesgado las frecuencias de algunas palabras clave más que otras. Por ejemplo, los filtros habían reducido la frecuencia de la palabra «mujer» un 14 %. No obstante, la frecuencia de la palabra «hombre» solo se había reducido un 6 %. Esto confirmaba, a gran escala, lo que ya habíamos observado como mera anécdota al tomar muestras de los modelos GLIDE entrenados con ambos conjuntos de datos.

Cargando...

Ahora que teníamos un indicador para medir el sesgo causado por el filtro, debíamos encontrar una forma de mitigarlo. Para hacer frente a este problema, nuestro objetivo era reponderar el conjunto de datos filtrado para que su distribución se asemejase más a la de las imágenes sin filtrar. Ponemos un ejemplo simple para ilustrar esta idea. Supongamos que nuestro conjunto de datos está formado por un 50 % de fotos de gatos y un 50 % de fotos de perros. No obstante, nuestros filtros de datos eliminan al 75 % de los perros, pero solo al 50 % de los gatos. El conjunto de datos resultante tendría dos tercios de gatos y un tercio de perros. Por lo tanto, un modelo generativo basado en la verosimilitud y entrenado con este conjunto de datos generaría, probablemente, más imágenes de gatos que de perros. Podemos arreglar este desequilibrio si multiplicamos por dos la pérdida de entrenamiento de cada imagen de un perro. En este caso, emularíamos el efecto de repetir dos veces cada imagen de un perro. Dicho esto, resulta que podemos ampliar este enfoque a nuestros conjuntos de datos y modelos reales de una forma que es, en gran medida, automática. No hace falta que seleccionemos a mano las características que queremos reponderar.

Por el contrario, calculamos las ponderaciones para las imágenes que hay en el conjunto de datos filtrado usando las probabilidades de un clasificador especial, similar al enfoque que usaron Choi et al. (2019)(se abre en una ventana nueva). Hemos recogido muestras uniformes de imágenes de ambos conjuntos de datos y hemos predicho de qué conjunto procedía la imagen para entrenar este clasificador. Concretamente, este modelo predice P(sin filtrar|imagen) a partir de una P(sin filtrar) = 0,5 dada a priori. No obstante, en la práctica, no queremos que este modelo sea demasiado potente, ya que podría aprender la función exacta implementada por nuestros filtros en primer lugar. En vez de eso, queremos que el modelo sea más fluido que nuestros filtros de datos originales y que capture categorías amplias que se ven afectadas por los filtros a la vez que sigue sin estar seguro de si una imagen en particular está filtrada o no. Para esto, hemos entrenado una sonda lineal sobre un pequeño modelo CLIP.

Una vez tengamos un clasificador que prediga la probabilidad de que una imagen pertenezca al conjunto de datos sin filtrar, tendremos que convertir esta predicción en una ponderación para la imagen. Por ejemplo, supongamos que P(sin filtrar|imagen) = 0,8. Esto indica que es cuatro veces más probable encontrar la muestra en los datos no filtrados que en los filtrados. Una ponderación de cuatro debería corregir el desequilibrio. De una manera más general, podemos usar la ponderación P(sin filtrar|imagen)/P(filtrado|imagen).A

¿En qué medida mitiga realmente el sesgo amplificado este esquema de reponderación? Cuando optimizamos nuestro modelo filtrado anterior con el nuevo esquema de ponderación, el comportamiento del modelo optimizado se acercaba mucho más al modelo sin filtrar en los ejemplos sesgados que habíamos encontrado con anterioridad. Aunque esto era un avance prometedor, también queríamos evaluar esta mitigación más a fondo con nuestra heurística de sesgo basado en palabras clave. Para medir las frecuencias de las palabras clave teniendo en cuenta nuestro nuevo esquema de ponderación, nos basta con ponderar cada aparición de una palabra clave dentro del conjunto de datos filtrado por la ponderación de la muestra que contiene. De esta manera, obtenemos un nuevo conjunto de frecuencias que refleja las ponderaciones de las muestras del conjunto de datos filtrado.

En la mayoría de las palabras clave que hemos comprobado, el esquema de reponderación ha reducido el cambio de frecuencia que provoca el filtro. En nuestros ejemplos anteriores de «hombre» y «mujer», las reducciones de frecuencia relativas pasaron a ser del 1 % y el -1 %, cuando sus valores anteriores eran del 14 % y el 6 %, respectivamente. Aunque esta métrica no es más que un indicador aproximado del sesgo real del filtrado, el hecho de que nuestro esquema de reponderación basado en imágenes mejore de una forma tan significativa una métrica basada en texto nos resulta de lo más tranquilizador.

Seguimos investigando los sesgos que todavía quedan en DALL·E 2, por ejemplo, mediante evaluaciones más amplias del comportamiento del modelo e investigaciones sobre el impacto de los filtros en el desarrollo de sesgos y funciones.

Prevenir la replicación de imágenes

Hemos observado que, en ocasiones, nuestros predecesores a DALL·E 2 internos reproducían las imágenes de entrenamiento de forma idéntica. Esto es un comportamiento no deseado, puesto que nuestro objetivo es que DALL·E 2 cree imágenes únicas y originales por defecto, no que se limite a juntar pedazos de imágenes que ya existen. Además, copiar píxel a píxel las imágenes de entrenamiento puede plantear problemas legales relacionados con las infracciones de los derechos de autor, la propiedad y la privacidad (en caso de que hubiera fotos de personas en los datos de entrenamiento).

Para entender mejor el problema que supone la replicación de imágenes, hemos recopilado un conjunto de datos de prompts que, con frecuencia, han resultado en imágenes duplicadas. Con este fin, hemos usado un modelo entrenado para muestrear imágenes de 50 000 prompts desde nuestro conjunto de datos de entrenamiento y hemos ordenado las muestras según la similitud de percepción con la imagen de entrenamiento correspondiente. Por último, hemos inspeccionado manualmente las coincidencias más destacadas y solo hemos encontrado unos pocos cientos de pares duplicados verdaderos de entre un total de 50 000 prompts. No obstante, aunque la tasa de duplicación parecía ser inferior al 1 %, nos pareció necesario reducirla a cero por las razones que hemos expuesto anteriormente.

Al estudiar nuestro conjunto de datos de imágenes replicadas, hemos observador dos patrones. En primer lugar, la gran mayoría de las imágenes eran simples gráficos vectoriales. Estos son más fáciles de memorizar, ya que cuentan con poca información. En segundo lugar, aunque más importante que lo anterior, todas las imágenes tenían «casi duplicados» en el conjunto de datos de entrenamiento. Es decir, podía haber un gráfico vectorial que pareciera un reloj con la hora puesta a la una en punto. No obstante, luego descubríamos una muestra del entrenamiento que incluía el mismo reloj, pero a las dos en punto y, luego, otro a las tres en punto, y así sucesivamente. En cuanto nos dimos cuenta de esto, usamos una búsqueda distribuida del vecino más próximo para verificar que, en efecto, todas las imágenes replicadas tenían duplicados similares perceptualmente en el conjunto de datos. Otros(se abre en una ventana nueva) trabajos(se abre en una ventana nueva) han observado un fenómeno similar en grandes modelos lingüísticos, por lo que hemos descubierto que la duplicación de datos está fuertemente vinculada a la memorización.

Este hallazgo que mencionamos sugiere que, si eliminásemos los duplicados de nuestro conjunto de datos, podríamos resolver el problema de la replicación. Para conseguirlo, tenemos pensado usar una red neuronal que identifique grupos de imágenes similares y, a continuación, elimine de cada grupo todas las imágenes menos una.B

No obstante, hacer esto requeriría comprobar cada imagen para ver si es un duplicado de cualquier otra imagen del conjunto de datos. Puesto que nuestro conjunto de datos al completo contiene cientos de millones de imágenes, esto supondría comprobar cientos de miles de billones de pares de imágenes para encontrar todos los duplicados. Aunque es técnicamente factible, especialmente al tratar con un gran clúster informático. Por ello, hemos encontrado una alternativa mucho más eficaz que funciona prácticamente igual de bien pero a un coste mucho más reducido. Tengamos en cuenta lo que ocurre si agrupamos en clústeres nuestro conjunto de datos antes de proceder con la eliminación de duplicados. Puesto que las muestras cercanas suelen pertenecer al mismo clúster, la mayoría de los pares duplicados no superarían los umbrales de decisión del clúster. Así pues, podríamos eliminar los duplicados dentro de cada clúster sin comprobar si hay duplicados fuera de este y solo se perdería una pequeña fracción de todos los pares duplicados. Esto resulta mucho más rápido que el método simple mencionado anteriormente, ya que no haría falta comprobar cada par de imágenes.C

Cuando probamos empíricamente este enfoque con un pequeño subconjunto de nuestros datos, encontramos el 85 % de todos los pares duplicados cuando usamos clústeres K=1024. Para mejorar la tasa de éxito del algoritmo mencionado anteriormente, hemos tenido en cuenta una observación clave: cuando subconjuntos aleatorios de un conjunto de datos se agrupan en clústeres diferentes, los umbrales de decisión de los clústeres resultantes son, por norma general, muy diferentes. Por tanto, si un par duplicado supera uno de los umbrales del clúster para una de las agrupaciones de datos, el mismo par podría entrar dentro de un único clúster de una agrupación diferente. Así pues, cuantas más agrupaciones probemos, más probabilidades tendremos de descubrir un determinado par duplicado. En la práctica, hemos optado por utilizar cinco clústeres. Es decir, buscamos duplicados de cada imagen en la unión de cinco clústeres diferentes. Con este método, pudimos encontrar el 97 % de los pares duplicados en un subconjunto de nuestros datos.

Para nuestra sorpresa, este proceso eliminó casi una cuarta parte de nuestro conjunto de datos. Además, cuando observamos los pares «casi duplicados» que encontramos, muchos de ellos contenían cambios significativos. Recordemos el ejemplo del reloj que mencionamos anteriormente: el conjunto de datos puede contener muchas imágenes del mismo reloj, pero a distintas horas del día. Aunque es probable que estas imágenes sean las responsables de que el modelo memorice la apariencia de este reloj en concreto, también podrían ayudar al modelo a aprender a distinguir las horas del día en un reloj. Puesto que se han eliminado una gran cantidad de datos, nos preocupaba que eliminar este tipo de imágenes pudiera perjudicar el rendimiento del modelo.

Por ello, para comprobar el efecto de eliminar los duplicados en nuestros modelos, hemos entrenado dos modelos con hiperparámetros idénticos: uno con el conjunto de datos completo y otro con la versión del conjunto de datos sin duplicados. Hemos utilizado las mismas evaluaciones hechas por humanos que ya usamos para evaluar nuestro modelo GLIDE original para comparar ambos modelos. Sorprendentemente, hemos descubierto que los evaluadores humanos tenían algo más de preferencia por el modelo entrenado con los datos en los que se habían eliminado los duplicados. Esto sugiere que la gran cantidad de imágenes redundantes del conjunto de datos estaba perjudicando el rendimiento del modelo.

En cuanto contamos con un modelo entrenado con datos sin duplicados, volvimos a ejecutar la búsqueda de réplicas que habíamos hecho anteriormente con más de 50 000 prompts del conjunto de datos de entrenamiento. Descubrimos que el nuevo modelo nunca replicaba una imagen de entrenamiento cuando se usaba un prompt exactamente igual que el de la imagen del conjunto de datos de entrenamiento. Para profundizar aún más con esta prueba, también llevamos a cabo una búsqueda del vecino más próximo en todo el conjunto de datos de entrenamiento para todas y cada una de las 50 000 imágenes generadas. Pensamos que, de esta forma, podríamos «pillar» al modelo replicando una imagen diferente a la asociada a un prompt específico. Sin embargo, incluso tras esta comprobación más minuciosa, jamás hemos encontrado otro caso de imágenes replicadas.

Los próximos pasos

Todas las medidas de mitigación que hemos comentado en el artículo representan un avance muy significativo hacia nuestro objetivo de reducir los riesgos asociados a DALL·E 2. No obstante, todavía nos queda mucho por mejorar:

  • Unos mejores filtros de entrenamiento nos permitirían entrenar a DALL·E 2 con más datos y, potencialmente, a reducir todavía más el sesgo del modelo. Los filtros de los que disponemos ahora están ajustados para ofrecer un bajo índice de errores a costa de que haya muchos falsos positivos. Como resultado, hemos filtrado, aproximadamente, el 5 % de nuestro conjunto de datos, aunque la mayoría de las imágenes filtradas no infringen en absoluto nuestra política de contenidos. Así pues, una mejora en nuestros filtros nos daría la capacidad de recuperar algunos de estos datos de entrenamiento.
  • Los sesgos se introducen y se amplifican potencialmente en varias de nuestras fases del desarrollo y la implantación del sistema. Por ello, consideramos que evaluar y mitigar el sesgo en sistemas como DALL·E 2, así como el daño que este sesgo provoca, es un problema interdisciplinar importante y, en OpenAI, seguimos estudiando cómo resolverlo como parte de nuestra misión general. Nuestro trabajo en este aspecto incluye hacer evaluaciones para comprender mejor el problema, seleccionar nuevos y mejores conjuntos de datos, y aplicar técnicas como los comentarios por parte de humanos y la optimización para crear tecnologías más fiables y representativas.
  • Además, es fundamental que sigamos estudiando la memorización y la generalización en los sistemas de aprendizaje profundo. La eliminación de duplicados es un estupendo primer paso para evitar la memorización, pero no nos ofrece toda la información sobre cómo o por qué los modelos como DALL·E 2 memorizan los datos de entrenamiento.

Notas al pie

  1. Cuando parametrizamos P(sin filtrar|imagen) como sigmoide(f(x)), entonces la ponderación es exp(f(x)). Podemos deducir esto si usamos la definición de la función sigmoide:

1/(1+ef(x))/(11/(1+ef(x))) 1/(1+e^−f(x))/(1−1/(1+e^−f(x))) =1/(1+ef(x))/((1+ef(x)1)/(1+ef(x))) = 1/(1+e^{-f(x)}) / ((1+e^{-f(x)} - 1)/(1+e^{-f(x)})) =1/(1+ef(x))/((ef(x))/(1+ef(x))) = 1/(1+e^{-f(x)}) / ((e^{-f(x)})/(1+e^{-f(x)})) =(1+ef(x))/(1+ef(x))/(ef(x)) = (1+e^-f(x))/(1+e^-f(x)) / (e^-f(x)) =1/(ef(x))=ef(x) = 1 / (e^{-f(x)}) = e^{f(x)}

  1. B

    Para conseguir esto, podemos calcular un vector de características viv_i para cada imagen de entrenamiento ii. Después, habría que eliminar todas las imágenes jj de modo que exista una i<ji < j en la que vivj||v_i - v_j|| <umbral. Para resolver este problema de forma más sencilla, tendríamos que calcular cada distancia entre pares vivj||v_i - v_j||, una tarea que aumenta cuadráticamente con el tamaño de nuestro conjunto de datos.

  2. C

    Si ponemos que K K representa el número de clústeres y N N representa el tamaño del conjunto de datos, entonces este enfoque solo requiere cálculos de distancia entre pares O(K(N/K)2)=O(N2/K) O(K*(N/K)^2) = O(N^2/K) en vez del cálculo O(N2) O(N^2) al completo. Por el momento, seguimos teniendo la garantía de que ninguna imagen tendrá más de K K casi duplicados en el peor caso posible.

Autores

Alex Nichol

Contribuidores

Alex Nichol, Aditya Ramesh, Pamela Mishkin, Prafulla Dariwal, Joanne Jang y Mark Chen

Contribuciones de redacción

Greg Brockman, Aditya Ramesh, Pamela Mishkin, Mark Chen, Pranav Shyam, Casey Chu, Che Chang y Miles Brundage