机器学习算法性能严重依赖于特征,因此在传统机器学习中,大部分工作都在于数据的处理和转换上,以期得到好的特征使得机器学习算法更有效。特征工程的目的就在于此,将人的先验知识转化为可以被机器学习算法识别的特征,以弥补其自身的缺点。
如果存在一种可以从数据中得到判别性特征的方法,就会减少机器学习算法对特征工程的依赖,从而更好更快地将机器学习应用到更多的领域,这就是表示学习。
3个问题:
一个好的表示需要尽可能地描述一些高层次的抽象特征,以便后续的模型可以高效地利用这个特征,减小后续模型的“压力”,如果使用原始数据会十分困难。
机器学习中对一个对象的表示有两种常见的方式。最简单且不需要学习的方式是独热向量编码(one-hot)。
而分布式表示是另一种方式,它是通过某种方式得到一个低维稠密的向量来表示研究对象,最典型的就是颜色RGB。分布式表示可以显示出颜色之间的相关联系(相似度),而独热编码所有相似度均为0.
端到端学习是表示学习和任务学习的组合,它们不是完全分裂的。具体来说,它们是联合优化的,反向传播算法将误差从输出层向前传递直到输入层(任务学习),优化算法动态地调节模型参数使得模型可以自动提取到与任务相关的判别性特征(表示学习),这显示出深度学习的优越性。
以卷积神经网络为例,前面部分可以看做表示学习。
层次化表达:低层卷积主要提取低层次的特征,高层卷积主要提取抽象的、与任务有关的特征。低层次特征更加通用,高层次特征更加抽象、与任务有关。迁移学习就是基于此的,将已经学习过的知识迁移到新的问题中去,典型应用是微调,即以在其它数据集上训练好的模型为基础,在新的数据集上调整。
表示学习的目标:将输入映射映射到一个低维向量空间中。有两种方法:基于重构损失的方法和基于对比损失的方法。
自编码器是一种表示学习模型,但它不利用标签信息进行监督,而是以输入数据为参考,是一种无监督学习模型,可用于数据降维和特征提取。
核心思想:将输入映射到某个特征空间,再从这个特征空间映射回输入空间进行重构。
由编码器和解码器构成,编码器用于从输入数据提取特征,解码器用于提取的特征重构出输入数据。训练完成后使用编码器进行特征提取。
最简单的自编码器由一个输入层,一个隐藏层和一个输出层组成,输入层到隐藏层是编码器,隐藏层到输出层是解码器。输入维度n,隐藏层维度d,输出维度n,即 输 入 x ∈ R n , W e n c ∈ R d × n , 编 码 后 特 征 h ∈ R d , 重 构 输 入 x ~ , W d e c ∈ R n × d 输入\pmb x\in \pmb R^n,\pmb W_{enc}\in \pmb R^{d \times n},编码后特征\pmb h\in \pmb R^d,重构输入\pmb {\tilde x},\pmb W_{dec}\in\pmb R^{n\times d} 输入xxx∈RRRn,WWWenc∈RRRd×n,编码后特征hhh∈RRRd,重构输入x~x~x~,WWWdec∈RRRn×d
h = σ ( W e n c x + b e n c ) x ~ = σ ( W d e c h + b d e c ) \pmb h=\sigma(W_{enc}\pmb x+\pmb b_{enc}) \\ \tilde {\pmb x}=\sigma(W_{dec}\pmb h+\pmb b_{dec}) hhh=σ(Wencxxx+bbbenc)xxx~=σ(Wdechhh+bbbdec)
然后基于损失函数通过反向传播计算误差,利用梯度下降法不断优化参数
L = 1 N ∑ i ∣ ∣ x i − x ~ i ∣ ∣ 2 2 L=\frac{1}{N}\sum_i||x_i-\tilde x_i||_2^2 L=N1i∑∣∣xi−x~i∣∣22
如果用 f 和 g f和g f和g分别表示编码和解码,那么
L = 1 N ∑ i ∣ ∣ x i − g ( f ( x i ) ) ∣ ∣ 2 2 L=\frac{1}{N}\sum_i||x_i- g(f(x_i))||_2^2 L=N1i∑∣∣xi−g(f(xi))∣∣22
一般 d < n d
如果要放宽维度限制, d ≥ n d\ge n d≥n,这种编码器称为过完备自编码器,如果没有限制,会将输入直接拷贝因此不会学习到任何有用的特征,这个问题的本质原因不是维度约束的变化,而是当能力过强的时候,模型会有这个倾向(这么学习是最稳定的)。因此需要一些正则化的约束。
1.去噪自编码器
在原始输入上加入了一些噪声作为编码器的输入,解码器要重构出不加噪声的原始输入 x \pmb x xxx,通过这样来提取有用信息以恢复数据。
具体的做法是将输入 x \pmb x xxx的一部分置为0.
2.稀疏自编码器
稀疏自编码器中,重构误差中添加了一个稀疏惩罚,用来限定任何时刻的隐藏层中并不是所有神经元都被激活。使用一个超参数 ρ i \rho_i ρi表示一个神经元期望的活跃度,即一个神经元在所有样本上取值的平均值,对于 ρ i \rho_i ρi偏离较多的神经元进行惩罚,使用相对熵(KL散度)表示:
L s p r a s e = ∑ j = 1 d ( ρ log ρ ρ ^ j + ( 1 − ρ ) log 1 − ρ 1 − ρ ^ j ) L_{sprase}=\sum_{j=1}^d(\rho\log\frac{\rho}{\hat \rho_j}+(1-\rho)\log\frac{1-\rho}{1-\hat \rho_j}) Lsprase=j=1∑d(ρlogρ^jρ+(1−ρ)log1−ρ^j1−ρ)
相对熵量化了两个概率分布之间的差异,两个分布相差越大熵值越大;两个分布完全相同时为。因此
L = L ( x i , g ( f ( x i ) ) ) + λ L s p a r s e L=L(\pmb x_i,g(f(\pmb x_i)))+\lambda L_{sparse} L=L(xxxi,g(f(xxxi)))+λLsparse
作用:生成新的样本数据。
目标:希望构建一个从隐变量Z生成目标数据X的模型,但是实现上有所不同。
思想:每个样本都受到一些因素的控制,这些因素叫做隐变量,用向量 z z z表示,概率密度函数为 p ( z ) p(z) p(z),同时有函数 f ( z ; θ ) f(z;\theta) f(z;θ),它可以把从 p ( z ) p(z) p(z)中采样的数据 z z z映射为与 X X X比较相似的样本数据,即 p ( X ∣ z ) p(X|z) p(X∣z)的概率更高。通过下式求解 p ( X ) p(X) p(X)的分布
p ( X ) = ⎰ z p ( x ∣ z ) p ( z ) d z p(X)=\lmoustache_z p(\pmb x|z)p(z)dz p(X)=⎰zp(xxx∣z)p(z)dz
两个问题:
假设z服从标准正态分布,而 p ( x ∣ z ) p(x|z) p(x∣z)服从均值为 f ( z ; θ ) f(z;\theta) f(z;θ),方差为 σ I 2 , σ 是 超 参 数 \sigma I^2,\sigma 是超参数 σI2,σ是超参数。
上述假设合理的原因是任何一个d维的复杂分布都可以通过对d维的正态分布使用一个复杂变换得到。
p ( x ∣ z ) p(x|z) p(x∣z)通常接近0,无法估计 p ( X ) p(X) p(X),需要的是大概率生成比较像x的z,因此需要知道z的后验分布 p ( z ∣ x ) p(z|x) p(z∣x),因此引入 q ( z ∣ x ) q(z|x) q(z∣x)来近似,两者的KL距离如下
D K L ( q ( z ∣ x ) ∣ ∣ p ( z ∣ x ) ) = E z ∼ q ( z ∣ x ) ( log q ( z ∣ x ) − log p ( z ∣ x ) ) D_{KL}(q(z|x)||p(z|x))=E_{z\sim q(z|x)}(\log q(z|x)-\log p(z|x)) DKL(q(z∣x)∣∣p(z∣x))=Ez∼q(z∣x)(logq(z∣x)−logp(z∣x))
运用贝叶斯展开
D K L ( q ( z ∣ x ) ∣ ∣ p ( z ∣ x ) ) = E z ∼ q ( z ∣ x ) ( log q ( z ∣ x ) − log p ( z ) − log p ( x ∣ z ) ) + log p ( x ) E z ∼ q ( z ∣ x ) log p ( x ) − D K L ( q ( z ∣ x ) ∣ ∣ p ( z ∣ x ) ) = E z ∼ q ( z ∣ x ) ( log p ( x ∣ z ) ) − D K L ( q ( z ∣ x ) ∣ ∣ p ( z ) ) D_{KL}(q(z|x)||p(z|x))=E_{z\sim q(z|x)}(\log q(z|x)-\log p(z)-\log p(x|z))+\log p(x) \\E_{z\sim q(z|x)} \log p(x)-D_{KL}(q(z|x)||p(z|x))=E_{z\sim q(z|x)}(\log p(x|z))-D_{KL}(q(z|x)||p(z)) DKL(q(z∣x)∣∣p(z∣x))=Ez∼q(z∣x)(logq(z∣x)−logp(z)−logp(x∣z))+logp(x)Ez∼q(z∣x)logp(x)−DKL(q(z∣x)∣∣p(z∣x))=Ez∼q(z∣x)(logp(x∣z))−DKL(q(z∣x)∣∣p(z))
第二个公式是变分自编码器的核心。左边包含了优化目标 p ( x ) p(x) p(x);右边第一项实际上是一个解码器,将基于x得到的最有可能生成相似样本的隐变量采样出来,通过解码器得到生成的样本 ,右边第二项是一个正则项。右边两项都可以用正态分布表示,使用梯度下降法就可以进行优化。
解决采样不可导的问题可以从标准正态分布中采样得到 ξ \xi ξ,则隐变量计算为 z = ξ μ ( x ) + σ ( x ) z=\xi\mu(x)+\sigma(x) z=ξμ(x)+σ(x),这样就解决了反向传播的问题。
vs 自编码器
传统的自编码器的隐藏层空间是不连续的,其由样本点编码构成,如果输入样本中没有那么在隐藏层中也就没有对应的特征,解码器也就不能给出有意义的输出。而变分自编码器则是要建模样本的分布p(x)$,所以之后解码器可以生成样本。
自然语言处理中,表示一个词的方法有独热编码、词袋模型、基于词的上下文构建的共现矩阵等方法,都无法避免维度过高、稀疏性等问题。Word2vec基于词嵌入的思想,将词嵌入到一个向量空间中,**用一个低维的向量来表达每个词,并且语义相关的词距离更近。**解决了高维和数据稀疏的问题。
Word2vec两种思想:
一方面要增大正样本的概率,另一方面要减少负样本的概率,增加 U w c ⋅ V w U_{w_c}\cdot V_w Uwc⋅Vw就是增大正样本的概率,也就是中心词和上下文词的相似度,相反与非上下文词相似度就会减小。收敛之后,U,V就是我们需要的词向量,通常选择U作为最终的词向量。这种构建正负样本,最大化正样本之间的相似度,最小化负样本之间的相似度的方式就是表示学习中构建损失函数的一种常用思路,这类损失我们叫做对比损失。
负样本比正样本多得多,一般无法计算所有的负样本(代价过大)。使用负采样技术
− log σ ( U w c V w ) − ∑ i = 1 n log σ ( − U w c V N E G ( w c ) i ) -\log \sigma(U_{w_c}V_w)-\sum_{i=1}^{n}\log \sigma(-U_{w_c}V_{NEG(w_c)_i}) −logσ(UwcVw)−i=1∑nlogσ(−UwcVNEG(wc)i)
其中 N E G ( w c ) i NEG(w_c)_i NEG(wc)i表示采样得到的与 w c w_c wc构成的负样本的词集合,每次采样n个词语,远小于 ∣ V ∣ |V| ∣V∣.在采样的时候不是均匀采样,而是基于词频的带权重采样,这种采样方式优化了词向量的互信息,效果更好。
Word2vec的几种优化可以参考:https://blog.51cto.com/u_15127544/2663005
1,在他们的模型中将常见单词对或短语视为单个“单词”。
2,对频繁的词进行抽样以减少训练样例的数量。
3,使用他们所谓的“负抽样”技术来修改优化目标,使得每个训练样本只更新模型权重的一小部分。
Word2vec的几种优化可以参考:https://blog.51cto.com/u_15127544/2663005
1,在他们的模型中将常见单词对或短语视为单个“单词”。
2,对频繁的词进行抽样以减少训练样例的数量。
3,使用他们所谓的“负抽样”技术来修改优化目标,使得每个训练样本只更新模型权重的一小部分。