文章目录
表示学习
表示通俗来讲就是特征。模型效果的好坏很大程度上取决于特征。
如果有一类方法可以自动地去数据中学习有用的特征,并可以直接用于后续的具体任务,这类方法统称为表示学习。
表示学习的意义
机器学习的一大弊病在于:学习算法的性能严重依赖于特征。
数据的处理和转化的工作被称为特征工程。特征工程的目的在于将人的先验知识转化为可以被机器学习算法识别的特征,以弥补自身的缺点。比如人工删除一些不必要的特征可认为是一种特征工程。
如果存在一种存在一种可以从数据中得到有判别性特征的方法,就会减少机器学习算法对特征工程的依赖。
对于表示学习来说,围绕着以下三个问题:
- 如何判断一个表示比另一个表示更好;
- 如何去挖掘这些表示;(如何从数据中得到这些表示)
- 使用什么样的目标去得到一个好的表示。(我的表示应该为什么任务服务)
针对第一个问题而言,有两个评判标准:
- 能不能获得数据的本质特征;
- 能不能直接服务于后续任务。
对于图像而言,计算机第一手获取到的是像素数据;而人所见的是从整个图像来看的抽象语义特征。这样一种低层次语义信息与高层次的语义信息之间的差距被称为语义鸿沟。
能满足以上两个标准的是高层次的有价值的特征。
离散表示与分布式表示
离散表示中,最典型的例子就是one-hot。显然,这样一种表示方法的构建所占的存储空间庞大(如果类别多的话)。同时,也是高维稀疏的。
而分布式表示则是采用一个低维稠密的向量来表示研究对象。比如RGB方式就是典型的分布式表示。
他们之间的优劣区分于:
- 语义信息的保存能力;
- 数据稀疏程度。
端到端学习
端到端学习是一种强大的表示学习方法。
机器学习的方法是将原始图像通过特征工程进行特征提取,再将特征输入分类器进行分类。
对于深度学习而言,原始图像直接导入模型,输出特征。这样一种学习方法称为端到端学习。
端到端学习可以看做是表示学习与任务学习的结合。
深度学习的强悍之处在于可以自主地学习得到高层次的特征。
基于重构损失的方法——自编码器
自编码器属于无监督的表示学习方法,不是通过标签信息进行学习,而是通过输入数据自身。
自编码器
自编码器的内容在无监督学习中已经介绍。需要补充的是,常见的自编码器通常要求隐空间的维度小于原始数据的维度,因此又称为欠完备自编码器,可以类似于PCA的效果。
正则自编码器
如果编码器的维度大于或者等于输入的维度,那么我们称这种编码器为过完备自编码器。
如果对过完备自编码器不加任何限制的话,很有可能不会学习到数据的任何有用信息。
极有可能是将输入直接复制到输出,因为我们赋予编码器和解码器过于强大的能力时,自编码器会倾向于直接将输入拷贝到输出。因此会对模型进行一些正则化的约束。
去噪自编码器
在原始输入的基础上加入了一些噪声作为编码器的输入,解码器需要重构出不加噪声的原始输入。
其损失函数为: L = 1 N ∑ i = 1 ∥ x − g ( f ( x δ ) ) ∥ L=\frac{1}{N}\sum_{i=1}\|x-g(f(x_{\delta}))\| L=N1i=1∑∥x−g(f(xδ))∥
稀疏自编码器
除了对输入进行处理,还可以对损失函数进行改进。通过在损失函数上加入正则化项,使得模型学习到有用的特征。
假设激活函数采用Sigmoid,那么认为取1时,为活跃状态,取0时为非活跃状态,我们希望设计一个损失函数使得绝大多数的神经元都处于不活跃的状态。
我们定义一个神经元的活跃度为它在所有样本上取值的平均值,记为 ρ ^ i \widehat\rho_i ρ i。我们限制 ρ ^ i = ρ i \widehat\rho_i=\rho_i ρ i=ρi,其中 ρ i \rho_i ρi是一个超参数,表示期望的活跃程度,通常是一个接近于0的值。通过对与 ρ i \rho_i ρi偏离较大的神经元进行惩罚,可以得到稀疏的编码特征。(大部分神经元不再活跃,更容易输出0,呈现出与one-hot类似的形式)
采用相对熵作为正则化项,有: L s p a r s e = ∑ j = 1 d ρ log ρ ρ ^ j + ( 1 − ρ ) log 1 − ρ 1 − ρ ^ j L_{sparse}=\sum_{j=1}^d\rho\log\frac{\rho}{\widehat\rho_j}+(1-\rho)\log\frac{1-\rho}{1-\widehat\rho_j} Lsparse=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(x_i,g(f(x_i)))+\lambda L_{sparse} L=L(xi,g(f(xi)))+λLsparse
变分自编码器
变分自编码器在VAE已经介绍,此处就不再赘述。值得一提的它与Auto-Encoder的区别。
本质上,两者是不同的,自编码器是一种无监督的表示学习方法,而变分自编码器是生成模型。前者是一种判别模型,自编码器的隐空间是离散的,由一个个样本点的编码构成。如果事先没有见过,给定任意隐藏层的向量时,解码器无法给出有意义的输出。而VAE的隐空间是连续的,对样本的分布建模,训练完后,使用解码器就可以生成样本。
基于对比损失的方法——Word2vec
核心思想是用一个词的上下文去刻画这个词。这又分成了两个派系:其一是给定某个中心词的上下文去预测该中心词,称为CBow;其二是给定一个中心词去预测它的上下文词,称为Skip-gram。
Skip-gram
给定一个语料库,表示为一个序列 C = { w 1 , w 2 , . . . , w N } C=\{w_1,w_2,...,w_N\} C={w1,w2,...,wN},语料库长度为 N N N,单词的词表为 V V V, w i ∈ V w_i\in V wi∈V。
定义上下文词为以中心词为中心的某个窗口内的词。假设窗口大小为 2 m + 1 2m+1 2m+1。
我们希望的是,给定某个中心词,输出上下文词的概率越大越好。
设 m = 2 m=2 m=2,源文本为“图 神经 网络 有 非常 丰富 的 应用”。
“网络”为中心词,那么“图 神经 有 非常”为上下文词。
记[(图,网络),(神经,网络),(有,网络),(非常,网络)]为正样本,
[(网络,应用),(网络,丰富)]为负样本。
于是,我们的的目标函数转化为了:
θ
∗
=
arg max
∏
w
c
,
w
∈
D
p
(
y
=
1
∣
(
w
c
,
w
)
)
∏
w
c
,
w
∈
D
ˉ
p
(
y
=
0
∣
(
w
c
,
w
n
e
g
)
;
θ
)
\theta^*=\argmax\prod_{w_c,w\in D}p(y=1|(w_c,w))\prod_{w_c,w\in \bar D}p(y=0|(w_c,w_{neg});\theta)
θ∗=argmaxwc,w∈D∏p(y=1∣(wc,w))wc,w∈Dˉ∏p(y=0∣(wc,wneg);θ)
这就转化为了一个二分类问题。引入两个矩阵 U ∈ R ∣ D ∣ × d U\in R^{|D|\times d} U∈R∣D∣×d, V ∈ R ∣ D ∣ × d V\in R^{|D|\times d} V∈R∣D∣×d,每一行都代表着一个词汇,训练结束后,它们就构成了包含语义表达的词向量。U和V分别表示着一个词作为中心词和上下文词两种角色下的不同表达。
我们有 p ( y ∣ ( w c , w ) ) = { σ ( U w c ⋅ V w ) i f y = 1 1 − σ ( U w c ⋅ V w ) i f y = 0 p(y|(w_c,w))=\left\{\begin{array}{lr}\sigma(U_{w_c}\cdot V_w)&if ~~y=1\\1-\sigma(U_{w_c}\cdot V_w)&if ~~y=0\end{array}\right. p(y∣(wc,w))={σ(Uwc⋅Vw)1−σ(Uwc⋅Vw)if y=1if y=0
于是,取对数之后,Skip-gram的目标函数是:
L
=
−
∑
(
w
c
,
w
)
∈
D
log
σ
(
U
w
c
⋅
V
w
)
−
∑
(
w
c
,
w
)
∈
D
log
(
1
−
σ
(
U
w
c
V
w
)
)
L=-\sum_{(w_c,w)\in D}\log\sigma(U_{w_c}\cdot V_w)-\sum_{(w_c,w)\in D}\log(1-\sigma(U_{w_c}V_w))
L=−(wc,w)∈D∑logσ(Uwc⋅Vw)−(wc,w)∈D∑log(1−σ(UwcVw))
最小化上式会使得中心词与上下文词的内积增大,与非上下文词的内积见小。最终U和V就是需要的词向量,通常取U作为最终词向量。
对比损失
上述这种最大化正样本之间的相似度、最小化负样本之间的相似度的方式是构建损失函数的一种常用思路,称之为对比损失。
思路迁移
人脸识别中,正样本可以定义为同一个体在不同条件下的人脸图像,负样本定义为不同个体的人脸图像,通过对比损失进行优化以学习到具有判别性的特征。