Embedding 的概念来自于 word embeddings,具体是 2013 年 Google 开源的一款用于词向量计算的工具 —— word2vec。嵌入层(Embedding)通俗地讲,它是将正整数(下标)转换为具有固定大小的向量。
使用原因
我们为什么要使用嵌入层呢?其主要有如下两大原因:
- 使用 one-hot 方法编码的向量会很高维,也很稀疏。假设我们在做自然语言处理(NLP)中遇到了一个包含 10000 个词的字典,当时用 one-hot 编码时,每一个词会被一个包含 10000 个整数的向量来表示,其中9999 个数字是 0,要是字典再大一点的话,这种方法的计算效率会大打折扣。embedding 生成低维、稠密的向量。
- 训练神经网络的过程中,每个嵌入的向量都会得到更新。在多维空间中词与词之间有多少相似性,这使我们能建立词语之间的关系,不仅仅是词语,任何能通过嵌入层 Embedding 转换成向量的内容都可以这样做。
tensorflow keras Embedding
tensorflow 的 keras 提供了封装的 Embedding 对象,构造函数如下:
import tensorflow as tf
tf.keras.layers.Embedding(
input_dim,
output_dim,
embeddings_initializer='uniform',
embeddings_regularizer=None,
activity_regularizer=None,
embeddings_constraint=None,
mask_zero=False,
input_length=None,
**kwargs):
需要注意的是,Embedding 层只能作为模型的第一层。
参数
input_dim
:大于或等于 0 的整数,也就是字典长度,即输入数据最大下标+1。output_dim
:大于 0 的整数,代表全连接嵌入的维度。embeddings_initializer
:嵌入矩阵的初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。embeddings_regularizer
:嵌入矩阵的正则项,为 Regularizer 对象。activity_regularizer
:对该层的输出进行正则化。embeddings_constraint
:嵌入矩阵的约束项,为 Constraints 对象。mask_zero
:布尔值,确定是否将输入中的‘0’看作是应该被忽略的‘填充’(padding)值,该参数在使用递归层处理变长输入时有用。设置为True
的话,模型中后续的层必须都支持 masking,否则会抛出异常。如果该值为 True,则下标 0 在字典中不可用,input_dim 应设置为 |vocabulary| + 1。input_length
:当输入序列的长度固定时,该值为其长度。如果要在该层后接 Flatten 层,然后接 Dense 层,则必须指定该参数,否则,Dense 层的输出维度无法自动推断。