机器学习和深度学习中的模型都是遵循数学函数的形式创立的。从数据分析到预测建模,个别状况下都会有数学原理的撑持,比方:欧几里得间隔用于检测聚类中的聚类。
傅里叶变换是一种众将函数从一个域转换到另一个域的数学方法,它也能够利用于深度学习。
本文将探讨傅里叶变换,以及如何将其用于深度学习畛域。
什么是傅里叶变换?
在数学中,变换技术用于将函数映射到与其原始函数空间不同的函数空间。傅里叶变换时也是一种变换技术,它能够将函数从时域空间转换到频域空间。例如以音频波为例,傅里叶变换能够依据其音符的音量和频率来示意它。
咱们能够说,任何函数的傅里叶变换所执行的变换都是频率的函数。其中后果函数的大小是原始函数所蕴含的频率的示意。
让咱们举一个信号的例子,它的时域函数如下所示:
在同一时间范畴内获取另一个信号的一部分
将这两个信号的称为 A(n) 和 B(n),其中 n 是时域。因而,如果咱们增加这些信号,信号的构造将如下所示:
C(n) = A(n) + B(n)
能够看到,函数的信号相加是将两个信号进行了加的操作,如果咱们试图从这个相加信号 C 中提取信号 A 或 B,咱们会遇到一个问题,因为 这些信号只是功率相加,和工夫没有关系。也就是说相加的操作是同一时间上的功率的相加。
能够在上图中看到,频域能够很容易地突出信号之间的差别。如果心愿将这些信号转换回时域,咱们能够应用傅里叶逆变换。
傅立叶变数学原理
正弦序列可用于示意时域中的信号,这是傅立叶变换的根底。所以如果函数是一个间断信号,函数 f 能够用来示意为:
能够看到该函数是由有限正弦曲线相加组成的,咱们能够将其视为函数信号的示意,并且该函数具备定义输入信号构造所需的两个系数。
求解傅里叶变换积分(实质上是频率的函数)会产生这些系数。傅里叶变换的后果能够被认为是一组系数。它能够用数学示意如下:
而这个函数的倒数能够看作是咱们用来将频域函数转换为时域函数的工夫函数,也就是傅里叶逆变换。
求解下面的这些积分能够失去 a 和 b 的值,这里探讨的是信号是间断信号的状况。然而在现实生活中,大多数问题都是从离散采样的信号中产生的,为了找出这种信号变换的系数,咱们须要执行离散傅里叶变换 (DFT)。
应用 DFT 咱们能够失去一个雷同长度等距离的样本序列,这个函数是由一组等距离的样本序列组成的。下面给出的函数 f(t) 的系数能够由上面的函数失去。
a 和 b 的值将是,
在函数 f(t) 中应用项 a 和 b,就能够找到频域中的信号。
应用 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()
当初能够分明地看到各种波的频率是多少,作为时域的函数造成的时这些并不显著,只有在频域示意时能力分明的看到这些区别。
通过下面的介绍曾经理解了傅立叶变换的根本内容,但它当初与神经网络有什么关系呢?傅里叶变换是一种迫近其余频域函数的工具,而神经网络也能够迫近任意函数。咱们将在本文的下一部分中介绍神经网络和傅里叶变换之间的关系。
神经网络和傅里叶变换之间有什么关系?
能够将傅里叶变换视为一种有助于迫近其余函数的函数,并且咱们还晓得神经网络能够被认为是一种函数迫近技术或通用函数迫近技术。
上图描述了一个采纳傅里叶变换办法的神经网络。一个绝对根本的神经网络的指标是心愿在特定工夫迫近一个未知函数及其值。大多数神经网络的工作是学习整个函数或算法或数据中指定的值点处的函数,傅里叶网络也是一样通过迭代技术找到迫近函数的参数。
卷积神经网络中的傅立叶变换
卷积神经网络中卷积层是次要根底组件,在网络中,任何卷积层的次要工作是将滤波器(卷积核)利用于输出数据或特色图,对前一层的输入进行卷积。该层的工作是学习过滤器的权重。在一个简单的卷积神经网络中看到,层数很多,每层的过滤器也很多,这使得计算成本十分高。
应用傅里叶变换能够将层计算转换为频域中的元素乘积,网络的工作将是雷同的,然而能够通过应用傅里叶变换来节俭计算器的能量。
综上所述,咱们能够说卷积层或卷积层的过程与傅里叶变换无关。大多数时域中的卷积层能够被认为是频域中的乘法。咱们能够很容易地通过多项式乘法来了解卷积。
假如咱们必须对任意值 x 的 y 和 g 进行函数解决,如下所示:
y(x) = ax + b
g(x) = cx + d
而这些函数的多项式乘法能够写成函数 h
h(x) = y(x).g(x)
= (ax + b)(cx + d)
= ac x² + (ad+bc) x + bd
综上所述,咱们能够说卷积层过程能够定义为上述给定函数的乘积。函数的向量模式能够写成:
y[n] = ax[n] + b
g[n] = cx[n] + d
向量模式的向量乘法为:
h[n] = y[n] X g[n]
H[w] = F(y[n]) ‧ F(g[n]) = Y[w] ‧ G[w]
h[n] = F^-1(H[w])
其中:
- 乘法中的符号“.”示意乘法,X 是卷积的。
- F 和 F^-1 别离是傅里叶变换和傅里叶逆变换。
- “n”和“w”别离是时域和频域。
综上所述,咱们能够看到如果函数与时域相干,卷积层最终意味着傅里叶变换及其在乘法中的逆。
如何在深度学习中应用傅立叶变换?
在上一节中,咱们曾经看到时域中的卷积过程能够简略地认为是频域中的乘法。这证实它能够用于各种深度学习算法,即便它能够用于各种动态预测建模算法。
让咱们来看一个相似的卷积神经网络示例,这样咱们就不会偏离本文的主题。
卷积数学操作是在时域中执行乘法,而傅里叶变换背地的数学是在频域中进行乘法。
为了在任何卷积神经网络中利用傅里叶变换,咱们能够对输出和滤波器进行一些更改。
如果 CNN 中的输出矩阵和滤波器矩阵能够转换为频域进行乘法运算,并且频域乘法的后果矩阵能够转换为时域矩阵,则不会对算法的准确性造成任何影响。矩阵从时域到频域的转换能够通过傅里叶变换或疾速傅里叶变换来实现,而从频域到时域的转换能够通过傅里叶逆变换或疾速傅里叶逆变换来实现。
下图展现了咱们如何应用疾速傅里叶变换代替卷积。
正如咱们所探讨的,在任何简单的网络中滤波器和层的数量都是十分高的,因为这些数量的减少,应用卷积的计算过程变得十分迟缓。而利用傅里叶变换能够缩小这种计算的复杂性,使模型运行速度更快。
如果你对这篇文章的思路有趣味能够自行尝试,并欢送留言探讨。
https://avoid.overfit.cn/post/c7fa2a15c85d4192bbab1d98dcbdb882
作者:Lorenzo Castagno