实际上就算swiglu的原作者也是炼丹炼出来的,所以我们只能马后炮解释一下。
首先考虑GLU的缺点。它用sigmoid做门控是个极其糟糕的选择,沾上了sigmoid的通病,即0和1处导数为0,这让门控没法通过训练达到彻底打开or关闭某个值的效果,且只能缩小不能放大。
再考虑swish。你要是看过swish和glu的公公式,你就会说这swish不就是glu的乞丐版嘛。swish单用时,缺点肯定与glu一样。
现在,我们把glu的sigmoid替换成了一个swish,你也可以理解为是glu里面塞了一个阉割版的glu,结果就是glu它自己把自己的问题解决了。你看swish的函数图像,首先它在0和1的位置有导数,好优化,门能关严(指0),还能大开门(指放大),这不就是完美的sigmoid上位替代品嘛。
有人要问为什么不能glu套glu。当然可以,但是肯定是算起来费时间,swish只需要一个超参数beta,剩下的计算大头只有sigmoid,而glu还有训练参数,一训练就又要陷入sigmoid的陷阱里了。既然swish还顶得住,那就先这么用着。