随便想的,主要好理解一些吧?
普通的变量占比
假设我们班总共十个人,第
i
i
i 人身上有
m
i
m_i
mi元,我想知道每个人身上的钱占总钱数的比例是多少,
那么设第
i
i
i 个人money占的比例为
P
i
P_i
Pi
则有
p
i
=
m
i
∑
j
=
1
n
m
j
p_i = \frac{m_i}{\sum_{j=1}^{n} m_j}
pi=∑j=1nmjmi
这个东西可以很好的表现每个人的money占总体的比例
但是,这个比例是线性的,也就是 p i = k × m i , k = 1 ∑ j = 1 n m j p_i = k \times m_i, k = \frac{1}{\sum_{j=1}^{n} m_j} pi=k×mi,k=∑j=1nmj1
softmax(开始一本正经的扯淡)
如果我想通过这些数据知道我们班上不同人的富有情况,我肯定希望钱少的人占的比例尽量更小,有钱的人占的比例尽量更大(也就是能把量级的分化变得更明显),(反正我觉得我讲的听玄学的_滑稽)则此时,我们需要softmax函数
S
i
=
e
m
i
∑
j
=
1
k
e
m
j
S_i = \frac{e^{m_i}}{\sum_{j=1}^{k} e^{m_j}}
Si=∑j=1kemjemi
也就是在每个元素变成了其的e次方,根据指数的爆炸性增长,我们可以想象一下……
比如当m为[1, 2, 3]时(小数据)
用普通的比例求出来P为[0.166667, 0.333333, 0.500000]
用softmax求出来的P为 .[0.090031, 0.244728, 0.665241]
明显(个P),用softmax计算出来,我们能更肯定,1号同学是个穷X,更应该抱住3号同学的大腿 (雾~~)
然后因为引入了指数级别运算,写代码很容易爆炸,也就是溢出,所以这里将每个元素减去他们的最大值,这样所有元素都小于0,而且函数值不会变:
l a r g e s t = m a x ( r 1 , r 2 , . . . , r n ) largest = max (r_1,r_2,...,r_n) largest=max(r1,r2,...,rn)
S i = e r i ∑ j = 1 k e r j S_i = \frac{e_{r_i}}{\sum_{j=1}^{k} e^{r_j}} Si=∑j=1kerjeri
= e − l a r g e s t × e r i e − l a r g e s t × ∑ j = 1 k e r j = \frac{e^{-largest} \times e_{r_i}}{e^{-largest} \times \sum_{j=1}^{k} e^{r_j}} =e−largest×∑j=1kerje−largest×eri
= e r i − l a r g e s t ∑ j = 1 k e r j − l a r g e s t = \frac{e_{r_i - largest}}{\sum_{j=1}^{k} e^{r_j - largest}} =∑j=1kerj−largesteri−largest
所以,现在就这么多吧,softmax设计的初衷,是希望特征对概率的影响是乘性的。然后这个东西还有很多优点啊比如避免了0分母之类的等等……
————————————————————补充————————————————————
softmax,其中的soft和max,可以牵强的理解为软化的max,这个函数有max的趋势,也就是让其中大的更大,小的更小,这样可以更好的激励学习(效率更高),在知乎上看到一个很生动的举例:
好比考试错了,老师轻轻骂你两句,或换成softmax两巴掌扇上去,你说那个学习效率高?