Bisakah PRNG digunakan untuk mengompresi benda secara ajaib?


38

Gagasan ini muncul pada saya sebagai seorang anak yang belajar memprogram dan pada awalnya menghadapi PRNG. Saya masih tidak tahu seberapa realistis itu, tapi sekarang ada pertukaran tumpukan.

Berikut skema anak berusia 14 tahun untuk algoritma kompresi yang luar biasa:

Ambil PRNG dan seed dengan seed suntuk mendapatkan urutan panjang pseudo-random byte. Untuk mengirimkan urutan itu ke pihak lain, Anda hanya perlu mengkomunikasikan deskripsi PRNG, seed yang sesuai dan panjang pesan. Untuk urutan yang cukup panjang, deskripsi itu akan jauh lebih pendek daripada urutan itu sendiri.

Sekarang anggaplah saya bisa membalikkan prosesnya. Dengan cukup waktu dan sumber daya komputasi, saya bisa melakukan pencarian dengan kekuatan besar dan menemukan benih (dan PRNG, atau dengan kata lain: program) yang menghasilkan urutan yang saya inginkan (Katakanlah foto lucu kucing yang nakal).

PRNG mengulangi setelah sejumlah besar bit telah dihasilkan, tetapi dibandingkan dengan siklus "tipikal" pesan saya cukup pendek sehingga hal ini sepertinya bukan masalah besar.

Voila, cara efektif (jika rube-Goldbergian) mengompres data.

Jadi, dengan asumsi:

  • Urutan yang ingin saya kompres terbatas dan diketahui sebelumnya.
  • Saya tidak kekurangan uang tunai atau waktu (Asalkan jumlah terbatas keduanya diperlukan)

Saya ingin tahu:

  • Apakah ada kelemahan mendasar dalam alasan di balik skema ini?
  • Apa cara standar untuk menganalisis eksperimen pemikiran semacam ini?

Ringkasan

Sering kali jawaban yang baik menjelaskan tidak hanya jawabannya, tetapi apa yang sebenarnya saya tanyakan. Terima kasih atas kesabaran semua orang dan jawaban terinci.

Inilah usaha saya yang ke-1 untuk ringkasan jawaban:

  • Sudut PRNG / seed tidak berkontribusi apa-apa, itu tidak lebih dari sebuah program yang menghasilkan urutan yang diinginkan sebagai output.
  • Prinsip pigeonhole: Ada lebih banyak pesan panjang> k daripada ada program (menghasilkan pesan) panjang <<k. Jadi beberapa urutan tidak bisa menjadi keluaran dari program yang lebih pendek dari pesan.
  • Perlu disebutkan bahwa penerjemah program (pesan) harus diperbaiki terlebih dahulu. Dan desainnya menentukan subset pesan (kecil) yang dapat dihasilkan ketika pesan dengan panjang k diterima.

Pada titik ini ide PRNG asli sudah mati, tetapi setidaknya ada satu pertanyaan terakhir untuk diselesaikan:

  • T: Bisakah saya beruntung dan menemukan bahwa pesan panjang (tapi terbatas) saya kebetulan merupakan hasil dari program dengan panjang <k bit?

Sebenarnya, ini bukan masalah kebetulan karena makna dari setiap pesan (program) yang mungkin harus diketahui sebelumnya. Entah itu adalah arti dari beberapa pesan dari <k bit atau tidak .

Jika saya memilih pesan acak> = k bit secara acak (mengapa saya harus melakukannya?), Dalam kasus apa pun saya akan memiliki kemungkinan lenyap untuk dapat mengirimnya menggunakan kurang dari k bit, dan hampir pasti tidak dapat mengirim itu sama sekali menggunakan kurang dari k bit.

OTOH, jika saya memilih pesan spesifik> = k bit dari yang merupakan output dari program kurang dari k bit (dengan asumsi ada pesan seperti itu), maka pada dasarnya saya mengambil keuntungan dari bit yang sudah dikirim ke penerima (desain interpreter), yang dianggap sebagai bagian dari pesan yang ditransfer.

