深度学习 基础

深度学习 网络层

深度学习 嵌入层(Embedding Layer)详解


Embedding 的概念来自于 word embeddings,具体是 2013 年 Google 开源的一款用于词向量计算的工具 —— word2vec。嵌入层(Embedding)通俗地讲,它是将正整数(下标)转换为具有固定大小的向量

使用原因

我们为什么要使用嵌入层呢?其主要有如下两大原因:

  1. 使用 one-hot 方法编码的向量会很高维,也很稀疏。假设我们在做自然语言处理(NLP)中遇到了一个包含 10000 个词的字典,当时用 one-hot 编码时,每一个词会被一个包含 10000 个整数的向量来表示,其中9999 个数字是 0,要是字典再大一点的话,这种方法的计算效率会大打折扣。embedding 生成低维稠密的向量。
  2. 训练神经网络的过程中,每个嵌入的向量都会得到更新。在多维空间中词与词之间有多少相似性,这使我们能建立词语之间的关系,不仅仅是词语,任何能通过嵌入层 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 层的输出维度无法自动推断。