方云團,周秋百
(江蘇大學計算機科學與通信工程學院,江蘇鎮(zhèn)江212013)
1987 年Eli Yablonovitch[1]和Sajeev John[2]分別在研究周期性光學結構時各自獨立地提出了光子晶體的概念。光子晶體是一種利用兩種或兩種以上不同介電常數的材料在空間中進行周期性排列形成的晶體結構[3]。光子晶體最顯著的特點就是光子帶隙[4](Photonic band gap,PBG)。光子晶體在TE模和TM模兩種偏振態(tài)下具有不同的能帶結構。TE 模帶隙和TM 模帶隙交疊部分稱為完全光子帶隙。雖然三維光子晶體在任意方向上都可存在光子帶隙,但其制造困難[5]。相對而言,二維光子晶體容易制造,有著廣泛的應用。對二維光子晶體傳輸特性的研究具有重要的理論意義和應用價值,對其研究的方法主要有平面波展開法[6](Plane wave expansion method,PWE)和時域有限差分法[7](Finite difference time domain method,FDTD)。近年來,隨著神經網絡的興起,Asano T[8]和Inampudi S[9]等人將神經網絡用于對光子晶體的研究。值得注意的是,Liu D[10]將利用神經網絡進行反向設計的思想引入到光子晶體的研究中。本文旨在講述完整的光子晶體神經網絡建模過程,以正方晶格為研究對象,利用平面波展開法來獲得數據集,然后訓練神經網絡(Neural network),最終實現用神經網絡來計算光子晶體的能帶。
選擇如圖1所示的晶胞結構,晶胞邊長為a,共計有4個自變量r1、r2、θ和d以及一個因變量歸一化頻率ω(2πc a),其中r1與r2為兩個介質圓柱的半徑、d為圓心距離、θ為兩圓心方向的方位角、c為光速。
圖1 晶胞結構
光子晶體的介電常量ε(r),考慮E極化電磁波,電場矢量只有一個z分量,電場E(r)的全矢量波方程可以被寫成:
根據布洛赫定理,E(r)在周期性晶胞中可以被寫成如下形式:
其中,Φ(r)隨著晶格周期發(fā)生周期性改變,K是布洛赫波矢。
考慮到研究問題的周期性,利用布洛赫定理可以將電場展開成平面波之和:
其中,G是倒格子空間描述周期性結構的的晶格矢量,E(K+G)是關于G的展開系數。
周期性介質中,介電常數可以展開成傅里葉級數[11]:
其中
在式(5)中,Au為晶胞的面積。
對第一布里淵區(qū)每一個波矢K建立關于E(K+G)的線性方程組:
該線性方程組可看作矩陣特征方程,由特征值求得模式頻率,得到光子晶體的能帶結構,從而獲得訓練神經網絡的樣本數據。在進行神經網絡訓練之前,需要檢查該模型是否能夠利用神經網絡得出結果,即需要滿足通用近似定理[12]:一個包含足夠多隱藏層神經元的多層前饋網絡,能以任意精度逼近任意預定的連續(xù)函數。該定理表明:a.可以設計一個神經網絡盡可能好地去“近似”某個特定函數,而不是說“準確”計算這個函數(我們通過增加隱藏層神經元的個數來提升近似的精度);b.被近似的函數必須是連續(xù)函數。如果函數是非連續(xù)的,也就是說有極陡跳躍的函數,那神經網絡就“愛莫能助”了。
將訓練集可視化得到圖2,沒有一對多或極陡跳躍的情況,因此該模型是可以用神經網絡來計算的。由圖2(a)可以得出參數d對最終結果的影響力有限,因此我們得到如圖3所示的神經網絡結構。由圖2(b),可以得出參數θ的變化會導致結果正弦變化;圖2(c)、(d)表明,r越大,頻率越大。
圖2 連續(xù)函數的驗證。
圖3 神經網絡的結構示意圖
本文中激活函數為S函數,(如圖4所示)。
圖4 Sigmoid函數
S函數只對絕對值小的輸入值敏感,因此在訓練之前需要對每一列進行歸一化,具體如式(7)所示:
其中x 為原始數據,m 為一列的最小值,M 為一列的最大值,y 為歸一化后的值,λ 為歸一化系數,取值0.8。對于λ 的取值,正常情況下選擇1,但在建模過程中我們發(fā)現取值為0.8 的時候會得到更優(yōu)解。歸一化之前需要得出最小值和最大值,以備反歸一化時使用。所有數據集中,80%作為訓練集,20%作為測試集,在數據集拆分之前,亂序是有必要的。
在本次示例中所使用的神經網絡算法是BP(Back-propagation)算法[13],分為前向傳播和后向傳播兩個部分,如圖5所示(相關符號請參照此圖)。
圖5 BP算法結構示意圖
前向傳播以輸入層到隱藏層為例。隱藏層神經元h1的輸入加權和為
隱藏層神經元h1的輸出:
其中F( x )是激活函數[14],本文中:
對式(10)求導,有F′( x )=F( x )( 1-F( x )),這使得用S函數作為激活函數的神經網絡比用其他函數的神經網絡學習速度快[14]。
反向傳播共計分為三個部分。
隱藏層到輸出層的反向傳播(M2與M3分別為隱藏層和輸出層的神經元個數):
將式(12)和(13)代入式(11)并對W2jk求偏導得:
ej是隱藏層節(jié)點中重組的向后傳播誤差:
利用對稱性,可以輕易得出輸入層到隱藏層的反向傳播(M1為輸入層的神經元個數):
權重更新(LR為學習率):
上面的公式沒有包含偏置項,是因為偏置項可以通過給每層加入一個恒為1 的輸入來消除,因此有偏置可以等價轉換成沒有偏置的問題,如圖3所示。
利用簡單的BP 算法,神經網絡已經可以訓練了,但仍然需要作細微調整。在式(17)和(18)中,有個參數LR,這個參數是無法從數據中學習估計得到,只能靠人的經驗進行設計指定,對此需要超參數優(yōu)化(hyper-parameters optimization,HPO)。在此我們借用這個思想,我們對算法進行優(yōu)化。人們通常稱遍歷一次訓練集為一個世代(Epoch)。在Epoch=40 時改變學習率LR,雖然只是做了一點微調,但效果是非常棒的,如圖6所示。圖6中,橫坐標為世代數目,縱坐標為均方根誤差RMSE:
其中xi為預測值,yi為理論值。圖6中,黑色曲線是超參數優(yōu)化的結果,在Epoch=100 時,HPO 得到的RMSE就已經達到我們預期的效果;LR=0.5 在Epoch=400 的時候達到預期效果;至于LR=0.1,甚至達不到預期效果(步長太小,陷入了“不理想的坑”,出不來了)。
注:若將優(yōu)化的過程看作尋找最低點,那么過程是坑坑洼洼的。開始步長大,可能跳出最優(yōu)谷。最后步長小,可能跳不出次優(yōu)谷。
圖6 均方根誤差
經過上面的努力,我們成功地訓練了神經網絡,將20%的測試集輸入神經網絡得出結果(式(8)、(9)),并反歸一化后,與平面波展開法得到的結果比較。我們計算了相對誤差(式(20)),結果如圖7 所示,由于本身是三個輸入變量,圖7 中只以r1為變量,自然會出現一對多的情形。由圖7 得知,該神經網絡計算的誤差是很小的,完全可以作為一種新的方法用于計算頻率。
圖7 相對誤差
到此,我們已經成功計算出K空間的一個點了,再重復進行以上操作就可以畫出能帶圖了。圖8(b)展示了應用神經網絡與平面波展開法分別計算的能帶,結果幾乎是一樣的。
圖8 二維正方格子(a)第一布里淵區(qū)和(b)TE模第一能帶
現在,我們已經成功地利用神經網絡來計算光子晶體能帶了。在各個程序之間,利用txt文件進行數據交互,特別注意的是,每一列的最小值與最大值是需要單獨記錄的。
本文通過神經網絡來計算光子晶體能帶。結果表明,在時間與資源受限的情況下,利用神經網絡可以快速得出準確的光子晶體能帶。如果將神經網絡算法進行優(yōu)化升級,那么所需數據集將大幅減小,性能會更加優(yōu)異。