¿Cómo mejoran los algoritmos de compresión?

En mi explicación, usaré el concepto de entropía de una variable aleatoria. El método al que se hace referencia en la pregunta, la codificación de Huffman, es demostrablemente imbatible siempre que conozca la función de densidad de probabilidad completa de la señal que desea comprimir. El número de bits de información en una señal [matemática] X [/ matemática], dada su función de densidad de probabilidad se mide por su entropía teórica de la información (Entropía (teoría de la información)), y la codificación de Huffman logra esto asintóticamente:
[matemáticas] H (X) = – \ sum_x p_X (x) log_2 p_X (x) [/ matemáticas]
Ilustraré el problema continuando con el ejemplo que usó en su pregunta. Cuando tiene un histograma, no, digamos, una función de densidad de probabilidad * verdadera * de valores de color, puede representar un píxel individual con el menor número absoluto de bytes posible. Pero presumiblemente quiere hacer más que comprimir un solo píxel de color. Quizás quieras comprimir una imagen.

Pero una imagen es solo una colección de píxeles. ¿Por qué importa cuántos píxeles quieres enviar? Para ilustrar, digamos que tiene una señal [matemática] Z = [Z_1, Z_2] [/ matemática] que consta de dos bits, y es 1,0 o 0,1 con probabilidad 0,5. Entonces, si codifica cualquier bit [matemático] Z_i [/ ​​matemático] de esta señal, encontrará que su entropía de ese bit es exactamente 1 bit. Es decir, la señal no se puede comprimir en absoluto. Pero si codifica la señal como un todo, verá que [matemática] P (Z = 01) = P (Z = 10) = 0.5 [/ matemática] y así [matemática] H (Z) = 0.5 + 0.5 bits = 1 bit [/ math], que es una ganancia total del 50% sobre el método de codificación de un solo bit.

¿Cómo pasó esto? Porque hay dependencias entre [math] Z_1 [/ math] y [math] Z_2 [/ math]. De hecho, [math] Z_1 [/ math] determina completamente [math] Z_2 [/ math]. Si almacenó esa [matemática] Z_1 = 1 [/ matemática], no necesitaría almacenar [matemática] Z_2 = 0 [/ matemática]. Lo obtienes gratis. Es por eso que la señal tiene solo un bit de información. Volviendo a la definición de entropía anterior, la entropía de una señal vectorial es estrictamente menor que la suma de las entropías de sus componentes individuales a menos que todos los componentes sean independientes.

[matemáticas] H ([X]) = H (X_1) + [/ matemáticas] [matemáticas] H (X_2 | X_1) +… + H (X_n | X_1, .. X_n) [/ matemáticas]

[matemática] H (A | B) [/ matemática] es una medida de la información adicional en A después de saber B. En el ejemplo anterior [matemática] H (Z_2 | Z_1) = 0 [/ matemática].

Ahora, vamos a las señales del mundo real. Suponga que desea comprimir una imagen fotográfica [matemática] I [/ matemática]. Todos los píxeles de una imagen tienen dependencias, por lo que no puede trabajar con probabilidades de píxeles individuales. Eso sería como trabajar con los bits individuales de nuestra señal de juguete [matemática] Z [/ matemática] anterior. Debe conocer la función de densidad de probabilidad conjunta de la imagen [matemáticas] I [/ matemáticas]. No puede simplemente almacenar histogramas de imágenes para representar el pdf conjunto, como lo hizo para los valores de color. Incluso para una imagen de 640 × 480 píxeles, este histograma tendría 307200 dimensiones, y si cada píxel pudiera tomar 255 valores (digamos que es una imagen en escala de grises), entonces estaría mirando un histograma con [matemáticas] 255 ^ {307200 } [/ math] entradas! E incluso si estuviera dispuesto a almacenar esta información en algún lugar, la cantidad de imágenes que tendría que escanear para construir un histograma confiable de ese tamaño sería un orden de magnitud mayor que el tamaño del histograma.