Akhirnya:

Pada akhirnya, keduanya memberi tahu kita hal yang sama dengan prinsip lubang pancang (yang lebih sederhana) memberi tahu kita tentang seberapa banyak kita dapat mengompres: mungkin tidak sama sekali, mungkin beberapa, tetapi tentu saja tidak sebanyak yang kita sukai (kecuali kita menipu).


6
Tweak pertanyaan Anda sedikit dan Anda masih tidak bisa memampatkan setiap string (seperti yang dijelaskan dalam jawaban di bawah), tetapi Anda mendapatkan Teori Informasi Algoritmik ( en.wikipedia.org/wiki/Kolmogorov_complexity ). Ganti "PRNG" dengan "mesin universal Turing" dan "seed" dengan "input tape yang berisi program yang menghasilkan output yang saya inginkan." Sebagian besar kaset input lebih panjang dari output yang mereka hasilkan, tetapi untuk setiap output setidaknya ada satu input yang menghasilkan output itu.
Pengembaraan Logika

Tidak, tetapi ukuran yang dikompresi adalah entropi dari sumber ^ _ ^
Navin

5
Jika Anda benar-benar menerapkan ini, Anda akan menemukan hal yang menarik: untuk merekonstruksi input sewenang-wenang, Anda akan memerlukan seed + rng yang, rata-rata, setiap bit sama besar dengan data asli. Ups.
Markus

Cara lain untuk memahami mengapa ini tidak berhasil: meskipun PRNG dapat menghasilkan output yang panjang dan sewenang-wenang, PRNG tidak dapat menghasilkan output yang sewenang-wenang . (Keluaran PRNG akan selalu berupa siklus atau pola tertentu, dibatasi oleh ukuran negaranya.)
Pi Delport

@PietDelport, Untuk setiap n ada PRNG yang siklusnya jauh lebih besar, dan pertanyaan yang diajukan telah diketahui sebelumnya. Jadi saya tidak yakin bahwa fakta bahwa PRNG bersifat siklik itu sendiri langsung menjawab pertanyaan.

Jawaban:


43

Anda punya skema kompresi baru yang brilian, eh? Baiklah kalau begitu...

♫ Ayo kita semua bermain, game entropi ♫

Sederhananya, saya akan menganggap Anda ingin mengompres pesan dengan tepat bit, untuk beberapa n tetap . Namun, Anda ingin dapat menggunakannya untuk pesan yang lebih lama, jadi Anda perlu cara membedakan pesan pertama dari yang kedua (tidak bisa mendua dengan apa yang telah Anda kompres).nn

Jadi, skema Anda adalah untuk menentukan beberapa keluarga PRNG / benih sehingga jika Anda ingin mengompres, katakanlah, , maka Anda cukup menulis beberapa angka k , yang mengidentifikasi beberapa combo seed / PRNG yang telah dikomputasi (dan dibagi) yang menghasilkan bit-bit tersebut setelah n pertanyaan. Baik. Berapa banyak bit-string panjang n yang ada? 2 n (Anda memiliki n pilihan antara dua item; 0 dan 1 ). Itu berarti Anda harus menghitung 2 n dari kombo ini. Tidak masalah. Namun, Anda perlu menulis k dalam biner agar saya membacanya. Seberapa besar k dapat? Yah, itu bisa sebesar 201000111001knn2n012nkk . Berapa bit yang harus saya tuliskan 2 n ? log 2 n = n .2n2nlog2n=n

Ups! Skema kompresi Anda membutuhkan pesan selama apa yang Anda kompres!

"Haha!", Katamu, "tapi itu dalam kasus terburuk! Salah satu pesanku akan dipetakan ke , yang hanya membutuhkan 1 bit untuk diwakili! Kemenangan!"01

Ya, tetapi pesan Anda harus jelas! Bagaimana saya membedakan diikuti oleh 0 dari 10 ? Karena beberapa kunci Anda panjang n , semuanya harus, atau saya tidak tahu di mana Anda memulai dan berhenti.1010n

