通过Autoencoder找到Probabilistic shaping的最优probability distribution
在有信道损伤情况下的信道容量C
信道容量C定义为:互信息I(X;Y)的最大值
适用条件:离散无记忆信道
C = max I(X;Y)
简要介绍系统结构原理
通过NN1,先输出按照P(s)产生的0-15的symbol S,再将这些symbols变成星座点 x
通过NN2,接收到的sample y被接收端的NN转换成对应symbol集S的probability vector,这个probability vector就是对真实后验概率P(s|y)的估计
将解码器看成一个分类问题classification task,64QAM及以下可以看作分类问题,64QAM以上更常看作回归问题。
Loss Function选择
原本分类问题的代价函数常用交叉熵cross entropy函数,上述是交叉熵的常规表示形式。下面对这个公式进行解释。
背景介绍:
上述是交叉熵的定义,这里的p(x)不是完全等效于p(s),而是每个transmit symbol先被表示成one-hot的prob的形式,也是receiver的正确结果,即:对于symbol s=2,则有:
p(s) = [0 0 1 0 0 0 0 0 0 0 0 0 0 0 0]
q(s)为经过softmax之后的对p(s)的预测结果。例如:
q(s|y) = [0.001 0.001 0.9 0.001 0.001…………]
所以,receiverNN的经过softmax后的输出就代表了在发送某个symbol时,对接收信号的 后 验 概 率q(s|y)的估计。
由于我们的最终目标要使I(X;Y)最大,所以将loss function变化成能最大化I(X;Y)的形式:
回到本系统的loss function:
首先,信道输入和输出的交叉熵:
但是不能直接使交叉熵不断减小,因为L降低会导致input entropy也降低。所以要保证H(S)不降低。所以得到更改后的Loss function:
则:在代价函数中减去信号熵,使得NN在迭代的过程中只最大化互信息I(X;Y)却不会降低信号自熵。
这其中存在一个问题:令Loss Function = cross entropy - signal entropy之后,降低loss function的值在迭代后期(例如图中60 epoch左右之后),减小loss function会通过增加H(X)来实现,这是我们不想看到的。
疑惑:但是增加H(X)也会导致cross entropy的降低,为何由于增加H(X)而再次造成的cross entropy不会在loss中占主导作用使loss增加,而反而通过粗暴的增加entropy,就可以使loss得到进一步的下降??
补充:
使用这样的Loss function还有一个好处就是,-L直接表示信号互信息量(也就是信道容量)的最大值的下界,该结论是通过以上的数学表示形式得出的。这个前提是NN2有足够复杂的结构使输出prob的估计误差(KL散度)尽可能小。
这一项表示NN2对真实后验概率的估计能力。
用TensorFlow给信号加SNR固定的AWGN噪声
因为IQ信道是复信号,所以要介绍如何给复信号加复噪声。
难点是:
- 如何控制Signal和Noise的均值和方差
- 如何利用SNR将Signal和Noise的power联系起来
Noise power应该和input entropy的变化规律相同,因为input entropy增加,表示信号越uniform shaped,则信号的signal power越大。
疑惑:若信号input entropy减小,则信号more shaped,但这不一定绝对代表着信号power减小。因为如果power大的点的出现概率变大,power小的点出现概率变小,则信号总功率变大的同时信号input entropy变小。所以要避免这种情况的出现。
Gumbel_Softmax采样
需要Gumbel_Softmax层的输入为unormalized log probabilities.
上述公式是GS采样的公式。其中log(p(i))是NN1的16个neurons的linear activation layer的输出。不用再进行log等任何操作。
因为将NN1的linear activation layer直接接一层softmax layer的话,输出就是真实的概率分布。所以在经过softmax之前,自动看作log(p(i))。
所以Gumbel_Softmax层输出的symbols自动服从了p(s)的概率分布。这点已经通过程序断点输出得到证明。
其中Gi是服从Gumbel分布的随机数。
其中epsilon i-epsilon n服从U~(0,1)的均匀分布
所以真实的Probabilistic shaping的各个星座点的概率是将GS输入端的logits通过一个softmax层,其结果就是真实的PS概率。
前期错误
1.矩阵维度以及Tensorflow的Tensor张量图的操作
因为Tensor不可以对元素进行操作,Tensor Model在未赋值的情况下是只读的。
2. Argmax的不可导问题
使用 tf.stop_gradient 函数,使其在前向传播时使用argmax即值进行传播,但是在后向传播时使用encoder_op的输出的prob值而不是one_hot进行后向Back propagation.
one_hot_label = encoder_op + tf.stop_gradient(tf.one_hot(tf.argmax(encoder_op, 1),16) - encoder_op)
极其重要的关键性错误
- 对高斯噪声的添加方法不清晰
添加信道噪声时,因为是PS Signal,所以要对信号进行期望能量归一化。
回顾PS信号可以抗噪声的原理,即确定当输入信号的Expected Energy = 1,此时constellation 越shaped,则各个星座点之间的距离越大,则噪声的影响越小。
关键:星座点位置是改变的,但是Expected Energy不变,SNR不变, Noise Energy不变。 - 对Linear Activation Layer的设置不正确
weights = {
'encoder_h2': tf.Variable(tf.zeros([n_hidden_1, n_output])),
}
biases = {
'encoder_b2': tf.Variable(tf.truncated_normal([n_output])),
}
def encoder(x):
layer_1 = tf.nn.relu(tf.add(tf.matmul(x, weights['encoder_h1']), biases['encoder_b1']))
layer_2 = tf.add(tf.matmul(layer_1, weights['encoder_h2']), biases['encoder_b2'])
return layer_2
其中的layer2就是linear activation layer,用tf.add
- Gumbel-Softmax采样的输入不明确
将Linear Activation Function的输出直接输入Gumbel_Softmax进行采样。因为Linear layer的输出直接作为log(P(s))。
这里注意,因为之后要计算self entropy,所以要加一层普通softmax层来输出real prob distribution。不要对GS后的信号进行计算,用加softmax的方法,保证其可导性! - 不应该在run.session中进行计算并传给model
因为TensorFlow每run一次就会重新遍历一次图,run两次不能保证其采样的symbol完全一致,所以要一次run输出全部想输出的值。
_, c, self_entro, prob_listshow, spow,noisepow,SNR,test = sess.run([optimizer, modified_loss, tmp_sum, prob_list,Ps,Pn,snr_verify,deltaA],
feed_dict={X: batch_xs})
- 没进行BATCH Normalization
批标准化(batch normalization,BN)一般用在激活函数之前,使结果x=Wx+bx=Wx+b 各个维度均值为0,方差为1。通过规范化让激活函数分布在线性区间,让每一层的输入有一个稳定的分布会有利于网络的训练。
优点:
加大探索步长,加快收敛速度。
更容易跳出局部极小。
破坏原来的数据分布,一定程度上防止过拟合。
解决收敛速度慢和梯度爆炸。
TensorFlow程序方面问题
Debug中出现的问题以及尝试解决
- Prob的entropy的计算方法有问题,导致log0的出现,使loss不准确
- 未进行normalization,包括receiver端的standard normalization
- self entropy不应该写在run session中,应该在model中的定义好
- 信道Noise加的不正确,检查Noise是否随Input Entropy变化
- Gumbel采样原理出现错误
Loss Function不收敛的原因
没有对数据进行归一化
忘记检查输入和输出
没有对数据进行预处理
没有对数据正则化
使用过大的样本
使用不正确的学习率
在输出层使用错误的激活函数
网络中包含坏梯度
初始化权重错误
过深的网络
隐藏单元数量错误