今天看vision transformer的程序,看到sigmoid激活函数,偶然想起几个月前跟师兄争论注意力机制中使用sigmoid函数的合理性,发现自己错了,老脸一红
关于这两种函数的介绍网上有很多,为了方便就不列公式了,只说当时没有搞清楚的一点:sigmoid和softmax都是对一个batch_size的数据进行归一化到(0, 1)(这里用归一化可能有误导性,重点在(0, 1)),这两者有什么区别?
sigmoid相当于一种投影,即将大小不一的一组数据的每个数都映射在0-1之间,将原来的大尺度的值转换为0-1之间这种小尺度的值,但个人感觉这样做有一个问题就是会改变激活前数据的分布,因为sigmoid是一种非线性函数,举个形象一点的例子,地图将空间信息等比例缩放在一张纸上,同一批数据样本间的相对性不发生改变,因为位置信息前后映射关系是线性关系,而sigmoid不具备这种条件(但是又考虑到神经网络自学的特性,再追究脑子就不够用了)。一个batch_size中的样本使用sigmoid激活之后的和不一定为1,而是每个值都在0-1之间。
对于softmax,他的作用通俗理解就是做归一化,将数据归一化到(0, 1)之间,这种函数也会改变数据的原始分布,并且一个batch_size的权重相加之和为1,意味着样本本身特性的体现会受到batch_size大小的影响,所以很多CV的文章都没有用softmax。
用python做一个小测试,体会下两种函数对数据分布改变的影响:
sigmoid:
softmax:
可以看到sigmoid相比softmax能够更大程度上保留数据的原始分布,除了个别的离散点之外,sigmoid对原来密集处的样本分布能够做到不错的还原,softmax显然就不行了。
ps:有没有大佬知道这方面的数学公式能给证明一下