说话人识别流程

一个说话人识别系统通常包括:声学特征提取、说话人编码器、说话人注册数据库、说话人验证/辨认等,如下图所示(图源:语音之家)。

本文要介绍的GMM、GMM-UBM、GMM-SVM就属于说话人编码器的范畴。

高斯分布

  • 也叫正态分布
  • 记作 x ∼ N ( x ∣ μ , σ 2 ) x \sim N(x| \mu , \sigma^2) xN(xμ,σ2),其中
    • x x x表示随机变量
    • μ \mu μ表示均值
    • σ \sigma σ表示标准差
    • σ 2 \sigma^2 σ2表示方差
  • 一维(指自变量x是一维的)高斯分布概率密度函数:
    p ( x ) = ( 2 π σ 2 ) − 1 / 2 exp ⁡ { − 1 2 ( x − μ σ ) 2 } p(x) = (2 \pi \sigma^2)^{-1 / 2} \exp\left \{- \frac{1}{2} (\frac{x-\mu}{\sigma } )^2 \right \} p(x)=(2πσ2)1/2exp{21(σxμ)2}

    注意:均值只影响高斯分布的位置,方差只影响高斯分布的形状(方差越大,随机变量的概率密度越集中)。

多元高斯分布

  • 记作 x ∼ N ( x ∣ μ , Σ ) x \sim N(x| \mu , \Sigma) xN(xμ,Σ),其中

    • μ \mu μ表示 K 维均值向量
    • Σ \Sigma Σ表示 K × K K \times K K×K 维协方差矩阵,其元素 σ i j 2 \sigma_{ij}^2 σij2 表示随机变量 i 和 j 的协方差,对角线上的元素 σ i i 2 \sigma_{ii}^2 σii2 表示随机变量 i 的方差,由此可知:协方差矩阵是对称矩阵。
  • 多元(指自变量x是高维的)高斯分布概率密度函数:
    p ( x ) = ( ( 2 π ) K ∣ Σ ∣ ) − 1 / 2 exp ⁡ { − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) } p(x) = ((2 \pi)^K | \Sigma |)^{-1 / 2} \exp\left \{- \frac{1}{2} (x-\mu)^T \Sigma^{-1} (x-\mu) \right \} p(x)=((2π)K∣Σ∣)1/2exp{21(xμ)TΣ1(xμ)}
    ∣ Σ ∣ |\Sigma| ∣Σ∣ 表示协方差矩阵的行列式

中心极限定理(Central Limit Theorem,CLT)

  • 中心极限定理(也叫大数定律):在适当的条件下,大量相互独立随机变量的均值经适当标准化后依分布收敛于标准正态分布。等价于,大量相互独立随机变量的和,以其均值为中心,呈现正态分布,
  • 这组定理是数理统计学和误差分析的理论基础,指出了大量随机变量之和近似服从正态分布的条件。
  • 在说话人识别领域,对大量的语音进行随机采样,其中,下列物理量会呈现正态分布:
    • 基频
    • 共振峰
    • 声强
    • 信噪比
    • 持续时间

