欢迎光临散文网 会员登陆 & 注册

tf.keras.layers.Embedding词嵌入浅析

2023-03-14 23:19 作者:GUCCI-GUJI  | 我要投稿

本篇关于Keras的Embedding函数解析是参考了其他博主的文章,加上自己的理解,不当之处请大家指出。

原文链接:

https://keras.io/search.html?query=embedding

https://blog.csdn.net/weixin_44493841/article/details/121487594

https://www.jianshu.com/p/a3f3033a7379


在介绍Embedding之前,先了解以下几个概念:

数值张量

深度学习模型在处理文本数据时不会直接把原始文本数据作为输入,它只能处理数值张量。

文本向量化

文本向量化就是把文本数据转化成数值张量的过程,实现方法多是把文本分割成单词或者字符,再把单词或字符转换为一个向量。

标记

将文本分解而成的单词或字符叫做标记。

分词

将文本分解成标记的过程叫做分词。

我们要用深度学习模型处理文本数据,通过使用某种分词方法来实现文本向量化,即在分词过程,把生成的标记与数值向量相关联,然后把这些向量组合成张量作为深度学习模型的输入,embedding(词嵌入)方法就是一种把标记与数值向量相关联的方法。

函数及参数

参数说明

input_dim: int > 0。词汇表大小, 即最大整数 index + 1,在分词过程中每一个标记都有唯一一个区别于其它标记的索引,input_dim = 所有标记的索引的最大值 + 1。

output_dim: int >= 0。词向量的维度。

embeddings_initializer: embeddings 矩阵的初始化方法 (详见 initializers)。

embeddings_regularizer: embeddings matrix 的正则化方法 (详见 regularizer)。

embeddings_constraint: embeddings matrix 的约束函数 (详见 constraints)。

mask_zero: 是否把 0 看作为一个应该被遮蔽的特殊的 "padding" 值。 这对于可变长的 循环神经网络层 十分有用。 如果设定为 True,那么接下来的所有层都必须支持 masking,否则就会抛出异常。 如果 mask_zero 为 True,作为结果,索引 0 就不能被用于词汇表中 (input_dim 应该与 vocabulary + 1 大小相同)。

input_length: 输入序列的长度,当它是固定的时。 如果你需要连接 FlattenDense 层,则这个参数是必须的 (没有它,dense 层的输出尺寸就无法计算)。


基础嵌入层示例

个人理解:

该案例中,输入矩阵input_array是一个2×3的矩阵[[8 4 7],[6 2 3]]。

在Embedding嵌入层中,设定input_dim=1000,表示最多有1000个不同的元素索引(非样本,注意区分,一个样本里可能包含多个元素,如input_array可以理解为两个样本,每个样本里就有三个元素);设定output_dim=4,表示对于每个元素,都使用一个1×4的向量来表示;设定input_length=3,表示每个样本或每次输入3个元素。

输出矩阵output_array是一个(2, 3, 4)的张量,表示一共有两个样本,每个样本都通过一个(3,4)的张量来表示,其中3表示每个样本有3个元素,每个元素用4维向量(4个数字)来表示。例如,input_array中的8通过向量[ 0.01561867  0.01928559 -0.04316533  0.04298258]来表示。


再举另一个例子,做稍微深一点点理解

通俗的讲,这个过程中,Embedding层生成了一个大小为3*2的随机矩阵,记为M,查看矩阵M:

矩阵的每一行是该行下标指示的标记的数值向量,即矩阵M的第i(可取0,1,2)行是标记为i的单词对应的数值向量。

data是Embedding层的输入,它包含2个样本,每个样本长度都是7,输出out是一个大小为(2,7,2)的矩阵,data[i,j]元素的数值向量是out[i,j,:]。

可以看到,这个时候得到的文本的向量化表示是随机的,我们对这个模型进行训练,更新各层权重,最后我们得到一个文本向量化的有意义的表示,即单词间通过各自对应的数值向量来反映单词间相关性。

tf.keras.layers.Embedding词嵌入浅析的评论 (共 条)

分享到微博请遵守国家法律