Introduction
这是ICML2018的一篇论文,其由来自英伟达、阿尔托大学和 MIT 的研究者联合发表。该文章提出了一个很有意思的观点:在某些常见情况下,网络可以学习恢复信号而不用“看”到“干净”的信号,且得到的结果接近或相当于使用“干净”样本进行训练。而这项结论来自于一个简单的统计学上的观察:我们在网络训练中使用的损失函数,其仅仅要求目标信号(ground truth)在某些统计值上是“干净”的,而不需要每个目标信号都是“干净”的。
Theoretical background
上面这一小段,一张低分辨率图对应多张高分辨率图,是基于一种实际观测和先验,公式中表示了一对多的具体关系。
“综上所述, L2最小化的一个看起来似乎微不足道的属性是,如果我们用一个期望与目标相匹配的随机数替换目标,那么估计值将保持不变。”这是为什么会保持不变呢?
我的理解:
输入x,经过网络theta参数得到,此时有一个真的目标y,假设这里是一一对应的,此时要想得到theta参数,就需要公式来使得损失最小,此时若等于y,因为此时的损失最小,参数也是最优的。
但假设,输入x,经过网络theta参数得到,此时有一组目标集合Y={y1,y2,y3等},这里是1对多的关系,就需要公式来使得损失最小,那么此时若等于目标集合Y的期望时(Y的期望等于上面的y),损失最小,参数最优,同时得到的估计值就应该是y。
从上面的2个例子可以看出,当均值相同时,使用L2损失函数,最终的估计值时保持不变的。
“这意味着,可以在不改变网络训练结果的情况下,将神经网络的训练目标添加上均值为0的噪声。”这里该怎么解释呢?
一组数据A=(2,1,3,4,5),其均值为3(统计学中叫均值,概率学中叫期望)。此时有一组数据B=(-2,-1,0,1,2),其均值为0。那么A+B(0,0,3,5,7)的均值为3。可以看出其均值没有发生变化,那么意味着估计值也没有发生变化。
对于无限的数据,用噪声图像作为目标的结果就和用干净图像作为目标的重建效果一样。
对于有限的数据,方差是目标中噪声的平均方差除以训练样本的数量,即:
根据论文提出的理论以及方差和协方差的基本性质,可以得到最后一排公式。
如果噪声是互不相关的,则可以简化为:
无论是哪种情况,估计的方差都是噪声的平均(协)方差,除以样本N的数目。因此,随着样本数的增加,误差接近于零。
训练:
将图像A resize成256*256,图像A使用加性高斯噪声,方差范围在[0,50],具体实现如下:
def add_train_noise_tf(self, x): (minval,maxval) = self.train_stddev_range shape = tf.shape(x) rng_stddev = tf.random_uniform(shape=[1, 1, 1], minval=minval/255.0, maxval=maxval/255.0) return x + tf.random_normal(shape) * rng_stddev
对A使用1次加性高斯噪声,得到噪声图像A_noise_src。
对A使用1次加性高斯噪声,得到噪声图像A_noise_target。
将A不做任何变换,得到原图A_clean_target。
训练时,使用干净目标A_clean_target作为标签,A_noise_src作为输入,使用均方误差作为损失,下方代码f(A_noise_src)表示经过了神经网络后的输出。
meansq_error = tf.reduce_mean(tf.square(A_clean_target - f(A_noise_src)))
训练时,使用噪声目标A_noise_target作为标签,A_noise_src作为输入,使用均方误差作为损失,下方代码f(A_noise_src)表示经过了神经网络后的输出。
meansq_error = tf.reduce_mean(tf.square(A_noise_target - f(A_noise_src)))
从实际结果来看,使用干净目标A_clean_target和噪声目标A_noise_target作为标签,所得到的结果相近,收敛速度也相当。
Practical experiments
加性高斯白噪声
其他合成噪声
泊松噪声
乘性伯努利噪声
文字去除
随机值脉冲噪声
英伟达新闻地址:新闻地址
An unofficial and partial Keras implementation:github
更新:
英伟达官方tensorflow实现:github