GMM(Gaussian Mixture Model,高斯混合模型)

  • 动机:使用 M 个高斯分布的线性组合,模拟复杂的分布
  • 高斯混合模型的概率密度函数:
    p ( x ) = ∑ i = 1 M c i ⋅ N i ( x ) p(x) = \sum_{i=1}^{M} c_i \cdot N_i (x) p(x)=i=1MciNi(x)
    其中,

    • c i ≥ 0 c_i \ge 0 ci0 是第 i 个高斯分量的权重
    • ∑ i = 1 M c i = 1 \sum_{i=1}^{M} c_i = 1 i=1Mci=1
    • N i ( x ) = ( ( 2 π ) K ∣ Σ i ∣ ) − 1 / 2 exp ⁡ { − 1 2 ( x − μ i ) T Σ i − 1 ( x − μ i ) } N_i (x) = ((2 \pi)^K | \Sigma_i |)^{-1 / 2} \exp\left \{- \frac{1}{2} (x-\mu_i)^T \Sigma_i^{-1} (x-\mu_i) \right \} Ni(x)=((2π)KΣi)1/2exp{21(xμi)TΣi1(xμi)}
  • 高斯混合模型的参数表示为:
    λ = { c i , μ i , Σ i ; i = 1 , 2 , . . . , M } \lambda = \left \{ c_i , \mu_i , \Sigma_i ;i=1,2,...,M \right \} λ={ci,μi,Σi;i=1,2,...,M}
    即总共有 M ⋅ ( 1 + K + K 2 ) M \cdot (1+K+K^2) M(1+K+K2) 个参数
  • GMM的问题在于:参数量随着 K 的平方增大,这容易导致过拟合
  • GMM的参数主要集中在协方差矩阵上,因此有两个减少协方差矩阵参数的办法:
    • 共享参数

      • 第一层:每个GMM的每个高斯分量都有独立的协方差矩阵
      • 第二层:每个GMM的所有高斯分量都共享协方差矩阵
      • 第三层:所有GMM的所有高斯分量都共享协方差矩阵
    • 简化矩阵
      • 第一层:方阵上每个元素都有参数,表示随机变量的任意两个维度都相关
      • 第二层:方阵上只有对角线上元素有参数,表示随机变量的任意两个维度都不相关
      • 第三层:方阵上只有对角线上元素有参数,且对角线上元素相同,可表示为 α I \alpha I αII I I 为单位矩阵,表示随机变量的任意两个维度都不相关,且各维度方差相同
  • 注意:符合高斯分布的随机变量,不相关等价于独立。
  • 说话人识别领域最佳实践:每个GMM的每个高斯分量都有独立的对角协方差矩阵。从而,参数量变为: M ⋅ ( 1 + 2 K ) M \cdot (1+2K) M(1+2K),新的第 i 个高斯分量的概率密度函数可表示为:
    N i ( x ) = Π k = 1 K ( 2 π σ i k 2 ) − 1 / 2 e x p { − 1 2 ( x k − μ i k σ i k ) 2 } N_i (x) = \Pi_{k=1}^{K} (2 \pi \sigma_{ik}^2)^{-1/2} exp\left \{ -\frac{1}{2} (\frac{x_k-\mu_{ik}}{\sigma_{ik}})^2 \right \} Ni(x)=Πk=1K(2πσik2)1/2exp{21(σikxkμik)2}
    这个形式类似于 K 个一维高斯分布连乘。