Esto es cuando sabe que es hora de que comience a hacer cosas inteligentes para acercarse al mejor rendimiento posible haciendo * mucho * menos de lo que requeriría el mejor rendimiento absoluto. Empiezas a construir un modelo económico inteligente para un pdf conjunto. En el nivel más bajo, los valores de píxeles adyacentes generalmente están muy cerca uno del otro, pero esta dependencia desaparece rápidamente para píxeles más separados. Entonces, tal vez diga que estaría satisfecho con un pdf conjunto que solo codifica las dependencias en vecindarios de 3 × 3 píxeles. Entonces tu trabajo se volvió mucho más fácil. Ahora tiene [math] 255 ^ 9 [/ math] entradas en su histograma. Todavía es un número muy grande, pero observa que hay simetrías dentro del pdf (digamos que el píxel superior e inferior dependen de la misma manera del resto) y, por lo tanto, solo necesita almacenar [matemáticas] 255 ^ 5 [/ matemáticas ] píxeles. Esto es algo que quizás pueda lograr, pero es posible que tenga que aprender un modelo funcional para su histograma después de haberlo construido, para que su programa de compresión no necesite [matemáticas] 4 ^ {12} [/ matemáticas ] bytes (suponiendo entradas flotantes).

El principal algoritmo de compresión de imágenes sin pérdida de hoy en día, JPEG-LS (ver http://www.hpl.hp.com/loco/), hace algo en este sentido y ha sido difícil de superar durante mucho tiempo. Sin embargo, teóricamente, podrías encontrar otras formas de aproximar el pdf conjunto y quizás hacerlo mejor. Tal vez, por ejemplo, explota dependencias de mayor nivel, como decir que si hay un automóvil en la imagen, ¡es probable que también haya una carretera en él! Siempre es posible superar todos los métodos de compresión existentes, simplemente utilizando unos pocos recursos más que cualquiera de ellos. A medida que aumenta la potencia de cálculo y las capacidades de almacenamiento, los algoritmos de compresión cada vez más complicados pueden volverse viables. Por lo tanto, siempre hay margen de mejora.

Solo he tratado hasta ahora con la compresión sin pérdidas. Supongamos que se vuelve aún más inteligente y dice que no le importa el pdf conjunto de la imagen en sí, sino solo la percepción de esa imagen por parte de los espectadores humanos. Como ejemplo de juguete, digamos que descubres que a la mayoría de los humanos les resulta difícil notar el cambio cuando se eliminan todos los bordes de una imagen. Luego dejas de molestarte para codificar los bordes. Claro, en un sentido absoluto, no podrá reproducir la imagen original, pero sus estudios muestran que la mayoría de las personas no notan la diferencia, y usted sabe que los únicos consumidores de su imagen son * personas *, por lo que puede salirse con la suya haciendo esto. Esta es la compresión “con pérdida”. Para las imágenes, por ejemplo, los esquemas de compresión de imágenes fijas con pérdida como JPEG pueden producir imágenes comprimidas “excelentes” (según lo juzgado por observadores humanos) utilizando aproximadamente un orden de magnitud menos bytes que los mejores métodos sin pérdida. Por lo tanto, el progreso en el difícil problema de comprender la percepción visual humana es otra fuente importante de nuevas ideas que han permitido consistentemente mejoras sobre el estado de la técnica para la compresión de imagen / video con pérdida.

Imágenes cortesía: wikipedia, galerías jmg y blog del consorcio de la comunidad informática

No es una tarea fácil vencer a los algoritmos de compresión generales, sin pérdidas y basados ​​en el diccionario, ya que actualmente están logrando relaciones de compresión muy altas (debido a la mayor disponibilidad de máquinas con grandes cantidades de RAM, lo que hace posible encontrar repeticiones de patrones muy largas ) Para mejorar aún más, normalmente se debe tener en cuenta el dominio del problema dado e incorporarlo al algoritmo de compresión en forma de conocimiento previo que sería imposible obtener de una sola instancia de los datos que necesitan ser comprimidos. Como resultado, la investigación de compresión se ha dividido en compartimentos y continúan surgiendo múltiples nichos. El algoritmo Portable Network Graphics es un buen ejemplo de un algoritmo de compresión de imágenes con dominio de dominio, como lo es JPEG 2000. Actualmente se está llevando a cabo una interesante investigación de compresión en Genomics, donde se han obtenido algunos resultados impresionantes, por ejemplo, el proyecto HapZipper.

La compresión con pérdida se basa en el conocimiento del dominio de manera similar: aquí tenemos que saber qué es lo que podemos tirar sin afectar la percepción humana general de lo que estamos tratando de comprimir.

La compresión es comprensión. Cuanto mejor comprenda lo que está comprimiendo, mejor podrá comprimirlo. Entonces, un compresor que es realmente óptimo para texto en inglés pasaría una prueba de Turing porque realmente entendería el idioma.

Es por eso que siempre hay margen de mejora porque todavía estamos muy lejos en el campo de la IA para poder programar computadoras para comprender realmente las cosas. Y la compresión es de hecho un problema de IA.

Puede ver la compresión como dos pasos: modelado y codificación. El modelado es un campo de IA y es un problema que no se puede resolver.

Se desarrollan nuevos compresores que mejoran la forma en que se modelan los datos.

Los algoritmos de compresión de datos operan dentro de las restricciones del sistema. En los últimos 10 años, los sistemas se han vuelto más potentes (o más baratos por la misma capacidad). Por lo tanto, los diseñadores de algoritmos pueden extenderse de formas que antes no podían.

Eche un vistazo a los Programas de compresión de datos de PAQ que detalla toda una familia de algoritmos relacionados, con mediciones de tiempo, uso de memoria y efectividad de compresión. Para generalizar en exceso, los que son más efectivos en la compresión en términos de bytes guardados tardan más en ejecutarse y consumen más memoria del sistema. Si está dispuesto a usar 100 veces el tiempo y 1000 veces el consumo de memoria, puede obtener resultados notablemente mejores (mirando P5 vs PAQ8L en esa tabla).

Ahora, un diseñador de sistemas de 2005 que establece el mejor algoritmo de compresión disponible para las máquinas que tienen frente a ellos en ese momento avanza rápidamente hasta 2015. RAM es barata, el disco es absurdamente rápido (debido a SSD), y existen estos chips de GPU originales que parecen interesantes. Un algoritmo que era irremediablemente lento en 2005 podría funcionar bien ahora sin modificaciones porque ahora se ajusta a su hardware, mientras que antes no lo hacía.

Además de la respuesta del usuario de Quora, la mayor compresión posible de un conjunto de datos viene dada por su complejidad de Kolmogorov. Este número es, lamentablemente, incuestionable [1]. De esto parecería que nunca vamos a llegar a un punto en el que podamos decir con certeza que “esto es tan bueno como se pone”.

[1] Complejidad de Kolmogorov

More Interesting

¿Qué cursos de CS debo completar antes de intentar la investigación de pregrado?

¿Quiénes son los mejores profesores de investigación en informática en la NYU?

¿Cuál es el campo donde la investigación tiene la aplicación más rápida?

¿Es la computación en el espacio diferente de la computación en la tierra?

¿Cuáles son los documentos más influyentes en el mundo de SDN (Software Defined Networking)?

No estudié ciencias de la computación en los grados 11 y 12, pero ahora deseo estudiar ciencias de la computación en el Manipal Institute of Technology. ¿Es una buena decisión hacerlo?

Mi trabajo de tesis está relacionado con el aprendizaje automático. ¿Alguien puede sugerir algún trabajo de aprendizaje automático que contenga alguna investigación que pueda completar en los próximos dos meses?

¿Cómo se puede seguir el Karma Yoga en el campo de la informática?

¿Cuáles son los códigos de simulación de última generación en dinámica de fluidos computacional?

¿Cuáles son los temas de investigación más importantes en el campo de Big Data?

¿Quiénes son algunos grandes científicos informáticos con una sólida formación en física?

Comenzando mi investigación de doctorado sobre sistemas de navegación con visión asistida. ¿Dónde puedo encontrar buenos recursos y referencias para la visión por computadora en la navegación?

¿Cómo puedo aprender la teoría del lenguaje de programación?

¿Puedo tomarme un mes para escribir una encuesta de investigación en ciencias de la computación?

¿Cómo puede un estudiante universitario publicar un artículo de revista? ¿Qué tan difícil es hacer? ¿Qué consejos y estrategias recomendaría la gente?