機器學習和深度學習中的模型都是遵循數學函數的方式創建的。從數據分析到預測建模,一般情況下都會有數學原理的支撐,比如:歐幾里得距離用于檢測聚類中的聚類。
傅里葉變換是一種眾所周知的將函數從一個域轉換到另一個域的數學方法,它也可以應用于深度學習。
本文將討論傅里葉變換,以及如何將其用于深度學習領域。
什么是傅里葉變換?
在數學中,變換技術用于將函數映射到與其原始函數空間不同的函數空間。傅里葉變換時也是一種變換技術,它可以將函數從時域空間轉換到頻域空間。例如以音頻波為例,傅里葉變換可以根據其音符的音量和頻率來表示它。
我們可以說,任何函數的傅里葉變換所執行的變換都是頻率的函數。其中結果函數的大小是原始函數所包含的頻率的表示。
我們舉一個信號的例子,它的時域函數如下所示:
在同一時間范圍內獲取另一個信號的一部分:
將這兩個信號的稱為??和?,其中 n 是時域。因此,如果我們添加這些信號,信號的結構將如下所示:
可以看到,函數的信號相加是將兩個信號進行了加的操作,如果我們試圖從這個相加信號 C 中提取信號 A 或 B,我們會遇到一個問題,因為 這些信號只是功率相加,和時間沒有關系。也就是說相加的操作是同一時間上的功率的相加。
可以在上圖中看到,頻域可以很容易地突出信號之間的差異。如果希望將這些信號轉換回時域,我們可以使用傅里葉逆變換。
傅立葉變數學原理
正弦序列可用于表示時域中的信號,這是傅立葉變換的基礎。所以如果函數是一個連續信號,函數f可以用來表示為:
可以看到該函數是由無限正弦曲線相加組成的,我們可以將其視為函數信號的表示,并且該函數具有定義輸出信號結構所需的兩個系數。
求解傅里葉變換積分(本質上是頻率的函數)會產生這些系數。傅里葉變換的結果可以被認為是一組系數。它可以用數學表示如下:
而這個函數的倒數可以看作是我們用來將頻域函數轉換為時域函數的時間函數,也就是傅里葉逆變換。
求解上面的這些積分可以得到a和b的值,這里討論的是信號是連續信號的情況。但是在現實生活中,大多數問題都是從離散采樣的信號中產生的,為了找出這種信號變換的系數,我們需要執行離散傅里葉變換 (DFT)。
使用DFT我們可以得到一個相同長度等間隔的樣本序列,這個函數是由一組等間隔的樣本序列組成的。上面給出的函數?的系數可以由下面的函數得到。
和??的值將是:
在函數??中使用項??和??,就可以找到頻域中的信號。
使用 Python 進行傅里葉變換
Python 的 scipy 模塊提供了數學中所需的所有轉換技術,所以可以直接使用它
?
import numpy as np import matplotlib.pyplot as plt from scipy.fft import fft, fftfreq
?
制作正弦波
?
# sample points N = 1200 # sample spacing T = 1.0 / 1600.0 x = np.linspace(0.0, N*T, N, endpoint=False) sum = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x) plt.plot(sum) plt.title('Sine wave') plt.xlabel('Time') plt.ylabel('Amplitude') plt.grid(True, which='both') plt.show()
?
上面的輸出中,可以看到使用 NumPy 生成的正弦波,現在可以使用 scipy 庫的 FFT 模塊對其進行轉換。
?
sumf = fft(sum) xf = fftfreq(N, T)[:N//2] plt.ylabel('frequency') plt.xlabel('sample') plt.title("FFT of sum of two sines") plt.plot(xf, 2.0/N * np.abs(sumf[0:N//2])) plt.show()
?
現在可以清楚地看到各種波的頻率是多少,作為時域的函數形成的時這些并不明顯,只有在頻域表示時才能清楚的看到這些區別。
通過上面的介紹已經了解了傅立葉變換的基本內容,但它現在與神經網絡有什么關系呢?傅里葉變換是一種逼近其他頻域函數的工具,而神經網絡也可以逼近任意函數。我們將在本文的下一部分中介紹神經網絡和傅里葉變換之間的關系。
神經網絡和傅里葉變換之間有什么關系?
可以將傅里葉變換視為一種有助于逼近其他函數的函數,并且我們還知道神經網絡可以被認為是一種函數逼近技術或通用函數逼近技術。
上圖描繪了一個采用傅里葉變換方法的神經網絡。一個相對基本的神經網絡的目標是希望在特定時間逼近一個未知函數及其值。大多數神經網絡的任務是學習整個函數或算法或數據中指定的值點處的函數,傅里葉網絡也是一樣通過迭代技術找到逼近函數的參數。
卷積神經網絡中的傅立葉變換
卷積神經網絡中卷積層是主要基礎組曾,在網絡中,任何卷積層的主要工作是將濾波器(卷積核)應用于輸入數據或特征圖,對前一層的輸出進行卷積。該層的任務是學習過濾器的權重。在一個復雜的卷積神經網絡中看到,層數很多,每層的過濾器也很多,這使得計算成本非常高。
使用傅里葉變換可以將層計算轉換為頻域中的元素乘積,網絡的任務將是相同的,但是可以通過使用傅里葉變換來節省計算器的能量。
綜上所述,我們可以說卷積層或卷積層的過程與傅里葉變換有關。大多數時域中的卷積層可以被認為是頻域中的乘法。我們可以很容易地通過多項式乘法來理解卷積。
假設我們必須對任意值??的??和??進行函數處理,如下所示:
而這些函數的多項式乘法可以寫成函數h
綜上所述,我們可以說卷積層過程可以定義為上述給定函數的乘積。函數的向量形式可以寫成:
向量形式的向量乘法為:
其中:
乘法中的符號“.”表示乘法,?是卷積的。
和??分別是傅里葉變換和傅里葉逆變換。
“”和“”分別是時域和頻域。
綜上所述,我們可以看到如果函數與時域相關,卷積層最終意味著傅里葉變換及其在乘法中的逆。
如何在深度學習中使用傅立葉變換?
在上一節中,我們已經看到時域中的卷積過程可以簡單地認為是頻域中的乘法。這證明它可以用于各種深度學習算法,即使它可以用于各種靜態預測建模算法。
我們來看一個類似的卷積神經網絡示例,這樣我們就不會偏離本文的主題。
卷積數學操作是在時域中執行乘法,而傅里葉變換背后的數學是在頻域中進行乘法。
為了在任何卷積神經網絡中應用傅里葉變換,我們可以對輸入和濾波器進行一些更改。
如果 CNN 中的輸入矩陣和濾波器矩陣可以轉換為頻域進行乘法運算,并且頻域乘法的結果矩陣可以轉換為時域矩陣,則不會對算法的準確性造成任何影響。矩陣從時域到頻域的轉換可以通過傅里葉變換或快速傅里葉變換來完成,而從頻域到時域的轉換可以通過傅里葉逆變換或快速傅里葉逆變換來完成。
下圖展示了我們如何使用快速傅里葉變換代替卷積。
正如我們所討論的,在任何復雜的網絡中濾波器和層的數量都是非常高的,由于這些數量的增加,使用卷積的計算過程變得非常緩慢。而利用傅里葉變換可以減少這種計算的復雜性,使模型運行速度更快。
如果你對這篇文章的思路有興趣可以自行嘗試,并歡迎討論。
作者:Lorenzo Castagno
編輯:黃飛
評論
查看更多