Графические модели (курс лекций)/2013/Задание 2
Материал из MachineLearning.
Строка 26: | Строка 26: | ||
<tex>p(y,x)\propto p(y|x)I[Hx=0] = \prod_{n=1}^Np(y_n|x_n)\prod_{m=1}^MI[h_m^Tx = 0]</tex>. | <tex>p(y,x)\propto p(y|x)I[Hx=0] = \prod_{n=1}^Np(y_n|x_n)\prod_{m=1}^MI[h_m^Tx = 0]</tex>. | ||
- | Здесь M=N-K — количество проверок на чётность, а <tex>h_m^T</tex> — m-ая строка матрицы H. Фактор-граф введённой модели показан на рис. справа. | + | Здесь M=N-K — количество проверок на чётность, а <tex>h_m^T</tex> — m-ая строка матрицы H, а <tex>I[\cdot]</tex> — индикаторная функция. Фактор-граф введённой модели показан на рис. справа. |
Восстановление кодового слова <tex>x</tex> по полученному слову <tex>y</tex> предлагается осуществлять как | Восстановление кодового слова <tex>x</tex> по полученному слову <tex>y</tex> предлагается осуществлять как | ||
- | <tex>x_n^* = \arg\max p(x_n|y)</tex>, а маргинальные распределения <tex>p(x_n|y)</tex> оценивать в помощью циклического алгоритма передачи сообщений (sum-product loopy BP) на фактор-графе. При этом для упрощения алгоритма декодирования предлагается избавиться от факторов-унарных потенциалов (путем их включения в сообщения от переменных <tex>x_n</tex> к факторам <tex>f_m</tex>), а в качестве расписания пересчёта сообщений выбрать параллельное расписание, при котором сначала все переменные одновременно посылают сообщения во все факторы, а затем все факторы одновременно посылают сообщения во все вершины. | + | <tex>x_n^* = \arg\max p(x_n|y)</tex>, а маргинальные распределения <tex>p(x_n|y)</tex> оценивать в помощью циклического алгоритма передачи сообщений (sum-product loopy BP) на фактор-графе. При этом для упрощения алгоритма декодирования предлагается избавиться от факторов-унарных потенциалов (путем их включения в сообщения от переменных <tex>x_n</tex> к факторам <tex>f_m</tex>), а в качестве расписания пересчёта сообщений выбрать параллельное расписание, при котором сначала все переменные одновременно посылают сообщения во все факторы, а затем все факторы одновременно посылают сообщения во все вершины. Детали алгоритма передачи сообщений, в том числе, эффективные формулы для пересчета сообщений от факторов к вершинам можно найти в [http://www.inference.phy.cam.ac.uk/mackay/itila/book.html книге МакКая] (стр. 560-561). |
== Формулировка задания == | == Формулировка задания == | ||
Строка 35: | Строка 35: | ||
# Реализовать алгоритм построения по заданной проверочной матрице чётности H порождающей матрицы кода G для систематического кодирования; | # Реализовать алгоритм построения по заданной проверочной матрице чётности H порождающей матрицы кода G для систематического кодирования; | ||
# Реализовать алгоритм декодирования низкоплотностного кода на основе loopy BP, провести временные замеры реализованного алгоритма для различных значений входных параметров, время работы алгоритма не должно превышать XX секунд для ... | # Реализовать алгоритм декодирования низкоплотностного кода на основе loopy BP, провести временные замеры реализованного алгоритма для различных значений входных параметров, время работы алгоритма не должно превышать XX секунд для ... | ||
- | # Реализовать алгоритм оценки вероятности битовой и блоковой ошибки кода с помощью метода стат. испытаний; | + | # Реализовать алгоритм оценки вероятности битовой и блоковой ошибки кода с помощью метода стат. испытаний (многократная случайная генерация слова <tex>t</tex>, его преобразование к кодовому слову <tex>x</tex>, передача по каналу с независимым инвертированием каждого бита с заданной вероятностью <tex>q</tex>, восстановление кодового слова <tex>\hat{x}</tex> с помощью алгоритма декодирования и подсчет необходимых характеристик); |
# Провести эксперименты по оцениванию битовой и блоковой ошибки низкоплотностного кода для различных значений длины кодового слова N, скорости кода R, вероятности инвертирования бита при передаче по каналу связи q и среднего количества единиц в столбце проверочной матрицы j. В частности, необходимо проанализировать следующие ситуации: | # Провести эксперименты по оцениванию битовой и блоковой ошибки низкоплотностного кода для различных значений длины кодового слова N, скорости кода R, вероятности инвертирования бита при передаче по каналу связи q и среднего количества единиц в столбце проверочной матрицы j. В частности, необходимо проанализировать следующие ситуации: | ||
#* Теорема Шеннона определяет пропускную способность канала как максимально допустимую скорость кода, при которой возможно осуществление надежной коммуникации. Требуется проверить, как меняются характеристики кода при изменении скорости R от минимального значения до пропускной способности канала. | #* Теорема Шеннона определяет пропускную способность канала как максимально допустимую скорость кода, при которой возможно осуществление надежной коммуникации. Требуется проверить, как меняются характеристики кода при изменении скорости R от минимального значения до пропускной способности канала. | ||
Строка 43: | Строка 43: | ||
== Рекомендации по выполнению задания == | == Рекомендации по выполнению задания == | ||
- | + | 1. Разреженную проверочную матрицу кода заданных размеров можно строить с помощью случайной генерации (с соблюдением условия полноранговости). Однако, здесь рекомендуется воспользоваться [[Media:make_ldpc_mex.zip|данным кодом]], который генерирует проверочную матрицу с заданным количеством единиц в каждом столбце. При этом данный алгоритм старается сократить количество циклов длины 4 в генерируемой матрице, т.к. наличие коротких циклов в графе, как правило, значительно усложняет работу алгоритма loopy BP. | |
- | + | ||
- | + | 2. Одним из способов построения порождающей матрицы кода по заданной проверочной матрице является преобразование проверочной матрицы к каноническому ступенчатому виду. Такое преобразование может быть сделано с помощью [http://en.wikipedia.org/wiki/Gaussian_elimination гауссовских исключений]. При выполнении задания разрешается пользоваться сторонними кодами по реализации стандартных алгоритмов линейной алгебры (с соответствующими указаниями в отчёте). Однако, рекомендуется реализовывать алгоритм гауссовских исключений в логике по модулю 2 самостоятельно, т.к. такая реализация может быть сделана значительно эффективнее по сравнению с общим случаем логики по модулю произвольного простого числа, т.к. в логике по модулю два нет необходимости использовать операцию деления и, например, искать ведущий элемент при очередном вычитании (т.к. все ненулевые элементы равны единице). | |
+ | |||
+ | 3. Алгоритм декодирования удобно реализовывать в т.н. синдромном представлении. Полученное на выходе канала слово <tex>y</tex> можно представить как <tex>x+e</tex>, где <tex>x</tex> — посылаемое кодовое слово, а <tex>e\in\{0,1\}^N</tex> — вектор ошибок, которые вносит канал. Назовём величину <tex>z = Hy</tex> синдромом полученного сообщения. Тогда <tex>z=Hy=H(x+e)=He</tex>, и на этапе декодирования можно вместо <tex>x</tex> оценивать вектор ошибок <tex>e</tex> путем оценки аргмаксимумов маргинальных распределений <tex>p(e_n|z)</tex> в вероятностной модели | ||
+ | ::<tex>p(e,z)\propto p(e)I[He=z]=\prod_{n=1}^Np(e_n)\prod_{m=1}^MI[h_m^Te=z_m]</tex>. | ||
+ | Зная <tex>e</tex>, искомое кодовое слово можно найти как <tex>x=y+e</tex>. Заметим, что реализация алгоритма декодирования в синдромном представлении избавляет от необходимости предварительной реализации алгоритма кодирования. | ||
+ | |||
+ | 4. В эффективной реализации алгоритма декодирования все вычисления на очередной итерации не должны использовать вложенных циклов. | ||
== Оформление задания == | == Оформление задания == |
Версия 16:14, 2 марта 2013
Формулировка задания находится в стадии разработки. Убедительная просьба не приступать к выполнению задания до тех пор, пока это предупреждение не будет удалено. |
Начало выполнения задания: 3 марта 2013 г.
Срок сдачи: 17 марта 2013 г., 23:59.
Среда для выполнения задания — MATLAB.
Низкоплотностные коды
Низкоплотностный код (или код с малой плотностью проверок на чётность) представляет собой (N,K)-бинарный линейный блоковый код, в котором проверочная матрица является сильно разреженной. Таким образом, вектор является кодовым словом, если .
Рассмотрим бинарный симметричный канал для передачи данных. Здесь при передаче каждый бит независимо инвертируется с некоторой вероятностью q. Таким образом, бинарный симметричный канал задает распределение для передаваемого кодового слова и полученного на выходе слова как
.
Объединяя низкоплотностный код с бинарным симметричным каналом, получаем следующую вероятностную модель для пары :
.
Здесь M=N-K — количество проверок на чётность, а — m-ая строка матрицы H, а — индикаторная функция. Фактор-граф введённой модели показан на рис. справа.
Восстановление кодового слова по полученному слову предлагается осуществлять как , а маргинальные распределения оценивать в помощью циклического алгоритма передачи сообщений (sum-product loopy BP) на фактор-графе. При этом для упрощения алгоритма декодирования предлагается избавиться от факторов-унарных потенциалов (путем их включения в сообщения от переменных к факторам ), а в качестве расписания пересчёта сообщений выбрать параллельное расписание, при котором сначала все переменные одновременно посылают сообщения во все факторы, а затем все факторы одновременно посылают сообщения во все вершины. Детали алгоритма передачи сообщений, в том числе, эффективные формулы для пересчета сообщений от факторов к вершинам можно найти в книге МакКая (стр. 560-561).
Формулировка задания
- Реализовать алгоритм построения по заданной проверочной матрице чётности H порождающей матрицы кода G для систематического кодирования;
- Реализовать алгоритм декодирования низкоплотностного кода на основе loopy BP, провести временные замеры реализованного алгоритма для различных значений входных параметров, время работы алгоритма не должно превышать XX секунд для ...
- Реализовать алгоритм оценки вероятности битовой и блоковой ошибки кода с помощью метода стат. испытаний (многократная случайная генерация слова , его преобразование к кодовому слову , передача по каналу с независимым инвертированием каждого бита с заданной вероятностью , восстановление кодового слова с помощью алгоритма декодирования и подсчет необходимых характеристик);
- Провести эксперименты по оцениванию битовой и блоковой ошибки низкоплотностного кода для различных значений длины кодового слова N, скорости кода R, вероятности инвертирования бита при передаче по каналу связи q и среднего количества единиц в столбце проверочной матрицы j. В частности, необходимо проанализировать следующие ситуации:
- Теорема Шеннона определяет пропускную способность канала как максимально допустимую скорость кода, при которой возможно осуществление надежной коммуникации. Требуется проверить, как меняются характеристики кода при изменении скорости R от минимального значения до пропускной способности канала.
- Теорема Шеннона предполагает, что качество кода растет при увеличении длины кодового слова N. Требуется проверить это предположение.
- Одно из следствий теоремы Шеннона утверждает, что хорошими кодами являются коды со случайной проверочной матрицей H. В частности, здесь предполагается, что качество кода должно расти при увеличении среднего количества единиц в столбце проверочной матрицы j. Требуется проверить это утверждение для низкоплотностных кодов.
Рекомендации по выполнению задания
1. Разреженную проверочную матрицу кода заданных размеров можно строить с помощью случайной генерации (с соблюдением условия полноранговости). Однако, здесь рекомендуется воспользоваться данным кодом, который генерирует проверочную матрицу с заданным количеством единиц в каждом столбце. При этом данный алгоритм старается сократить количество циклов длины 4 в генерируемой матрице, т.к. наличие коротких циклов в графе, как правило, значительно усложняет работу алгоритма loopy BP.
2. Одним из способов построения порождающей матрицы кода по заданной проверочной матрице является преобразование проверочной матрицы к каноническому ступенчатому виду. Такое преобразование может быть сделано с помощью гауссовских исключений. При выполнении задания разрешается пользоваться сторонними кодами по реализации стандартных алгоритмов линейной алгебры (с соответствующими указаниями в отчёте). Однако, рекомендуется реализовывать алгоритм гауссовских исключений в логике по модулю 2 самостоятельно, т.к. такая реализация может быть сделана значительно эффективнее по сравнению с общим случаем логики по модулю произвольного простого числа, т.к. в логике по модулю два нет необходимости использовать операцию деления и, например, искать ведущий элемент при очередном вычитании (т.к. все ненулевые элементы равны единице).
3. Алгоритм декодирования удобно реализовывать в т.н. синдромном представлении. Полученное на выходе канала слово можно представить как , где — посылаемое кодовое слово, а — вектор ошибок, которые вносит канал. Назовём величину синдромом полученного сообщения. Тогда , и на этапе декодирования можно вместо оценивать вектор ошибок путем оценки аргмаксимумов маргинальных распределений в вероятностной модели
- .
Зная , искомое кодовое слово можно найти как . Заметим, что реализация алгоритма декодирования в синдромном представлении избавляет от необходимости предварительной реализации алгоритма кодирования.
4. В эффективной реализации алгоритма декодирования все вычисления на очередной итерации не должны использовать вложенных циклов.
Оформление задания
Выполненное задание следует отправить письмом по адресу bayesml@gmail.com с заголовком письма «[ГМ13] Задание 2 <ФИО>». Убедительная просьба присылать выполненное задание только один раз с окончательным вариантом. Также убедительная просьба строго придерживаться заданных ниже прототипов реализуемых функций.
Присланный вариант задания должен содержать в себе:
- Текстовый файл в формате PDF с указанием ФИО, содержащий описание всех проведенных исследований. Данный файл должен, в частности, содержать необходимые графики зависимости битовой и блоковой ошибки кода в зависимости от различных значений параметров.
- Все исходные коды с необходимыми комментариями.
Построение порождающей матрицы для систематического кодирования | ||
---|---|---|
[G, ind] = ldpc_gen_matrix(H) | ||
ВХОД | ||
| ||
ВЫХОД | ||
|
Алгоритм декодирования LDPC-кода в синдромном представлении | ||||||||
---|---|---|---|---|---|---|---|---|
[n, status] = ldpc_decoding(z, H, q, param_name1, param_value1, ...) | ||||||||
ВХОД | ||||||||
| ||||||||
ВЫХОД | ||||||||
|
Оценка характеристик LDPC-кода с помощью метода Монте Карло | ||||
---|---|---|---|---|
[err_bit, err_block, diver] = ldpc_mc(H, G, g, num_points) | ||||
ВХОД | ||||
| ||||
ВЫХОД | ||||
|