B站学习法之深度学习笔记一
Three Steps for Deep Learning
Step 1. A neural network is a function compose of simple functions (neurons)
神经元=simple fcn
神经网络=fcn
通常需要自己决定网络的structure,and let machine find parameters from data.
所以我们要focused 就是有哪些常见的structure.
Step 2. 定好structure和para后就要定cost function——什么样的network参数是好的?什么样的network的参数又是不好的?那么如何定cost fcn呢?
那当然是case by case,取决于你要处理的问题和你手上的data(训练数据)
Step 3. 有了上面两个步骤之后,我们就用gradient descent(梯度下降)找到一个最好的fcn
接下来开头课程的outline
1.Fully connected layer(全连接层)
1.1关于全连接层的浅显理解
对全连接层的理解参考了这篇原创文章[link]https://blog.csdn.net/m0_37407756/article/details/80904580
理解:例如经过卷积,relu后得到3x3x5的输出。
那它是怎么样把3x3x5的输出,转换成1x4096的形式?
很简单,可以理解为在中间做了一个卷积。
从上图我们可以看出,我们用一个3x3x5的filter 去卷积激活函数的输出,得到的结果就是一个fully connected layer 的一个神经元的输出,这个输出就是一个值。因为我们有4096个神经元。我们实际就是用一个3x3x5x4096的卷积层去卷积激活函数的输出。
以VGG-16再举个例子吧,
对224x224x3的输入,最后一层卷积可得输出为7x7x512,如后层是一层含4096个神经元的FC,则可用卷积核为7x7x512x4096的全局卷积来实现这一全连接运算过程。
它把特征representation整合到一起,输出为一个值。
那么全连接层这样做,有什么好处?
好处就是大大减少特征位置对分类带来的影响,不能理解?没关系,继续举例理解:
举个简单的例子:
从上图我们可以看出,猫在不同的位置,输出的feature值相同,但是位置不同。
对于电脑来说,特征值相同,但是特征值位置不同,那分类结果也可能不一样。所以为了避免上图中Feature Map的位置不同引起电脑分类不一样的后果,全连接层filter的作用就相当于告诉电脑——
喵在哪我不管,我只要喵,于是我让filter去把这个喵找到,实际就是把Feature map 整合成一个值,这个值大,有喵,这个值小,那就可能没喵,和这个喵在哪关系不大了,鲁棒性有大大增强。
在实际使用当中,全连接层中一层的一个神经元可以看成一个多项式,我们用许多神经元去拟合数据分布。但是只用一层fully connected layer 有时候没法解决非线性问题,那么如果有两层或以上fully connected layer就可以很好地解决非线性问题了
再举一个例子说明很好地解决非线性问题:
我们都知道,全连接层之前的作用是提取特征
全连接层的作用是分类
我们现在的任务是去区别一图片是不是猫
假设现在神经网络模型已经训练完了,全连接层已经知道了,并表示:当我们检测到以下特征时,我就可以判断这个东东是猫了。
因为全连接层的作用主要就是实现分类(Classification)
从下图,我们可以看出
红色的神经元表示这个特征被找到了(激活了)
同一层的其他神经元,要么猫的特征不明显,要么没找到
当我们把这些找到的特征组合在一起后发现最符合要求的是猫——ok,我认为这是猫了。
再比如说区别猫头:
道理和区别猫一样
当我们找到这些特征,神经元就被激活了(上图红色圆圈)
注:这些细节特征又是怎么来的?——是从前面的卷积层,下采样层来的
全连接层参数特多(可占整个网络参数80%左右),那么全连接层对模型影响参数就是三个:
- 全连接层的总层数(长度)
- 单个全连接层的神经元数(宽度)
- 激活函数
其中,激活函数暂时先明白他的作用是
以上,从全连接层的好处(减少特征位置对分类带来的影响)+全连接层的作用(分类)+全连接层对模型影响的主要参数进行了十分浅显且不知道恰不恰当的举例,对Fully connected layer有了粗浅的了解。
1.2关于全连接层的浅显理解
第 l l l层有N个Nodes,均对用一个output: a i l a^l_i ail,其中 i i i代表第 l l l层的第 i i i个神经元的输出
把一层layer中的所有output集合起来——就组成了一个vector向量,用 a l a^l al代表第 l l l层的输出向量。
FCL中的每个layer都是两两相接的,那neurons和neurons之间的connection有一个weight—— w i j l w^l_{ij} wijl
其中,上标表示这个连接了第l-1个layer和第l个Layer;下标是指这个weight连接了第 l − 1 l-1 l−1个layer的第 j j j个neuron a j a_j aj连接到(箭头指向)第 l l l个layer的第 i i i个neuron.( j j j在左边, i i i在右边)
依次类推,两两neurons之间就有一个weight,由此排成一个矩阵 W l W^l Wl.第一个index(即 i i i)指的是row,第二个index(即 j j j)指的是column.从而 W l W^l Wl的row行的个数就是 N l N_l Nl(节点数), W l W^l Wl的column列的个数就是 N l − 1 N_{l-1} Nl−1(节点数)
(注:第一个index指的是上图的input layer,第二个index指的是上图的output layer)
那么,现在就构造了一个matrix将所有的weight全都表示。上标 l l l表示第 l − 1 l-1 l−1和第 l l l层的weight_matrix.
除了weight以外,每个neuron还有一个bias.(我们可以把bias想象成weight的一部分,只是需要在input的地方多加一个1(如下图所示的1,并将1视为是weight的一部分),所以有些书就没有给出bias图线的部分)将这些bias全部穿起来成一个vector,用 b l b^l bl表示第 l l l个layer组成的bias的vector.
接下来我们要算 a i l a^l_i ail,即第 l l l个layer的第 i i i个neuron的output a i l a^l_i a