GMM用于说话人识别

  • 对于每个说话人,都用一个GMM去表征,从而GMM成为一个映射: 声学特征 → 说话人 声学特征 \rightarrow 说话人 声学特征说话人
  • 常用最大似然估计(Maximum Likelihood Estimation,MLE)对GMM进行参数估计,即最大化:
    p ( X ∣ λ ) = Π n = 1 N p ( x n ∣ λ ) p(X|\lambda) = \Pi_{n=1}^{N} p(x_n|\lambda) p(Xλ)=Πn=1Np(xnλ)

    • 其中, λ \lambda λ是GMM的参数,GMM的总数与说话人的个数相同; X = { x n ∣ n = 1 , 2 , . . . , N } X=\left \{ x_n|n=1,2,...,N \right \} X={xnn=1,2,...,N} 为GMM对应说话人的所有话语。
    • 注意:不要与最大后验估计(Maximum A Posteriori Estimation,MAP)混淆,最大后验估计要求最大化 p ( λ ∣ X ) p(\lambda|X) p(λX)
  • 常用EM算法(Expectation-Maximization algorithm)解决最大似然估计问题,在此不深究EM算法的本质,只给出步骤
  • EM算法步骤
    1. 设置初始化参数 λ 0 \lambda_0 λ0

      • 可以随机初始化
      • 也可以用K-means先对样本进行聚类,然后用多元高斯分布,初步表征每个类
    2. E步骤:计算每个样本,到每个高斯分量上的概率,由于高斯分量已经有参数,所以此时的概率是在具有先验知识的前提下得到的,因此是后验概率

      • 假设当前是第 t 个迭代
      • 参数未更新,记为 λ ( t − 1 ) \lambda^{(t-1)} λ(t1)
      • 计算样本对GMM的第 i 个高斯分量的后验概率
        p ( i ∣ x n , λ ( t − 1 ) ) = c i ( t − 1 ) ⋅ N i ( t − 1 ) ( x n ) ∑ j = 1 M c j ( t − 1 ) ⋅ N j ( t − 1 ) ( x n ) p(i|x_n,\lambda^{(t-1)})=\frac{c_i^{(t-1)} \cdot N_i^{(t-1)} (x_n)}{\sum_{j=1}^{M} c_j^{(t-1)} \cdot N_j^{(t-1)} (x_n)} p(ixn,λ(t1))=j=1Mcj(t1)Nj(t1)(xn)ci(t1)Ni(t1)(xn)
    3. M步骤:根据E步骤得到的后验概率,更新参数

      • 更新权重
        c i ( t ) = 1 N ∑ n = 1 N p ( i ∣ x n , λ ( t − 1 ) ) c_i^{(t)} = \frac{1}{N} \sum_{n=1}^{N} p(i|x_n,\lambda^{(t-1)}) ci(t)=N1n=1Np(ixn,λ(t1))
      • 更新均值和协方差矩阵
        μ i ( t ) = ∑ n = 1 N p ( i ∣ x n , λ ( t − 1 ) ) ⋅ x n ∑ n = 1 N p ( i ∣ x n , λ ( t − 1 ) ) σ i k 2 ( t ) = ∑ n = 1 N p ( i ∣ x n , λ ( t − 1 ) ) ⋅ ( x n k − μ i k ) 2 ∑ n = 1 N p ( i ∣ x n , λ ( t − 1 ) ) \begin{aligned} \mu_i^{(t)} &= \frac{\sum_{n=1}^{N} p(i|x_n,\lambda^{(t-1)}) \cdot x_n}{\sum_{n=1}^{N} p(i|x_n,\lambda^{(t-1)})} \\ {\sigma_{ik}^{2}}^{(t)} &= \frac{\sum_{n=1}^{N} p(i|x_n,\lambda^{(t-1)}) \cdot (x_{nk}-\mu_{ik})^2}{\sum_{n=1}^{N} p(i|x_n,\lambda^{(t-1)})} \end{aligned} μi(t)σik2(t)=n=1Np(ixn,λ(t1))n=1Np(ixn,λ(t1))xn=n=1Np(ixn,λ(t1))n=1Np(ixn,λ(t1))(xnkμik)2
    4. 交替重复E步骤和M步骤,直到达成特定条件为止

      • 可以是达到最大迭代次数
      • 也可以是更新后的参数几乎没有太大变化
  • EM算法注意事项:协方差矩阵位于分母的位置,且常常会变得很小,计算E步骤时容易出现数值计算错误,可以给协方差矩阵的值设置下限来稳定计算
  • GMM用于说话人辨认的过程(假设被辨认的每个说话人的先验概率都是一样的)
    1. 对于 S 个说话人,经过参数估计后,得到 S 组参数 { λ s ∣ s = 1 , 2 , . . . , S } \left \{ \lambda_s|s=1,2,...,S \right \} {λss=1,2,...,S}
    2. 输入一组声学特征 X = { x n ∣ n = 1 , 2 , . . . , N } X=\left \{ x_n|n=1,2,...,N \right \} X={xnn=1,2,...,N},N可以等于1
    3. 对应这组声学特征的最可能的说话人为
      s ∗ = arg ⁡ max ⁡ 1 ≤ s ≤ S ln ⁡ [ p ( X ∣ λ s ) ] = arg ⁡ max ⁡ 1 ≤ s ≤ S ∑ n = 1 N ln ⁡ [ p ( x n ∣ λ s ) ] \begin{aligned} s^* &= \arg\max_{1 \le s \le S} \ln[p(X|\lambda_s)] \\ &= \arg\max_{1 \le s \le S} \sum_{n=1}^{N} \ln[p(x_n|\lambda_s)] \end{aligned} s=arg1sSmaxln[p(Xλs)]=arg1sSmaxn=1Nln[p(xnλs)]
      取对数是为计算简便
  • GMM的缺点
    • GMM假设被辨认的每个说话人的先验概率都是一样的,这其实上限制了GMM只能用于闭集的说话人辨认问题,GMM不能用于区分仿冒说话人和注册说话人,对于开集说话人辨认问题,GMM效果并不好
    • 由于每个说话人对应于一个GMM,所以当说话人的话语样本非常少时,GMM的参数估计非常不可靠,很容易过拟合,如果要求用户提供大量的话语用于注册,则会显著降低用户体验

GMM-UBM(Universal Background Model,通用背景模型)

