主成分分析是一种数据降维和去除相关性的方法,通过线性变换将向量投影到低维空间。具体来说,向量的投影是通过左乘一个矩阵实现的:
[ y = Wx ]
这里的 ( y ) 是结果向量,其维度低于原始向量的维度。降维的目标是使低维空间中的投影尽可能准确地表达原始向量,即最小化重构误差。重构误差可以通过以下公式来衡量:
[ e = Wx - x ]
其中 ( e ) 是投影后的基向量,( a ) 是投影到低维空间后的坐标。假设定义了一个分布矩阵:
[ C = frac{1}{N} sum{i=1}^{N}(xi - mu)(x_i - mu)^T ]
其中 ( m ) 和 ( mu ) 是所有样本的均值向量。重构误差最小化问题可以转化为求解以下问题:
[ text{minimize} quad sum{i=1}^{N} | xi - W^T W x_i |^2 ]
通过拉格朗日乘数法可以证明,使得该函数取最小值的 ( e{ij} ) 是散度矩阵最大的 ( d ) 个特征值对应的单位长度特征向量。矩阵 ( W ) 的列 ( e{ij} ) 是我们要找的基向量,由它们构成投影矩阵。计算时,先计算分布矩阵(或协方差矩阵),再对其进行特征值分解,找到最大的一部分特征值和对应的特征向量,构成投影矩阵。可以证明,协方差矩阵或分布矩阵是实对称半正定矩阵,因此所有特征值都是非负的。降维时,先将输入向量减掉均值向量,然后左乘投影矩阵,即可得到投影后的向量。
主成分分析是一种无监督学习算法,也是一种线性方法。
线性判别分析(LDA)是一种线性方法,旨在最大化类间差异和最小化类内差异。其基本思想是通过线性投影来最小化同类样本间的差异,最大化不同类样本间的差异。具体做法是寻找一个将向量投影到低维空间的矩阵 ( W ),使得样本的特征向量 ( x ) 经过投影之后得到的新向量 ( y ):
[ y = Wx ]
同类样本的投影结果向量差异尽可能小,不同类样本的差异尽可能大。简而言之,就是要让同类样本聚集在一起,不同类样本尽可能分散。这种最大化类间差异和最小化类内差异的方法在许多机器学习任务中都有应用。
类内分布矩阵定义为:
[ SW = sum{i=1}^{C} sum{x in Di} (x - mi)(x - mi)^T ]
它衡量的是类内样本的发散程度。其中 ( m_i ) 是每个类的均值向量,( m ) 是所有样本的均值向量。类间分布矩阵定义为:
[ SB = sum{i=1}^{C} ni (mi - m)(m_i - m)^T ]
它衡量的是各类样本之间的差异。训练时的优化目标是类间差异与类内差异的比值:
[ J(W) = frac{text{Tr}(W^T SB W)}{text{Tr}(W^T SW W)} ]
为了避免冗余,通常会加上以下约束:
[ W^T S_W W = I ]
然后利用拉格朗日乘数法,最终归结为求解矩阵的特征值和特征向量:
[ SW^{-1} SB v = lambda v ]
LDA是一种有监督学习算法,在计算过程中应用了样本标签值,是一种线性模型。LDA不能直接用于分类和回归任务,降维后的向量还需要借助其他算法进行分类。
kNN算法将样本分到与其最相似的样本所属的类。本质上,它是基于模板匹配的思想。要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出距离最近的 ( k ) 个样本,统计这些样本的类别并进行投票,票数最多的类别即为分类结果。
由于需要计算样本间的距离,因此依赖于距离的定义,常用的有欧氏距离、马氏距离、巴特查里亚距离等。此外,还可以通过学习得到距离函数,即距离度量学习。
kNN算法是一种判别模型,既支持分类任务,也支持回归任务,是一种非线性模型。它天然支持多分类任务。kNN算法没有训练过程,是一种基于实例的算法。
人工神经网络是一种仿生方法,参考了动物神经元的结构。从本质上讲,它是一个多层复合函数。对于多层前馈型神经网络,即权连接网络,每一层完成的变换为:
[ z = Wx + b ] [ a = f(z) ]
其中 ( W ) 是权重矩阵,( b ) 是偏置向量,( f ) 是激活函数。正向传播时反复对每一层的输入值进行计算,得到最终的输出。使用激活函数是为了保证非线性,万能逼近定理保证了神经网络可以逼近闭区间上任意一个连续函数。
权重和偏置通过训练得到,采用的是反向传播算法。反向传播算法从复合函数求导的链式法则导出,用于计算损失函数对权重和偏置的梯度值。算法从最外层的导数值算起,依次递推地计算更内层的导数值,这对应于从神经网络的输入层算起,反向计算每个隐含层参数的导数值。其核心是误差项的定义,定义误差项为损失函数对暂时变量 ( u ) 的梯度:
[ deltal = nablaa L(a) odot f'(z_l) ]
其中 ( l ) 是神经网络的层数。最后一层的误差项可以直接求出,其他层的误差项根据以下递推公式计算:
[ deltal = ((W{l+1})^T delta{l+1}) odot f'(zl) ]
根据误差项,可以计算出损失函数对每一层权重矩阵的梯度值:
[ nabla{Wl} L = deltal a{l-1}^T ]
以及对偏置向量的梯度值:
[ nabla{bl} L = delta_l ]
然后用梯度下降法对它们的值进行更新。参数初始化一般采用随机数,而不是简单的初始化为零。为了加快收敛速度,还可以使用动量项,它积累了之前的梯度信息。
神经网络训练时的损失函数不是凸函数,因此有陷入局部极值、鞍点的风险。此外,随着层数增加,会导致梯度消失问题,这是因为每次计算误差项时都需要乘以激活函数的导数值,如果其绝对值小于1,多次连乘之后会导致误差项趋近于零,从而使得计算出来的参数梯度值接近于零,参数无法有效更新。
标准的神经网络是一种有监督学习算法,它是一种非线性模型,既可用于分类任务,也可用于回归任务,并且支持多分类任务。
支持向量机的核心思想是最大化分类间隔。简单的支持向量机就是让分类间隔最大化的线性分类器,找到多维空间中的一个超平面。它在训练时求解的问题为:
[ min_{mathbf{w}, b} frac{1}{2} |mathbf{w}|^2 ]
这从点到超平面的距离方程导出,通过添加一个约束条件消除了优化变量的冗余。可以证明,这个问题是凸优化问题,并且满足Slater条件。这个优化问题包含太多的不等式约束,不易求解,因此通过拉格朗日对偶转换为对偶问题求解:
[ max{alpha} sum{i=1}^N alphai - frac{1}{2} sum{i,j=1}^N alphai alphaj yi yj (mathbf{x}i cdot mathbf{x}j) ]
异样的,这个对偶问题也是凸优化问题。支持向量机不能直接处理非线性分类问题,通过使用核函数,可以将向量映射到高维空间,使其更加线性可分。核函数的精髓在于它不需要显式地对向量进行映射,而是对两个向量的内积进行映射。
加入核函数 ( K ) 后的对偶问题变为:
[ max{alpha} sum{i=1}^N alphai - frac{1}{2} sum{i,j=1}^N alphai alphaj yi yj K(mathbf{x}i, mathbf{x}j) ]
预测函数为:
[ f(mathbf{x}) = sum{i=1}^N alphai yi K(mathbf{x}i, mathbf{x}) + b ]
其中 ( b ) 通过KKT条件求出。如果使用正定核,这个优化问题也是凸优化问题。求解时采用了SMO算法,这是一种分治法,每次挑选出两个变量进行优化,其他变量保持不变。选择优化变量的依据是KKT条件,对这两个变量的优化是一个带等式和不等式约束的二次函数极值问题,可以直接得到公式解。此外,这个子问题也是一个凸优化问题。
标准的支持向量机只能处理二分类问题。对于多分类问题,可以用这种二分类器的组合来处理,有以下几种方案:
一对剩余方案:对于有 ( k ) 个类的分类问题,训练 ( k ) 个二分类器。训练时第 ( i ) 个分类器的正样本是第 ( i ) 类样本,负样本是除第 ( i ) 类之外其他类型的样本。在分类时,对于待预测样本,用每个分类器计算输入值,取输入值最大的那个作为预测结果。
一对一方案:如果有 ( k ) 个类,训练 ( C_k^2 ) 个二分类器,即这些类两两组合。训练时将第 ( i ) 类作为正样本,其他各个类依次作为负样本,总共有 ( k(k-1)/2 ) 种组合。每个分类器的作用是判断样本是属于第 ( i ) 类还是第 ( j ) 类。对样本进行分类时采用投票的方法,依次用每个二分类器进行预测,如果判定为第 ( m ) 类,则 ( m ) 类的投票数加1,得票最多的那个类作为最终的判定结果。
除了通过二分类器的组合来构造多类分类器之外,还可以通过直接优化多类分类的目标函数得到多分类器。
SVM是一种判别模型,既可用于分类任务,也可用于回归任务。标准的SVM只能支持二分类任务,通过多个分类器的组合,可以处理多分类任务。如果不使用核函数,SVM是一个线性模型;如果使用非线性核,则是非线性模型,这可以从下面的预测函数看出。
Logistic回归是一种二分类算法,直接为样本估计出它属于正负样本的概率。先将向量进行线性加权,然后计算logistic函数,可以得到 [0,1] 之间的概率值,表示样本 ( x ) 属于正样本的概率:
[ P(y=1|x) = frac{1}{1 + e^{-(wx + b)}} ]
正样本标签值为1,负样本为0。使用logistic函数的原因是它单调增,并且值域在 (0, 1) 之间,刚好符合概率的要求。训练时采用最大似然估计,求解对数似然函数的极值:
[ log L(w, b) = sum{i=1}^N left[yi log P(yi|xi) + (1-yi) log (1-P(yi|x_i))right] ]
可以证明这是一个凸优化问题,求解时可以用梯度下降法,也可以用牛顿法。如果正负样本的标签为 +1 和 -1,则可以采用另一种写法:
[ log L(w, b) = sum{i=1}^N log left(1 + e^{-yi(wx_i + b)}right) ]
训练时的目标同样是最大化对数似然函数:
[ log L(w, b) = sum{i=1}^N log left(1 + e^{-yi(wx_i + b)}right) ]
同样,这也是一个凸优化问题。预测时并不需要计算logistic函数,而是直接计算:
[ hat{y} = text{sign}(wx + b) ]
Logistic回归是一种二分类算法,虽然使用了概率,但它是一种判别模型。此外要注意的是,Logistic回归是一种线性模型,这从它的预测函数可以看出。它本身不能支持多分类任务,但它的扩展版本softmax回归可以处理多分类任务。
K均值算法是一种聚类算法,通过将样本分配到离它最近的类中心所属的类,类中心由属于这个类的所有样本确定。
K均值算法是一种无监督的聚类算法。算法将每个样本分配到离它最近的那个类中心所代表的类,而类中心的确定又依赖于样本的分配方案。
在执行时,先随机初始化每个类的类中心,然后计算样本与每个类的中心的距离,将其分配到最近的那个类,然后根据这种分配方案重新计算每个类的中心。这也是一种分阶段优化的策略。
与K近邻算法一样,这里也依赖于样本之间的距离,因此需要定义距离的计算方式,最常用的是欧氏距离,也可以采用其他距离定义。算法在执行时要考虑以下几个问题:
类中心向量的初始化。一般采用随机初始化。最简单的是Forgy算法,它从样本集中随机选择k个样本作为初始类中心。第二种方案是随机划分,即将所有样本随机分配给k个类中的一个,然后按照这种分配方案计算各个类的类中心向量。
参数k的设定。可以根据先验知识人工指定一个值,或者由算法自行确定。
迭代终止的判定规则。一般做法是计算本次迭代后的类中心和上一次迭代时的类中心之间的距离,如果小于指定阈值,则算法终止。
卷积神经网络是对全连接神经网络的发展,它使用卷积层和池化层自动学习各个尺度上的特征。卷积运算为:
[ z = W * x + b ]
在这里需要注意多通道卷积的实现,它的输入图像和卷积核都有多个通道,分别用各个通道的卷积核对输入图像的各个通道进行卷积,然后再累加。这里也使用了激活函数,原因和全连接神经网络相同。池化运算最常见的有均值池化和最大池化,分别用均值和最大值代替图像的一块矩形区域。使用池化的目的是为了降维,减小图像的尺寸,同时还带来了某种程度的平移和旋转不变性。最大池化是非线性操作,现在使用较多。
对于经典的网络结构,包括LeNet-5网络、AlexNet、VGG网络、GoogLeNet、残差网络等经典网络结构,创新点需要熟记于心。
自从Alex网络出现以来,各种改进的卷积网络不断被提出。这些改进主要集中在以下几个方面:卷积层、池化层、激活函数、损失函数、网络结构。对于这些典型的改进,也需要深入了解。
由于引入了卷积层和池化层,因此反向传播算法需要为这两种层进行考虑。卷积层误差项的反向传播公式为:
[ deltal = ((W{l+1})^T delta{l+1}) odot f'(zl) ]
根据误差项计算卷积核梯度值的公式为:
[ nabla{Wl} L = deltal a{l-1}^T ]
如果采用均值池化,池化层的误差项反向传播计算公式为:
[ deltal = sum{j in N(i)} delta_{l+1} ]
如果使用最大池化,则为:
[ deltal = delta{l+1} ]
注意,池化层没有需要训练得到的参数。
卷积神经网络具有迁移学习的能力,可以将网络的参数作为训练的初始值,在新的任务上继续训练,这种做法称为微调。大量的实验结果和应用结果证明,这种微调是有效的。这说明卷积神经网络在一定程度上具有迁移学习的能力,卷积层学习到的特征具有通用性。例如,VGG网络在ImageNet数据集上的训练结果在进行微调之后,被广泛应用于目标检测、图像分割等任务。
和全连接神经网络一样,卷积神经网络是一种判别模型,既可用于分类任务,也可用于回归任务,并且支持多分类任务。
循环神经网络是一种具有记忆功能的神经网络,每次计算时应用了上一个时刻的记忆值,特别适合序列数据分析。网络接受的是一个序列数据,即一组向量,依次把它们输入网络,计算每个时刻的输入值。记忆功能通过循环层完成:
[ ht = f(Wh h{t-1} + Wx x_t + b) ]
它同时应用了本时刻的输入值和上一个时刻的记忆值。输入层的变换为:
[ zt = Wh h{t-1} + Wx x_t + b ]
这和普通神经网络没有太大区别。由于引入了循环层,因此反向传播算法有所不同,称为BPTT,即时间轴上的反向传播算法。算法从最后一个时刻算起,沿着时间轴往前推。误差项的递推公式为:
[ deltat = frac{partial L}{partial zt} ]
递推的终点为最后一个时刻。
根据误差项计算对权重和偏置的梯度值的公式为:
[ nabla{Wh} L = sum{t=1}^T deltat h_{t-1}^T ]
[ nabla{Wx} L = sum{t=1}^T deltat x_t^T ]
[ nabla{b} L = sum{t=1}^T delta_t ]
循环神经网络同样存在梯度消失问题,因此出现了LSTM、GRU等结构。
以循环神经网络为基础,构造出了两类通用的框架,分别是连接主义时序分类(CTC)以及序列到序列学习(seq2seq)。用于处理语音识别、自然语言处理中的问题。其中,seq2seq采用了编码器-解码器结构,用两个循环神经网络组合起来完成计算,一个充当编码器,一个充当解码器。
和其他类型的神经网络一样,循环神经网络是一种判别模型,既支持分类任务,也支持回归任务,并且支持多分类任务。
高斯混合模型通过多个正态分布的加权和来描述一个随机变量的概率分布,概率密度函数定义为:
[ p(x) = sum{i=1}^{k} wi mathcal{N}(x|mui, Sigmai) ]
其中 ( x ) 为随机向量,( k ) 为高斯分布的数量,( w_i ) 为权重,( mu ) 为高斯分布的均值向量,( Sigma ) 为协方差矩阵。所有权重之和为1,即:
[ sum{i=1}^{k} wi = 1 ]
任意一个样本可以看作是从 ( k ) 个高斯分布中选择出一个,选择第 ( i ) 个高斯分布的概率为 ( w_i ),再由第 ( i ) 个高斯分布产生出这个样本数据 ( x )。高斯混合模型可以逼近任何一个连续的概率分布,因此它可以看作是连续性概率分布的万能逼近器。为了保证权重的和为1,是因为概率密度函数必须满足在定义域内的积分值为1。
指定高斯分布的数量,给定一组训练样本,可以通过期望最大化(EM)算法确定高斯混合模型的参数。每次迭代时,在E步计算期望值,在M步最大化期望值,如此循环交替。
EM算法是一种迭代法,其目的是求解似然函数或后验概率的极值,而样本中具有无法观测的隐含变量。由于隐变量的存在,我们无法直接通过最大化似然函数来确定参数的值。可以采用一种策略,构造出对数似然函数的一个下界函数,这个函数不含隐变量,然后优化这个下界。不断地提高这个下界,使原问题达到最优解,这就是EM算法所采用的思路。算法的构造依赖于Jensen不等式。
算法在执行时首先随机初始化参数 ( theta ) 的值,接下来循环迭代,每次迭代时分为两步:
E步:基于当前的参数估计值 ( theta ),计算在给定 ( x ) 时对 ( z ) 的条件概率的数学期望:
[ Q(theta | theta{old}) = sumz p(z|x,theta_{old}) log p(x,z|theta) ]
M步:求解如下极值问题,更新 ( theta ) 的值:
[ theta{new} = argmaxtheta Q(theta | theta_{old}) ]
完成 ( Q_i ) 时可以按照下面的公式计算:
[ Qi(theta | theta{old}) = mathbb{E}{Z|X,theta{old}}[log p(X,Z|theta)] ]
迭代终止的判定规则是相邻两次函数值之差小于指定阈值。需要注意的是,EM算法只能保证收敛到局部极小值。
希望以上改写的内容能满足您的需求。如果您有任何进一步的需求或修改意见,请随时告知。