Teoria informacji/TI Wykład 10

From Studia Informatyczne

Efektywne kodowanie wiadomości

Dla pary wejście-wyjście (A,B) rozważmy dodatkową zmienną losową

E = A \oplus B

Możemy ją interpretować jako sygnaturę błędu w czasie transmisji. Zachodzi równość

p (b | a ) = p (E = a \oplus b)

Wynika to z definicji BSC:

p (b | a ) =  \begin{matrix}  P & a = b & (a \oplus b = 0) \\ Q & a \neq b & (a \oplus b = 1) \end{matrix}

i zauważenia, że

p (E = 0) = p (A = 0) \cdot p (0 \to 0) + p(A=1)\cdot p (1 \to 0) = P
p (E = 1) = p (A = 0) \cdot p (0 \to 1) + p(A=1)\cdot p (1 \to 1) = Q


Rozważmy teraz sekwencję par wejście-wyjście (A_1 ,B_1), \ldots , (A_k, B_k ), zachowującą niezależność symboli. Implikuje to, że zmienne losowe E_1, \ldots, E_k (gdzie E_i = A_i \oplus B_i są niezależne (zauważmy, że implikacja w drugą stronę nie zawsze zachodzi). Używając notacji p (\vec{E} = \vec{e} ) lub po prostu p(\vec{e} na oznaczenie p(E_1 = e_1 \wedge \ldots \wedge E_k = e_k ), możemy to zapisać

p (e_1 \ldots e_k) = \sum_{\vec{a}} p (\vec{A} = \vec{a} \wedge \vec{B} = \vec{a} \oplus \vec{e}) = \sum_{\vec{a}} p (\vec{A} = \vec{a}) \cdot p  (\vec{B} = \vec{a} \oplus \vec{e} | \vec{A} = \vec{a})

Używając niezależności symboli w połączeniu z p (b | a ) = p (E = a \oplus b), dostajemy

\aligned p(\vec{B} = \vec{a} \oplus \vec{e} | \vec{A} = \vec{a}) & = p (B_1 = a_1 \oplus e_1 | A_1 = a_1) \cdot \ldots \cdot p (B_k = a_k \oplus e_k | A_k = a_k )\\ & =p (E_1 = e_1) \cdot \ldots \cdot p(E_k = e_k) \endaligned

dla dowolnego \vec{a}. A więc

p (e_1 \ldots e_k) = p (e_1) \cdot \ldots \cdot p(e_k)


Załóżmy, że dysponujemy opisanym wyżej symetrycznym kanałem \Gamma, w którym P>Q, i chcemy przesyłać nim wartości zmiennej losowej X o wartościach z \mathcal{X}=\{x_1, \ldots, x_m\}. We wcześniejszych wykładach poznaliśmy techniki efektywnego kodowania wartości. Jeśli kanał jest wierny, wystarczy, że znajdziemy optymalne kodowanie \varphi : {\mathcal X} \to \{ 0,1\}^* i będziemy wysyłać bit po bicie. Oczekiwana długość (czas) transmisji będzie ograniczony wtedy przez H(X)+1 (na podstawie kodowania Shannona-Fano). Z drugiej strony, zawsze możemy zakodować \mathcal{X} używając ciągów długości \lceil \log m \rceil, co daje nam ograniczenie na pesymistyczny czas transmisji (te dwa ograniczenia mogą nie dać się zachować jednocześnie dla żadnego kodowania).

Jeśli jednak kanał nie jest wierny, ta metoda będzie prowadziła do błędów. Przykład z poprzedniego wykładu pokazuje, że będziemy musieli użyć redundantnego, a więc nieoptymalnego kodowania. Zajmiemy się teraz szukaniem metod pogodzenia tych dwóch przeciwstawnych celów:

  • używaniem jak najmniejszej redundancji
  • zmiejszenia prawdopodobieństwa błędu do jak najniższego poziomu

Ogólny schemat postępowania będzie następujący:


Algorytm transmisji
(dla zmiennej losowej X o wartościach w \mathcal{X}=\{x_1, \ldots, x_m \} i kanału \Gamma)
1. Wybierz n \in \mathbb{N} i C \subseteq \{0,1\}^n, takie że |C|=m
2. Ustal bijekcję \varphi : {\mathcal X} \to C (oczywiście taki kod będzie bezprefiksowy). 
3. Prześlij ciąg znaków \varphi(X)=a_1 \ldots a_n przez kanał \Gamma bit po bicie, 
otrzymując na wyjściu Y=b_1 \ldots b_n.
4. Aby odkodować wiadomość wybierz a_1 \ldots a_n \in C takie, dla którego p( b_1 \ldots b_n | a_1 \ldots a_n ) jest maksymalne


Zakładając, że kanał jest bezstanowy i pozbawiony feedbacku, mamy

p( b_1 \ldots b_k | a_1 \ldots a_k ) = Q^{d (\vec{a},\vec{b})} \cdot P^{k-d  (\vec{a},\vec{b})}

Użyta reguła dekodowania wskazuje zatem dla każdego ciągu b_1 \ldots b_n ciąg \Delta(b_1 \ldots b_n) \in C, najbliższy możliwy w sensie odległości Hamminga (jeśli jest kilka równie odległych to wybierany jest któryś z nich). Jest to tak zwana reguła dobrosąsiedzka.

Dla uproszczenia możemy utożsamić \mathcal{X} z C (za pomocą bijekcji \varphi) i traktować X jako zmienną losową o wartościach w C.

Na opisaną powyżej procedurę możemy patrzeć jak na nowy kanał (z C do C):

C \ni  a_1 \ldots a_n \tografika:gamma.PNG\to b_1 \ldots b_n \to \Delta (b_1 \ldots b_n )  \in C

z prawdopodobieństwem błędu

Pr_E(\Delta,X)=p(\Delta\circ Y \neq X )


Naszą pierwszą obserwacją będzie fakt, że najgorszym możliwym rozkładem X jest rozkład jednostajny (p(x)=\frac{1}{m} dla x\in C)

Fakt

Niech X i U będą dwiema zmiennymi losowymi o wartościach w C \subseteq \{0,1\}^n. U niech będzie miała rozkład losowy, a X dowolny. Wtedy istnieje permutacja \varphi :C \to C, taka że
Pr_E(\Delta, \varphi \circ X) \le Pr_E(\Delta, U)


Przy analizowaniu jakości naszych metod możemy zatem bez utraty ogólności zakładać że rozkład X jest jednostajny. W takim przypadku Pr_E(\Delta,X) zależy jedynie od C, a więc możemy używać notacji Pr_E(\Delta, C).

Redundancję mierzymy porównując entropię C (o wartości \log_2 |C|) z faktyczną długością kodu (w naszym przypadku n).


Definicja [Szybkość transmisji]

Szybkością transmisji kodu C \subseteq \{0,1\}^n nazywamy wartość

R(C)=\frac{\log_2 |C|}{n}

Intuicyjnie możemy rozumieć, że aby przesłać \log_2 |C| bitów informacji, używamy faktycznie n bitów, a więc przesyłamy bity z szybkością \frac{\log_2 |C|}{n}</math> bitów na znak.

Dwa warunki, jakie postawiliśmy wcześniej, oznaczają teraz, że chcemy zminimalizować zarówno Pr_E(\Delta,C) jak i R(C).


Przykład [Wadliwa maszyna do pisania]

Wrócimy do przykładu wadliwej maszyny do pisania. Z pewnością taki kanał generuje bardzo dużo błędów. Jednak jeśli użyjemy tylko nieparzystych liter (a, c, e, g, \ldots) to będziemy mogli zawsze odkodować wiernie otrzymane znaki.

Czy możemy użyć tej obserwacji do przesyłania dowolnych wiadomości?

Najprostszym pomysłem jest kodowanie liter jako par, używając wciąż tylko połowy znaków, np.:

\begin{matrix} a & & aa\\ b & & ac \\ c & & cc \\ d & &  ce \\ \ldots  & & \end{matrix}

Szybkość transmisji w tym przypadku wynosi \frac{1}{2}. Czy można to zrobić lepiej?

Jeśli mielibyśmy dodatkowy symbol, np. #, który potrafilibyśmy odkodować bezbłędnie, moglibyśmy zakodować symbole w następujący sposób:

\begin{matrix} a & & a\\ b & & \#a \\ c & & c \\ d & & \#c \\ \ldots  & & \end{matrix}

Średnia długość kodu wynosi tu \frac{1}{2}\cdot 1+\frac{1}{2}\cdot 2 =\frac{3}{2}, a więc szybkość transmisji wynosi \frac{2}{3}. Możemy tę metodę wykorzystać bez rozszerzania alfabetu, wybierając jedną literę, np. a, aby grała rolę #, i kodując a przez aa, b przez ca i c przez cc (aby zachować bezprefiksowość kodu). Uzyskamy wtedy szybkość transmisji niewiele mniejszą niż \frac{2}{3}. Rozwinięcie tej metody pozwala podnieść szybkość transmisji do wartości bliskiej 1.


Przykład [Wielokrotny BSC]

W tym przykładzie rozważmy kanał BSC i poprawienie jego jakości przez wysłanie każdego bitu wielokrotnie. Niech n=k\cdot l i niech m=2^k. Wtedy dowolny ciąg bitów a_1 \ldots a_k możemy zakodować jako a_1^l \ldots a_k^l \in \{0,1\}^n, uzyskując kod o szybkości transmisji \frac{1}{l}. Podobna analiza jak w poprzednim wykładzie pokazuje, że dla dowolnego k jesteśmy w stanie zmniejszyć Pr_E(\Delta,C) do dowolnie małej wartości, wystarczająco wydłużając l. Oznacza to, że teoretycznie, o ile kanał nie jest całkowicie chaotyczny (czyli P \neq Q), możemy nim przesyłać wiadomości z dowolnie małym prawdopodobieństwem błędu - ale ceną za to jest spowalnianie prędkości transmisji prawie do zera.


Główne Twierdzenie Shannona mówi, że sytuacja w rzeczywistości jest o wiele lepsza. Możemy osiągnąć to samo, zachowując szybkość transmisji bliską pewnej stałej, konkretnie przepustowości kanału C_{\Gamma}.

Zanim przejdziemy do samego twierdzenia, pokażemy dolne ograniczenie dowodzące, że lepszej szybkości transmisji w ogólności nie da się uzyskać. Zaczniemy od dowiedzenia tego, gdy prawdopodobieństwo błędu musi być zerowe, a w dalszej części pokażemy, jak ten dowód rozszerza się na dodatnie prawdopodobieństwa. Tutaj \Gamma może być dowolnym kanałem, ale jak zwykle zakładamy niezależność symboli.


Fakt [Przepustowość kanału]

Jeśli Pr_E(\Delta,C)=0 to

R(C) \le C_{\Gamma}

Dowód

Niech X=(A_1, \ldots A_n) i Y=(B_1, \ldots B_n) będą zmiennymi z algortymu transmisji. Używając niezależności symboli możemy łatwo policzyć, że
H(Y|X) = H(B_1 |A_1) + \ldots + H(B_n | A_n )

Wiemy ponadto, że

H(Y) \leq H(B_1) + \ldots + H(B_n)

Czyli

\aligned I (X,Y) & = H(Y) - H(Y|X)\\ & \leq \sum_{i=1}^n H(B_i ) - \sum_{i=1}^n H(B_i | A_i )\\ & = \sum_{i=1}^n \underbrace{(H(B_i ) - H(B_i | A_i ))}_{=I (A_i , B_i)}\\ &\leq n \cdot C_{\Gamma } \endaligned

(z definicji C_{\Gamma})

Z drugiej strony mamy

I (X,Y) = H(X) - \underbrace{H(X|Y)}_{=0} = \log_2 m

(gdzie m=|C|). Tutaj H(X|Y) ma wartość zero, ponieważ założenie Pr_E(\Delta,C)=0 implikuje, że X jest funkcją Y (konkretnie X=\Delta(Y). Ponadto H(X)=\log_2 m gdyż X ma rozkład jednostajny. Ostatecznie zatem

R(C) = \frac{\log_2 m}{n} \leq C_{\Gamma }
jak zakładaliśmy. image:End_of_proof.gif

Fakt

Korzystając z ciągłości, możemy łatwo pokazać, że osłabienie warunku Pr_E (\Delta,C) = 0 do Pr_E (\Delta,C) \le \delta dla pewnego \delta > 0 daje w powyższym dowodzie H(X|Y) \leq \vartheta (\delta ) (dla pewnej ciągłej i ograniczonej funkcji \vartheta). Z tego dostajemy
\log_2 m - \vartheta (\delta ) \leq n \cdot C_{\Gamma }

i ostatecznie

R (C)  \leq C_{\Gamma } + \frac{\vartheta (\delta )}{n}
Z grubsza oznacza to, że jeśli chcemy uzyskać małe prawdopodobieństwo błędu, szybkość transmisji nie może być wiele większa niż C_{\Gamma}.