"Haha!", Katamu, "tapi aku hanya bisa meletakkan panjang string dalam biner dulu! Itu hanya perlu dihitung menjadi , yang dapat diwakili oleh log n bits! Jadi 0 saya sekarang datang diawali dengan hanya log n bit, aku masih menang! "nlogn0logn

Ya, tetapi sekarang angka-angka yang sangat besar diawali dengan bit n . Skema kompresi Anda telah membuat beberapa pesan Anda bahkan lebih lama! Dan setengah dari semua angka Anda dimulai dengan 1 , jadi setengah dari pesan Anda lebih lama!logn1

Anda kemudian melanjutkan untuk mengeluarkan lebih banyak ide seperti karakter penghentian, gzipping nomor, dan mengompresi panjang itu sendiri, tetapi semua itu berjalan ke dalam kasus di mana pesan yang dihasilkan hanya lebih lama. Bahkan, untuk setiap bit yang Anda simpan pada beberapa pesan, pesan lain akan mendapat respons lebih lama. Secara umum, Anda hanya akan bergeser di sekitar "biaya" pesan Anda. Membuat beberapa lebih pendek hanya akan membuat orang lain lebih lama. Anda benar-benar tidak dapat memasukkan pesan yang berbeda dalam ruang yang lebih sedikit daripada menulis 2 n string biner dengan panjang n .2n2nn

"Haha!", Anda berkata, "tapi aku bisa memilih beberapa pesan sebagai 'bodoh' dan membuat mereka! Ilegal Lalu aku tidak perlu menghitung semua jalan ke , karena saya tidak mendukung bahwa banyak pesan!"2n

Anda benar, tetapi Anda belum benar-benar menang. Anda baru saja menyusut set pesan yang Anda dukung. Jika Anda hanya mendukung dan b = 111111110101000 sebagai pesan yang Anda kirim, maka Anda pasti dapat memiliki kode a 0 , b 1 , yang cocok persis dengan apa yang saya katakan. Di sini, n = 1 . Panjang sebenarnya dari pesan itu tidak penting, ada berapa banyak.a=0000000011010b=111111110101000a0b1n=1

"Haha!", Katamu, "tapi aku bisa dengan mudah menentukan bahwa pesan-pesan bodoh itu langka! Aku akan membuat yang langka itu besar, dan yang umum kecil! Lalu aku menang rata-rata!"

Ya! Selamat, Anda baru saja menemukan entropi ! Jika Anda memiliki pesan, di mana saya pesan th memiliki probabilitas p i menjadi pengirimannya, maka Anda bisa mendapatkan panjang pesan diharapkan Anda ke entropi H = Σ n i = 1 p i log ( 1 / p i ) dari himpunan ini pesan. Itu semacam ekspresi aneh, tetapi yang perlu Anda ketahui adalah itu yang terbesar ketika semua pesan memiliki kemungkinan yang sama, dan lebih kecil ketika beberapa lebih umum daripada yang lain. Dalam ekstrim, jika Anda tahu pada dasarnya setiap pesan akan menjadi sebuahnipiH=i=1npilog(1/pi) . Kemudian Anda dapat menggunakan kode super efisien ini: a 0 , x 1 x sebaliknya. Kemudian panjang pesan diharapkan Anda pada dasarnya 1 , yang mengagumkan, dan itu akan menjadi benar-benar dekat dengan entropi H . Namun, H adalah batas bawah, dan Anda benar-benar tidak dapat mengalahkannya, tidak peduli seberapa keras Anda mencoba.a=000111010101a0x1x1HH

Apa pun yang mengklaim mengalahkan entropi mungkin tidak memberikan informasi yang cukup untuk secara jelas mengambil pesan terkompresi, atau hanya salah. Entropy adalah suatu konsep yang sangat kuat sehingga kita dapat membatasi waktu berjalan (dan kadang-kadang bahkan batas atas ) beberapa algoritma dengan itu, karena jika mereka berjalan sangat cepat (atau sangat lambat), maka mereka harus melakukan sesuatu yang melanggar entropi .


