- MNIST handwritten digit classification को सिर्फ GZIP compression और k-nearest neighbors (k-NN) से लगभग 78% accuracy तक पहुंचाने वाला यह प्रयोग दिखाता है कि compression को model-free classification tool के रूप में इस्तेमाल किया जा सकता है
- दो image samples को साथ में compress करने पर length कितनी बदलती है, इसके आधार पर normalized compression distance (NCD) calculate किया गया और इसे images के बीच similarity metric के रूप में इस्तेमाल किया गया
- हर test sample की तुलना 100 training samples से की जाती है, और सबसे कम distance वाले k=5 neighbors के majority label को prediction माना जाता है
- computational cost की वजह से accuracy पूरे test set पर नहीं, बल्कि test images के एक हिस्से पर मापी गई; पूरे set का इस्तेमाल करने पर evaluation अधिक सटीक हो सकता है
- public example में compression length cache बनाने के बावजूद उसे actual NCD calculation में इस्तेमाल न करने वाली refactoring mistake बची हुई है, इसलिए cache हटाने या
compute_ncdमें उसे शामिल करने की जरूरत है
GZIP + k-NN से MNIST classify करना
- प्रयोग में MNIST handwritten digit dataset को GZIP + k-NN combination से classify किया गया
- छोटा code example
gzip.compress(z.tobytes())के result की length को compressed length के रूप में इस्तेमाल करता है, NCD calculate करता है, और फिर 5 nearest neighbors के labels में से mode चुनता है - runnable example Jupyter Notebook में है
- लक्ष्य highest accuracy नहीं, बल्कि compression को model-free classification tool के रूप में इस्तेमाल करने के idea को सरल तरीके से validate करना है
- 10 पंक्तियों से कम वाला code प्रयोग का core होने से ज्यादा, मजे के लिए code golf element जैसा है
Similarity calculation और classification process
- NCD यह normalize करके similarity मापता है कि दो data points को साथ में compress करने की cost, उन्हें अलग-अलग compress करने की तुलना में कितनी अलग है
- compressed length इस रूप में calculate की जाती है
Cx1 = len(gzip.compress(x1.tobytes()))Cx2 = len(gzip.compress(x2.tobytes()))Cx1x2 = len(gzip.compress((x1 + x2).tobytes()))
- NCD formula
(Cx1x2 - min(Cx1, Cx2)) / max(Cx1, Cx2)के रूप में है - classification में हर test image और training image के बीच distance calculate किया जाता है, उन्हें nearest order में sort किया जाता है, और सबसे नजदीकी 5 labels के majority vote का इस्तेमाल होता है
- प्रयोग में 100 training samples के आधार पर comparison किया गया, और computational cost की वजह से test set का भी सिर्फ एक हिस्सा इस्तेमाल किया गया
संदर्भित ideas और code से जुड़ी सावधानी
- यह approach text generation from data compression article और parameter free text classification paper से प्रेरित है
- article लिखने के बाद Andreas Kirsch द्वारा 2019 में इसी तरह लिखी गई MNIST by ZIP post भी मिली
- example code training samples की compressed length cache बनाता है, लेकिन actual loop में उस cache value का इस्तेमाल नहीं करता
- normal version और obfuscated version दोनों
compressed_lengthsयाclsबनाते हैं, लेकिन NCD calculation में cached length का इस्तेमाल नहीं करते - cache हटाकर सीधे
training_setइस्तेमाल किया जाए, याcompute_ncdको cache values इस्तेमाल करने के लिए बदला जाए, तो code की मंशा और implementation मेल खाएंगे
- normal version और obfuscated version दोनों
1 टिप्पणियां
Hacker News की राय
कोड के distance function को एक और सरल माप से बदलकर देखा, तो MNIST classification में GZIP distance की accuracy भी कम थी और compute भी कहीं ज़्यादा था
Gzip distance: लगभग 3 मिनट, 78% accuracy / Euclidean distance: लगभग 0.5 सेकंड, 93% / Jaccard distance: लगभग 0.7 सेकंड, 94% / Dice dissimilarity: लगभग 0.8 सेकंड, 94%
Jaccard और Dice को image binarize करने के बाद मापा गया
GZIP algorithm से मैं बहुत परिचित नहीं हूं, लेकिन result इतना कम होना दिलचस्प है, और सोचता हूं कि image-केंद्रित compression algorithm हो तो शायद बेहतर हो
पोस्ट अपने आप में creative है और code व explanation भी अच्छे थे, लेकिन मुझे लगता है कि ऊपर की baselines gzip score को context देती हैं
NMI skimage: लगभग 30 सेकंड, 95% accuracy / NMI numba: लगभग 0.6 सेकंड, 95% accuracy
ChatGPT द्वारा दिए गए
numbacode से 2x2 joint count, entropy, और normalized mutual information calculate कियाव्यक्तिगत रूप से मेरी रुचि CIFAR10 fast training में है, इसलिए यह approach दूसरे domains में भी काफ़ी उपयोगी लग सकती है
https://github.com/benjamin-recht/mnist_1_pt_2/tree/main
zstandard भी जोड़कर देखा, तो Zstd(level=3) ने लगभग 3.5 सेकंड में 88% accuracy दी, यानी gzip से बहुत तेज़
Cx1x2calculate करते समयx1+x2की जगह(x1-x2)*2इस्तेमाल करें तो zstd 93% accuracy तक पहुंचता हैदोनों arrays को जोड़ने के बजाय ऊपर-नीचे stack करने पर performance पूरी तरह बिगड़कर 20% से कम हो जाती है, लेकिन string classification में वही तरीका अच्छा काम करता लगता है, इसलिए यह दिलचस्प है
दूसरी techniques से तुलना करें तो Linear SVC करीब 92%, RBF kernel SVC 96.4%, polynomial kernel SVC 94.5%, logistic regression 89%, और naive Bayes करीब 81% है
स्रोत: https://dmkothari.github.io/Machine-Learning-Projects/SVM_wi...
online posts देखकर लगता है कि सिर्फ K-NN से भी कहीं बेहतर results संभव हैं, इसलिए शायद author ने gzip इस्तेमाल करके काम को और मुश्किल बना दिया
मुझे simple model से शुरू करना और बाद में complexity जोड़ना पसंद है, लेकिन जिन समस्याओं में यह सच में अच्छा काम करता है, उनमें भी “logistic regression नहीं चलेगा” अक्सर सुनने को मिला
जब पूछा जाता है कि MNIST पर baseline performance कितनी होगी, तो कई लोग 20–30% का अनुमान लगाते हैं
machine learning करने वाले लोग भी अक्सर underestimate करते हैं कि model complexity बहुत बढ़ाने पर diminishing returns कितनी जल्दी आने लगते हैं
कई मामलों में अगर simple model पर performance अच्छी नहीं थी, तो अधिक complex model से भी बेहतरीन performance पाना मुश्किल रहा
MNIST dataset पेश करने वाले original paper ने भी लगभग 98% accuracy हासिल की थी, और आजकल neural networks 99.87% accuracy तक पहुंचते हैं
https://paperswithcode.com/sota/image-classification-on-mnis...
compression मूल समस्या को कठिन बनाने के लिए ही है, और वास्तव में यह अब भी वैसा ही काम करता है
दूसरे models कहीं न कहीं noise जोड़ने की प्रवृत्ति रखते हैं, तो सोचता हूं gzip से पहले feature engineering डालने पर कैसा रहेगा
उदाहरण के लिए, पहले Gaussian blur और convolution लागू करके, फिर feature selection के लिए deep learning का इस्तेमाल करना भी संभव लगता है
code elegant और छोटा हो सकता है, लेकिन MNIST पर 78% accuracy बहुत खराब मानी जाएगी
TensorFlow से बनाया गया dummy model भी आसानी से 90% accuracy तक पहुंच जाता है, और best model 99.87% पर है
benchmark: https://paperswithcode.com/sota/image-classification-on-mnis...
दिलचस्प हिस्सा यह है कि model train किए बिना भी compression को classification के लिए इस्तेमाल किया जा सकता है
इसलिए सवाल उठता है कि क्या और सस्ते व lossy information-theoretic measures भी इस्तेमाल किए जा सकते हैं
To Compress or Not to Compress- Self-Supervised Learning and Information Theory: A Review
[https://arxiv.org/abs/2304.09355\)" class="ud link">https://arxiv.org/abs/2304.09355\](https://arxiv.org/abs/2304.09355\)*
GZip latest best performance तक पहुंचता है या नहीं, यह interesting नहीं है; interesting यह है कि किसी हद तक classification हो जाती है
यह इस बात जैसा है कि भालू Mozart को perfect reproduce कर सकता है या नहीं, नहीं; बल्कि वह piano बजा सकता है, यही अपने आप में हैरान करने वाली बात है
फिर भी यह baseline से 8 गुना बेहतर है, और दिखाता है कि compression representation सीख सकता है
अगर
compute_ncdको Euclidean distance से बदल दें, तो test accuracy 15%p बढ़ जाती है और computation भी काफ़ी कम हो जाता हैइसे
distances = [(np.sqrt(np.sum(np.square(x1-x))), label) for x, _, label in compressed_lengths]जैसा बदलना होगासूचना सिद्धांत, compression और learning algorithms के गहरे संबंधों पर किताबों में MacKay सबसे अच्छी लगी
ठीक से प्रशिक्षित लोगों के लिए यह शायद सामान्य ज्ञान हो सकता है, लेकिन self-taught तरीके से practical machine learning करते आए मेरे लिए यह देखना कि यह विषय particle physics और cosmology जैसे क्षेत्रों तक जाता है, एक ज़बरदस्त “आहा!” पल था
उम्मीद है कि कम से कम एक व्यक्ति को भी वैसी ही समझ मिले, इसलिए यह छोड़ रहा/रही हूँ
जब पता चला कि gzip की बुनियादों में से एक, मूल Lempel-Ziv compression, सिर्फ़ size घटाने की कोशिश से ज़्यादा “finite sequences की complexity” के अध्ययन से निकला था, तो यह काफ़ी प्रभावशाली लगा
https://ieeexplore.ieee.org/document/1055501
निष्पक्ष तौर पर कहें तो MNIST को सिर्फ़ UMAP से गुज़ार देने पर भी वह लगभग पूरी तरह अलग-अलग हो जाता है
आजकल MNIST पर खराब performance लाने के लिए काफ़ी मेहनत करनी पड़ेगी, ऐसा लगता है
https://github.com/lmcinnes/umap_paper_notebooks/blob/master...
अब इस dataset को retire कर देना बेहतर होगा, और QuickDraw जैसे dataset कहीं ज़्यादा वाजिब लगते हैं
इसे अपने-आप में कोई बड़ी उपलब्धि मानना मुश्किल है, फिर भी यह देखना दिलचस्प है कि यह काम करता है
घर पहुँचकर लेख में जोड़ दूँगा/दूँगी कि MNIST solve करना अपेक्षाकृत आसान है
फिर भी ज़्यादातर सरल और reasonable algorithms 97% accuracy तक पहुँच जाते हैं, इसलिए educational tool या Hello world dataset के रूप में इसकी value अभी भी है
शुरू से tools खुद बनाएं तब भी यह homework के scale में फिट बैठता है, और “postal digits recognition” जैसा काम है जिसे हर कोई समझ सकता है
अगर compression समझते हैं, तो यह approach भी बहुत सरल idea है, इसलिए MNIST के public होने के पहले दिन भी इसे लिखा जा सकता था और फिर भी 78% accuracy मिलती
यही बात काफ़ी चौंकाने वाली लगती है
repository भी UMAP को define नहीं करती, और ChatGPT पर भरोसा करें तो UMAP का full form Uniform Manifold Approximation and Projection है, जो machine learning और data analysis में इस्तेमाल होने वाली dimension reduction और visualization technique है
इस क्षेत्र में मेरी समझ hobby level की है, लेकिन strongly compressed data, encrypted data की तरह high entropy वाला नहीं होता क्या
अगर compressed data में patterns ढूँढकर original digit पता लगाया जा सके, तो क्या उन patterns का इस्तेमाल बेहतर compression में नहीं होना चाहिए
idea यह है कि “7 7”, “7 3” से बेहतर compress होना चाहिए, और raster image में “7 7” भी “7 3” से बेहतर compress होगा
incompressibility efficient cryptographic operations की विशेषता है
Kolmogorov complexity लेख का compression section देखें: https://en.wikipedia.org/wiki/Kolmogorov_complexity#Compress...
compression में मेरी पसंदीदा concepts में से एक pigeonhole principle है, जिसके मुताबिक हर compression algorithm के लिए ऐसा output ज़रूर मौजूद होता है जो input से बड़ा हो जाता है
अच्छी तरह design किए गए encrypted payload को compress करने की कोशिश तो की जा सकती है, लेकिन average में output input से बड़ा हो जाता है और compression बेकार हो जाता है, इसलिए उसे “incompressible” कहा जाता है
https://en.wikipedia.org/wiki/Pigeonhole_principle#Uses_and_...
कुछ साल पहले MNIST images के size को “meta feature” की तरह इस्तेमाल करने का एक example था, ऐसा याद है, लेकिन अभी तुरंत ढूँढ नहीं पा रहा/रही हूँ
मुझे याद है कि image देखे बिना सिर्फ़ उसी एक feature से भी लगभग 90% के आसपास accuracy मिली थी
क्या gzip से compressed size? केवल यह देखना कि MNIST image कितनी dark है, यानी dark pixels का ratio, लगभग 20% accuracy देता है, इसलिए random guessing से दोगुना बेहतर है लेकिन 90% से बहुत दूर है
लगता है उस paper के authors से कोई गलती हुई थी, जिससे result benchmark के top tier में उछल गया था
उस घटना के बाद से मुझे लगा कि theory consistent नहीं है, फिर भी सिर्फ़ GZIP से 78% accuracy प्रभावशाली है
यह problem compression trick के लिए अच्छा application है या नहीं, इससे अलग, experiments करने वालों को
gzipछोड़करzlibइस्तेमाल करना चाहिएपहली line को
gzip.compressसेzlib.compressमें बदल देने पर वही classification performance मिलेगी और speed 3 गुना तेज़ होगी