当前位置: 首页 > news >正文

深度学习简历面试知识——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不用CNNtransformer好在哪

(2)transformerLSTM有什么区别

二、VGGish

1、形式化描述

输入:音频的梅尔频谱图
输出:128维的特征向量

VGGish 是一种用于音频特征提取的神经网络,它基于 VGG 网络架构进行调整,专门用于处理音频数据。VGGish 的主要目的是将音频信号转化为固定长度的向量表示,通常用于音频分类、音频检索、语音识别等任务。

具体来说,VGGish 的音频特征提取流程如下:

  1. 音频预处理

    • 输入音频数据首先会经过预处理。音频信号被分割成多个短时间窗口,每个窗口的时长通常为 960 ms。
    • 将这些时间窗口通过短时傅里叶变换 (STFT) 转化为频谱图。这种转换将音频的时域信息转换成频域信息,使得音频信号可以被表示为时间和频率的二维图像(也称为梅尔频谱图)。
  2. 梅尔频谱图生成

    • 频谱图经过梅尔滤波器处理,生成梅尔频谱图。梅尔频率尺度是一种更符合人耳听觉感知的频率尺度,通过应用一组梅尔滤波器将频谱的频率轴重新调整到对数尺度上。结果是一个形似图片的二维数组,其中每行表示特定的梅尔频率,每列表示时间帧。
  3. 卷积神经网络(CNN)处理

    • VGGish 网络结构由一系列的卷积层、池化层和全连接层组成,类似于原始的 VGG 网络架构。音频的梅尔频谱图作为网络的输入。
    • 梅尔频谱图通过多层卷积层进行特征提取,这些卷积层可以识别音频信号中的时频模式,例如音乐、语音、环境声等。
    • 卷积后的结果经过池化层,逐步缩小特征图的空间尺寸,同时保留最重要的特征。
  4. 输出特征向量

    • 在通过多层卷积网络后,音频被表示为一个高维的特征向量,通常维度为 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=0N1x[n+mL]w[n]ej2π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} ej2π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=0K1Hi(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} Fl1,卷积核为 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=σ(WlFl1+bl)

其中:

  • W l ∗ F l − 1 W_l \ast F_{l- 1} WlFl1表示卷积运算。
  • 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 的音频特征提取过程可以分为以下几个步骤:

  1. STFT:对离散化后的音频信号 x [ n ] x[n] x[n]进行短时傅里叶变换,得到时频域特征 X ( k , m ) X(k, m) X(k,m)
  2. 梅尔频谱图:通过梅尔滤波器对功率谱 P ( k , m ) P(k, m) P(k,m)进行加权求和,得到梅尔频谱图 M ( i , m ) M(i, m) M(i,m),并取对数。
  3. 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μj2=l=1d(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=Cj1xiCjxi

其中 ∣ C j ∣ |C_j| Cj 是簇 C j C_j Cj 中数据点的个数,质心更新为簇中所有数据点在各个维度上的平均值。

第四步:重复迭代

重复步骤二步骤三,即:

  1. 重新分配数据点到最近的簇。
  2. 更新每个簇的质心。

直到质心不再发生变化,或者达到预定的最大迭代次数,算法停止。

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=1kxiCjxiμj2

SSE(Sum of Squared Errors)是每个数据点与其簇质心的距离平方的总和。算法通过不断调整簇质心,使这个误差最小化。

5. 收敛条件

K- means 算法在以下两种情况下收敛:

  1. 簇质心不再发生变化:在迭代过程中,质心的位置不再改变。
  2. 达到预设的最大迭代次数:如果设置了最大迭代次数,算法在达到这个迭代次数时停止。

6. K- means 算法的优缺点

优点:
  • 简单易实现:K- means 算法实现简单,计算效率较高,尤其适用于大规模数据集。
  • 速度快:算法每次只需要计算欧氏距离,时间复杂度为 O ( n ⋅ k ⋅ t ) O(n \cdot k \cdot t) O(nkt),其中 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

具体步骤如下:

  1. 运行 K- means 算法,设置不同的 K K K 值(比如 K = 1 , 2 , 3 , . . . , 10 K=1, 2, 3, ..., 10 K=1,2,3,...,10)。
  2. 对于每个 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=1KxiCjxiμj2
    其中, C j C_j Cj 表示第 j j j 个簇, μ j \mu_j μj 是该簇的质心, x i x_i xi 是属于 C j C_j Cj 的数据点。
  3. 将不同 K K K 值对应的 SSE 画成曲线,通常随着 K K K 的增加,SSE 会逐渐减小,因为簇数越多,每个簇中的点会越接近质心。
  4. 观察曲线的变化,当 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,表示数据点被错误聚类,应该属于其他簇。

步骤

  1. 运行 K- means 算法,设置不同的 K K K 值。
  2. 计算每个 K K K 值对应的轮廓系数 s ( i ) s(i) s(i) 并取所有点的平均值。
  3. 选择使得平均轮廓系数最高的 K K K 值。

优点:不仅考虑簇内的紧凑性,还考虑簇间的分离性,能更全面地评估聚类效果。
缺点:计算复杂度较高,尤其是数据量大时。

3. 间隙统计量法(Gap Statistic Method)

间隙统计量法通过将实际数据与随机生成的参照数据进行比较,评估不同 K K K 值下的聚类效果。

步骤

  1. 对于每个 K K K,运行 K- means 算法并计算簇内误差平方和(SSE)。
  2. 生成多个与原始数据具有相同分布的随机数据集,对这些随机数据集同样运行 K- means,计算它们的 SSE。
  3. 计算间隙统计量,公式为:
    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=1Blog(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 是生成随机数据集的数量。
  4. 选择 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=2k2log(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 本质上不是一个概率模型。


http://www.mrgr.cn/news/31472.html

相关文章:

  • SQL编程题复习(24/9/20)
  • VM虚拟机使用的镜像文件下载
  • Linux:虚拟文件系统/proc和self进程
  • [Unity Demo]从零开始制作空洞骑士Hollow Knight第六集:制作小骑士完整的跳跃落地行为
  • 力扣(leetcode)每日一题 LCR 187 破冰游戏(还是考的约瑟夫环)
  • F28335中断系统
  • 第二十节:学习Redis缓存数据库实现增删改查(自学Spring boot 3.x的第五天)
  • Linux线程同步—竞态条件与互斥锁、读写锁(C语言)
  • PLC通信协议的转化
  • xhs 小红书 x-s web 分析
  • 如何下载ComfyUI开发版
  • SpringBoot开发-数据加密
  • Vue3DevTools7是如何在vscode定位指定文件位置的?
  • 浅谈穷举法
  • 【C/C++语言系列】实现单例模式
  • 在PyQt的QLabel控件上显示图像指南
  • 50.面向对象进阶训练-学生类
  • 达梦数据库踩坑
  • 线性规划中可行域为什么一定是凸的--证明
  • 前端框架对比选择:如何在众多技术中找到最适合你的