人工智能深度學習:神經(jīng)網(wǎng)絡與傅立葉變換到底有沒有關系?
機器學習和深度學習中的模型都是遵循數(shù)學函數(shù)的方式創(chuàng)建的。從數(shù)據(jù)分析到預測建模,一般情況下都會有數(shù)學原理的支撐,比如:歐幾里得距離用于檢測聚類中的聚類。
傅里葉變換是一種眾所周知的將函數(shù)從一個域轉換到另一個域的數(shù)學方法,它也可以應用于深度學習。
什么是傅里葉變換?
在數(shù)學中,變換技術用于將函數(shù)映射到與其原始函數(shù)空間不同的函數(shù)空間。傅里葉變換時也是一種變換技術,它可以將函數(shù)從時域空間轉換到頻域空間。例如以音頻波為例,傅里葉變換可以根據(jù)其音符的音量和頻率來表示它。
我們可以說,任何函數(shù)的傅里葉變換所執(zhí)行的變換都是頻率的函數(shù)。其中結果函數(shù)的大小是原始函數(shù)所包含的頻率的表示。
我們舉一個信號的例子,它的時域函數(shù)如下所示:

在同一時間范圍內(nèi)獲取另一個信號的一部分:

將這兩個信號的稱為 和 ,其中 n 是時域。因此,如果我們添加這些信號,信號的結構將如下所示:

可以看到,函數(shù)的信號相加是將兩個信號進行了加的操作,如果我們試圖從這個相加信號 C 中提取信號 A 或 B,我們會遇到一個問題,因為 這些信號只是功率相加,和時間沒有關系。也就是說相加的操作是同一時間上的功率的相加。

可以在上圖中看到,頻域可以很容易地突出信號之間的差異。如果希望將這些信號轉換回時域,我們可以使用傅里葉逆變換。
傅立葉變數(shù)學原理
正弦序列可用于表示時域中的信號,這是傅立葉變換的基礎。所以如果函數(shù)是一個連續(xù)信號,函數(shù)f可以用來表示為:
可以看到該函數(shù)是由無限正弦曲線相加組成的,我們可以將其視為函數(shù)信號的表示,并且該函數(shù)具有定義輸出信號結構所需的兩個系數(shù)。
求解傅里葉變換積分(本質(zhì)上是頻率的函數(shù))會產(chǎn)生這些系數(shù)。傅里葉變換的結果可以被認為是一組系數(shù)。它可以用數(shù)學表示如下:
而這個函數(shù)的倒數(shù)可以看作是我們用來將頻域函數(shù)轉換為時域函數(shù)的時間函數(shù),也就是傅里葉逆變換。
求解上面的這些積分可以得到a和b的值,這里討論的是信號是連續(xù)信號的情況。但是在現(xiàn)實生活中,大多數(shù)問題都是從離散采樣的信號中產(chǎn)生的,為了找出這種信號變換的系數(shù),我們需要執(zhí)行離散傅里葉變換 (DFT)。

使用 Python 進行傅里葉變換
Python 的 scipy 模塊提供了數(shù)學中所需的所有轉換技術,所以可以直接使用它
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 生成的正弦波,現(xiàn)在可以使用 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()

現(xiàn)在可以清楚地看到各種波的頻率是多少,作為時域的函數(shù)形成的時這些并不明顯,只有在頻域表示時才能清楚的看到這些區(qū)別。
通過上面的介紹已經(jīng)了解了傅立葉變換的基本內(nèi)容,但它現(xiàn)在與神經(jīng)網(wǎng)絡有什么關系呢?傅里葉變換是一種逼近其他頻域函數(shù)的工具,而神經(jīng)網(wǎng)絡也可以逼近任意函數(shù)。我們將在本文的下一部分中介紹神經(jīng)網(wǎng)絡和傅里葉變換之間的關系。
神經(jīng)網(wǎng)絡和傅里葉變換之間有什么關系?
可以將傅里葉變換視為一種有助于逼近其他函數(shù)的函數(shù),并且我們還知道神經(jīng)網(wǎng)絡可以被認為是一種函數(shù)逼近技術或通用函數(shù)逼近技術。

