深度学习的局部响应归一化LRN

深度学习的局部响应归一化LRN

  LRN这个概念和运用是出现在AlexNet中。LRN最初是生物学里的概念“相邻神经元抑制”,对局部神经元的活动创建竞争机制。使用LRN增加了泛化能力(使输出中响应比较大的值变得相对更大,并抑制其他响应较小的神经元),做了平滑处理,提高了1%~2%的识别率。

在Tensorflow中有对应的函数

tf.nn.lrn(input,depth_radius=None,bias=None,alpha=None,beta=None,name=None)

在AlexNet的论文中,有局部响应归一化的公式

深度学习的局部响应归一化LRN
接下来,我们分析这个公式

公式中的aa表示卷积层(卷积操作和池化操作)后的输出,输出结果是一个四维数组[batch, height, width, channel],看作channel个3维矩阵

ax,yia^i_{x,y}:输出结果中一个位置[a,b,c,d],可以理解为某一张图的某一个点的第几个通道。
NN: 通道数

超参数
aa: 函数中的input
n2\frac{n}{2}: 函数中的depth_radius,表示在channel这个坐标轴上的半径,包括的channel个数
kk: bias
αα: alpha

这么说还不够形象,那么就用图来说明。可以从图中看出,求和所选择的点范围是以n/2为半径的,这个半径的坐标轴是channel。

深度学习的局部响应归一化LRN

简单的代码来帮助我们理解LRN的作用

下面的矩阵可以理解为一张图片,大小为一个像素,有三个通道。

import tensorflow as tf
import numpy as np
a = 2 * np.ones([1, 1, 1, 3]) # array([[[[2., 2., 2.]]]])
b = tf.nn.local_response_normalization(a, 1, 0, 1, 1)
sess = tf.Session()
print(sess.run(b))
# Output:
# [[[[0.25       0.16666667 0.25      ]]]]
import tensorflow as tf
import numpy as np
a = np.arange(3)
a = a.reshape([1, 1, 1, 3]) # array([[[[0, 1, 2]]]])
b = tf.nn.local_response_normalization(a, 1, 0, 1, 1)
sess = tf.Session()
print(sess.run(b))
# Output:
# [[[[0.  0.2 0.4]]]]

可以看到,对于两边的channel,看到边缘突出,增加反差。生物学上的解释是相近的神经元彼此之间发生的抑制作用,即在某个神经元受到刺激而产生兴奋时,再刺激相近的神经元,则后者所发生的兴奋对前者产生的抑制作用。

注意

在2015年的《Very Deep Convolutional Networks for Large-Scale Image Recognition》中,说明了LRN在IILSVRC数据集上不能对性能进行改善。主流的模型中基本不使用LRN。

参考博客

  1. https://blog.csdn.net/yangdashi888/article/details/77918311
  2. https://blog.csdn.net/hduxiejun/article/details/70570086