一、卷积
CNN中的卷积层,
然后得到$c\times (n-k+1)\times(n-k+1)$的feature map,这里默认stride=1,padding=0
针对每一个卷积核,卷积具体可以写成
向量卷积
给定两个向量$a=(a_0,a_1,…,a_{n-1})^T,b=(b_0,b_1,…,b_{n-1})^T$,向量卷积结果$c=(c_0,c_1,…,c_{2n-2})^T$为
定理:向量$a,b$做卷积运算等价于对分别以$a,b$为系数的多项式做多项式乘法得到的多项式的系数
- $a=(1,1,1),b=(0,2,5)$,卷积结果$c=(2,7,7,5)$
- 构造多项式$A(x)=x^2+x+1,B(x)=2x+5$
- $C(x)=A(x)B(x)=(x^2+x+1)(2x+5)=2x^3+7x^2+7x+5$
矩阵卷积(2-D)转化为向量卷积(1-D)
把$X,W$拉成一维向量$\vec{X},\vec{W}$,首先对这两个向量做向量卷积
根据向量中元素和原本矩阵中对应的关系,可以得到
二、快速傅里叶变换
假设我们有多项式$A(x)=x^2+3x+2,B(x)=2x^2+1$,想要求$C(x)=A(x)B(x)$
如何在计算机中存储多项式?
存储系数,一个最高次数为$d$的多项式需要$d+1$个系数
- 通过常规的数学算法$(x^2+3x+2)(2x^2+1)=x^2·2x+3x·2x^2+2·2x^2+x^2+3x+2$的方法对系数进行乘法和加法操作,复杂度为$O(d^2)$
任一最高次数为$d$的多项式都可以由$d+1$不同的点唯一确定,(两点确定一条直线)
也就是说$\{(x_0,P(x_0)),(x_1,P(x_1)),…,(x_d,P(x_d))\}$可以用来表示这个多项式
$P(x)=p_0+p_1x+…+p_dx^d$,代入上述$d+1$个点可以得到
- 注意:这里$x_0,x_1,…x_d$两两不同,因此中间的矩阵是一个范德蒙德矩阵,可以证明行列式一定不为0,因此由克莱姆法则可以知道上述方程一定有唯一解,因此可以确定一个唯一的多项式
我们可以用$d+1$个点来表示一个多项式,那么表示$C(x)$我们需要5个点,对于$A(x)$我们取出5个点,$B(x)$我们也取出5个点,我们将这10个点组成5对,分别两两相乘又得到五个点,这五个点就是$C(x)$上的五个点,可以用来表示$C(x)$,复杂度为$O(d)$
那么就有两个问题
- 我们如何从$P(x)=p_0+p_1x+p_2x^2+…+p_dx^d$中取出$d+1$个点
- 我们如何从这$d+1$个点还原回一个多项式
如何从$P(x)=p_0+p_1x+p_2x^2+…+p_dx^d$中取出$d+1$个点
选取$d+1$个点$x_0$计算$P(x_0)$,那么每个点的计算复杂度为$O(d)$,总的计算复杂度就是$O(d^2)$
有没有可能我们计算完一个点的值后,另一个横坐标不同的点的纵坐标也就计算出来了?
- 比如$P(x)=x^2$,那么我们计算完$P(x_0),P(-x_0)$也就知道了
- 奇偶性
$以P(x)=3x^5+2x^4+x^3+7x^2+5x+1$为例
根据奇偶性将$P(x)$分组为$P(x)=(2x^4+7x^2+1)+(3x^5+x^3+5x)$
更进一步将奇函数部分的x提出,$P(x)=(2x^4+7x^2+1)+x(3x^4+x^2+5)$
我们将这样的形式统一写成
那么计算$P(x)$的过程就转化为了计算$P_e(x^2)$和$P_o(x^2)$的过程,同时我们可以把$x^2$看成一个整体,然后计算$P_e(x^2)$和$P_o(x^2)$的次数就变成了$\frac{d}{2}$
- 但是由于$P_e(x^2)、P_o(x^2)$的整体定义域变为了正实数,我们在实数域内没法通过同样的找到$x_0,-x_0$的方式减少计算的点的个数
- 扩展到复数域
- 这样我们还是可以通过成对取点的方式递归计算$P_e(x^2)$和$P_0(x^2)$
- 复杂度$O(nlogn)$
- 但是由于$P_e(x^2)、P_o(x^2)$的整体定义域变为了正实数,我们在实数域内没法通过同样的找到$x_0,-x_0$的方式减少计算的点的个数
更进一步,我们要如何计算出这几个复数呢
以$P(x)=x^3+x^2-x-1$为例,我们需要取出4个点$(x_1,-x_1,x_2,-x_2)$
- 其中$x_1^2=-x_2^2$,那么我们就需要从$x_1^4$中求得它的两个平方根
- 最简单的方法就是令$x_1^4=1$,那么最后的4个点就是1的4次方根(4th roots of unity)
取出$d+1$个点,方便起见,我们直接取出$n=2^k$个点,其中$2^{k-1}<d+1\le2^k$
那么我们可以取出$1的n次方根(1, \omega^1,\omega^2,…,\omega^{n-1})$,(n-th roots of unity)
如何从这$d+1$个点还原回一个多项式
我们将一个多项式表示成$d+1$个点(插值,参考拉格朗日插值)
如何快速的转化回去?
- IFFT,下面最终矩阵的形式和FFT非常相似,我们还是可以用类似的递归的方法来计算
用FFT和IFFT计算卷积
前面已经得到对于两个矩阵$X,W$的卷积,我们可以用$\vec{X},\vec{W}$的向量卷积来得到
而向量卷积等价于用由$\vec{X},\vec{W}$作为系数的两个多项式的乘法
用FFT对$\vec{X},\vec{W}$分别进行插值表示,取同样的点个数($X$比$W$的规模大,按照$X$的取),这些点的横坐标是一样的,得到了$\vec{X},\vec{W}$在同样的几个点下的插值表示,分别表示为一个向量
对得到的这两个向量进行Hadamard乘积计算,即对应位置相乘,即可得到多项式乘法的结果的插值结果,然后再对插值结果进行IFFT计算即可得到卷积,即