深度学习简历面试知识——transformer、VGGish、K-means、峰值检测
文章目录
- 一、transformer
- 二、VGGish
- 1、形式化描述
- 2、数学化描述
- 1. 音频预处理(输入音频信号)
- 1.1 短时傅里叶变换 (STFT)
- 1.2 梅尔频谱图
- 2. 卷积神经网络(CNN)处理
- 2.1 卷积层
- 2.2 池化层
- 2.3 全连接层与特征向量
- 总结
- 三、K- means
- 1、K- means的算法流程
- 1. 算法输入
- 2. 算法步骤
- 第一步:初始化簇质心
- 第二步:分配数据点到最近的簇
- 第三步:更新质心
- 第四步:重复迭代
- 3. 算法输出
- 4. 算法的目标
- 5. 收敛条件
- 6. K- means 算法的优缺点
- 优点:
- 缺点:
- 7. 其他变体
- 2、K的选择
- 1. 肘部法(Elbow Method)
- 2. 轮廓系数法(Silhouette Coefficient)
- 3. 间隙统计量法(Gap Statistic Method)
- 4.信息准则法(BIC/AIC)
一、transformer
Pytorch:Attention理解和代码实现
注意力机制和Transformer模型各部分功能解释
(1)为什么用transformer
不用CNN
,transformer
好在哪
(2)transformer
和LSTM
有什么区别
二、VGGish
1、形式化描述
输入
:音频的梅尔频谱图
输出
:128维的特征向量
VGGish 是一种用于音频特征提取的神经网络,它基于 VGG 网络架构进行调整,专门用于处理音频数据。VGGish 的主要目的是将音频信号转化为固定长度的向量表示,通常用于音频分类、音频检索、语音识别等任务。
具体来说,VGGish 的音频特征提取流程如下:
-
音频预处理:
- 输入音频数据首先会经过预处理。音频信号被分割成多个短时间窗口,每个窗口的时长通常为 960 ms。
- 将这些时间窗口通过短时傅里叶变换 (STFT) 转化为频谱图。这种转换将音频的时域信息转换成频域信息,使得音频信号可以被表示为时间和频率的二维图像(也称为梅尔频谱图)。
-
梅尔频谱图生成:
- 频谱图经过梅尔滤波器处理,生成梅尔频谱图。梅尔频率尺度是一种更符合人耳听觉感知的频率尺度,通过应用一组梅尔滤波器将频谱的频率轴重新调整到对数尺度上。结果是一个形似图片的二维数组,其中每行表示特定的梅尔频率,每列表示时间帧。
-
卷积神经网络(CNN)处理:
- VGGish 网络结构由一系列的卷积层、池化层和全连接层组成,类似于原始的 VGG 网络架构。音频的梅尔频谱图作为网络的输入。
- 梅尔频谱图通过多层卷积层进行特征提取,这些卷积层可以识别音频信号中的时频模式,例如音乐、语音、环境声等。
- 卷积后的结果经过池化层,逐步缩小特征图的空间尺寸,同时保留最重要的特征。
-
输出特征向量:
- 在通过多层卷积网络后,音频被表示为一个高维的特征向量,通常维度为 128。这些向量可以用于不同的音频分析任务,比如音频分类、相似音频检索等。
总的来说,VGGish 网络通过将音频信号转化为梅尔频谱图,再利用卷积神经网络对其进行处理,从而提取出音频的时频特征,最终输出固定长度的特征向量,便于后续任务进行进一步的分析和处理。
2、数学化描述
我们可以从音频信号处理的角度,使用更数学化的语言描述 VGGish 网络提取音频特征的过程。这个过程分为两大部分:音频预处理和卷积神经网络处理。
1. 音频预处理(输入音频信号)
假设输入音频信号为 x ( t ) x(t) x(t),它是随时间变化的连续信号。为了进行处理,首先我们需要将该信号离散化,得到离散音频信号 x [ n ] x[n] x[n],其中 n n n是时间采样点。
1.1 短时傅里叶变换 (STFT)
为了捕捉信号的时频特征,我们对 x [ n ] x[n] x[n]进行短时傅里叶变换 (STFT)。STFT 是通过在音频信号上施加一个滑动窗口 w [ n ] w[n] w[n]来对信号的局部频率成分进行分析,其数学形式为:
X ( k , m ) = ∑ n = 0 N − 1 x [ n + m L ] w [ n ] e − j 2 π k n / N X(k, m) = \sum_{n=0}^{N- 1} x[n+mL] w[n] e^{- j 2 \pi kn / N} X(k,m)=n=0∑N−1x[n+mL]w[n]e−j2πkn/N
其中:
- X ( k , m ) X(k, m) X(k,m)是在时间帧 m m m和频率 k k k上的 STFT 系数。
- w [ n ] w[n] w[n]是一个长度为 N N N的窗口函数(通常为汉宁窗口等)。
- L L L是窗口的步长(也称为 hop size)。
- N N N是每个窗口的长度。
- e − j 2 π k n / N e^{- j 2 \pi kn / N} e−j2πkn/N是傅里叶变换的基函数。
STFT 结果 X ( k , m ) X(k, m) X(k,m)是一个二维复数矩阵,它表示音频信号在不同时间帧 m m m和频率 k k k上的频域信息。通常我们取其绝对值平方,得到功率谱:
P ( k , m ) = ∣ X ( k , m ) ∣ 2 P(k, m) = |X(k, m)|^2 P(k,m)=∣X(k,m)∣2
1.2 梅尔频谱图
接下来,我们将功率谱 P ( k , m ) P(k, m) P(k,m)转化为梅尔频谱图。梅尔尺度是一种非线性频率尺度,符合人类听觉的频率感知。
首先,定义一组梅尔滤波器 H i ( k ) H_i(k) Hi(k),这些滤波器覆盖线性频率 k k k,但其中心频率遵循梅尔尺度。然后,对每个滤波器,我们计算加权和:
M ( i , m ) = ∑ k = 0 K − 1 H i ( k ) P ( k , m ) M(i, m) = \sum_{k=0}^{K- 1} H_i(k) P(k, m) M(i,m)=k=0∑K−1Hi(k)P(k,m)
其中 M ( i , m ) M(i, m) M(i,m)是在第 i i i个梅尔滤波器和时间帧 m m m上的梅尔频谱系数。最终,得到的 M ( i , m ) M(i, m) M(i,m)是一个二维矩阵,它表示音频信号在梅尔频率尺度上的频谱图。
为了使得数据更加适合神经网络处理,通常会对梅尔频谱系数取对数:
M log ( i , m ) = log ( M ( i , m ) + ϵ ) M_{\text{log}}(i, m) = \log(M(i, m) + \epsilon) Mlog(i,m)=log(M(i,m)+ϵ)
其中 ϵ \epsilon ϵ是防止取对数时出现数值不稳定的极小量。
2. 卷积神经网络(CNN)处理
2.1 卷积层
将生成的梅尔频谱图 M log ( i , m ) M_{\text{log}}(i, m) Mlog(i,m)输入卷积神经网络。卷积层通过卷积操作提取音频信号的局部时频特征。
对于每一层卷积操作,设输入的特征图为 F l − 1 F_{l- 1} Fl−1,卷积核为 W l W_l Wl,卷积结果为 F l F_l Fl。第 l l l层的卷积运算为:
F l = σ ( W l ∗ F l − 1 + b l ) F_l = \sigma(W_l \ast F_{l- 1} + b_l) Fl=σ(Wl∗Fl−1+bl)
其中:
- W l ∗ F l − 1 W_l \ast F_{l- 1} Wl∗Fl−1表示卷积运算。
- b l b_l bl是偏置项。
- σ \sigma σ是激活函数(通常为 ReLU)。
2.2 池化层
在每个卷积层之后,通常会使用池化层来缩小特征图的尺寸。池化层通过取局部区域的最大值或平均值来减少数据的维度,公式为:
F l pool ( i , j ) = max ( p , q ) ∈ window F l ( i + p , j + q ) F_l^{\text{pool}}(i, j) = \max_{(p, q) \in \text{window}} F_l(i+p, j+q) Flpool(i,j)=(p,q)∈windowmaxFl(i+p,j+q)
这一步的目的是减少计算量,同时保留重要特征。
2.3 全连接层与特征向量
经过多层卷积和池化后,音频特征被压缩成一个固定大小的特征图。该特征图通过展平(flatten)操作变成一个向量,并通过全连接层转换成固定长度的音频特征向量。
设展平后的向量为 z z z,经过全连接层的映射为:
f audio = σ ( W fc z + b fc ) f_{\text{audio}} = \sigma(W_{\text{fc}} z + b_{\text{fc}}) faudio=σ(Wfcz+bfc)
其中 f audio f_{\text{audio}} faudio是最终输出的音频特征向量(通常为 128 维)。
总结
通过数学化的描述,VGGish 的音频特征提取过程可以分为以下几个步骤:
- STFT:对离散化后的音频信号 x [ n ] x[n] x[n]进行短时傅里叶变换,得到时频域特征 X ( k , m ) X(k, m) X(k,m)。
- 梅尔频谱图:通过梅尔滤波器对功率谱 P ( k , m ) P(k, m) P(k,m)进行加权求和,得到梅尔频谱图 M ( i , m ) M(i, m) M(i,m),并取对数。
- CNN处理:使用卷积层提取音频特征,通过池化层缩小特征图,最终通过全连接层将特征图映射为固定维度的特征向量 f audio f_{\text{audio}} faudio。
最终,VGGish 输出的特征向量 f audio f_{\text{audio}} faudio能够有效表示音频的时频特征,适合用于音频分类等任务。
三、K- means
1、K- means的算法流程
K- means 算法是一种常见的无监督聚类算法,用于将数据点划分为 k k k 个簇。每个簇由一个质心(中心点)代表,数据点根据与质心的距离被分配到最近的簇。其目标是最小化簇内数据点与质心的距离平方和。下面是 K- means 算法的具体流程:
1. 算法输入
- 数据集:我们有一个数据集 X = { x 1 , x 2 , … , x n } X = \{x_1, x_2, \dots, x_n\} X={x1,x2,…,xn},其中每个 x i x_i xi 是 d d d 维空间中的一个数据点。
- 簇数 k k k:要划分的簇的数量,事先由用户指定。
2. 算法步骤
第一步:初始化簇质心
从数据集中随机选择 k k k 个不同的点作为初始簇的质心,记作 μ 1 , μ 2 , … , μ k \mu_1, \mu_2, \dots, \mu_k μ1,μ2,…,μk,其中每个 μ j \mu_j μj 是 d d d 维向量,表示第 j j j 个簇的质心。
第二步:分配数据点到最近的簇
对于每个数据点 x i x_i xi,计算它与每个簇质心的距离(通常使用欧几里得距离),然后将数据点分配给距离最近的簇。
对于第 i i i 个数据点 x i x_i xi,我们计算其与所有质心 μ j \mu_j μj 的距离:
d ( x i , μ j ) = ∥ x i − μ j ∥ 2 = ∑ l = 1 d ( x i l − μ j l ) 2 d(x_i, \mu_j) = \|x_i - \mu_j\|^2 = \sum_{l=1}^{d} (x_{il} - \mu_{jl})^2 d(xi,μj)=∥xi−μj∥2=l=1∑d(xil−μjl)2
其中 x i l x_{il} xil 是数据点 x i x_i xi 的第 l l l 维分量, μ j l \mu_{jl} μjl 是质心 μ j \mu_j μj 的第 l l l 维分量。
将数据点 x i x_i xi 分配到距离最小的质心对应的簇:
Assign x i to cluster C j if d ( x i , μ j ) is minimum . \text{Assign} \ x_i \ \text{to cluster} \ C_j \ \text{if} \ d(x_i, \mu_j) \ \text{is minimum}. Assign xi to cluster Cj if d(xi,μj) is minimum.
第三步:更新质心
对每个簇 C j C_j Cj,重新计算簇的质心,质心为该簇中所有数据点的均值:
μ j = 1 ∣ C j ∣ ∑ x i ∈ C j x i \mu_j = \frac{1}{|C_j|} \sum_{x_i \in C_j} x_i μj=∣Cj∣1xi∈Cj∑xi
其中 ∣ C j ∣ |C_j| ∣Cj∣ 是簇 C j C_j Cj 中数据点的个数,质心更新为簇中所有数据点在各个维度上的平均值。
第四步:重复迭代
重复步骤二和步骤三,即:
- 重新分配数据点到最近的簇。
- 更新每个簇的质心。
直到质心不再发生变化,或者达到预定的最大迭代次数,算法停止。
3. 算法输出
最终,K- means 算法输出 k k k 个簇,每个簇由其质心和分配给它的所有数据点组成。
4. 算法的目标
K-means 算法的目标是最小化簇内数据点与其质心之间的距离平方和,具体公式如下:
SSE = ∑ j = 1 k ∑ x i ∈ C j ∥ x i − μ j ∥ 2 \text{SSE} = \sum_{j=1}^{k} \sum_{x_i \in C_j} \|x_i - \mu_j\|^2 SSE=j=1∑kxi∈Cj∑∥xi−μj∥2
SSE(Sum of Squared Errors)是每个数据点与其簇质心的距离平方的总和。算法通过不断调整簇质心,使这个误差最小化。
5. 收敛条件
K- means 算法在以下两种情况下收敛:
- 簇质心不再发生变化:在迭代过程中,质心的位置不再改变。
- 达到预设的最大迭代次数:如果设置了最大迭代次数,算法在达到这个迭代次数时停止。
6. K- means 算法的优缺点
优点:
- 简单易实现:K- means 算法实现简单,计算效率较高,尤其适用于大规模数据集。
- 速度快:算法每次只需要计算欧氏距离,时间复杂度为 O ( n ⋅ k ⋅ t ) O(n \cdot k \cdot t) O(n⋅k⋅t),其中 n n n 是数据点个数, k k k 是簇的数量, t t t 是迭代次数。
缺点:
- 需要事先指定簇的数量 k k k,这在实际应用中可能不太方便。
- 对初始质心敏感:不同的初始质心选择会导致不同的聚类结果。
- 容易陷入局部最优:K- means 算法无法保证找到全局最优解。
- 只适用于凸形簇:K- means 假设簇是球形且大小相似,无法处理复杂形状的簇。
7. 其他变体
为了克服 K- means 的缺点,研究者提出了多种变体,比如:
- K- means++:通过一种巧妙的方式选择初始质心,能够有效改善结果并加快收敛速度。
- Mini- batch K- means:通过小批量更新质心,适用于大规模数据集。
K- means 算法的核心思想是基于质心更新和数据点重新分配的过程,直到最终找到最优的簇分配。
2、K的选择
选择 K K K 值(即簇的数量)是 K- means 算法中一个关键且常见的问题。因为 K- means 算法需要用户事先指定簇数 K K K,但现实中的数据分布通常不清楚到底有多少个自然簇。为了合理选择 K K K,常用的方法有以下几种:
1. 肘部法(Elbow Method)
肘部法是一种常用的确定 K K K 值的方法,主要通过观察不同 K K K 值下聚类的误差平方和(SSE,Sum of Squared Errors)如何变化来选择 K K K。
具体步骤如下:
- 运行 K- means 算法,设置不同的 K K K 值(比如 K = 1 , 2 , 3 , . . . , 10 K=1, 2, 3, ..., 10 K=1,2,3,...,10)。
- 对于每个 K K K 值,计算聚类结果的 SSE。SSE 是簇内所有点到其质心的距离平方和,表示聚类的紧凑程度。公式为:
S S E = ∑ j = 1 K ∑ x i ∈ C j ∥ x i − μ j ∥ 2 SSE = \sum_{j=1}^{K} \sum_{x_i \in C_j} \|x_i - \mu_j\|^2 SSE=j=1∑Kxi∈Cj∑∥xi−μj∥2
其中, C j C_j Cj 表示第 j j j 个簇, μ j \mu_j μj 是该簇的质心, x i x_i xi 是属于 C j C_j Cj 的数据点。 - 将不同 K K K 值对应的 SSE 画成曲线,通常随着 K K K 的增加,SSE 会逐渐减小,因为簇数越多,每个簇中的点会越接近质心。
- 观察曲线的变化,当 SSE 减小到某个点后开始趋于平缓,这个点通常就是肘部(elbow)。肘部对应的 K K K 值就是最佳的簇数。
优点:简单直观,适用于绝大多数情况。
缺点:肘部位置有时不太明显,导致难以准确判断。
2. 轮廓系数法(Silhouette Coefficient)
轮廓系数法是一种通过衡量聚类结果的紧凑性和分离性来选择 K K K 值的方法。轮廓系数 s ( i ) s(i) s(i) 用来评价每个数据点是否适合其所属的簇,定义如下:
s ( i ) = b ( i ) − a ( i ) max ( a ( i ) , b ( i ) ) s(i) = \frac{b(i) - a(i)}{\max(a(i), b(i))} s(i)=max(a(i),b(i))b(i)−a(i)
其中:
- a ( i ) a(i) a(i) 是数据点 i i i 到同一簇内其他点的平均距离,反映簇内的紧凑性。
- b ( i ) b(i) b(i) 是数据点 i i i 到最近的其他簇的平均距离,反映簇间的分离性。
轮廓系数的取值范围为 ([- 1, 1]$,其中:
- s ( i ) s(i) s(i) 接近 1,表示数据点 i i i 被很好地聚类,远离其他簇。
- s ( i ) s(i) s(i) 接近 0,表示数据点位于两个簇的边界上。
- s ( i ) s(i) s(i) 接近 - 1,表示数据点被错误聚类,应该属于其他簇。
步骤:
- 运行 K- means 算法,设置不同的 K K K 值。
- 计算每个 K K K 值对应的轮廓系数 s ( i ) s(i) s(i) 并取所有点的平均值。
- 选择使得平均轮廓系数最高的 K K K 值。
优点:不仅考虑簇内的紧凑性,还考虑簇间的分离性,能更全面地评估聚类效果。
缺点:计算复杂度较高,尤其是数据量大时。
3. 间隙统计量法(Gap Statistic Method)
间隙统计量法通过将实际数据与随机生成的参照数据进行比较,评估不同 K K K 值下的聚类效果。
步骤:
- 对于每个 K K K,运行 K- means 算法并计算簇内误差平方和(SSE)。
- 生成多个与原始数据具有相同分布的随机数据集,对这些随机数据集同样运行 K- means,计算它们的 SSE。
- 计算间隙统计量,公式为:
G a p ( K ) = 1 B ∑ b = 1 B log ( S S E b rand ( K ) ) − log ( S S E orig ( K ) ) Gap(K) = \frac{1}{B} \sum_{b=1}^{B} \log(SSE^{\text{rand}}_b(K)) - \log(SSE^{\text{orig}}(K)) Gap(K)=B1b=1∑Blog(SSEbrand(K))−log(SSEorig(K))
其中, S S E b rand ( K ) SSE^{\text{rand}}_b(K) SSEbrand(K) 表示第 b b b 个随机数据集的 SSE, S S E orig ( K ) SSE^{\text{orig}}(K) SSEorig(K) 是原始数据的 SSE, B B B 是生成随机数据集的数量。 - 选择 Gap 值最大的 K K K 或第一个超过 Gap ( K + 1 ) \text{Gap}(K+1) Gap(K+1) 减去其标准差的 K K K。
优点:理论依据充分,能够防止过拟合。
缺点:计算复杂度较高,尤其是需要生成多个随机数据集。
4.信息准则法(BIC/AIC)
信息准则方法通常用于模型选择。对于 K- means,可以通过最小化某些信息准则(如 AIC 或 BIC)来选择最佳的 K K K。
-
AIC(Akaike 信息准则):考虑模型的拟合优度和复杂度,公式为:
A I C = 2 k − 2 log ( L ) AIC = 2k - 2\log(L) AIC=2k−2log(L)
其中 k k k 是参数个数, L L L 是模型的似然函数。 -
BIC(贝叶斯信息准则):与 AIC 类似,但对复杂度惩罚更大,公式为:
B I C = k log ( n ) − 2 log ( L ) BIC = k \log(n) - 2\log(L) BIC=klog(n)−2log(L)
其中 n n n 是样本数。
选择使得 AIC 或 BIC 最小的 K K K 值。
优点:适用于有概率模型假设的场景,能平衡拟合和复杂度。
缺点:不适用于纯粹的 K- means 场景,因为 K- means 本质上不是一个概率模型。