13
Wah, apakah saya terdengar konyol ketika Anda berpura-pura menjadi saya. Syukurlah aku bisa bangga telah menemukan entropi. Selain lelucon, ini adalah jawaban yang bagus - Kalau saja nadanya tidak begitu diwarnai ejekan.

6
Saya tidak bermaksud untuk mengejek, hanya bermain bersama dengan gagasan "skema 14 tahun untuk algoritma kompresi yang luar biasa". :)
Alexis Beingessner

3
Tidak terdengar seperti mengejek saya juga :) Ini adalah skema yang cukup umum untuk menjelaskan masalah dalam sains populer (dan beberapa bidang lain), meskipun benar bahwa "penanya" biasanya Alice atau Bob daripada "nyata" orang: D Lihat betapa mudahnya Anda tiba-tiba memahami betapa rumitnya masalah sebenarnya! (Belum lagi ketika saya memikirkan masalah yang rumit di kepala saya, saya menggunakan proses yang sama - dialog batin sangat bagus dalam mensimulasikan "lebih banyak kepala yang tahu lebih banyak")
Luaan

2
@ SeveJessop, itu dikotomi palsu dan jangan pergi ke sana. Ini jawaban yang bagus dan saya mungkin terlalu sensitif, itu saja.

3
@ sipmonkey, saya pikir itu masih diliputi oleh jawaban alexis tentang "permainan entropi". Mungkin, jumlah algoritma yang diperlukan untuk melakukan itu akan sangat besar, sehingga jumlah bit yang diperlukan untuk menentukan yang mana yang digunakan akan membatalkan manfaatnya.

21

2N1N2NN

Dalam kehidupan nyata, kita sering tahu sesuatu tentang urutan yang kita tekan, katakan itu suara atau gambar. Dalam kasus kompresi lossless, teorema pengkodean sumber Shannon menunjukkan bahwa tingkat kompresi optimal sama dengan entropi sumber. Untuk pengkodean lossy ada teorema lain dalam teori informasi (teori tingkat-distorsi). Jadi, bahkan dalam kasus ini ada batasan seberapa banyak Anda dapat mengompres data.


Saya tidak pernah melihatnya dengan cara ini, tetapi ini baru saja datang kepada saya: pada dasarnya, Shannon mengatakan bahwa kasus terbaik sekalipun tidak dapat dikompres secara sewenang-wenang dan Prinsip Pigeonhole menjamin bahwa harus ada kasus terburuk yang tidak dapat dikompresi sama sekali. Apakah itu karakterisasi yang masuk akal?
Jörg W Mittag

1
Kasing terbaik selalu dapat dikompresi, karena Anda dapat memasukkan beberapa string sebagai kasing khusus dari algoritma kompresi Anda. Argumen ini bekerja tidak hanya untuk kasus terburuk tetapi juga untuk kasus rata-rata, menunjukkan bahwa kompresi rata-rata paling banyak 2 bit.
Yuval Filmus

Ah, tentu saja. if input.empty? then output_very_long_stringakan memberikan rasio kompresi tanpa batas sebagai kasus terbaik. Sebenarnya, bahkan ada algoritma kompresi yang menggunakan ini. (Aku lupa nama, sayangnya.) Hal ini dimaksudkan untuk string yang sangat singkat, dan memiliki pengkodean khusus untuk substring keras-kode seperti http://, www., .comdan sebagainya.
Jörg W Mittag

Bisakah saya mengalahkan argumen ini jika saya memiliki cara untuk merancang keluarga PRNG sehingga urutan yang tidak dapat mereka ungkapkan adalah yang saya kecualikan sebelumnya? (Kebisingan membentuk mata pikiran).

3
H=ipilog1/pipiH

7

sk2kn2nns

(Seperti jawaban lain dicatat, ini akan terjadi untuk fungsi kompresi yang Anda pilih.)


