点击上方
“
小白学视觉
”,选择加"
星标
"或“
置顶
”
重磅干货,第一时间送达![](http://mmbiz.qpic.cn/mmbiz_jpg/ow6przZuPIENb0m5iawutIf90N2Ub3dcPuP2KXHJvaR1Fv2FnicTuOy3KcHuIEJbd9lUyOibeXqW8tEhoJGL98qOw/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1)
作者:TniL(知乎)
专业:复旦大学 计算机科学技术硕士在读
链接:
https://www.zhihu.com/question/359742335/answer/1835609656
首先看问题评论中提到是面试题,那首先排除一下label smoothing这种技巧。只探讨在一般nn框架内分类问题的标签如何表示的问题。
正好前不久看到
@冷比特er(悬
铃)
的一篇文章有涉及到类似的问题,讨论了对率回归中损失函数的两种形式:
逻辑回归损失函数的
两种形式
。
在二分类
中,标签可以表示为{0,1},有时也表示为{-1, 1}。
因此损失函数可以写成两种形式,
标签
时,损失写为
标签
时,损失写为
但实际上你将两种情况分类展开时就会发现二者是一模一样的:
这个例子告诉我们,
只要背后的理论是相同的,标签的表示对结果并不会产生任何影响
。把视角切换回多分类的问题中,为了贴合交叉熵的诠释,你常常看到使用一个one-hot向量表示一个标签代表的ground truth概率分布
,然后使用交叉熵来衡量nn模型输出的概率
与ground truth的差距:
假设第i个样本的类别对应的是第k个类,那这个交叉熵损失展开实际上变成一个很简单的形式
实际上可以
解读为最大化真实类别的对数似然
。看到这里你发现,
为什么非得one-hot编码呢?直接找出下标对应的预测值求负对数作为loss不香吗?这时你随手打开PyTorch的源码,看到
cross_entropy
的函数docstring如下:
Args: input (Tensor) : :math:`(N, C)` where `C = number of classes` or :math:`(N, C, H, W)`in case of 2D Loss, or :math:`(N, C, d_1, d_2, ..., d_K)` where :math:`K \geq 1`in the case of K-dimensional loss. target (Tensor) : :math:`(N)` where each value is :math:`0 \leq \text{targets}[i] \leq C-1`,or :math:`(N, d_1, d_2, ..., d_K)` where :math:`K \geq 1` for K-dimensional loss.
你才发现原来在主流深度学习框架里面,one-hot编码很可能压根就是个伪命题,例如PyTorch里面
target
是ground truth的下标而不是one-hot编码。而你的面试官还在考虑用二进制码表示标签来节省内存...
P.S. 即使需要one-hot标签表示,这种省内存的技巧多数时候都没有必要,标签存储基本不可能成为一个瓶颈,完全可以通过批处理节省内存。
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。