在第一讲,我们来summarize一下DeepCode这篇paper的主要思路。
Introduction
- 是本文主要研究是的 feedback channel,使用的feedback是一个单位时延的接收信号。也就是说发送端在每次作决策的时候,之前所有发送的信号都已经有反馈回来了。
- feedback不会提升信道容量,但是会在有限长码字时提升可靠性。也就是说,对于无限长码字来说,我们单凭发送出coding就能做到和有feedback时一样的效果。但是对于短码,有feedback会大大降低误码率。但是以前的工作中还没能完全exploit feedback带来的好处,本文最主要就是用DeepLearning来设计code。
- 一个重要的benchmark就是S-K scheme,但是它对实数精度很敏感(可能是用了很尬modulation的QAM来feedback很多信息)而且仅能用在noiseless feedback的情况下。
- [7-9] 扩展了s-k scheme到噪声信道,但是并没有收到很好的增益。
- 一个结论是,所有的linear codes + noisy output feedback 都不能achieve正的通信速率。这就麻烦了,因为实际中所有的码都是线性的([9] 倒是提出了一个渐进最优的非线性码字).
- 本文主要考虑定长码字(因此rate也fix了),因为变长码字收发端不好agree on length,特别是在noisy feedback的情况下。
- Variable length setting下,[11,12]中设计的码字对反馈信道噪声不敏感;[13] 设计了coded feedback发现只要反馈信道SNR够大, 也能提升可靠性。
本文的场景可以概括为:码字有限长,fixed rate (有限码长传输的信息也fix),passive feedback (接收端仅feedback接收的信号)。
System Model
就DL来说,本文的模型还是比较简单的。首先,transmitter的主要目的就是把
K
K
K 个 bits
b
\bm{b}
b 发送给接收端:
- 发送端每次传输的信号是 x i x_i xi;
- 接收端每次收到的信号是 y i = x i + n i y_i=x_i+n_i yi=xi+ni;
- 接收端反馈 y i y_i yi, 发送端收到 y ~ i = y i + w i \tilde{y}_i=y_i+w_i y~i=yi+wi.
所以可以看出,这其实是一个比较简单的系统 – 整个系统中唯一的不确定性就是噪声。因此我们在发送端和接收端需要设计编码器和译码器来对抗噪声。
发送端设计
文中讲了很多错误和曲折,我们直接跳到最后的设计。
发送端的设计如下图所示:
可以看到,总共有
K
K
K bits有待发送。那么发送端
- 首先把K个bits传输一遍,这一步没有用到任何code design,只是为了得到噪声序列的一个realization,相当于后面check bits需要学习的就是怎么纠正前面实例化的噪声。注意 a a a 和 w w w 都是tunable parameter作者的解释是让DL自己学会功率分配balance不同bits的传输功率。实际上就是说,DNN不容易学到功率分配,所以得单独拎出来让DNN学。
- 把K个bits传一遍之后,文中设计让DNN逐个纠正bits,每个bits产生俩check bits且每次都把之前check bits的噪声当做输入信息来generate这一次的check bits。作者还用了RNN让每次check bits的生成和前几次check bits的产生形成联系。即,最终所有的code是作为一个序列产生的,RNN需要去exploit这个序列之间的关系。
[关于RNN的选取]: 注意,统计意义上说,原始的 K K K 个bits之间本来是没有任何时序关系的,都是iid的,而且添加的噪声也没任何时序关系。更具体地说,发送端的所有输入序列 b \bm{b} b, n \bm{n} n, w 1 \bm{w_1} w1, w 2 \bm{w_2} w2内部没有任何时序关系,把他们调换位置都没问题。
那么作者为什么要用RNN尼?我觉得是由第一个phase决定的。因为所有的code都是基于第一个phase的传输来设计的,所以实际上一旦第一个phase的bits被产生并完成传输,那么隐含的意思就是这个sequence完全确定下来了,noise也完全确定下来了,没有任何randomness了。接下来DNN要做的就是去探索怎么在一个确定sequence (第一个phase的noise) 的干扰下恢复另一个确定的sequence ( K K K 个bits序列)。当然这个恢复过程会受到两个随机噪声影响。
以上的分析是对第一个phase中一个确定的 b \bm{b} b 和 n \bm{n} n来分析的,但是作者不可能fix b \bm{b} b 和 n \bm{n} n只改变第二个phase的noise来做文章,所以最终的simulation我猜还是会遍历所有的 b \bm{b} b 和 n \bm{n} n。也就是说,RNN需要学习到:对每一个具体的 b \bm{b} b 和 n \bm{n} n in the first phase,怎么利用它们的时序关系来解码。
我们之所以要重视DNN的选取,是因为发射端的RNN造成了unbalanced BER问题,请看下图
上图是 K K K个bits的BER curve,明显BER是unbalanced。这就是发送端RNN的代价,即第一个phase的 c k c_k ck仅仅包含 b k b_k bk的信息,第二个phase的 c k c_k ck 仅仅包含 k ′ < k k'<k k′<k 哪些信息,所以发送信号中蕴含的最开始的那些bits的信息最多而最后面的那些信息的bits越少。这就导致了unbalanced BER. 作者用了很多方法补救,比如末尾填零, a i a_i ai, w i w_i wi power allocation, etc.
接收端设计
如果给你一个上述的发送端,你该怎么设计接收端尼?显然不是那么好设计的,因此我们也要用DNN,这里也比较简单粗暴了,就是把接收到的信号全扔进去用bi-directional RNN来解。最后输出是sigmoid激活函数。
这里RNN的选取是很合理的,因为发送端发送的数据肯定是有时序关系的 – 后发送的数据一定是exploit了前面的feedback的,肯定是针对feedback进行了调整的。
最终训练的目的是最小化binary cross-entropy
L
(
b
,
b
^
)
=
∑
i
=
1
K
[
−
b
i
log
b
^
i
−
(
1
−
b
i
)
log
(
1
−
b
^
i
)
]
\mathcal{L}(\bm{b},\bm{\hat{b}})=\sum_{i=1}^{K}[-b_i\log\hat{b}_i-(1-b_i)\log(1-\hat{b}_i)]
L(b,b^)=i=1∑K[−bilogb^i−(1−bi)log(1−b^i)]
总结
总的来说,这篇paper实际上在训练一个大的神经网络,以 b \bm{b} b 为输入,encoder 不断输出数据,加噪声得到接收信号。接收信号再加噪声反馈给发送端构成下一次输入。这样进行K次之后decoder开始译码并计算loss。最终这个大的神经网络就联合训练来minimize loss,然后把encoder decoder分别抽出来以供实际应用。
相当于神经网络内部完成了对输入的加噪解码。即固定了神经网络内部的一部分结构(噪声和反馈链路),训练一个针对这一部分结构的编译码器.