对CNN网络全连接层的一些理解

版权声明:站在巨人的肩膀上学习。 https://blog.csdn.net/zgcr654321/article/details/84894860

CNN网络的全连接层一般包含两个部分:

线性运算部分:完成线性变换的工作,将输入经过线性变换转换成输出。

非线性运算部分(以下简称非线性部分): 紧接着线性部分,完成非线性变换。

线性运算部分的作用:

线性部分从运算过程上看就是线性变换,对于一个输入向量,线性部分的输出向量是,线性部分的参数是一个mXn的矩阵W ,有时再加上一个偏置项,即:

这个运算到底做了什么工作呢?

表面上看就只是矩阵和向量相乘,再加上一个偏置向量。但如果我们输入的数据有一些含义时,这个操作就有了不同的意义。假设我们输入的数据是mnist的图片数据(一个28X28=784维的向量),这个784维的向量是784个像素点的数值,显然不同的数字0-9,它们各自的784个像素点的数值肯定是不一样的,而且这其中一定暗含着某种规律。我们使用上面的线性变换后可以得到一个向量,而不同的数字图片经过这个变换得到的向量显然有很大的区别。我们就称这个向量为原始图片数据经过神经网络提取出的“特征”。

非线性部分的工作:

非线性部分有很多种函数可以选择,这里就以sigmoid函数为例。

sigmoid函数形式:

函数图像如下:

非线性部分在模型中有很多作用, 其中一个作用就是对数据的归一化。

比如Sigmoid 函数会将数据限制在(0,1)的范围中。这样后面的网络层如果要基于前面网络层的数据继续计算,网络内部的数值的范围就相对可控了。

如果不进行归一化,在下一层网络中,输入的数值大小可能不尽相同,有些比较大,有些比较小,那么在计算中那些大数字的重要性就会被强调,而小数字的重要性就会被忽略。这可能会导致到下几层网络后出现数值爆炸溢出的情况,最终导致网络输出的结果超过数字能表示的范围。

从反向计算网络时,如果每一层的数值大小都不一样,有的范围在(0,1),有的在(0, 10000),那么在做模型优化时,设定反向求导的学习率时就会出现很大的问题:如果设置过大,那么梯度较大的维度就会因为过量更新而造成无法预期的结果;如果设置过小,那么梯度较小的维度得不到充分的更新就难以有提升。

非线性部分还有一个重要的作用,就是打破线性映射关系。

如果全连接层没有非线性部分,只有线性部分,那么在模型中叠加多层神经网络是没有意义的,因为多层神经网络可以直接退化成一层神经网络。

举例:

假设有一个两层全连接神经网络,其中没有非线性层,那么对于第一层有:

对于第二层有:

我们合并上面两式:

这时可以发现,只要令,就可以用一层神经网络来表示两层神经网络。所以说,没有非线性部分的深层神经网络是没有意义的,其效果和单层神经网络一样。

猜你喜欢

转载自blog.csdn.net/zgcr654321/article/details/84894860