กลับไปหน้าบทความ

อ่าน 14 นาที

ไม่มีชื่อบทความ

ระบบตัวเลขอสมมาตร ( ANS ) [ ‡ 1 ] [ ‡ 2 ] เป็นกลุ่มของวิธี การเข้ารหัสเอนโทรปี ที่คิดค้นโดย Jarosław (Jarek) Duda [ ‡ 3 ] จาก มหาวิทยาลัย Jagiellonian ซึ่งใช้ใน การบีบอัดข้อมูล...

ระบบตัวเลขอสมมาตร

ระบบตัวเลขอสมมาตร ( ANS ) [ ‡ 1 ] [ ‡ 2 ]เป็นกลุ่มของวิธีการเข้ารหัสเอนโทรปี ที่คิดค้นโดย Jarosław (Jarek) Duda [ ‡ 3 ]จากมหาวิทยาลัย Jagiellonianซึ่งใช้ในการบีบอัดข้อมูลตั้งแต่ปี 2014 [ ‡ 4 ]เนื่องจากประสิทธิภาพที่ดีขึ้นเมื่อเทียบกับวิธีการก่อนหน้า[ 1 ] ANS ผสมผสานอัตราส่วนการบีบอัดของการเข้ารหัสเลขคณิต (ซึ่งใช้การกระจายความน่าจะเป็น ที่แม่นยำเกือบทั้งหมด ) เข้ากับต้นทุนการประมวลผลที่คล้ายกับการเข้ารหัส Huffman [ ‡ 1 ]ในรูปแบบ ANS แบบตาราง (tANS) นี้ ทำได้โดยการสร้างเครื่องสถานะจำกัดเพื่อทำงานกับตัวอักษรขนาดใหญ่โดยไม่ต้องใช้การคูณ[ ‡ 2 ]

ANS ถูกใช้ในคอมเพรสเซอร์Facebook Zstandard [ 2 ] [ 3 ] (ใช้ในเคอร์เนลLinux [ 4 ] เบราว์เซอร์Google Chrome [ 5 ] ระบบปฏิบัติการ Android [ 6 ]และเผยแพร่เป็น RFC  8478 สำหรับMIME [ 7 ]และHTTP [ 8 ] ด้วยเช่นกัน ) คอมเพรสเซอร์Apple LZFSE [ 9 ] คอมเพรสเซอร์ Google Draco 3D [ 10 ] (ใช้ในรูปแบบPixar Universal Scene Description [ 11 ] ) และคอมเพรสเซอร์รูปภาพ PIK [ 12 ] คอมเพรสเซอร์ CRAM DNA [ 13 ]จาก ยูทิ ลิตี้SAMtools [ 14 ] ไลบรารีการบีบอัดความเร็วสูง NVIDIA nvCOMP [ 15 ] คอมเพรสเซอร์ Dropbox DivANS [ 16 ] คอมเพรสเซอร์พื้นผิว Microsoft DirectStorage BCPack [ 17 ] JPEG XLระยะยาว[ 18 ] และ คอมเพรสเซอร์รูปภาพJPEG AI ที่ใช้การเรียนรู้[ 19 ]

แนวคิดพื้นฐานคือการเข้ารหัสข้อมูลลงในจำนวนธรรมชาติเพียงจำนวนเดียวx{\displaystyle x}[ ‡ 2 ]ในระบบเลขฐานสองมาตรฐาน เราสามารถเพิ่มบิตได้{0,1}{\displaystyle s\in \{0,1\}}ข้อมูลถึงx{\displaystyle x}โดยการต่อท้าย{\displaystyle s}ในตอนท้ายของx{\displaystyle x}ซึ่งทำให้เราได้x=2x+{\displaystyle x'=2x+s}สำหรับตัวเข้ารหัสเอนโทรปีแล้ว วิธีนี้จะเหมาะสมที่สุดหากปร.(0)=ปร.(1)=1/2{\displaystyle \Pr(0)=\Pr(1)=1/2}ANS ขยายกระบวนการนี้ไปใช้กับชุดสัญลักษณ์ใดๆ ก็ได้เอส{\displaystyle s\in S}พร้อมด้วยการกระจายความน่าจะเป็นที่เกี่ยวข้อง(พี)เอส{\displaystyle (p_{s})_{s\in S}}ใน ANS หากข้อมูลจาก{\displaystyle s}ถูกแนบมาด้วยx{\displaystyle x}ส่งผลให้x{\displaystyle x'}, แล้วxxพี1{\displaystyle x'\approx x\cdot p_{s}^{-1}}ในทำนองเดียวกันบันทึก2(x)บันทึก2(x)+บันทึก2(1/พี){\displaystyle \log _{2}(x')\approx \log _{2}(x)+\log _{2}(1/p_{s})}, ที่ไหนบันทึก2(x){\displaystyle \log _{2}(x)}คือจำนวนบิตของข้อมูลที่จัดเก็บอยู่ในตัวเลขx{\displaystyle x}, และบันทึก2(1/พี){\displaystyle \log _{2}(1/p_{s})}คือจำนวนบิตที่อยู่ในสัญลักษณ์นั้น{\displaystyle s}[ 2 ]