对于GMM的上述缺点,研究人员提出了另一个GMM模型,称为UBM。

  • UBM是说话人无关(Speaker-independent)的GMM模型,用于表示区分仿冒说话人和注册说话人
  • GMM-UBM基于假设检验
    • 假设 H 0 H_0 H0:当前话语来自于假设的注册说话人
    • 假设 H 1 H_1 H1:当前话语来自于仿冒说话人
  • 两个假设的对数似然比:
    L ( X ) = ln ⁡ p ( X ∣ λ ) − ln ⁡ p ( X ∣ λ H 1 ) L(X) = \ln p(X|\lambda) - \ln p(X|\lambda_{H_1}) L(X)=lnp(Xλ)lnp(XλH1)
    其中,

    • ln ⁡ p ( X ∣ λ ) \ln p(X|\lambda) lnp(Xλ) 为假设的注册说话人的GMM对数似然概率
    • ln ⁡ p ( X ∣ λ H 1 ) \ln p(X|\lambda_{H_1}) lnp(XλH1) 为UBM的对数似然概率
    • L ( X ) > 0 L(X) > 0 L(X)>0,则接受假设 H 0 H_0 H0;否则,接受假设 H 1 H_1 H1
  • 由于UBM本身也是一个GMM,所以可以用上述的方法进行参数估计,参数估计所用的数据为所有说话人的话语样本
  • 得到UBM之后,还需要得到每个说话人对应的GMM
  • 在GMM-UBM中,不去直接对GMM进行参数估计,而是根据UBM的参数,利用贝叶斯自适应(Bayesian Adaptation)方法,得到每个说话人对应的GMM参数
  • 贝叶斯自适应方法非常复杂,本文不去深究,而是给出贝叶斯自适应方法的优点
    • 所有的说话人对应的GMM,都从UBM自适应而来,使这些GMM具有可比性
    • 由于UBM是基于大量说话人数据训练的,所以自适应到少样本说话人的GMM时,不会发生严重的过拟合
    • 实验表明,贝叶斯自适应方法能提升性能
  • 贝叶斯自适应方法有不同的自适应策略
    • 第一层:自适应所有参数,包括权重、均值和协方差矩阵
    • 第二层:自适应权重、冻结均值和协方差矩阵
    • 第三层:自适应均值,冻结权重和协方差矩阵
  • 说话人识别领域最佳实践:自适应均值,冻结权重和协方差矩阵。对于这一策略:
    • 如果将GMM的每个高斯分量的均值串联(Concatenate)起来,将得到一个较长的向量,称为 supervector 超向量
    • 超向量就是最早的声纹嵌入码(Speaker Embedding),每个说话人都对应于一个超向量

GMM-SVM(Support Vector Machine,支持向量机)

