【问题标题】:Why "it would be wasteful to use more embedding dimensions than the number of units in the layer that follows the Embedding layer"为什么“使用比嵌入层后面的层中的单元数更多的嵌入维度会很浪费”
【发布时间】:2020-10-21 07:05:15
【问题描述】:

引自“使用 Scikit-Learn、Keras 和 TensorFlow 进行机器学习实践,第 2 版”:

One-hot 编码后跟一个 Dense 层(没有激活函数也没有偏差)相当于一个 Embedding 层。然而,嵌入层使用更少的计算(当嵌入矩阵的大小增加时,性能差异变得明显)。 Dense 层的权重矩阵起到嵌入矩阵的作用。例如,使用大小为 20 的 one-hot 向量和具有 10 个单元的 Dense 层等效于使用具有 input_dim=20 和 output_dim=10 的 Embedding 层。 因此,使用比嵌入层之后的层中的单元数更多的嵌入维度是一种浪费。

“使用比嵌入层后面的层中的单元数更多的嵌入维度会很浪费”的原因是什么?

【问题讨论】:

    标签: tensorflow machine-learning


    【解决方案1】:

    我也偶然发现了同样的问题,这是我设法想出的。如有错误请见谅。


    首先,考虑一个简单的(线性)密集层,其中 input_dim=a,output_dim=c。我们称之为d12。暂时忽略偏见。

    a --d12--> c
    
    c_x = d12.weight * a_x
    

    可以将这个dense layer分成2个dense layer,第一个(d1)有input_dim=a,output_dim=b,第二个(d2)有input_dim=b,output_dim=c .

    a --d1--> b --d2--> c
    
    b_x = d1.weight * a_x
    c_x = d2.weight * b_x
    (d12.weight = d2.weight * d1.weight)
    

    这里的问题是:拆分是否减少了信息量。这里我们有两种情况:

    • a*c <= a*b + b*c(即 d12 的参数比 d1+d2 少):没有信息丢失,只是引入了额外的计算。
    • a*c > a*b + b*c(即 d12 的参数多于 d1+d2):丢失了一些信息。基本上b 会成为瓶颈,就像编码器-解码器结构一样。

    因此,如果在一个网络中,对于 2 个线性密集层可以合并为 1 个线性密集层而不会丢失信息,则中间维度 (b) 大于输出维度 (c)。


    嵌入层本质上是一个(线性)密集层,其中 input_dim=vocab_len、output_dim=embedding_dim、activation="linear"。因此,如果嵌入层的 output_dim 大于其后的 Dense 层,则可以有效地简化嵌入层。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-10
      • 2019-10-13
      • 2018-01-11
      • 2020-09-04
      • 1970-01-01
      • 2019-05-17
      • 2018-09-23
      • 2021-03-08
      相关资源
      最近更新 更多