สำหรับกฎการเข้ารหัส เซตของจำนวนธรรมชาติจะถูกแบ่งออกเป็นเซตย่อยที่ไม่ซ้ำกันซึ่งสอดคล้องกับสัญลักษณ์ที่แตกต่างกันเหมือนกับการแบ่งเป็นจำนวนคู่และจำนวนคี่ แต่มีความหนาแน่นที่สอดคล้องกับการกระจายความน่าจะเป็นของสัญลักษณ์ที่จะเข้ารหัส จากนั้นจึงเพิ่มข้อมูลจากสัญลักษณ์เข้าไป {\displaystyle s}เข้าสู่ข้อมูลที่จัดเก็บไว้แล้วในหมายเลขปัจจุบันx{\displaystyle x}เราไปที่หมายเลขx=ซี(x,)x/พี{\displaystyle x'=C(x,s)\approx x/p}เป็นตำแหน่งของx{\displaystyle x}การปรากฏตัวครั้งที่ - จาก{\displaystyle s}เซตย่อยที่ -th [ ‡ 2 ]

มีวิธีอื่นในการนำไปใช้ในทางปฏิบัติได้แก่สูตรทางคณิตศาสตร์โดยตรงสำหรับขั้นตอนการเข้ารหัสและการถอดรหัส (uABS และ rANS) หรือสามารถใส่พฤติกรรมทั้งหมดลงในตารางได้ (tANS) [ ‡ 1 ]การปรับค่าใหม่ใช้เพื่อป้องกัน x{\displaystyle x}ไปสู่ค่าอนันต์การถ่ายโอนบิตที่สะสมไปยังหรือจากบิตสตรีม[ ‡ 2 ] 

การเข้ารหัสเอนโทรปี

สมมติว่าเราต้องการเข้ารหัสลำดับของเลขศูนย์และเลขหนึ่งจำนวน 1,000 ตัว ซึ่งจะต้องใช้พื้นที่ 1,000 บิตในการจัดเก็บโดยตรง อย่างไรก็ตาม หากทราบว่าลำดับดังกล่าวมีเลขศูนย์เพียง 1 ตัวและเลขหนึ่ง 999 ตัว ก็เพียงพอที่จะเข้ารหัสตำแหน่งของเลขศูนย์ ซึ่งใช้พื้นที่เพียง 1 บิตเท่านั้นบันทึก2(1000)10{\displaystyle \lceil \log _{2}(1000)\rceil \approx 10}ใช้บิตจำนวนน้อยลงแทนที่จะเป็น 1000 บิตตามเดิม

โดยทั่วไป ลำดับที่มีความยาวดังกล่าวn{\displaystyle n}ประกอบด้วยพีn{\displaystyle pn}ศูนย์และ(1พี)n{\displaystyle (1-p)n}หนึ่ง ด้วยความน่าจะเป็นบางประการพี(0,1){\displaystyle p\in (0,1)}เรียกว่าการรวมกันโดยใช้การประมาณของสเตอร์ลิงเราจะได้จำนวนเชิงอะซิมโทติกของพวกมันเป็น

(nพีn)2nชม.(พี) สำหรับขนาดใหญ่ n และ ชม.(พี)=พีบันทึก2(พี)(1พี)บันทึก2(1พี),{\displaystyle {n \choose pn}\approx 2^{nh(p)}{\text{ สำหรับ n ที่มีค่ามาก }}n{\text{ และ }}h(p)=-p\log _{2}(p)-(1-p)\log _{2}(1-p),}

เรียกว่าเอนโทรปีของแชนนอน[ 20 ]

ดังนั้น ในการเลือกหนึ่งลำดับดังกล่าว เราจึงต้องการประมาณnชม.(พี){\displaystyle nh(p)}บิต มันยังคงเป็นn{\displaystyle n}บิต ถ้าพี=1/2{\displaystyle p=1/2}อย่างไรก็ตาม มันอาจจะเล็กกว่านั้นมากก็ได้ ตัวอย่างเช่น เราต้องการเพียงแค่n/2{\displaystyle \approx n/2}บิตสำหรับพี=0.11{\displaystyle p=0.11}.

ตัวเข้ารหัสเอนโทรปีช่วยให้สามารถเข้ารหัสลำดับของสัญลักษณ์โดยใช้บิตเอนโทรปีของแชนนอนโดยประมาณต่อสัญลักษณ์ ตัวอย่างเช่น ANS สามารถใช้โดยตรงเพื่อแจงนับชุดค่าผสม: กำหนดจำนวนธรรมชาติที่แตกต่างกันให้กับลำดับของสัญลักษณ์แต่ละลำดับที่มีสัดส่วนคงที่ในลักษณะที่เกือบจะเหมาะสมที่สุด[ ‡ 2 ]

ตรงกันข้ามกับชุดการเข้ารหัส การกระจายความน่าจะเป็นนี้มักจะแตกต่างกันไปในโปรแกรมบีบอัดข้อมูล ด้วยเหตุนี้ เอนโทรปีของแชนนอนจึงสามารถมองได้ว่าเป็นค่าเฉลี่ยถ่วงน้ำหนัก: สัญลักษณ์ของความน่าจะเป็นพี{\displaystyle p}ประกอบด้วยบันทึก2(1/พี){\displaystyle \log _{2}(1/p)}บิตของข้อมูล ระบบเลขฐานสิบหก (ANS) เข้ารหัสข้อมูลลงในจำนวนธรรมชาติเพียงจำนวนเดียวx{\displaystyle x}ซึ่งตีความได้ว่าประกอบด้วยบันทึก2(x){\displaystyle \log _{2}(x)}ข้อมูลย่อย การเพิ่มข้อมูลจากสัญลักษณ์ความน่าจะเป็นพี{\displaystyle p}เพิ่มเนื้อหาข้อมูลนี้ให้มากขึ้นบันทึก2(x)+บันทึก2(1/พี)=บันทึก2(x/พี){\displaystyle \log _{2}(x)+\log _{2}(1/p)=\log _{2}(x/p)}ดังนั้น ตัวเลขใหม่ที่ประกอบด้วยข้อมูลทั้งสองอย่างควรจะเป็นxx/พี{\displaystyle x'\approx x/p}[ 2 ]

ตัวอย่างที่สร้างแรงบันดาลใจ

พิจารณาแหล่งข้อมูลที่มีตัวอักษร 3 ตัว คือ A, B, C โดยมีความน่าจะเป็น 1/2, 1/4, 1/4 การสร้างรหัสคำนำหน้าที่ดีที่สุดในระบบเลขฐานสองนั้นทำได้ง่าย คือ A = 0, B = 10, C = 11 จากนั้นข้อความจะถูกเข้ารหัสเป็น ABC -> 01011

เราพบว่าวิธีการเข้ารหัสที่เทียบเท่ากันมีดังต่อไปนี้:

  • เริ่มจากเลข 1 แล้วทำการคำนวณกับตัวเลขนั้นสำหรับตัวอักษรแต่ละตัวที่ป้อนเข้ามา
  • A = คูณด้วย 2; B = คูณด้วย 4 แล้วบวก 2; C = คูณด้วย 4 แล้วบวก 3
  • แปลงตัวเลขนั้นให้อยู่ในรูปเลขฐานสอง แล้วลบเลข 1 ตัวแรกออก

ลองพิจารณาแหล่งข้อมูลทั่วไปที่มีตัวอักษร k ตัว โดยมีความน่าจะเป็นแบบตรรกยะn1/เอ็น,...,nเค/เอ็น{\displaystyle n_{1}/N,...,n_{k}/N}จากนั้น การเข้ารหัสเลขคณิตบนแหล่งข้อมูลจะต้องใช้การคำนวณเลขคณิตที่แม่นยำกับจำนวนเต็มเท่านั้น[ ‡ 1 ]

โดยทั่วไป ANS เป็นการประมาณค่าด้วยการเข้ารหัสทางคณิตศาสตร์ที่ประมาณค่าความน่าจะเป็นที่แท้จริง1,...,เค{\displaystyle r_{1},...,r_{k}}โดยจำนวนตรรกยะn1/เอ็น,...,nเค/เอ็น{\displaystyle n_{1}/N,...,n_{k}/N}โดยมีตัวหารขนาดเล็กเอ็น{\displaystyle N}[ 2 ]

แนวคิดพื้นฐานของ ANS

การเปรียบเทียบแนวคิดของการเข้ารหัสเลขคณิต (ซ้าย) และ ANS (ขวา) ทั้งสองสามารถมองได้ว่าเป็นการขยายระบบตัวเลขมาตรฐาน ซึ่งเหมาะสมที่สุดสำหรับการกระจายความน่าจะเป็นแบบสม่ำเสมอของตัวเลข ไปสู่การปรับให้เหมาะสมสำหรับการกระจายความน่าจะเป็นที่เลือกไว้ การเข้ารหัสเลขคณิตหรือการเข้ารหัสช่วงสอดคล้องกับการเพิ่มข้อมูลใหม่ในตำแหน่งที่มีนัยสำคัญที่สุด ในขณะที่ ANS เป็นการขยายการเพิ่มข้อมูลในตำแหน่งที่มีนัยสำคัญน้อยที่สุด กฎการเข้ารหัสคือ " xไปถึง การปรากฏครั้งที่ xของเซตย่อยของจำนวนธรรมชาติที่สอดคล้องกับสัญลักษณ์ที่เข้ารหัสในปัจจุบัน" ในตัวอย่างที่นำเสนอ ลำดับ (01111) ถูกเข้ารหัสเป็นจำนวนธรรมชาติ 18 ซึ่งเล็กกว่า 47 ที่ได้จากการใช้ระบบเลขฐานสองมาตรฐาน เนื่องจากมีความสอดคล้องกับความถี่ของลำดับที่จะเข้ารหัสได้ดีกว่า ข้อดีของ ANS คือการจัดเก็บข้อมูลในจำนวนธรรมชาติเพียงตัวเดียว ตรงกันข้ามกับการใช้สองตัวเพื่อกำหนดช่วง

ลองนึกภาพว่ามีข้อมูลบางอย่างถูกเก็บไว้ในจำนวนธรรมชาติx{\displaystyle x}ตัวอย่างเช่น ลำดับบิตของการขยายเลขฐานสอง เพื่อเพิ่มข้อมูลจากตัวแปรเลขฐานสอง{\displaystyle s}เราสามารถใช้ฟังก์ชันการเขียนโค้ดได้x=ซี(x,)=2x+{\displaystyle x'=C(x,s)=2x+s}ซึ่งจะเลื่อนบิตทั้งหมดขึ้นไปหนึ่งตำแหน่ง และวางบิตใหม่ไว้ในตำแหน่งที่มีค่าน้อยที่สุด ทีนี้มาดูฟังก์ชันการถอดรหัสกันดี(x)=(x/2,โอ(x,2)){\displaystyle D(x')=(\lfloor x'/2\rfloor ,\mathrm {mod} (x',2))}ช่วยให้สามารถเรียกดูข้อมูลก่อนหน้าได้x{\displaystyle x}และส่วนเพิ่มเติมนี้:ดี(ซี(x,))=(x,), ซี(ดี(x))=x{\displaystyle D(C(x,s))=(x,s),\ C(D(x'))=x'}เราสามารถเริ่มต้นด้วยx=1{\displaystyle x=1}สถานะเริ่มต้น จากนั้นใช้ซี{\displaystyle C}ใช้ฟังก์ชันกับบิตที่ต่อเนื่องกันของลำดับบิตจำกัดเพื่อให้ได้ผลลัพธ์สุดท้ายx{\displaystyle x}หมายเลขที่เก็บลำดับทั้งหมดนี้ จากนั้นใช้ดี{\displaystyle D}ฟังก์ชันนี้ทำงานหลายครั้งจนกระทั่งx=1{\displaystyle x=1}ช่วยให้สามารถเรียกกลับลำดับบิตในลำดับย้อนกลับได้[ ‡ 2 ]

วิธีการข้างต้นเหมาะสมที่สุดสำหรับการกระจายความน่าจะเป็นแบบสม่ำเสมอ (สมมาตร) ของสัญลักษณ์ปร.(0)=ปร.(1)=1/2{\displaystyle \Pr(0)=\Pr(1)=1/2}ANS ขยายความให้เหมาะสมที่สุดสำหรับรูปแบบการแจกแจงความน่าจะเป็นแบบไม่สมมาตรของสัญลักษณ์ใดๆ ที่เลือกไว้:ปร.()=พี{\displaystyle \Pr(s)=p_{s}}. ในขณะที่{\displaystyle s}ในตัวอย่างข้างต้นคือการเลือกระหว่างเลขคู่และเลขคี่ซี(x,){\displaystyle C(x,s)}ใน ANS การแบ่งจำนวนธรรมชาติแบบคู่/คี่จะถูกแทนที่ด้วยการแบ่งออกเป็นเซตย่อยที่มีความหนาแน่นสอดคล้องกับการกระจายความน่าจะเป็นที่กำหนดไว้{พี}{\displaystyle \{p_{s}\}_{s}}: จนถึงตำแหน่งx{\displaystyle x}มีอยู่ประมาณxพี{\displaystyle xp_{s}}การปรากฏของสัญลักษณ์{\displaystyle s}[ 2 ]

ฟังก์ชันการเข้ารหัสซี(x,){\displaystyle C(x,s)}ส่งคืนx{\displaystyle x}การปรากฏครั้งที่ - จากชุดย่อยดังกล่าวที่สอดคล้องกับสัญลักษณ์{\displaystyle s}ข้อสมมติเรื่องความหนาแน่นนั้นเทียบเท่ากับเงื่อนไขดังกล่าวx=ซี(x,)x/พี{\displaystyle x'=C(x,s)\approx x/p_{s}}โดยสมมติว่าเป็นจำนวนธรรมชาติx{\displaystyle x}ประกอบด้วยบันทึก2(x){\displaystyle \log _{2}(x)}ข้อมูลเล็กๆ น้อยๆบันทึก2(ซี(x,))บันทึก2(x)+บันทึก2(1/พี){\displaystyle \log _{2}(C(x,s))\approx \log _{2}(x)+\log _{2}(1/p_{s})}ดังนั้นจึงเป็นสัญลักษณ์แห่งความน่าจะเป็นพี{\displaystyle p_{s}}ถูกเข้ารหัสโดยมีเนื้อหาอยู่ภายในบันทึก2(1/พี){\displaystyle \approx \log _{2}(1/p_{s})}บิตของข้อมูลตามที่ต้องการจากตัวเข้ารหัสเอนโทรปี [ 2 ]

ตัวแปร

ตัวแปรไบนารีแบบสม่ำเสมอ (uABS)

เรามาเริ่มต้นด้วยตัวอักษรไบนารีและการกระจายความน่าจะเป็นกันก่อนปร.(1)=พี{\displaystyle \Pr(1)=p},ปร.(0)=1พี{\displaystyle \Pr(0)=1-p}จนถึงตำแหน่งx{\displaystyle x}เราต้องการประมาณพีx{\displaystyle p\cdot x}อนาล็อกของเลขคี่ (สำหรับ=1{\displaystyle s=1}เราสามารถเลือกจำนวนการปรากฏตัวนี้ได้ดังนี้xพี{\displaystyle \lceil x\cdot p\rceil }, ได้รับ=(x+1)พีxพี{\displaystyle s=\lceil (x+1)\cdot p\rceil -\lceil x\cdot p\rceil }รูปแบบนี้เรียกว่าuABSและนำไปสู่ฟังก์ชันการถอดรหัสและการเข้ารหัสดังต่อไปนี้: [ 21 ]

การถอดรหัส:

s = ceil (( x + 1 ) * p ) - ceil ( x * p ) // 0 ถ้า fract(x*p) < 1-p มิฉะนั้น 1 ถ้าs = 0 แล้วnew_x = x - ceil ( x * p ) // D(x) = (new_x, 0) ซึ่งเหมือนกับ new_x = floor(x*(1-p)) ถ้าs = 1 แล้วnew_x = ceil ( x * p ) // D(x) = (new_x, 1)

การเข้ารหัส:

ถ้าs = 0 แล้วnew_x = ceil (( x + 1 ) / ( 1 - p )) - 1 // C(x,0) = new_x ถ้าs = 1 แล้วnew_x = floor ( x / p ) // C(x,1) = new_x

สำหรับพี=1/2{\displaystyle p=1/2}มันก็คือระบบเลขฐานสองมาตรฐาน (โดยที่ 0 และ 1 สลับตำแหน่งกัน) ด้วยเหตุผลที่แตกต่างกันพี{\displaystyle p}มันจะกลายเป็นสิ่งที่ดีที่สุดสำหรับการกระจายความน่าจะเป็นที่กำหนดนี้[ 21 ]ตัวอย่างเช่น สำหรับพี=0.3{\displaystyle p=0.3}สูตรเหล่านี้จะนำไปสู่ตารางสำหรับค่าเล็กๆ ของx{\displaystyle x}:

ซี(x,){\displaystyle C(x,s)}01234567891011121314151617181920
=0{\displaystyle s=0}012345678910111213
=1{\displaystyle s=1}0123456

สัญลักษณ์=1{\displaystyle s=1}สอดคล้องกับเซตย่อยของจำนวนธรรมชาติที่มีความหนาแน่นพี=0.3{\displaystyle p=0.3}ซึ่งในกรณีนี้คือตำแหน่งต่างๆ{0,3,6,10,13,16,20,23,26,}{\displaystyle \{0,3,6,10,13,16,20,23,26,\ldots \}}. เช่น1/4<0.3<1/3{\displaystyle 1/4<0.3<1/3}ตำแหน่งเหล่านี้จะเพิ่มขึ้น 3 หรือ 4 ตำแหน่ง เนื่องจากพี=3/10{\displaystyle p=3/10}ในที่นี้ รูปแบบของสัญลักษณ์จะซ้ำกันทุกๆ 10 ตำแหน่ง

การเขียนโค้ดซี(x,){\displaystyle C(x,s)}สามารถค้นหาได้โดยการเลือกแถวที่ตรงกับสัญลักษณ์ที่กำหนด{\displaystyle s}และเลือกสิ่งที่กำหนดให้x{\displaystyle x}ในแถวนี้ จากนั้นแถวบนสุดจะแสดงข้อมูลซี(x,){\displaystyle C(x,s)}. ตัวอย่างเช่น,ซี(7,0)=11{\displaystyle C(7,0)=11}จากแถวกลางไปยังแถวบนสุด

ลองนึกภาพว่าเราต้องการเข้ารหัสลำดับ '0100' โดยเริ่มต้นจากx=1{\displaystyle x=1}. อันดับแรก=0{\displaystyle s=0}พาเราไปx=2{\displaystyle x=2}, แล้ว=1{\displaystyle s=1}ถึงx=6{\displaystyle x=6}, แล้ว=0{\displaystyle s=0}ถึงx=9{\displaystyle x=9}, แล้ว=0{\displaystyle s=0}ถึงx=14{\displaystyle x=14}โดยใช้ฟังก์ชันการถอดรหัสดี(x){\displaystyle D(x')}ในรอบชิงชนะเลิศนี้x{\displaystyle x}เราสามารถดึงลำดับสัญลักษณ์ออกมาได้ โดยใช้ตารางเพื่อจุดประสงค์นี้x{\displaystyle x}แถวแรกจะเป็นตัวกำหนดคอลัมน์ จากนั้นแถวที่ไม่ว่างและค่าที่เขียนไว้จะเป็นตัวกำหนดคอลัมน์ที่สอดคล้องกัน{\displaystyle s}และx{\displaystyle x}.

ตัวแปรช่วง (rANS) และการสตรีม

รูปแบบช่วงยังใช้สูตรทางคณิตศาสตร์ แต่ช่วยให้สามารถดำเนินการกับตัวอักษรขนาดใหญ่ได้[ ‡ 2 ]โดยสัญชาตญาณแล้ว มันจะแบ่งเซตของจำนวนธรรมชาติออกเป็นช่วงที่มีขนาด2n{\displaystyle 2^{n}}และแบ่งแต่ละส่วนออกเป็นช่วงย่อยในลักษณะเดียวกัน โดยมีสัดส่วนตามการแจกแจงความน่าจะเป็นที่สมมติขึ้น

เราเริ่มต้นด้วยการแบ่งการกระจายความน่าจะเป็นออกเป็นขั้นๆ2n{\displaystyle 2^{-n}}โดยที่nถูกเลือก (โดยปกติคือ 8-12 บิต):พีเอฟ[]/2n{\displaystyle p_{s}\approx f[s]/2^{n}}สำหรับจำนวนธรรมชาติบางจำนวนเอฟ[]{\displaystyle f[s]}(ขนาดของช่วงย่อย)

ระบุหน้ากาก=2n1{\displaystyle {\text{mask}}=2^{n}-1}และฟังก์ชันการกระจายสะสม:

ซีดีเอฟ[]=ฉัน<เอฟ[ฉัน]=เอฟ[0]++เอฟ[1].{\displaystyle \operatorname {CDF} [s]=\sum _{i<s}f[i]=f[0]+\cdots +f[s-1].}

โปรดสังเกตว่า ฟังก์ชันนี้ไม่ใช่ฟังก์ชันการกระจายสะสม (CDF) ที่แท้จริง เนื่องจากความน่าจะเป็นของสัญลักษณ์ปัจจุบันไม่ได้รวมอยู่ในค่าของนิพจน์ แต่แสดงถึงความน่าจะเป็นรวมของสัญลักษณ์ก่อนหน้าทั้งหมด ตัวอย่างเช่น แทนที่จะใช้คำจำกัดความปกติของมันจะถูกประเมินเป็นเนื่องจากไม่มีสัญลักษณ์ก่อนหน้าCDF[s]CDF[s]CDF[0]=f[0]CDF[0]=0

สำหรับy[0,2n1]{\displaystyle y\in [0,2^{n}-1]}ระบุฟังก์ชัน (โดยปกติจะแสดงในรูปแบบตาราง)

สัญลักษณ์( y ) = s โดยที่CDF [ s ] <= y < CDF [ s + 1 ]

ฟังก์ชันการเขียนโค้ดต่อไปนี้คือ:

C ( x , s ) = ( floor ( x / f [ s ]) << n ) + ( x % f [ s ]) + CDF [ s ]

การถอดรหัส:

s = symbol ( x & mask ) D ( x ) = ( f [ s ] * ( x >> n ) + ( x & mask ) - CDF [ s ], s )

ด้วยวิธีนี้ เราสามารถเข้ารหัสลำดับของสัญลักษณ์ลงในจำนวนธรรมชาติขนาดใหญ่xได้ เพื่อหลีกเลี่ยงการใช้เลขคณิตของจำนวนขนาดใหญ่ ในทางปฏิบัติจึงใช้รูปแบบสตรีมซึ่งบังคับใช้x[แอล,แอล1]{\displaystyle x\in [L,b\cdot L-1]}โดยการปรับค่าใหม่: การส่งบิตที่มีค่าน้อยที่สุดของxไปหรือจากบิตสตรีม (โดยปกติLและbจะเป็นกำลังของ 2) [ ‡ 2 ]

ในรูปแบบ rANS นั้นxอาจเป็นจำนวนเต็ม 32 บิต ตัวอย่างเช่น สำหรับการปรับค่าใหม่แบบ 16 บิต (x[216,2321]{\displaystyle x\in [2^{16},2^{32}-1]}) ตัวถอดรหัสจะเติมบิตที่มีค่าน้อยที่สุดจากบิตสตรีมเมื่อจำเป็น:

ถ้า( x < ( 1 << 16 )) { x = ( x << 16 ) + อ่าน 16 บิต() }

รูปแบบตาราง (tANS)

ตัวอย่างง่ายๆ ของออโตมาตา ANS 4 สถานะ สำหรับการกระจายความน่าจะเป็น Pr( a )  =  3/4, Pr( b )  =  1/4 สัญลักษณ์bมีข้อมูล −lg(1/4)  =  2 บิต ดังนั้นจึงสร้างข้อมูลสองบิตเสมอ ในทางตรงกันข้าม สัญลักษณ์aมีข้อมูล −lg(3/4)  ~  0.415 บิต ดังนั้นบางครั้งจึงสร้างข้อมูลหนึ่งบิต (จากสถานะ 6 และ 7) บางครั้ง 0 บิต (จากสถานะ 4 และ 5) โดยจะเพิ่มสถานะขึ้นเท่านั้น ซึ่งทำหน้าที่เป็นบัฟเฟอร์ที่มีจำนวนบิตเศษส่วน: lg( x ) จำนวนสถานะในทางปฏิบัติ เช่น 2048 สำหรับตัวอักษรขนาด 256 (เพื่อเข้ารหัสไบต์โดยตรง)

ตัวแปร tANS จะกำหนดพฤติกรรมทั้งหมด (รวมถึงการปรับค่าใหม่) สำหรับx[แอล,2แอล1]{\displaystyle x\in [L,2L-1]}แปลงเป็นตารางซึ่งให้ผลลัพธ์เป็นเครื่องสถานะจำกัดโดยหลีกเลี่ยงความจำเป็นในการคูณ[ ‡ 2 ]

สุดท้ายนี้ ขั้นตอนของลูปการถอดรหัสสามารถเขียนได้ดังนี้:

t = decodingTable ( x ); x = t.newX + readBits ( t.nbBits ) ; // การเปลี่ยนสถานะwriteSymbol ( t.symbol ); //สัญลักษณ์ที่ถอดรหัสแล้ว

ขั้นตอนของลูปการเข้ารหัส:

s = ReadSymbol (); nbBits = ( x + ns [ s ]) >> r ; // จำนวนบิตสำหรับการปรับค่าใหม่writeBits ( x , nbBits ); // ส่งบิตที่มีค่าน้อยที่สุดไปยังบิตสตรีมx = encodingTable [ start [ s ] + ( x >> nbBits )];

การกำหนดรหัส tANS เฉพาะเจาะจงนั้นทำได้โดยการกำหนดสัญลักษณ์ให้กับทุกๆ[แอล,2แอล1]{\displaystyle [L,2L-1]}ตำแหน่ง จำนวนครั้งที่ปรากฏควรเป็นสัดส่วนกับความน่าจะเป็นที่สมมติขึ้น ตัวอย่างเช่น เราอาจเลือกการกำหนด "abdacdac" สำหรับการแจกแจงความน่าจะเป็น Pr(a)=3/8, Pr(b)=1/8, Pr(c)=2/8, Pr(d)=2/8 หากมีการกำหนดสัญลักษณ์ในช่วงความยาวที่เป็นกำลังของ 2 เราจะได้การเข้ารหัส Huffmanตัวอย่างเช่น จะได้รหัสคำนำหน้า a->0, b->100, c->101, d->11 สำหรับ tANS ด้วยการกำหนดสัญลักษณ์ "aaaabcdd" [ ‡ 1 ]

ตัวอย่างการสร้างตาราง tANS สำหรับตัวอักษรขนาด m = 3 และสถานะ L = 16 จากนั้นนำไปใช้ในการถอดรหัสสตรีม ขั้นแรก เราประมาณความน่าจะเป็นโดยใช้เศษส่วนที่มีตัวส่วนเป็นจำนวนสถานะ จากนั้นเรากระจายสัญลักษณ์เหล่านี้ในลักษณะที่เกือบสม่ำเสมอ โดยรายละเอียดอาจขึ้นอยู่กับกุญแจเข้ารหัสสำหรับการเข้ารหัสพร้อมกัน จากนั้นเราแจงนับการปรากฏโดยเริ่มจากค่าที่เป็นจำนวนครั้งของการปรากฏสำหรับสัญลักษณ์ที่กำหนด จากนั้นเราเติมบิตที่อายุน้อยที่สุดจากสตรีมเพื่อกลับไปยังช่วงที่สมมติไว้สำหรับ x (การปรับค่าใหม่)

หมายเหตุ

สำหรับการเข้ารหัส Huffman การปรับเปลี่ยนการกระจายความน่าจะเป็นของ tANS นั้นมีต้นทุนค่อนข้างสูง ดังนั้นจึงมักใช้ในสถานการณ์คงที่ โดยปกติจะใช้กับ รูปแบบ Lempel–Ziv บาง รูปแบบ (เช่น ZSTD, [ 2 ] LZFSE [ 9 ] ) ในกรณีนี้ ไฟล์จะถูกแบ่งออกเป็นบล็อกโดยแต่ละบล็อกจะนับความถี่ของสัญลักษณ์อย่างอิสระ จากนั้นหลังจากประมาณค่า (การหาปริมาณ) จะเขียนลงในส่วนหัวของบล็อกและใช้เป็นการกระจายความน่าจะเป็นแบบคงที่สำหรับ tANS [ ‡ 1 ] 

ในทางตรงกันข้าม rANS มักใช้แทนการเข้ารหัสช่วง ที่เร็วกว่า ( เช่นCRAM [ 13 ] LZNA, Draco [ 10 ] ) ต้องใช้การคูณ แต่มีประสิทธิภาพด้านหน่วยความจำมากกว่าและเหมาะสมสำหรับการปรับเปลี่ยนการกระจายความน่าจะเป็นแบบไดนามิก[ ‡ 2 ]

การเข้ารหัสและการถอดรหัสของ ANS ดำเนินการในทิศทางตรงกันข้าม ทำให้เป็นสแต็กสำหรับสัญลักษณ์ ความไม่สะดวกนี้มักจะได้รับการแก้ไขโดยการเข้ารหัสในทิศทางย้อนกลับ หลังจากนั้นจึงสามารถถอดรหัสไปข้างหน้าได้[ ‡ 2 ]สำหรับการพึ่งพาบริบท เช่นแบบจำลองมาร์คอฟตัวเข้ารหัสจำเป็นต้องใช้บริบทจากมุมมองของการถอดรหัสในภายหลัง สำหรับการปรับตัว ตัวเข้ารหัสควรดำเนินการไปข้างหน้าก่อนเพื่อค้นหาความน่าจะเป็นที่จะใช้ (ทำนาย) โดยตัวถอดรหัสและจัดเก็บไว้ในบัฟเฟอร์ จากนั้นเข้ารหัสในทิศทางย้อนกลับโดยใช้ความน่าจะเป็นที่จัดเก็บไว้ในบัฟเฟอร์[ ‡ 2 ]

สถานะสุดท้ายของการเข้ารหัสจำเป็นสำหรับการเริ่มต้นการถอดรหัส ดังนั้นจึงต้องจัดเก็บไว้ในไฟล์บีบอัด ค่าใช้จ่ายนี้สามารถชดเชยได้โดยการจัดเก็บข้อมูลบางอย่างไว้ในสถานะเริ่มต้นของตัวเข้ารหัส ตัวอย่างเช่น แทนที่จะเริ่มต้นด้วยสถานะ "10000" ให้เริ่มต้นด้วยสถานะ "1****" โดยที่ "*" คือบิตที่จัดเก็บเพิ่มเติม ซึ่งสามารถเรียกคืนได้เมื่อสิ้นสุดการถอดรหัส หรืออีกทางหนึ่ง สถานะนี้สามารถใช้เป็นค่าตรวจสอบความถูกต้องได้โดยการเริ่มต้นการเข้ารหัสด้วยสถานะคงที่ และทดสอบว่าสถานะสุดท้ายของการถอดรหัสเป็นไปตามที่คาดไว้หรือไม่[ ‡ 2 ]

ข้อพิพาทเรื่องสิทธิบัตร

ผู้เขียนอัลกอริธึม ANS และรูปแบบต่างๆ เช่น tANS และ rANS ตั้งใจให้ผลงานของเขาสามารถเข้าถึงได้ฟรีในโดเมนสาธารณะด้วยเหตุผลด้านมนุษยธรรม เขาไม่ได้แสวงหาผลกำไรจากผลงานเหล่านี้ และได้ดำเนินการเพื่อให้แน่ใจว่าผลงานเหล่านี้จะไม่กลายเป็น "กับดักทางกฎหมาย" หรือถูกจำกัด หรือถูกแสวงหาผลกำไรจากผู้อื่น[ 1 ]ในปี 2015 Google ได้เผยแพร่สิทธิบัตรในสหรัฐอเมริกาและทั่วโลกสำหรับ "การเข้ารหัสสัมประสิทธิ์ ans โทเค็นบูลีนแบบผสม" [ 22 ]ในขณะนั้น ศาสตราจารย์ Duda ได้รับคำขอจาก Google ให้ช่วยในเรื่องการบีบอัดวิดีโอ ดังนั้นเขาจึงมีความรู้ความเข้าใจอย่างลึกซึ้งในด้านนี้ โดยมีผู้เขียนต้นฉบับคอยให้ความช่วยเหลือ

ดูดาไม่พอใจที่ (บังเอิญ) ค้นพบเจตนาสิทธิบัตรของ Google เนื่องจากเขาระบุชัดเจนว่าต้องการให้เป็นสาธารณสมบัติ และได้ช่วยเหลือ Google โดยเฉพาะบนพื้นฐานนั้น[ 1 ]ต่อมาดูดาได้ยื่นคำขอของบุคคลที่สาม[ ‡ 5 ]ต่อสำนักงานสิทธิบัตรของสหรัฐอเมริกาเพื่อขอให้ปฏิเสธ สำนักงานสิทธิบัตรของสหรัฐอเมริกาปฏิเสธคำขอในปี 2018 และต่อมา Google ก็ละทิ้งสิทธิบัตรดังกล่าว[ 23 ]

ในเดือนมิถุนายน พ.ศ. 2562 ไมโครซอฟต์ได้ยื่นคำขอสิทธิบัตรชื่อ "คุณสมบัติของการเข้ารหัสและการถอดรหัสระบบตัวเลขแบบไม่สมมาตรตามช่วง" [ 24 ]สำนักงานสิทธิบัตรสหรัฐฯ (USPTO) ได้ออกคำปฏิเสธขั้นสุดท้ายของคำขอเมื่อวันที่ 27 ตุลาคม พ.ศ. 2563 [ 24 ]อย่างไรก็ตาม เมื่อวันที่ 2 มีนาคม พ.ศ. 2564 ไมโครซอฟต์ได้ยื่นคำชี้แจงต่อ USPTO โดยระบุว่า "ผู้ยื่นคำขอไม่เห็นด้วยกับคำปฏิเสธดังกล่าว" [ 25 ]เพื่อขอให้ศาลพิจารณาคำปฏิเสธขั้นสุดท้ายอีกครั้งภายใต้โครงการ "After Final Consideration Pilot 2.0" [ 26 ]หลังจากการพิจารณาใหม่ USPTO ได้อนุมัติคำขอเมื่อวันที่ 25 มกราคม พ.ศ. 2565 [ 24 ]

ดูเพิ่มเติม

  • Duda, Jarek (2 พฤศจิกายน 2008). "การเข้ารหัสที่เหมาะสมที่สุดบนโครงข่ายแบบไม่ต่อเนื่องที่มีข้อจำกัดที่ไม่เปลี่ยนแปลงตามการเลื่อนตำแหน่งโดยใช้อัลกอริธึมทางสถิติ". arXiv : 0710.3861 [ cs.IT ].ซึ่งอาจเป็นการกล่าวถึง ANS ครั้งแรกสุด
  • สถาปัตยกรรมฮาร์ดแวร์ประสิทธิภาพสูงสำหรับการเข้ารหัสเอนโทรปีของระบบตัวเลขอสมมาตร SM Najmabadi, Z. Wang, Y. Baroud, S. Simon, ISPA 2015
  • ตัวเข้ารหัสเอนโทรปีรุ่นใหม่การนำเอนโทรปีสถานะจำกัด (FSE) มาใช้ใน tANS โดย Yann Collet
  • rygorous/ryg_ransการนำ rANS ไปใช้โดย Fabian Giesen
  • jkbonfield/rans_staticการใช้งาน rANS และการเข้ารหัสเลขคณิตอย่างรวดเร็วโดย James K. Bonfield
  • โปรแกรมบีบอัด DNA CRAM 3.0 (rANS ลำดับที่ 1) (ส่วนหนึ่งของSAMtools ) โดยสถาบันชีวสารสนเทศแห่งยุโรป
  • การนำไปใช้สำหรับ Google VP10
  • การใช้งานสำหรับ Google WebP
  • ไลบรารีการบีบอัดข้อมูล 3 มิติ Google Draco
  • aom_dsp - aom - การนำ Git มาใช้ใน Googleเพื่อสนับสนุนAlliance for Open Media
  • การบีบอัดข้อมูลโดยใช้ระบบตัวเลขอสมมาตร - โครงการสาธิตของ Wolframโครงการสาธิตของ Wolfram
  • GST: พื้นผิวบีบอัดแบบพิเศษที่ถอดรหัสได้ด้วย GPU GST: พื้นผิวบีบอัดแบบพิเศษที่ถอดรหัสด้วย GPU
  • หนังสือ Understanding Compressionโดย A. Haecky และ C. McAnlis

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ไม่มีชื่อบทความ

ระบบตัวเลขอสมมาตร ( ANS ) [ ‡ 1 ] [ ‡ 2 ] เป็นกลุ่มของวิธี การเข้ารหัสเอนโทรปี ที่คิดค้นโดย Jarosław (Jarek) Duda [ ‡ 3 ] จาก มหาวิทยาลัย Jagiellonian ซึ่งใช้ใน การบีบอัดข้อมูล...

การเข้ารหัสเอนโทรปี

สมมติว่าเราต้องการเข้ารหัสลำดับของเลขศูนย์และเลขหนึ่งจำนวน 1,000 ตัว ซึ่งจะต้องใช้พื้นที่ 1,000 บิตในการจัดเก็บโดยตรง อย่างไรก็ตาม หากทราบว่าลำดับดังกล่าวมีเลขศูนย์เพียง 1 ตัวและเลขหนึ่ง 999 ตัว ก็เพียงพอที่จะเข้ารหัสตำแหน่งของเลขศูนย์ ซึ่งใช้พื้นที่เพียง 1...

ตัวอย่างที่สร้างแรงบันดาลใจ

พิจารณาแหล่งข้อมูลที่มีตัวอักษร 3 ตัว คือ A, B, C โดยมีความน่าจะเป็น 1/2, 1/4, 1/4 การสร้างรหัสคำนำหน้าที่ดีที่สุดในระบบเลขฐานสองนั้นทำได้ง่าย คือ A = 0, B = 10, C = 11 จากนั้นข้อความจะถูกเข้ารหัสเป็น ABC -> 01011

แนวคิดพื้นฐานของ ANS

ลองนึกภาพว่ามีข้อมูลบางอย่างถูกเก็บไว้ในจำนวนธรรมชาติ x {\displaystyle x} ตัวอย่างเช่น ลำดับบิตของการขยายเลขฐานสอง เพื่อเพิ่มข้อมูลจากตัวแปรเลขฐานสอง ส {\displaystyle s} เราสามารถใช้ฟังก์ชันการเขียนโค้ดได้ x ′ = ซี ( x , ส ) = 2 x + ส {\displaystyle...