很早之前就想把深度学习领域中一些专有名词的意思整理记录下来,但是迟迟没有动手。今天,下定决心做这件事,不打算填坑了,遇到什么就记录什么吧。
- 知识蒸馏(Knowledge Distillation)
知识蒸馏就是想利用一个复杂的,精度高的网络(教师网络),来训练一个简单的网络(学生网络),使得学生网络用比较简单的网络结构,同样能够达到教师网络的效果,相当于对知识进行了提取和蒸馏过程。训练过程中,损失函数通常包括软约束和硬约束,软约束就是教师网络的输出与学生网络输出之间的差异,硬约束就是groundtruth和学生网络输出之间的差异,最后对这两个损失做加权求和。
相关论文:《Distilling the Knowledge in a Neural Network》
参考博客:https://blog.csdn.net/nature553863/article/details/80568658 - 深度分离卷积(Depthwise Separable Convolutions)
对于普通的卷积操作,假设输入图像为3通道,输出通道为5,卷积核大小为3 * 3,则在卷积过程中,会有5个不同的卷积核,每个卷积核都包含三个通道,对应输入图像的三通道,对于每个卷积核,三个通道卷积的结果求和得到通道数为一的输出,五个卷积核共得到五个通道数为一的输出,组合成通道数为五的输出。其中涉及的参数数量为3 * 3 * 3 * 5 = 135。对于深度分离卷积,则是先用3个3 * 3的卷积核对输入图像进行卷积,每一个卷积核对应一个通道,输出的结果并不累加起来。这一步是在通道维度上进行卷积,下一步则使用1 * 1的卷积核在像素维度上进行卷积。具体来说,是用5个卷积核,每个卷积核同样包含三个通道,但卷积核的大小为1 * 1,对刚刚通道维度卷积得到的三通道特征图进行普通卷积操作,得到五个通道的输出。这种方法涉及的参数数量为 3 * 3 *3 + 3 * 1 * 1 *5 = 52,大大缩小了参数数量。
相关论文:《Xception: Deep Learning with Depthwise Separable Convolutions》
参考博客:https://blog.csdn.net/tintinetmilou/article/details/81607721 - 可变型卷积(Deformable Convolution)
普通卷积核是一个紧密的N* N矩阵形式,只能对连续的,临近的部分像素进行卷积,而可变型卷积理论上能够对整幅图片上任意位置上的像素进行卷积。与普通的卷积相比,可变型卷积增加了一个“偏移”(offset)分支,这个分支的输出通道是输入通道的两倍,分别表示每个像素点在X,Y方向上的偏移量,假设 X i j c X_{ij}^c Xijc表示通道 c c c上的坐标为 ( i , j ) (i,j) (i,j)点处的特征值,经过偏移分支得到的X,Y方向上的偏移量分别是1和2,则原本坐标 ( i , j ) (i,j) (i,j)处的特征值就要替换为 ( i + 1 , j + 2 ) (i+1,j+2) (i+1,j+2)处的特征值。也就是说虽然在空间位置上两个像素是相邻的,但是由于每个点处的偏移都不同,经过偏移后,相邻像素点上的特征值就不再是之前的特征值了。当然由于偏移量通常是一个浮点数,因此要借助双线性插值来计算偏移后的特征值。假设偏移量为(0.5,1.2),则需要根据 ( f l o o r ( i − 0.5 ) , f l o o r ( j − 1.2 ) ) , ( f l o o r ( i − 0.5 ) , c e i l ( j − 1.2 ) ) , ( c e i l ( i − 0.5 ) , f l o o r ( j − 1.2 ) ) , ( c e i l ( i − 0.5 ) , c e i l ( j − 1.2 ) ) (floor(i-0.5),floor(j-1.2)),(floor(i-0.5),ceil(j-1.2)),(ceil(i-0.5),floor(j-1.2)),(ceil(i-0.5),ceil(j-1.2)) (floor(i−0.5),floor(j−1.2)),(floor(i−0.5),ceil(j−1.2)),(ceil(i−0.5),floor(j−1.2)),(ceil(i−0.5),ceil(j−1.2))四个点上的特征值进行双线性插值计算 X i + 0.5 , j + 1.2 c X_{i+0.5,j+1.2}^c Xi+0.5,j+1.2c处的特征值。
相关论文:《Deformable Convolutional Networks》
参考博客:https://blog.csdn.net/yeler082/article/details/78370795 - 自注意力机制(Self-attention Machinism)
自注意力机制最早是应用于自然语言处理任务中的,当机器在理解一句话时,通常要结合上下文信息进行推理,而普通的CNN只能捕捉到相邻的局部区域内的信息,而RNN也只能结合当前时刻及之前时刻输入的信息,而不能捕捉后来时刻输入的信息,因此就希望通过一种方式能够捕捉到上下文中所有与当前输入相关的信息。反映到计算机视觉领域中,就是在一幅图像中和当前像素点相关的像素,可能不仅仅在当前像素点周围,可能分布在整幅图像中。因此就需要找到当前像素点和其他所有像素点之间的相关性,并以相关性作为一种权重,对所有的像素点进行加权求和,得到当前像素点上的注意力值。最早提出自注意力机制的论文中使用了一个三元组 ( K e y , Q u e r y , V a l u e ) (Key, Query,Value) (Key,Query,Value)来实现自注意力机制,计算过程可以参考下图
忽略掉前面 X + P X+P X+P的过程,假设我们经过特征提取网络得到了特征图 X X X,分别经过两个卷积神经网络得到 f k e y ( X ) f_{key}(X) fkey(X)和 f q u e r y ( X ) f_{query}(X) fquery(X),经过变形得到一维特征向量 K K K和 Q Q Q(实际中不会只有一个向量,而是和特征图的通道数相同)。然后计算 K Q T KQ^T KQT,并经过softmax层后得到注意力图 W W W(也可以理解为权重图)。另一方面输入 X X X经过另一个卷积神经网络得到对应的 ϕ ( X ) \phi(X) ϕ(X),并经过变形得到 V V V,将 V V V与权重图 W W W相乘,在经过变形恢复尺寸就得到了自注意力模块的输出 C C C。由上述过程可以看到 K K K和 Q Q Q的相乘过程就是在计算特征图中任意两个像素点之间的相关性,在经过softmax层后,把相关性转化成规范化的权重值,权重值越大表示这个点需要更多注意。最后将 V V V与 W W W相乘则是把所有像素点乘以对应的权重值,再求和的过程。此时 C C C中每个像素点上其实都包含了全局所有像素点的相关信息。
相关论文:《A structured Self-Attentive Sentence Embedding》
参考博客:https://www.jiqizhixin.com/articles/100902
https://zhuanlan.zhihu.com/p/58936313?utm_source=wechat_session - Tied分块卷积(Tied Block Convolution)
TBC是一种新型的卷积模块,其结构非常简单,却能够提升多个backbone的效果,并且能够有效降低参数数量和计算量。首先标准卷积过程 X ~ = X ∗ W \tilde{X}=X*W X~=X∗W,参数数量为 c i × c o × k × k c_i \times c_o\times k\times k ci×co×k×k,其中 c i c_i ci表示输入通道数, c o c_o co表示输出通道数, k k k表示卷积核尺寸,该过程如下图所示(图中展示了两个全尺寸的卷积核,输出通道为1)
而分组卷积则是将输入通道分成了 G G G个组,对每个组用一个小的卷积核进行卷积,然后再把多个组的卷积结果级联起来, X ~ = X 1 ∗ W 1 ⊕ X 2 ∗ W 2 ⊕ . . . X G ∗ W G \tilde{X}=X_1*W_1 \oplus X_2*W_2 \oplus...X_G*W_G X~=X1∗W1⊕X2∗W2⊕...XG∗WG,其中 ⊕ \oplus ⊕表示级联过程,参数数量为 G × c i G × c o G × k × k G\times \frac{c_i}{G}\times \frac{c_o}{G}\times k\times k G×Gci×Gco×k×k,因为虽然每个卷积核的通道数都减少了 G G G倍,但因为有 G G G个不同的卷积核,所以参数数量还要乘以 G G G,该过程如下图所示
Tied分块卷积同样是把输入通道分成 B B B个块,与分组卷积不同的是,每个块的卷积核是相同的、复用的, X ~ = X 1 ∗ W ′ ⊕ X 2 ∗ W ′ ⊕ . . . X B ∗ W ′ \tilde{X}=X_1*W' \oplus X_2*W' \oplus...X_B*W' X~=X1∗W′⊕X2∗W′⊕...XB∗W′,这样参数数量即为 c i B × c o B × k × k \frac{c_i}{B}\times \frac{c_o}{B}\times k\times k Bci×Bco×k×k,该过程如下图所示
这样做的原因是,作者发现在深层的卷积神经网络中,随着网络的加深,卷积核各个通道之间的相关性也越来越强,也就是每个通道都很相似,于是作者想到既然都差不多干嘛不去复用他呢?这样不就省掉很多参数量吗?于是TBC就出现了,作者还把他与ResNet,ResNeXT,ResNeST,SENet等多种backbone网络进行结合(取代原本的普通卷积或分组卷积),都取得了不错的效果。
相关论文:《Tied Block Convolution: Leaner and Better CNNs with Shared Thinner Filters》
参考博客:https://my.oschina.net/u/3776677/blog/4666845