深度学习基础知识总结
(不定时更新)
目录
基础问题
卷积中图像大小变化公式:
i m a g e s i z e = n × n × c , f i l t e r s = f × f × c ( c h a n n e l s ) × n u m b e r o f f i l t e r s , s ( s t r i d e ) = s , p ( p a d d i n g ) = p image size = n \times n \times c, filters = f \times f \times c(channels) \times number\ of\ filters, s(stride) = s, p(padding) = p imagesize=n×n×c,filters=f×f×c(channels)×number of filters,s(stride)=s,p(padding)=p
after conv we get ( n + 2 p − f s + 1 ) × ( n + 2 p − f s + 1 ) × c (\frac {n+2p-f} {s} + 1) \times (\frac {n+2p-f} {s} + 1) \times c (sn+2p−f+1)×(sn+2p−f+1)×c (The new c here equals to number of filters from last layer)
为什么需要非线性激活函数?
Why need a nonlinear activation function?
如果你使用线性激活函数或者没有使用一个激活函数,那么无论你的神经网络有多少层一直在做的只是计算线性函数。模型复杂度和标准的logistic回归是一样的。非线性激活函数是深层的神经网络变得有意义,可以使模型更复杂。
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。
为什么使用卷积?
Why convolutions?
和只使用全连接层相比,卷积层的两个主要优势在于参数共享和稀疏连接。直接使用全连接层的话,需要的参数会非常多。
参数共享:观察发现,特征检测如垂直边缘检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域。整张图片共享特征检测器。
稀疏连接:第二个方法是使用稀疏连接,我来解释下。绿色线圈着的这个0是通过3×3的卷积计算得到的,它只依赖于这个3×3的输入的单元格,右边这个输出单元(元素 0)仅与36个输入特征中9个相连接。而且其它像素值都不会对输出产生任影响,这就是稀疏连接的概念。
神经网络可以通过这两种机制减少参数,以便我们用更小的训练集来训练它,从而预防过度拟合。
你们也可能听过,卷积神经网络善于捕捉平移不变。通过观察可以发现,向右移动两个像素,图片中的猫依然清晰可见,因为神经网络的卷积结构使得即使移动几个像素,这张图片依然具有非常相似的特征,应该属于同样的输出标记。实际上,我们用同一个过滤器生成各层中,图片的所有像素值,希望网络通过自动学习变得更加健壮,以便更好地取得所期望的平移不变属性。
池化层 Pooling layers
压缩特征图,提取主要特征。最大池化使用的过滤器2x2,步幅为2,表示层的高度和宽度会减少一半。
卷积网络经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性。
一般使用最大池化,大部分情况下最大池化很少用padding。数字大意味着可能探测到了某些特定的特征。如果没有提取到这个特征,那么其中的最大值也还是很小 。具体的原因也不是太清楚,之所以使用池化是因为用了效果好。同时池化可以把很多数据用最大值或者平均值代替。目的是降低数据量。降低训练的参数。对于输入层,当其中像素在邻域发生微小位移时,池化层的输出是不变的,从而能提升鲁棒性。而卷积则是把数据通过一个卷积核变化成特征,便于后面的分离。
padding 填充
如果我们有一个 n × n n \times n n×n的图像,用 f × f f \times f f×f的过滤器做卷积,那么输出的维度就是 ( n − f + 1 ) × ( n − f + 1 ) (n-f+1) \times (n-f+1) (n−f+1)×(n−f+1)。这样,每次做卷积操作,你的图像会缩小,影响卷积网络的深度。那些在角落或者边缘区域的像素点在输出中采用较少,意味着你丢掉了图像边缘位置的许多信息。可以使用Valid卷积,p=0。也可以使用Same卷积填充像素,使输出和输入大小相同。
迁移学习
如果你有一个三分类问题,训练集很小。举个例子,可以使用ImageNet数据集,它有1000个不同的类别,因此这个网络会有一个Softmax单元,它可以输出1000个可能类别之一。你可以去掉这个Softmax层,创建你自己的Softmax单元,用来输出三个类别。把所有的层看作是冻结的,冻结网络中所有层的参数,只需训练和你的Softmax层有关的参数。
如果你有大量的数据,你应该冻结更少的层,训练后面的层。
防止过拟合有哪些方法
- 获取更多的训练数据
- 减小网络容量(简单的网络),但容易欠拟合
- 添加权重正则化
- 添加dropout
正则化(Regularization)
深度学习可能存在过拟合问题–高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据。
λ 2 m \lambda \over 2m 2mλ乘以 w w w范数的平方, w w w欧几里德范数的平方等于 w j w_j