Dalam dirinya sendiri itu tidak membuktikan saya tidak dapat membangun PRNG yang kebetulan menghasilkan urutan yang saya pilih sebagai salah satu output yang mungkin, sementara membutuhkan bit jauh lebih sedikit untuk melakukannya. Seperti yang saya pahami dari jawaban lain, entropi terbukti memberlakukan batas bawah pada jumlah bit yang diperlukan. Artinya, saya benar-benar tidak dapat melakukannya dengan baik untuk urutan yang saya pilih.

Semua ini mengatakan bahwa jika Anda membuat PRNG favorit Anda, maka saya bisa mendatangi Anda dengan urutan yang tidak dihasilkannya, yang sudah menghancurkan ide Anda. Pernyataan yang lebih kuat adalah bahwa ada urutan yang tidak dipancarkan oleh program yang jauh lebih pendek sama sekali. (Dengan kata lain, Anda masih kehilangan bahkan jika saya membiarkan Anda mengubah fungsi Anda setelah melihat urutan saya. Itulah yang disinggung Yuval dengan "kompleksitas Kolmogorov".)
Louis

4

Selain poin-poin lain yang sudah dijawab, saya hanya ingin menambahkan tautan ini: https://www.schneier.com:443/blog/archives/2009/09/the_doghouse_cr.html

Sekarang, keluaran energi tahunan matahari kita adalah sekitar 1,21 × 10 ^ 41 erg. Ini cukup untuk memberi daya sekitar 2,7 × 10 ^ 56 perubahan bit tunggal pada komputer ideal kami; cukup perubahan status untuk menempatkan penghitung 187-bit melalui semua nilainya. Jika kita membangun bola Dyson mengelilingi matahari dan menangkap semua energinya selama 32 tahun, tanpa kehilangan apa pun, kita dapat menyalakan komputer untuk menghitung hingga 2 ^ 192. Tentu saja, itu tidak akan memiliki energi yang tersisa untuk melakukan perhitungan yang berguna dengan penghitung ini.

Jadi hanya iterasi (tanpa perbandingan ...) untuk menemukan konstelasi 187bit yang valid dari data yang Anda inginkan akan mengambil kondisi ideal (tidak dapat dicapai) lebih banyak energi daripada yang dipancarkan matahari selama setahun.


1

Bukti yang sangat cepat bahwa kompresor universal tidak ada. Misalkan Anda memang membuatnya, dan Anda mengompres input. Sekarang, kompres secara konsisten output dari program Anda. Jika Anda selalu dapat mengurangi ukuran, itu akan semakin kecil di setiap langkah, sampai Anda turun ke 1 bit.

Anda bisa berargumen bahwa, mungkin, output dari algoritma Anda memiliki struktur sedemikian rupa sehingga tidak dapat dikompresi lebih banyak, tetapi kemudian Anda bisa menerapkan shuffle deterministik * sebelum melakukan kompresi ulang.

Catatan Kaki: Beberapa pengocokan deterministik sebenarnya membantu dalam beberapa skema kompresi: http://pytables.github.io/usersguide/optimization.html?highlight=shuffling#shufflingoptim


Saya pikir Anda kehilangan bahwa setiap pesan terkompresi memiliki seed yang sterkait dengannya. Pesan 01001011 dengan ´s´ of 2348 akan berbeda dari pesan yang sama dengan ´s 'dari 3924. Kecuali saya salah memahami algoritma foo1899 sendiri dengan cara apa pun.
Azeirah

1

Penggunaan PRNG untuk "kompresi" pada dasarnya berguna dalam satu situasi: ketika perlu menggunakan sekelompok data "acak" dan secara kompak merekam data apa yang digunakan. Sebagian besar generator pseudo-acak hanya dapat menghasilkan sebagian kecil dari sekuens yang mungkin, tetapi jika seseorang hanya membutuhkan sekuens "acak" yang kecil hingga sedang, fraksi sekuens yang mungkin dihasilkan oleh PRNG akan sering lebih dari cukup.

