为何Embedding层需设为(V+1,D)?基于Keras Tokenizer的疑问
为什么Keras Embedding层输入维度要设为V+1(V是Tokenizer词汇量)?
首先纠正一个误区:len(tokenizer.word_index)得到的V就是词汇总数,tokenizer.word_index里的索引是从1开始依次分配给每个词的,所以最大索引值是V,不是你以为的V-1。比如有3个词,word_index会是{"词A":1, "词B":2, "词C":3},长度是3,最大索引就是3。
接下来解释Embedding层的输入维度要求:
- Embedding层的第一个参数
input_dim,定义的是输入数据中可能出现的最大索引值+1,因为它的内部索引是从0开始计数的。 - 我们用Tokenizer处理文本后,转成的序列里,已知词的索引是1到V,但如果做了填充操作(比如用
pad_sequences统一序列长度),填充的数值是0;另外如果设置了oov_token,未登录词会被分配为1(原有词的索引会从2开始,但核心逻辑不变)。 - 为了让Embedding层能处理这些0索引的情况,输入维度必须设为V+1——这样它的权重矩阵会包含索引0到V对应的嵌入向量,总共V+1个,刚好覆盖所有可能的输入索引(0到V)。
举个实际例子:
假设词汇量V=3,词索引是1、2、3。如果把Embedding层的input_dim设为3,那它的权重矩阵形状是(3, D),只能对应索引0、1、2。当输入序列里出现索引3时,就会超出范围报错;而设为V+1=4的话,权重矩阵是(4, D),能覆盖0、1、2、3所有可能的索引,不管是文本里的词还是填充的0都能正常处理。
总结一下:
核心原因是Embedding层的input_dim需要等于最大输入索引+1,而Tokenizer生成的最大词索引是V(因为词汇量是V,索引从1开始),所以必须设为V+1才能包含索引0的情况。
内容的提问来源于stack exchange,提问作者ShoutOutAndCalculate
相关产品推荐
相关产品推荐

