有幸拜读大佬言有三的书《深度学习之模型设计》,以下是我的读书笔记,仅供参考,详细的内容还得拜读原著,错误之处还望指正。下面的三张图片来自知乎。
传统的机器学习需要人为设计特征描述算子,但人毕竟有限,这从原理上限制了传统全连接神经网络的表达能力,使其只能解决比较简单的问题。
大型数据集的诞生,使很多机器学习模型有了足够多的数据来训练泛化性能足够好的模型。
1.什么是GPU
2.GPU架构与软件平台
GPU可编程了。
GPU发展阶段:固定功能架构阶段 ⇒ \Rightarrow ⇒分离渲染架构阶段 ⇒ \Rightarrow ⇒统一渲染架构阶段
3.GPU与CPU算力对比
(1)GPU的浮点运算能力是CPU的十倍以上。
(2)GPU拥有高速宽的独立显存;浮点运算性能高;几何处理能力强;适合处理并行计算任务;适合进行重复计算;适合图像或视频处理任务;能大幅度降低系统成本。
略
略
ZFNet(反卷积)(2013) ⇒ \Rightarrow ⇒GoogLeNet(Inception)&VGGNet(2014) ⇒ \Rightarrow ⇒ResNet(2015) ⇒ \Rightarrow ⇒ResNeXt(分组卷积)&DenseNet(2016) ⇒ \Rightarrow ⇒SeNet(2017)
LSTM(2014) ⇒ \Rightarrow ⇒注意力机制(2014) ⇒ \Rightarrow ⇒Transformer(2017) ⇒ \Rightarrow ⇒ELMO(2017) ⇒ \Rightarrow ⇒GPT(2018) ⇒ \Rightarrow ⇒GPT2.0(2019) ⇒ \Rightarrow ⇒XLNet(2019)
其中 ( x ∗ w ) ( t ) (x*w)(t) (x∗w)(t)称为 x x x和 w w w的卷积
连续的定义: ( x ∗ w ) ( t ) = ∫ − ∞ + ∞ f ( τ ) g ( t − τ ) d τ (x*w)(t)=\int_{-\infty}^{+\infty}f(\tau)g(t-\tau)d\tau (x∗w)(t)=∫−∞+∞f(τ)g(t−τ)dτ
离散的定义: ( x ∗ w ) ( t ) = ∑ − ∞ + ∞ f ( τ ) g ( t − τ ) (x*w)(t)=\sum_{-\infty}^{+\infty}f(\tau)g(t-\tau) (x∗w)(t)=∑−∞+∞f(τ)g(t−τ)
( x ∗ w ) ( i , j ) = ∑ m ∑ n x ( m , n ) w ( i − m , j − n ) (x*w)(i,j)=\sum_m\sum_n x(m,n)w(i-m,j-n) (x∗w)(i,j)=m∑n∑x(m,n)w(i−m,j−n)
其中 x x x表示输入 w w w卷积核。
说白了,卷积就是在图像上滑动,取与卷积核大小相等的区域,逐像素做乘法然后相加。
本人补充:卷积中还有三种模式:
1.full mode
full模式的意思是,从filter和image刚相交开始做卷积,白色部分为填0。filter的运动范围如图所示。
2.same mode
当filter的中心(K)与image的边角重合时,开始做卷积运算,可见filter的运动范围比full模式小了一圈。注意:这里的same还有一个意思,卷积之后输出的feature map尺寸保持不变(相对于输入图片)。当然,same模式不代表完全输入输出尺寸一样,也跟卷积核的步长有关系。same模式也是最常见的模式,因为这种模式可以在前向传播的过程中让特征图的大小保持不变,调参师不需要精准计算其尺寸变化(因为尺寸根本就没变化)。
3.valid mode
当filter全部在image里面的时候,进行卷积运算,可见filter的移动范围较same更小了。
卷积通常会造成分辨率降低,而反卷积正好相反。
实际上,并没有反卷积这种操作,目前在DeepLearning中主要有两种方式实现反卷积——插值法和转置卷积
已知四个点 Q 11 = ( x 1 , y 1 ) , Q 12 = ( x 1 , y 2 ) , Q 21 = ( x 2 , y 1 ) , Q 22 = ( x 2 , y 2 ) Q_{11}=(x_1,y_1),Q_{12}=(x_1,y_2),Q_{21}=(x_2,y_1),Q_{22}=(x_2,y_2) Q11=(x1,y1),Q12=(x1,y2),Q21=(x2,y1),Q22=(x2,y2)
对 x x x方向进行线性差值:
f ( x , y 1 ) ≈ x 2 − x x 2 − x 1 f ( Q 11 ) + x − x 1 x 2 − x 1 f ( Q 21 ) f(x,y_1)\approx \dfrac{x_2-x}{x_2-x_1} f(Q_{11}) + \dfrac{x-x_1}{x_2-x_1}f(Q_{21}) f(x,y1)≈x2−x1x2−xf(Q11)+x2−x1x−x1f(Q21)
f ( x , y 2 ) ≈ x 2 − x x 2 − x 1 f ( Q 12 ) + x − x 1 x 2 − x 1 f ( Q 22 ) f(x,y_2)\approx \dfrac{x_2-x}{x_2-x_1} f(Q_{12}) + \dfrac{x-x_1}{x_2-x_1}f(Q_{22}) f(x,y2)≈x2−x1x2−xf(Q12)+x2−x1x−x1f(Q22)
然后对 y y y方向进行线性差值:
f ( x , y ) ≈ y 2 − y y 2 − y 1 f ( x , y 1 ) + y − y 1 y 2 − y 1 f ( x , y 2 ) f(x,y)\approx \dfrac{y_2-y}{y_2-y_1} f(x,y_1) + \dfrac{y-y_1}{y_2-y_1}f(x,y_2) f(x,y)≈y2−y1y2−yf(x,y1)+y2−y1y−y1f(x,y2)
先对y方向再对x方向插值结果一样。
实际上也是一种卷积操作,与卷积用相同的代码。
实际运用中,首先计算上采样的倍率( 输 出 尺 寸 输 入 尺 寸 \dfrac{输出尺寸}{输入尺寸} 输入尺寸输出尺寸)。再根据步长的大小和边界补充的方式对初始输入进行变换。然后使用与卷积一样的方法进行参数学习。
在CNN中,是某一层输出结果的一个元素对应的输入层的一个映射,即特征平面上的一个点所对应的输入图像上的区域。
如果一个神经元的大小受到上层 N × N N \times N N×N的神经元区域的影响,那么就说该神经元的感受野是 N × N N \times N N×N,因为其反应了 N × N N \times N N×N区域的信息。
1.步长不为1的卷积;
2.直接采样。
1.使特征平面变小,简化网络计算复杂度;
2.提取主要特征。
Average Pooling、Max Pooling。
前后层神经元大部分采用局部连接的方式。
思想来源:生理学的感受野机制 和 图像的局部统计特性
同一个特征平面中的权值共享。
可以使图像局部区域学习到的信息可以应用到其他区域,从而使同样的目标在不同的位置能提取到同样的特征。
空间关系的保留是CNN能提取鲁棒特征的基础
1.对ReLU函数负区域进行改进
2.研究不同激活策略对不同的网络层、不同的通道使用的影响
3.使用各类学习方法来对简单的组合进行探索
目前,ReLU函数仍然是最通用的。
原则:
理想的初始化:使各层的激活值和状态梯度的方差在传播过程中保持一致
不利于优化
可以用高斯分布
参数的初始值不能太小:较小的参数在传播时会导致过小的梯度产生,对于深层网络而言,会产生梯度弥散。
参数的初始值不能太大:造成振荡,也会使Sigmoid进入梯度饱和区。
定义:归一化是指将数据约束到固定的分布范围 。
通常BN层在卷积层之后,用于重新调整数据分布。
ensp 每个批次的均值: u B = 1 n ∑ i = 1 n x i u_B = \dfrac{1}{n} \sum^n_{i=1} x_i uB=n1∑i=1nxi
每个批次的方差:$\delta^2_B = \dfrac{1}{n} \sum^n_{i=1} (x_i-u_B)^2 $
对每个元素进行归一化: x i ′ = x i − u B δ B 2 + ε x^{'}_i = \dfrac{x_i-u_B}{\sqrt{\delta^2_B+\varepsilon}} xi′=δB2+εxi−uB
尺度缩放和偏移: y i = γ i × x i ′ + β i y_i = \gamma_i \times x^{'}_i + \beta_i yi=γi×xi′+βi, 其中, γ \gamma γ和 β \beta β代表输入数据分布的方差和偏移。
CNN的各个特征维度(通道)之间,是分别进行BN计算的。
BN的好处:1.减轻了对初始值的依赖 2.训练更快,可以使用更高的学习速率
BN的缺点:依赖Batch的大小,当Batch值很小时,计算的均值和方差不稳定。故不适合于1.Batch非常小 2.深度不固定的模型,如RNN
BN用每个Batch来代替整体训练集的均值和方差,这要求Batch必须从各类中均匀采样,当Batch值较小时很难满足这一要求。
而Batch Renormalization就可以解决这个问题。
将BN中的对应公式改:
x i ′ = x i − u B δ β . r + d x^{'}_i = \dfrac{x_i- u_B}{\delta_{\beta}}. r + d xi′=δβxi−uB.r+d
其中 r = δ β δ r=\dfrac{\delta_\beta}{\delta} r=δδβ, d = u β − u δ d=\dfrac{u_\beta-u}{\delta} d=δuβ−u
其中 u : = u + α ( u β − u ) u:=u+\alpha(u_\beta-u) u:=u+α(uβ−u), δ : = δ + α ( u β − δ ) \delta:=\delta+\alpha(u_\beta-\delta) δ:=δ+α(uβ−δ)
实际使用中,先使用BN将网络训练到一个相对稳定的移动平均值,再使用Batch Renormalization训练。
正在研究中
作用:在一定程度上增加了平移不变性
对深层的网络并没有起到太大的作用,真正有用的是数据增强操作。
越在训练后期,学习率越小,有助于收敛的稳定
验证误差不再增大后,提前结束训练
充分利用训练数据集的策略:1.将全部训练数据一起训练固定的迭代次数 2.迭代训练流程,直到训练误差小于提前停止策略设置的验证误差。