在GMM-UBM框架下,每个说话人都可以被一个超向量表征,因此利用非线性支持向量机来对这些超向量进行分类,下面简述GMM-SVM方法(以后可能会出一期深入理解SVM)

  • 线性SVM决策函数形式: w x − b wx-b wxb。但在实际应用中,原始的样本点所在的空间,常常不具有线性可分性
  • 非线性SVM的步骤
    1. 先对原始样本点作非线性变换 ϕ ( ⋅ ) \phi(\cdot) ϕ(),非线性变换后,得到一个新的样本空间
    2. 新的样本空间应该具有线性可分性
    3. 使用线性SVM进行分类
  • 非线性SVM的核技巧(Kernel Trick)
  • 实际上,并不需要直接寻找非线性变换 ϕ ( ⋅ ) \phi(\cdot) ϕ()
  • 只需要对两个不同的样本应用核函数K(Kernel Function),使得核函数满足:
    K ( x 1 , x 2 ) = ϕ ( x 1 ) T ϕ ( x 2 ) K(x_1,x_2) = \phi(x_1)^T\phi(x_2) K(x1,x2)=ϕ(x1)Tϕ(x2)
  • 从而非线性SVM的决策函数就可以被定义为:
    g ( x ) = ∑ i = 1 N [ α i y i K ( x , x i ) ] + b g(x) = \sum_{i=1}^{N} [\alpha_iy_iK(x,x_i)] +b g(x)=i=1N[αiyiK(x,xi)]+b
    其中,

    • α i ≥ 0 \alpha_i \ge 0 αi0,需要从训练数据中得到
    • 对于非线性SVM,大部分 α i = 0 \alpha_i = 0 αi=0
    • 大于0的 α i \alpha_i αi 所对应的样本点,被称为非线性SVM的支持向量(也叫支持点)
    • 注意,核函数的运算结果是一个标量
  • 常用核函数
    • 非齐次多项式: K ( x 1 , x 2 ) = ( x 1 ⋅ x 2 + 1 ) d K(x_1,x_2)=(x_1 \cdot x_2 +1)^d K(x1,x2)=(x1x2+1)d
    • 齐次多项式: K ( x 1 , x 2 ) = ( x 1 ⋅ x 2 ) d K(x_1,x_2)=(x_1 \cdot x_2)^d K(x1,x2)=(x1x2)d
    • 高斯径向基核函数(Radial Basis Function Kenel,RBF Kernel): K ( x 1 , x 2 ) = exp ⁡ ( − γ ∥ x 1 − x 2 ∥ 2 ) K(x_1,x_2)=\exp(-\gamma \left \| x_1 - x_2 \right \| ^2) K(x1,x2)=exp(γx1x22),其中 γ > 0 \gamma > 0 γ>0
    • 双曲正切: K ( x 1 , x 2 ) = tanh ⁡ ( − κ x 1 ⋅ x 2 + c ) K(x_1,x_2)= \tanh (-\kappa x_1 \cdot x_2 +c) K(x1,x2)=tanh(κx1x2+c),其中 κ > 0 , c < 0 \kappa > 0, c<0 κ>0,c<0
  • 说话人识别领域核函数,假设有两段话语 u ( a ) u^{(a)} u(a)u ( b ) u^{(b)} u(b),GMM-UBM贝叶斯自适应冻结权重和协方差矩阵,只自适应均值
    • 超向量线性核函数: K ( u a , u b ) = ∑ i = 1 M c i ( μ i ( a ) ) T Σ i − 1 μ i ( b ) K(u_a,u_b) = \sum_{i=1}^{M} c_i(\mu_i^{(a)})^T \Sigma_i^{-1} \mu_i^{(b)} K(ua,ub)=i=1Mci(μi(a))TΣi1μi(b)
    • L 2 L_2 L2 内积核函数: K ( u a , u b ) = ∑ i = 1 M ∑ j = 1 M c i c j N ( μ i ( a ) − μ j ( b ) ∣ 0 , Σ i + Σ j ) K(u_a,u_b) = \sum_{i=1}^{M} \sum_{j=1}^{M} c_i c_j N(\mu_i^{(a)}-\mu_j^{(b)}|0,\Sigma_i + \Sigma_j) K(ua,ub)=i=1Mj=1McicjN(μi(a)μj(b)∣0,Σi+Σj)
    • 超向量线性核函数要好于 L 2 L_2 L2 内积核函数
    • 两种核函数性能都好于原始的GMM-UBM
  • GMM-SVM与GMM-UBM的区别
    • GMM-UBM中每个说话人被表示为一个GMM
    • GMM-SVM中每个话语被表示为一个GMM,每个说话人被表示为一个SVM的类