Jika urutan data yang ingin disimpan terjadi secara kebetulan untuk mencocokkan apa yang akan dihasilkan oleh PRNG tertentu dengan benih yang tepat, menyimpan benih mungkin merupakan alternatif yang ringkas untuk menyimpan data. Namun, kecuali jika sumber datanya sedemikian rupa sehingga kecocokan tersebut mungkin terjadi, mereka akan sangat jarang sehingga pencarian mereka tidak akan bermanfaat.


PRNG digunakan dengan cara ini untuk secara kompak mewakili (pseudo) data acak, misalnya demi pengulangan percobaan.
Yuval Filmus

1
@YuvalFilmus: Tepat. Mereka juga dapat digunakan dalam beberapa situasi seperti generasi tingkat permainan video di mana sebagian kecil dari tingkat yang dihasilkan akan dianggap dapat diterima, tetapi di mana seorang desainer permainan video dapat secara acak menghasilkan tingkat sampai dia menemukan beberapa yang sesuai dengan keinginannya, dan merekam benih yang menghasilkan itu. Sebuah konsep yang sangat berguna secara historis, ketika coding untuk mesin video game dengan 128 byte RAM, mencoba menyesuaikan program ke dalam kartrid dengan 4.096 byte byte.
supercat

Itu contoh yang sangat bagus, cocok dengan skema yang saya jelaskan tentang pencarian benih "baik", tetapi mengambil keuntungan dari kenyataan bahwa dalam skenario itu banyak pesan yang mungkin baik.

@ foo1899: Kebetulan, game "Pitfall" en.wikipedia.org/wiki/Pitfall ! menggunakan teknik yang disebutkan di atas untuk menggunakan menghasilkan peta 256-layar pada 4K game cartridge pada mesin dengan 128 byte RAM.
supercat

1

Sesuatu yang perlu dipertimbangkan untuk menambah hiruk-pikuk jawaban yang menegaskan mengapa ada beberapa string yang tidak dapat dikompresi karena, menurut definisi, sifat injeksi dekompresi, dan alam semesta terbatas string terkompresi dari mana untuk memilih untuk mewakili pesan adalah ini: sebagian besar string tidak dapat dikompresi karena ada sangat banyak entropi lebih tinggi, string tidak teratur daripada ada yang lebih rendah entropi dan terstruktur, oleh karena itu menimbulkan kondisi yang kita lihat dalam praktek bahwa: kompresi sebagian besar waktu berguna, karena pesan kami yang paling sering ingin dikompres adalah yang paling sering memiliki beberapa alikuot tatanan dan struktur, dan dengan ini, merupakan bagian dari alam semesta yang jauh lebih kecil dari objek entropi rendah. Ini berarti ada kemungkinan bahwa, dengan memilih panjang keluaran yang sesuai, kita dapat memampatkan segala sesuatu di alam semesta yang lebih kecil dan terstruktur. Istilah terstruktur, entropi dan dipesan di sini sengaja tidak tepat, untuk mencerminkan definisi subjektif dari semantik dan kegunaan pesan yang mungkin ingin kita kompres.

Dan sebagai jawaban langsung atas permintaan si penanya: * ya, Anda tentu saja bisa saja beruntung dan menemukan hasil PRNG Anda adalah pesan persis yang ingin Anda kompres, hanya saja Anda begitu sering tidak akan menemukan ini masalahnya karena properti yang mencirikan PRNG, yaitu, kemampuannya untuk menghasilkan berbagai (hampir) variasi string yang tak berujung, membuatnya secara bersamaan tidak suka memproduksi milik Anda.

Tentu saja Anda dapat mengurangi kemungkinan yang tidak disukai ini dengan menggunakan PRNG untuk menjelajahi "grafik domain" dari transisi kata ke kata, dan Anda sangat meningkatkan kemungkinan kemunculan pesan Anda, dan juga sekarang Anda harus menambahkan grafik domain ke pesan yang dikompresi. panjangnya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.