【翻譯】Brian2高級指導_狀態更新

在Brian中,狀態更新器將一系列方程轉換成抽象更新代碼(因此自動目標獨立)。總結而言,任何使用Equations對象並返回抽象代碼(以字元串形式)的函數都可用作狀態更新器並作為method參數傳遞給NeuronGroup構造函數。

更常見的用法是根本不說明狀態更新器或通過名字選擇,見下面的狀態更新器的選擇。

顯式狀態更新

顯式更新方案可使用ExplictStateUpdater類用數學符號說明。狀態更新器方案包含一些列變數,定義臨時變數和最終行(以x_new = 開始),給出了狀態變數的更新值。其描述可引用t(當前時間),dt(時間間隔大小),x(狀態變數值)和f(x, t)(狀態變數x的定義,假設dx/dt = f(x, t))。此外,狀支持隨機方程的態更新器使用還dw(方差為dt的正態分布隨機數)和g(x, t),其因子乘上雜訊變數,假設dx/dt = f(x, t) + g(x, t)*xi。

使用這種說明法,簡單正向歐拉積分可說明為:

x_new = x + dt * f(x, t)

龍格庫塔(Runge-Kutta)2(中點)方法說明為:

k = dt * f(x,t)x_new = x + dt * f(x + k/2, t + dt/2)

當使用ExplictStateUpdater創建新的狀態更新器時,你可以說明stochastic關鍵字變數,決定該狀態更新器是否支持隨機方程(默認為None),只添加雜訊的隨機方程(additive),任意隨機方程(multiplicative)。

提供的狀態更新器使用隨機方程的Stratonovich解釋(如果白雜訊源被認為是一個短時間常數的有色雜訊源的極限,這是正確的解釋)。因此,簡單的Euler-Maruyama方法(x_new = x + dt*f(x, t)+dw*g(x, t))僅可用於添加的雜訊。

一個處理任意乘性雜訊(Stratomovich解釋下)通用狀態更新器的例子是無導數Milstein方法:

x_support = x + dt*f(x, t) + dt**.5 * g(x, t)g_support = g(x_support, t)k = 1/(2*dt**.5)*(g_support - g(x, t))*(dW**2)x_new = x + dt*f(x,t) + g(x, t) * dW + k

注意這些描述中每行分別只允許提及一次g(x, t)和f(x, t)(你也不允許寫成g(f(x, t), t)這樣的形式)。你可以通過使用中間步驟,定義臨時變數來繞過這些限制,就像上面milstein和rk2的例子。

狀態更新器的選擇

如一開始提到的那樣,只要調用將Equation對象轉換成抽象代碼,你就可以將任意調用傳遞給NeuronGroup的方法變數。然而添加新的狀態更新器的最好的方法是用Brian註冊它並提供一個決定其是否適合給定的方程組的方法。這樣,當沒有說明方法時它可以自動選擇且能用名字引用(也就是你把像eular一樣的字元串傳遞給方法變數而不是導入eular並向對象本身傳遞一個引用)。

如果你用ExplictStateUpdater類創建了一個新的狀態更新器,必須說明其支持哪種隨機方程。關鍵字參數stochastic可採用None(不支持隨機方程,默認值),additive(支持有添加的雜訊的隨機方程),multiplicative(支持任意隨機方程)。

創建狀態更新器之後必須用StateUpdateMethod註冊:

new_state_updater = ExplicitStateUpdater(..., stochastic=additive)StateUpdateMethod.register(mymethod, new_state_updater)

寫一個新的狀態更新器(也就是不能用上面的顯式語法描述的狀態更新器)的首選方法是拓展StateUpdateMethod類(但這也不是絕對必要的,所有需要的是實現__call__方法的對象,該方法操作一個Equations對象和變數字典)。可選的,狀態更新器可用上面展示的StateUpdateMethod註冊。(譯者註:這句話讓我感覺很疑惑)

隱式狀態更新器

注意

下面所有內容僅用於將來的引用,現在還未實現。

隱式狀態更新器通常使用牛頓-拉普森法(Newton-Raphson) 或不動點迭代。這也可以用數學語法定義,但迭代器的數量是動態的因此不容易矢量化。然而這在C, GPU甚至Numba中不是個問題。

後向歐拉

後向歐拉定義如下:

x(t+dt)=x(t)+dt*f(x(t+dt),t+dt)

這不是個可執行的語法因為RHS取決於將來。一個實現不動點迭代的簡單方法是:

x(t+dt)=x(t)x(t+dt)=x(t)+dt*dx=f(x(t+dt),t+dt) until increment<tolerance

這包含了不同數量的迭代,迭代次數取決於神經元。


Brian 2 2.1.2 documentationbrian2.readthedocs.io


推薦閱讀:

TAG:深度學習DeepLearning | 機器學習 |