字词嵌入
Last updated
Was this helpful?
Last updated
Was this helpful?
字词嵌入是实现对于文本处理的第一步,主要是为了实现对于文字信息的量化,毕竟计算机实际只能处理数值信息。
one-hot应该是首先可以想到的一种编码方式,使用和词汇量等长度的全0向量,其中一个变为1代表一个词在这里出现。
注意:使用one-hot来表示是一个低效的方法,产生的矩阵极为稀疏,会造成大量的空间浪费。
我们还可以将每一个词映射到一个固定的数字,来表示一句话(如形如 [1,4,2,5,2,3] 的矩阵)。这样的表示方式是十分高效的,我们最后得到的矩阵是稠密的,每个位置都表示了元素。 但是这样的表示方法仍然存在问题:
这样的编码很随意:没有体现词之间的关系,编码数字大小临近的词,语义并不一定临近。
这样一个模型没法解释:由于编码结果是和他们的语义无关的,导致了对于编码结果的运算可以说是无实际意义的(对于随意给的一堆数字的加减乘除不能代表什么具体意义)。
总结下上面的编码所遇到的位问题:一个是要保证编码的效率以减少性能的浪费,另一个是保证语义的编码结果之间的关联,即相似的词具有相似的编码。由此提出了字词嵌入。 字词嵌入就是要产生一种符合上述要求的编码方式,建立量化的表示并尽可能少的丢失语义联系。
图示例子将一个词转换为使用4维坐标来表示。
☆ Embedding处理的是整数输入,不直接处理文本输入,需要先将我们的文本映射到整型数值才可以。
Tensorflow中提供了Embedding layre来处理词嵌入。 Embedding layer可以看做一个由整数下标到稠密向量的映射表。它使用以下的方法创建:
这一Embedding layer
会接受一个任意长度的整型张量,形状为(batch, input_length)
,其中要求最大的整数不能大于input_dim
。
Embedding layer在定义的时候内部的权重会随机初始化(就像其他的神经网络层一样),在训练阶段其中的权重也会一同参与训练,从中学习词语之间的语义关系,逐步达到更好的编码效果。
输入到Embedding layer的张量长度是任意的,输出会比输入多一个轴。
例: (2,3) -> (2,3,N)
,其中N
就是由之前定义的output_dim
决定的。