Keras中Embedding层原理
keras.embedding
例如:随着人工智能的不断发展,深度学习这门技术也越来越重要,很多人都开启了学习深度学习,本文就介绍了深度学习中keras框架进行embedding的原理。
一、embedding参数详解
input_dim:大或等于0的整数,字典长度,即输入数据最大下标+1
output_dim:大于0的整数,代表全连接嵌入的维度
embeddings_initializer: 嵌入矩阵的初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
embeddings_regularizer: 嵌入矩阵的正则项,为Regularizer对象
embeddings_constraint: 嵌入矩阵的约束项,为Constraints对象
mask_zero:布尔值,确定是否将输入中的‘0’看作是应该被忽略的‘填充’(padding)值,该参数在使用递归层处理变长输入时有用。设置为True的话,模型中后续的层必须都支持masking,否则会抛出异常。如果该值为True,则下标0在字典中不可用,input_dim应设置为|vocabulary| + 2。
input_length:当输入序列的长度固定时,该值为其长度。如果要在该层后接Flatten层,然后接Dense层,则必须指定该参数,否则Dense层的输出维度无法自动推断。
二、数学原理
1.one-hot
one-hot编码是一种简单的表示单词的方法,例如‘我 喜 欢 吃 苹 果’,可以生成如下的独热矩阵:
word | vector |
---|---|
我 | [1,0,0,0,0,0] |
喜 | [0,1,0,0,0,0] |
欢 | [0,0,1,0,0,0 |
吃 | [0,0,0,1,0,0] |
苹 | [0,0,0,0,1,0] |
果 | [0,0,0,0,0,1] |
喜欢的可以用下面这种形式进行表示:
word | vector |
---|---|
喜欢 | [0,1,0,0,0,0][0,0,1,0,0,0]] |
但是使用这种稀疏矩阵存储数据是浪费空间的。
2.word embedding计算过程
上面的例子可以看出使用独热编码构造的句子表示矩阵很消耗空间。
上述计算过程是word embedding的详细过程, 首先是2x6的独热矩阵为输入,中间层节点数为3的全连接的神经网络层。右边为得到的嵌入后的向量矩阵。可以看做是查表的过程,从矩阵中取出1,2行。
所以woed embedding的过程就是通过训练好的参数矩阵,将one-hot向量转换成对应的嵌入向量的过程。中间层的节点的维度就是全连接层的字向量维数,输入的one-hot矩阵和权重矩阵进行点积得到对应的嵌入向量,并使用嵌入向量作为字词的表示。
3.keras embedding过程
keras中的embedding和word embedding类似,与word embedding的one-hot矩阵不同的是,keras的embedding是使用的词下标矩阵作为embedding层的输入。
keras的embedding的嵌入过程如下所示:
(1)提取文章所有的单词(此处以1000个为例),按照出现的次数进行降序排列,单词频数最大的排第一位,以此类推。
(2)每个编号使用1000维的one-hot编码表示。
(3)经过embedding层的训练,得到一个行为词个数1000,列为词向量维度的大小的权重矩阵,矩阵的第一行对应ID为0的词向量。
生成嵌入矩阵之后,就完成了对单词的嵌入,类似word embedding过程,keras的embedding也是一个查表的过程,例如输入Input_length = 2的情况,输入长度为6的句子,将该句子中的词语替换为对应的下标,例如[[4],[20]],即可通过类似于word embedding的查表过程转化成[0.25,0.1]。此处生成的embedding层并不包含语义特征,只是进行了词嵌入的操作。矩阵的训练类似于普通神经网络的训练,权重矩阵的训练与整个网络的所有参数的训练是一样的。