这篇论文是比较早的工作了,但论文中提到 Deep Supervision 的概念在后面的工作中常会被提到。这篇论文的亮点就在于对每一隐层都引入 companion objective。简单说来就是每一个隐层都会后接一个分类器,去检验(监督)每一个隐层抽取出的特征的效果,这也是为什么标题叫 deeply-supervised。
如果先不看论文后面的部分,只看这么一个 idea,就会有一些疑问:
每个隐层都接一个分类器,整个模型怎么训练?目标函数怎么定义?反向传播怎么做?对每个隐层的分类器做优化,不会影响模型最后分类器的效果吗?这几个问题也是作者论文主体部分要去阐述和讨论的。
作者一开始总结了当时 DL 存在的一些问题,当然这些问题目前依旧还是存在的,比如中间层在训练时的不透明、训练时出现梯度爆炸/消失的问题、缺乏数学理论的理解、模型训练依赖于大量的数据、需要人工调参等。而作者的工作一定程度的缓解或解决了上述的一些问题。
对于这么一个新奇的结构,作者的动机是什么?通常,我们在做数据挖掘时,有一个很关键的步骤就是特征工程,因为特征决定了模型效果的上限。使用 highly discriminative 的特征去训练一个模型,其效果会优于使用了 less discriminative 的特征。基于这个观察(特征好,模型就好),在DL模型中,我们自然希望模型的隐层能提取出好的特征。
于是就有一个问题,如何促使隐层提取出好的特征,又如何去评估隐层提取出的特征的好坏。一个很简单的思路,“是驴是马,拉出来溜溜不就知道了嘛”,给每个隐层抽取的特征后面接一个分类器看看效果,不就知道提取出来的特征是好是坏了嘛。基于这么一个想法,作者就提出了给每一个隐层后面接上一个分类器,通过这个分类器的效果来评估隐层提取出的特征的质量,利用这个反馈来优化隐层,进而使得整体模型的效果得到提升。
这个想法不要太香。那么就看看前面提到的一个疑问,模型的目标函数怎么定义,怎么做反向传播训练。首先是常规的每一层卷积操作的定义: Z ( m ) = f ( Q ( m ) ) , a n d Z ( 0 ) = X , Q ( m ) = W ( m ) ∗ Z ( m − 1 ) Z^{(m)} = f(Q^{(m)}), \quad and \quad Z^{(0)} = X, \\ \ \\ Q^{(m)} = W^{(m)} * Z^{(m-1)} Z(m)=f(Q(m)),andZ(0)=X, Q(m)=W(m)∗Z(m−1) 其中 M M M 表示模型总的层数: W ( m ) , m = 1... M W^{(m)},m=1...M W(m),m=1...M 为每一层需要学习的参数权重; Z ( m − 1 ) Z^{(m - 1)} Z(m−1) 为 m − 1 m - 1 m−1 层产生的 feature map; Q ( m ) Q^{(m)} Q(m) 为前面的 feature map的convolved response; f ( ⋅ ) f(\cdot) f(⋅) 为作用在 Q Q Q 上的 pooling 函数;结合所有层的参数为: W = ( W ( 1 ) , . . . , W ( M ) ) W = (W^{(1)},...,W^{(M)}) W=(W(1),...,W(M)) 而对于每一个隐层中后接的分类器(SVM或者softmax)的参数为: w = ( w ( 1 ) , . . . , w ( M − 1 ) ) w = (w^{(1)},...,w^{(M-1)}) w=(w(1),...,w(M−1)) 这样,可以定义模型的目标函数为: ∥ w ( o u t ) ∥ 2 + L ( W , w ( o u t ) ) + ∑ m = 1 M − 1 α m [ ∥ w ( m ) ∥ 2 + l ( W , w ( m ) ) − γ ] + \| w^{(out)}\|^2 + \mathcal{L}(W,w^{(out)}) + \sum_{m=1}^{M-1} \alpha_m [\| w^{(m)}\|^2 + \mathcal{l}(W,w^{(m)})-\gamma]_+ ∥w(out)∥2+L(W,w(out))+m=1∑M−1αm[∥w(m)∥2+l(W,w(m))−γ]+ 其中 L ( W , w ( o u t ) ) = ∑ y k ≠ y [ 1 − < w ( o u t ) , ϕ ( Z ( M ) , y ) − ϕ ( Z ( M ) , y k ) > ] + 2 l ( W , w ( m ) ) = ∑ y k ≠ y [ 1 − < w ( m ) , ϕ ( Z ( m ) , y ) − ϕ ( Z ( m ) , y k ) > ] + 2 \mathcal{L}(W,w^{(out)}) = \sum_{y_k \neq y}{[1 - <w^{(out)},\phi(Z^{(M)},y)-\phi(Z^{(M)},y_k)>]^2_+} \\ \ \\ \mathcal{l}(W,w^{(m)}) = \sum_{y_k \neq y}{[1 - <w^{(m)},\phi(Z^{(m)},y)-\phi(Z^{(m)},y_k)>]^2_+} L(W,w(out))=yk=y∑[1−<w(out),ϕ(Z(M),y)−ϕ(Z(M),yk)>]+2 l(W,w(m))=yk=y∑[1−<w(m),ϕ(Z(m),y)−ϕ(Z(m),yk)>]+2 L ( W , w ( o u t ) ) \mathcal{L}(W,w^{(out)}) L(W,w(out)) 被称为是 overall loss,而 l ( W , w ( m ) ) \mathcal{l}(W,w^{(m)}) l(W,w(m)) 则是对于每个隐层而言的 companion loss。因为模型中的分类器采用的是 SVM(也可以采用 Softmax),所以这里定义的 loss是 squared hinge loss。
可以把上面的目标函数分成两个部分来看,前面一部分是 L ( W , w ( o u t ) ) \mathcal{L}(W,w^{(out)}) L(W,w(out)) ,这个是模型的最后一层的分类器的 loss function,而后半部分,是对每一层隐层中分类器的 loss function ∥ w ( m ) ∥ 2 + l ( W , w ( m ) ) \|w^{(m)}\|^2 + \mathcal{l}(W,w^{(m)}) ∥w(m)∥2+l(W,w(m)) 求和。这样一来,目标函数的定义就清楚了,就是将最终分类器的目标函数和每个隐层分类器的目标函数做一个结合,一起做优化。有了目标函数,反向传播训练就可以实现了。
一开始的疑问还有一个没有解决,就是上面定义的目标函数,在优化过程中,不会被后半部分的优化带跑偏,陷入一个隐层效果的最优而不是最终模型效果的最优吗?其实,这一点在作者设计目标函数的时候已经避免了。可以看到目标函数中的 γ \gamma γ ,它作为一个阈值是一个超参数。它的作用是当某个隐层的loss 下降到阈值 γ \gamma γ 时,这个 loss function就不再其作用了(loss 为 0,不会对总的loss有影响),也就意味着在做反向传播时,这一部分的 loss function 的梯度将为0,将不会加入到其 loss function 中涉及的参数的更新。
另外, α m \alpha_{m} αm 起到的作用是平衡着最终模型的loss 和每个隐层的 loss 对于整体目标函数的作用,而且对于这个 α m \alpha_{m} αm,作者是采用了一个衰减函数 α m × 0.1 × ( 1 − t / N ) → α m \alpha_m \times 0.1 \times (1 - t / N) \rightarrow \alpha_m αm×0.1×(1−t/N)→αm 去更新 α \alpha α,也就意味着随着训练的推进,后半部分的影响将会越来越小。
有了 α m \alpha_m αm 和 γ \gamma γ,就可以避免模型在优化过程中被后半部分带偏,而使得最终模型的效果不好。而此时后半部分的目标函数更像是整体目标函数的正则项,考虑的是在保证整体目标函数最优的情况下,还要一定程度满足后半部分目标函数的较优,也就是一种限制,而这种限制的目的是使得隐层能提取出较好的特征。也正是这种限制,使得模型具备了一定的泛化能力。
这样的模型设计,另外的优点在于一定程度上缓解了梯度消失/爆炸的问题。因为从现在的目标函数来看,在做反向传播的时候,梯度的计算不仅来自于最后一层输出的目标函数,而且还来自每个隐层输出的目标函数,这样使得模型中的每个参数的梯度一部分都能直接得到(隐层中的目标函数的梯度计算),这样也就一定程度的缓解了梯度消失/爆炸的问题。另外,论文后面的数学证明也得出了这样的模型能加快模型优化时的收敛速度。
在实验中,作者比较了几个模型在同一数据集下不同样本数的表现,可以发现 DSN 能在样本数较少的情况下得到和其他几个模型使用较多样本数一样的效果。另外,实验中也发现该模型能一定程度的缓解overfitting的问题,也证明了模型具备一定的泛化能力。
总的看来,这篇论文中的模型好像对前面提到的当时 DL 存在的问题都有一定程度的缓解。中间层的不透明,通过对每个隐层加一个分类器来看隐层提出的特征的好坏;训练时候出现的梯度爆炸/消失问题,也得到了一定程度的缓解;论文后面的数学证明也提供了数学上的理解;实验中发现模型能在样本较少的情况下获得不错的效果。
而显而易见的是,这样的模型结构是无法直接推广到 deep network 上的,因为对每个隐层都接一个分类器,训练的效率无疑是非常低的,这也就有了后面的工作对其进行改进。
总的看来,deep supervision 的思路是新颖的。