返回介绍

CNN-反卷积(1)

发布于 2025-02-25 23:04:59 字数 2837 浏览 0 评论 0 收藏 0

关于 CNN 的内容已经说了很多,虽然我们无法把这个长得像黑盒的东西完全摸清楚,但是我们多多少少也对它的外部结构有了一定的了解。下面我们来看看大神们对进一步探究 CNN 内部世界所做的工作。

这部分工作有一个响亮的 Title,那就是,CNN 的网络到底学到了什么?

对于浅层网络,尤其是一层网络,上面这个问题非常好回答。我们知道模型输入的特征和分布,我们也知道输出的特征和分布(这里特指监督学习),那么模型的目标就是把输入空间的数据映射到输出空间,而且映射的结果是正确的。如果我们把浅层网络替换成深层网络,还把它当作一个不可分割的整体,那么它的目标和浅层网络是完全一致的。

但问题是,我们并没有把深层网络当成浅层网络,因为深度学习涉及了浅层网络学习时代的两个部分 - 构建特征和从特征到结果。所以我们心里一定在想,这么多层,哪些层是在构建特征,哪些层是在把特征转换到结果?在 CNN 网络模型发展的初期,人们倾向于把这个分界点设立在卷积层和全连接层的交界处 - 卷积层负责收集特征信息,全连接层和早年的神经网络一样,只负责特征的处理。

如果你接受了这样的概念,那么我们下一个问题就来了。卷积层是如何把一张图片或者其他的东西转换成了特征,这些特征是如何表达我们的图片呢?这还是一个没有解决的问题。

于是很多大神开始了各种尝试,其中一种尝试就是反卷积操作。

反卷积

反卷积是什么?是一个新概念呢?其实不是。其实在 CNN 中 Deconvolution 的计算和图像的反卷积操作还是有一点不同,这种 Deconvolution 是将 Convolution 的方向反过来 - 没错,前向变后向,后向变前向。实际上关于它的名称还有很多,像 back convolution, transpose convolution 等。我个人比较喜欢 back convolution。关于前向后向的计算可以参考我们前面对于卷积层的计算推导,这里就不再多说了。那么我们就从这个角度去看看反卷积究竟做了什么。

想知道反卷积的前向操作做了什么,我们可以去看卷积的后向操作做了什么。卷积的后向操作是为了计算卷积层的 Loss 对参数和输入的梯度,那么梯度是什么含义?负梯度表示了函数下降最快的方向,为了使函数值(也就是 Loss)尽可能地小,我们希望梯度尽可能地小。但是如果某个参数的梯度非常大,能说明什么呢?说明当前函数参数的变动对函数造成的影响非常大。

举个例子,比方说有这样一个函数y=w_1*x_1+w_2*x_2,y 最终还要经过计算得到最终的 loss,那么我们计算这个函数的梯度:

\frac{\partial Loss}{\partial x_1}=\frac{\partial Loss}{\partial y}*w_1
\frac{\partial Loss}{\partial x_2}=\frac{\partial Loss}{\partial y}*w_2
\frac{\partial Loss}{\partial w_1}=\frac{\partial Loss}{\partial y}*x_1
\frac{\partial Loss}{\partial w_2}=\frac{\partial Loss}{\partial y}*x_2

如果 w1 非常大而 w2 非常小,那么 x1 的梯度就会远大于 x2,如果 x1 做点小改动,它会对最终结果产生比较大的影响;而 x2 做点小改动,对应的影响就没有那么严重了;

如果 x1 非常大而 x2 非常小,那么 w1 的梯度就会远大雨 w2,如果 w1 做点小改动,它会对最终结果产生比较大的影响;而 w2 做点小改动,对应的影响就没有那么严重了;

那么我们可以想想看,对结果产生较大影响以为着什么?对于一个人脸识别系统,上面公式中那些对结果影响比较大的因子往往对应着人脸中富有关键特征的地方,因为如果这些地方发生了变化,我们识别这个人的关键信息就变动了,换言之 - 我们就有可能认错人。

而对于那些对结果影响较小的因子,往往对应着一些不太重要的地方,比方说背景 - 不论你变成蓝色,红色,白色,我都能认出这个人。

所以我们可以得出一个推论,那就是梯度大的因子是当前这个这套模型和数据组成的整体的关键!对于 w,它就是当前输入数据的关键参数,对于 x,他就是当前模型参数的关键输入!

所以,如果我们能够找到对于某一个模型某一特定输入下梯度比较大的输入因子和参数因子,我们就能知道输入的哪些部分是模型最关心的,而模型的哪些部分是输入最关心的。

一般来说,由于输入的图像大多具备一定的可视性,所以我们观察“输入的哪些部分是模型最关心的”是相对容易的。

那么我们就可以开始我们的实验了,其实并不需要真的构建一个反卷积层,我们理论上只要把数据从前向传一遍,后向传一遍,然后分析 Loss 对输入的梯度,找出梯度最大的像素点,就是模型最关心的地方。这样是不是就可以完成任务?

理论上是这样的,那么下一回我们看看具体的实现。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文