GMM、GMM-UBM、GMM-SVM相关推荐

  1. 高斯混合模型GMM、核心参数、高斯混合模型GMM的数学形式

    高斯混合模型GMM.核心参数.高斯混合模型GMM的数学形式 高斯混合模型GMM 混合模型是一个可以用来表示在总体分布(distribution)中含有 K 个子分布的概率模型,换句话说,混合模型表示了 ...

  2. stata外部命令大全(包含面板门槛、系统GMM、空间计量、Pvar、中介效应等)

    1.数据来源:自主整理 2.时间跨度:无 3.区域范围:无 4.指标说明: 该些外部命令包含面板门槛.系统GMM.空间计量.pvar.中介效应等涵盖全部 以下是部分命令截图: 空间计量: 系统GMM( ...

  3. 运动目标检测(GMM、Code Book、Vibe)

    运动目标检测(前景背景分离)被认为是视频分析学习的入门基础,分为以像素为特征的方法和以纹理为特征的方法,以纹理为特征的方法主要参考上节所讲的LBP和SILTP,这里我们重点介绍像素方法,像素方法是最常 ...

  4. 机器学习算法大汇总--线性回归、逻辑回归、正则化、神经网络、SVM、K-Means、PCA、集成学习等!

    本文很长~请耐心观看 另:本文主要用于本人的复习使用,欢迎大佬的指正和添加. 还有:本人也只是初出茅庐,希望大佬手下留情,谢谢!! 1.算法分类 机器学习算法分为: 有监督,无监督 两大阵营 1.有监 ...

  5. R语言分类模型:逻辑回归模型LR、决策树DT、推理决策树CDT、随机森林RF、支持向量机SVM、Rattle可视化界面数据挖掘、分类模型评估指标(准确度、敏感度、特异度、PPV、NPV)

    R语言分类模型:逻辑回归模型LR.决策树DT.推理决策树CDT.随机森林RF.支持向量机SVM.Rattle可视化界面数据挖掘.分类模型评估指标(准确度.敏感度.特异度.PPV.NPV) 目录

  6. 支持向量机(SVM):超平面及最大间隔化、支持向量机的数学模型、软间隔与硬间隔、线性可分支持向量机、线性支持向量机、非线性支持向量机、核函数、核函数选择、SMO算法、SVM vs LR、优缺点

    支持向量机(SVM):超平面及最大间隔化.支持向量机的数学模型.软间隔与硬间隔.线性可分支持向量机.线性支持向量机.非线性支持向量机.核函数.核函数选择.SMO算法.SVM vs LR.优缺点 目录

  7. ML之回归预测:利用十类机器学习算法(线性回归、kNN、SVM、决策树、随机森林、极端随机树、SGD、提升树、LightGBM、XGBoost)对波士顿数据集回归预测(模型评估、推理并导到csv)

    ML之回归预测:利用十类机器学习算法(线性回归.kNN.SVM.决策树.随机森林.极端随机树.SGD.提升树.LightGBM.XGBoost)对波士顿数据集[13+1,506]回归预测(模型评估.推 ...

  8. Interview:算法岗位面试—10.24下午—上海某软件公司(机器学习,上市)电话面试—考察SVM、逻辑回归、降低过拟合、卷积网络基础等

    Interview:算法岗位面试-10.24下午-上海某软件公司(机器学习,上市)电话面试-考察SVM.逻辑回归.降低过拟合.卷积网络基础等 导读:当时电话来的非常快,我刚做完一家公司的笔试,接着来了 ...

  9. Spark MLlib回归算法------线性回归、逻辑回归、SVM和ALS

    Spark MLlib回归算法------线性回归.逻辑回归.SVM和ALS 1.线性回归: (1)模型的建立: 回归正则化方法(Lasso,Ridge和ElasticNet)在高维和数据集变量之间多 ...

  10. 人工智能重点汇总(搜索策略、博弈、贝叶斯、SVM、神经网络、弧相容、SVM、决策树、反向传播、卷积神经网络)

    前言:智能Agent 理性Agent:信息手机 + 自主学习: 任务环境(PEAS)四要素: 性能: 环境: 执行器: 传感器: ❗ 环境的性质 环境的性质决定了agent的设计 最难处理的情况: ...

最新文章

  1. Hadoop学习笔记一 简要介绍
  2. Oracle 工程师离职并回踩:MySQL 糟糕透顶,强烈推荐 PostgreSQL
  3. 记最近Linux中遇到cpu使用率低loadavg高的分析过程
  4. git丢弃本地修改的所有文件(新增、删除、修改)
  5. 实现对象的复用——享元模式
  6. C#进阶系列——使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)...
  7. POJ 1308 Is It A Tree? (并查集)
  8. LeetCode100 相同的树-简单
  9. php curl_init不能用,curl_init()函数不起作用
  10. sql 转置_SQL 如何实现动态的行列转置
  11. could not be installed at this time
  12. php监控nginx,zabbix php nginx 监控搭建
  13. 服务器session文件什么时候销毁,node中session存储与销毁,及session的生命周期
  14. uniapp 使用uView UI教程
  15. BZOJ4200: [Noi2015]小园丁与老司机
  16. python中的round()函数
  17. 带有分销体系的开源知识付费系统——cremb
  18. Head First Java学习笔记(17):包、jar存档文件和部署
  19. 计算机桌面为什么没有语言栏了,电脑语言栏不见了的解决方法
  20. MySQL的索引(聚簇索引和非聚簇索引)

热门文章

  1. 爬取百思不得姐网站上的MP4视频,有限制,必须是网页内有mp4才行,18年3月之后百思不得姐网页版改版之后不行了
  2. 开发者危机!GitHub、GitLab 全部大裁员
  3. js 中编码(encode)和解码(decode)方法
  4. 法学论文应该注重论证形式
  5. 大数据时代互联网创业者的蓝海战略思维
  6. 关于网络安全设备总结
  7. 一个了不起的非洲小伙子-威廉.坎宽巴
  8. KVM- Guest Enter Guest Exit
  9. 生日蜡烛问题(蓝桥杯算法)
  10. Linux 非root用户安装CUDA,CUDNN