1.sofamx 公式:
2. GAT里的sofamax函数的实现:
1.
因为指数在x轴正轴爆炸式地快速增长,如果zi比较大,exp(zi)也会非常大,得到的数值可能会溢出。溢出又分为下溢出(Underflow)和上溢出(Overflow)。计算机用一定长度的二进制表示数值,数值又被称为浮点数。当数值过小的时候,被四舍五入为0,这就是下溢出;当数值过大,超出了最大界限,就是上溢出。
一个简单的办法是,先求得输入向量的最大值,然后所有向量都减去这个最大值:
2.问题是:一组数直接求softmax,和这组数取出最大值后,每个数逐个减去最大值然后求softmax的结果是一样吗?
3.
#下面就是GATConv中softmax的实现,就是这种防止计算上溢的实现方式
N = maybe_num_nodes(index, num_nodes)
src_max = scatter(src, index, dim, dim_size=N, reduce='max')
src_max = src_max.index_select(dim, index)
out = (src - src_max).exp()
out_sum = scatter(out, index, dim, dim_size=N, reduce='sum')
out_sum = out_sum.index_select(dim, index)
参考:
三分钟读懂Softmax函数 - 知乎 (zhihu.com)