理解keras中的Embedding层及参数含义

理解keras中的Embedding层及参数含义


keras文档中对embedding层的解释是:

“将正整数(索引值)转换为固定尺寸的稠密向量。
例如: [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]
该层只能用作模型中的第一层。”

embedding层有几个关键参数:input_dim、output_dim、input_length
我们先把它们列出来,下面通过例子来解释。

考虑一个模型:这个模型是预测一个人的收入,其中,星座是变量之一。
但是,星座是一个文本,如何将星座这个变量放入模型呢?
我们首先想到的是用数字将12个星座编号,比如从0到11。将这个数值放入模型似乎就可以计算了。
但是,这么处理在逻辑上是存在问题的。比如,我们预测出来,这个星座变量x的系数是b,由于双子座的编号是2,金牛座的编号是1,那是否意味着双子座的人的收入就会比金牛座的大(2-1)*b=b呢?显然不是。

星座本身并无大小之分。只是我们的编码方式导致星座有了大小之分。

统计学上对该问题的处理方式是用dummy variable, 即0-1变量。具体方法是扩大这个变量的维度,比如上面的星座问题,就把这个变量变成11个变量,第1个变量表示是不是金牛座,是就为1,不是为0,第2个变量表示是不是双子座,是就为1,不是为0,以此类推。如果都不是,那就是白羊座。最后的结果就是每个星座都用一个11维的变量(或11个变量)来表示。金牛座就是[1,0,0,0,0,0,0,0,0,0,0]

keras中对此问题的处理和统计学中类似,即用one-hot vector。 只不过没有全为0的这个变量。
如:

x = [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]
keras.utils.to_categorical(x)
array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]], dtype=float32)

在这个例子中,白羊座 = [1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]

如此处理后,就解决了为星座编号带来的大小问题。

但是,这么处理的代价是,我们用12维的变量来表示原来1维的变量,参数数量将增加11倍。尤其是当我们处理文本数据时,维数的增加将非常可怕。比如,即使是我们用最常用的汉字来训练文本模型,最常用的汉字个数至少也有1000个,这意味着每个字都要用一个1000维的变量来表示!

这时候,就该Embedding层登场了!
Embedding层的想法就是能不能用相对少一点的维度来表示?比如,用[0.5, 0.8, 1.2]来表示白羊座?当然是可行的。原理请各位同学自己搜索。本文只谈Embedding怎么用。

下面,我们谈谈Embedding参数的含义。

input_dim

input_dim就是我们要处理的这个变量所包含的实例数,比如星座变量包括12个星座,input_dim=12。最常用的1000个汉字变量,input_dim = 1000
keras文档中的解释是:input_dim: int > 0。词汇表大小, 即,最大整数 index + 1

output_dim

output_dim就是我们希望用几维变量来表示这个变量。比如,上面用[0.5, 0.8, 1.2]来表示白羊座,output_dim = 3.
keras文档中的解释是:output_dim: int >= 0。词向量的维度。

input_length

input_length就是我们原始输入的变量的长度,在上面的星座例子中,它的长度是1。因为每个人只有1个星座。但当我们训练五言古诗时,每次输入的都是5个字,它的长度就是5。
keras文档中的解释是:input_length: 输入序列的长度

仍以上面的星座例子为例,它的python代码是:

Embedding(input_dim = 12, output_dim = 3, input_length = 1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值