上圖描繪了一個采用傅里葉變換方法的神經(jīng)網(wǎng)絡。一個相對基本的神經(jīng)網(wǎng)絡的目標是希望在特定時間逼近一個未知函數(shù)及其值。大多數(shù)神經(jīng)網(wǎng)絡的任務是學習整個函數(shù)或算法或數(shù)據(jù)中指定的值點處的函數(shù),傅里葉網(wǎng)絡也是一樣通過迭代技術找到逼近函數(shù)的參數(shù)。
卷積神經(jīng)網(wǎng)絡中的傅立葉變換
卷積神經(jīng)網(wǎng)絡中卷積層是主要基礎組曾,在網(wǎng)絡中,任何卷積層的主要工作是將濾波器(卷積核)應用于輸入數(shù)據(jù)或特征圖,對前一層的輸出進行卷積。該層的任務是學習過濾器的權重。在一個復雜的卷積神經(jīng)網(wǎng)絡中看到,層數(shù)很多,每層的過濾器也很多,這使得計算成本非常高。
使用傅里葉變換可以將層計算轉換為頻域中的元素乘積,網(wǎng)絡的任務將是相同的,但是可以通過使用傅里葉變換來節(jié)省計算器的能量。
綜上所述,我們可以說卷積層或卷積層的過程與傅里葉變換有關。大多數(shù)時域中的卷積層可以被認為是頻域中的乘法。我們可以很容易地通過多項式乘法來理解卷積。
假設我們必須對任意值 的 和 進行函數(shù)處理,如下所示:
而這些函數(shù)的多項式乘法可以寫成函數(shù)h
2
綜上所述,我們可以說卷積層過程可以定義為上述給定函數(shù)的乘積。函數(shù)的向量形式可以寫成:
向量形式的向量乘法為:
其中:
乘法中的符號“.”表示乘法, 是卷積的。
和 分別是傅里葉變換和傅里葉逆變換。
“”和“”分別是時域和頻域。
綜上所述,我們可以看到如果函數(shù)與時域相關,卷積層最終意味著傅里葉變換及其在乘法中的逆。
如何在深度學習中使用傅立葉變換?
在上一節(jié)中,我們已經(jīng)看到時域中的卷積過程可以簡單地認為是頻域中的乘法。這證明它可以用于各種深度學習算法,即使它可以用于各種靜態(tài)預測建模算法。
我們來看一個類似的卷積神經(jīng)網(wǎng)絡示例,這樣我們就不會偏離本文的主題。
卷積數(shù)學操作是在時域中執(zhí)行乘法,而傅里葉變換背后的數(shù)學是在頻域中進行乘法。

為了在任何卷積神經(jīng)網(wǎng)絡中應用傅里葉變換,我們可以對輸入和濾波器進行一些更改。
如果 CNN 中的輸入矩陣和濾波器矩陣可以轉換為頻域進行乘法運算,并且頻域乘法的結果矩陣可以轉換為時域矩陣,則不會對算法的準確性造成任何影響。矩陣從時域到頻域的轉換可以通過傅里葉變換或快速傅里葉變換來完成,而從頻域到時域的轉換可以通過傅里葉逆變換或快速傅里葉逆變換來完成。
下圖展示了我們?nèi)绾问褂每焖俑道锶~變換代替卷積。

正如我們所討論的,在任何復雜的網(wǎng)絡中濾波器和層的數(shù)量都是非常高的,由于這些數(shù)量的增加,使用卷積的計算過程變得非常緩慢。而利用傅里葉變換可以減少這種計算的復雜性,使模型運行速度更快。
如果你對這篇文章的思路有興趣可以自行嘗試,并歡迎討論。
作者:Lorenzo Castagno

