【问题标题】: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 层,则可以有效地简化嵌入层。