一个良好的表示是内容充分高效表达的基础,作为沟通计算机与现实世界的桥梁,计算机行业人员每时每刻都在研究事物的表示。比如:编程语言,早期的机器语言和现在的高级程序语言可以看作是指令的两种不同表示方式,从可读性方面评价,两者的表达能力相差甚远。再比如:数据结构,其研究的正是数据在计算机中的高效表达与存储,如下图所示,我们可以采用链表和红黑树两种不同的数据结构对有序表进行存储。
|
在对有序表进行插入或删除操作时,链表的时间复杂度将是 O ( n ) O(n) O(n),因为需要将后续所有节点的移动。而采用红黑树存储时,其时间复杂度是 O ( log n ) O(\log n) O(logn),因为每次操作只涉及左子树或右子树。从上面两个例子,我们可以总结,一个良好的表示可以使后续任务更加容易,选择什么样的表示取决于后续任务。
表示学习(Representation Learning)
个人认为,表示学习是深度学习领域的一个概念,是学习数据表示的技术的集合,用于将现实世界中的数据转化成能够被计算机高效处理的形式。与之相对应,在机器学习领域,数据表示主要通过特征工程(feature engineering)实现,如下图所示:
在机器学习时代,我们如果需要对汽车进行表示,往往依靠的是领域专家手工提取特征并表示;在深度学习时代,我们直接将汽车输入模型,汽车将自动转换成高效有意义的表示。
- 特征工程:依靠专家提取显式特征,工程量巨大,特征选取的好坏将直接决定数据表示的质量,从而影响后续任务的性能。
- 表示学习:采用模型自动学习数据的隐式特征,数据表示与后续任务往往是联合训练,不依赖专家经验,但需要较大的训练数据集。
分布式表示(Distributed Representation)
在对数据进行表示前,我们需要先确定表示方案,或者说采用哪种表示思想对数据进行表示。有了目标,我们才能训练对应的模型。假设我们对以下四种形状进行表示
最直接的想法是对每一个形状分配一个标识符,但是符号计算机无法识别,我们稍微转变一下,将每个标识符与向量中的每一个分量对应,因此将形成一个长度为4的向量,表示每一个形状时,向量中对应的分量置1,其他分量为0。如下图所示:
可以看到,上面的表示中,每个向量只有一位为1,其余都是0,是一种非常稀疏的表示。当有 n n n个形状需要表示时,向量的长度将达到 n n n维,是一个非常高的维度。从计算机存储的角度看,这种表示方案是对每个形状分配一个独立的内存单元进行存储,所以将其命名为局部表示(Local Representation)。
局部表示还是简单的在个体层面上表示数据,我们可以通过提取更细粒度的特征来表示数据,例如,我们采用四种特征“水平”、“垂直”,“四边形”和“椭圆”对形状进行描述。因此,“横着的四边形”可以采用特征“水平”与“四边形”联合描述。类似于局部表示的向量形式,我们类似地将每一个特征对应到向量中的一个分量,我们同样将得到一个4维的向量,表示每个形状时,如果该形状拥有这个特征,向量中对应分量置1。如下图所示:
可以看到,此时每个形状的向量表示中,将不再只有一位为1,向量表示相对稠密了一些。当有 n n n个形状需要表示时,向量只需要 ⌈ log n ⌉ \lceil\log n\rceil ⌈logn⌉维度,向量维度大大降低。从计算机存储的角度看,这种表示方案将每个形状的表示分配到多个内存单元中,所以将其命名为分布式表示(Distributed Representation)
总结一下,局部表示与分布式表示对比如下:
- 局部表示(Local Representation)
- 每个内存单元存储一个数据,向量高维稀疏;
- 向量中每个分量对应一个数据,各个分量相互排斥。
- 分布式表示(Distributed Representation)
- 多个内存单元共同表示一个数据,向量低维稠密;
- 向量中每个分量单独没有意义,分量的组合才能表示具体数据。
分布式表示 VS 局部表示
现在我们将换一个角度理解表示:对输入空间的每个区域进行编码。
|
|
1. 表示能力
- 局部表示:长度为 n n n的向量,只能将输入空间划分为 n n n个区域
- 分布式表示:长度为 n n n的向量,能给 O ( 2 n ) O(2^n) O(2n)个不同的区域分配唯一编码
所以,相同维度的分布式表示相较于局部表示,能够将输入空间划分的更加细致,能针对更小的区域进行表示。
- 局部表示:符号表示,任意两两概念之间的距离没有差别,无法表示数据之间的关联
- 分布式表示:每个数据的向量表示中包含了数据间的相互关联信息,语义上相近的概念在距离上接近
所以,分布式表示能够捕获数据间的语义相关性,并且这种捕获语义相似性的能力是分布式表示天然具有的,而不需要刻意训练。
2. 参数数目
无论是机器学习任务还是深度学习任务,我们都可以讲他们一般化为如下形式:
第一层代表输入,第二层代表输出,输入与输出之间通过全连接连接。因此,对于 2 n 2^n 2n个数据
- 局部表示:每个数据使用唯一的符号表示,向量长度为 2 n 2^n 2n,因此需要 2 n 2^n 2n个参数去识别 2 n 2^n 2n个区域
- 分布式表示: O ( n ) O(n) O(n)个参数就能够明确表示 O ( 2 n ) O(2^n) O(2n)个不同数据,因此向量长度为 n n n,刻画 2 n 2^n 2n个数据只需要 n n n个参数
所以,分布式表示相较局部表示能够显著减少模型参数数目,带来计算效率上的提升,参数数目少也意味着模型需要较少的训练样本。
NLP中的分布式表示模型
自然语言是一种符号表示,因此自然语言处理领域(NLP)首先要解决的就是词表示问题。沿袭上面介绍的局部表示与分布式表示,在NLP领域,单词也通常被表示成这两种形式,只不过在NLP中,局部表示更多被称为独热表示(one-hot representation),分布式词表示通常被称为词向量或词嵌入(word embedding)。这里主要关注分布式词表示,将简单介绍三种主要的分布式词表示模型的由来与训练。
Distributional hypothesis
Distributional hypothesis是指:具有相同上下文的词语,应该具有相似的语义。目前,所有的分布式词向量都是基于该假设训练得到的。根据建模的词与词的关系,可以将模型分为两大类:
- Syntagmatic models:关注词与词之间的组合关系,强调的是相似的词会出现在同一个语境中。
- Paradagmatic models:关注词与词之间的替换关系,强调的是相似的词汇拥有相似的上下文而可以不同时出现。
下图展示了词与词之间的组合关系和替换关系
1. Latent Semantic Analysis(LSA)
LSA是一种Syntagmatic models,采用词-文档共现矩阵建模词语之间的组合关系。假设我们有语料doc1:“I love playing football.”、doc2:“I love playing tennis.”和doc3:“You love playing football.”。我们可以构建如下的词-文档共现矩阵:
其中蓝色方框圈出的“love”与“playing”,因为这两个单词在三篇文档中都共现了,所以他们的向量表示很相似;而红色方框圈出的“football”与“tennis”,因为没有在一个文档中共现过,所以他们的向量表示差距很大。得到词-文档共现矩阵后,需要对齐进行处理才能得到低维稠密的词向量,具体地,LSA采用了矩阵奇异值分解(SVD):
A
m
×
n
=
U
m
×
m
S
m
×
n
V
n
×
n
T
≈
U
m
×
r
S
r
×
r
V
r
×
r
T
A_{m\times n}=U_{m\times m}S_{m\times n}V^T_{n\times n}\approx U_{m\times r}S_{r\times r}V^T_{r\times r}
Am×n=Um×mSm×nVn×nT≈Um×rSr×rVr×rT
取前 r r r个奇异值,最终得到的 U m × r U_{m\times r} Um×r就是我们想要的词向量。更多关系LSA的介绍可以参考《奇异值分解与LSA潜在语义分析》。
2. Global Vector(GloVe)
GloVe是一种Paradigmatic models,采用词-词共现矩阵建模词语之间的替代关系。同样是上面三篇文档,将窗口大小设置为1,我们可以构建如下图所示的词-词共现矩阵:
矩阵中的元素值表示:在以行标所代表的词为中心词的窗口内,列标所代表的词共现的次数。如蓝框所示,“football“与”tennis”这两个具有很强替换关系的词具有相似的向量表示,而红框内的“love”与“playing”不具备替换关系,因此两者的向量表示相差甚远。GloVec通过最小化如下所示的损失函数将词-词共现矩阵转化为低维稠密词向量:
J
=
∑
i
,
j
N
f
(
X
i
j
)
(
v
i
T
v
j
+
b
i
+
b
j
−
log
(
X
i
j
)
)
2
J=\sum_{i,j}^Nf(X_{ij})(v_i^Tv_j+b_i+b_j-\log (X_{ij}))^2
J=i,j∑Nf(Xij)(viTvj+bi+bj−log(Xij))2
其中, X i j X_{ij} Xij是矩阵中第 i i i行第 j j j列个元素, v i v_i vi, v j v_j vj是单词 i i i和单词 j j j的词向量, b i b_i bi和 b j b_j bj是偏差项, f f f是权重函数, N N N是词汇表大小。这个模型本人暂时还没有学习过,关于该模型的介绍后续再继续补充。
3. Word2vec
Word2vec是一种采用神经网络训练词向量的方法,其不需要构建词-上下文共现矩阵。Word2vec可以分为基于上下文预测当前词的continuous Bag-of-Words模型与基于当前词预测上下文的continuous Skip-gram模型。
CBOW模型对应的损失函数如下
∑
w
∈
C
log
p
(
w
∣
C
o
n
t
e
x
t
(
w
)
)
\sum_{w\in C}\log p(w|Context(w))
w∈C∑logp(w∣Context(w))
Skip-gram模型对应的损失函数如下
∑
w
∈
C
log
p
(
C
o
n
t
e
x
t
(
w
)
∣
w
)
\sum_{w\in C}\log p(Context(w)|w)
w∈C∑logp(Context(w)∣w)
可以看到上面两个模型结构都非常简单,只有输入层、映射层和输出层,没有隐含层,词向量对应于输入层到映射层的参数。具体地关于模型训练的技巧,可以参考《word2vec之CBOW模型与skip-gram模型》
参考文献
「特征工程」与「表示学习」
神经网络如何学习分布式表示
DL4NLP——词表示模型(一)表示学习;syntagmatic与paradigmatic两类模型;基于矩阵的LSA和GloVe