日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

GELU函数的近似

發(fā)布時(shí)間:2023/12/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GELU函数的近似 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、背景

GELU(Gaussian Error Linear Unit)函數(shù)的定義為

其中

考慮高斯誤差函數(shù)

通過(guò)令得

由于高斯誤差函數(shù)里面涉及了指數(shù)運(yùn)算和積分運(yùn)算,如何利用初等函數(shù)進(jìn)行擬合,對(duì)于提高運(yùn)算效率就顯得比較有意義了。

二、方法

高斯誤差函數(shù)的圖像為

from scipy.special import erf import numpy as np import matplotlib.pyplot as plt fig, ax = plt.subplots()ax.spines['right'].set_visible(False) ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.spines['bottom'].set_position(('data',0)) ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data',0))x=np.linspace(-5,5,100) y=erf(x)plt.plot(x,y) plt.title('graph of erf function') plt.show()

可以驗(yàn)證erf(x)為奇函數(shù),首先想到的是利用tanh(x)做近似。可以考慮兩種擬合方式,局部擬合和全局?jǐn)M合。全局?jǐn)M合也就是數(shù)學(xué)里面的一致性問(wèn)題。這里只考慮利用對(duì)erf(x)進(jìn)行擬合。

局部擬合

局部擬合考慮利用泰勒展開(kāi),擬合前幾項(xiàng)的系數(shù)

求解得到

此時(shí),擬合的函數(shù)為

import numpy as np import matplotlib.pyplot as plt a=np.sqrt(2/np.pi) b=(4-np.pi)/(3*np.sqrt(2)*np.pi**(3/2)) b1=(4-np.pi)/(6*np.pi)x=np.linspace(-5,5,100) #y=erf(x) def gelu(x):return 1/2*x*(1+erf(x/np.sqrt(2))) def gelu_pro1(x):return 1/2*x*(1+np.tanh(np.sqrt(2/np.pi)*(x+b1*x**3)))fig, ax = plt.subplots() ax.spines['right'].set_visible(False) ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.spines['bottom'].set_position(('data',0)) ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data',0))plt.plot(x,gelu(x)) plt.plot(x,gelu_pro1(x),'r-') plt.legend(['gelu','gelu_pro']) plt.title('performance of the approximate') plt.show()

全局?jǐn)M合

考慮到中的求解能夠保證對(duì)GELU的一階近似,這里我們先固定a,然后對(duì)b進(jìn)行求解。即

import numpy as np from scipy.special import erf from scipy.optimize import minimizea=np.sqrt(2/np.pi)def f(x,b):return np.abs(erf(x/np.sqrt(2))-np.tanh(a*x+b*x**3))def g(b):return np.max([f(x,b) for x in np.arange(0,4,0.001)])options={'xtol':1e-10,'ftol':1e-10,'maxiter':100000} result=minimize(g,0,method='Powell',options=options) print(result.x)


???????

總結(jié)

以上是生活随笔為你收集整理的GELU函数的近似的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。