Keras 中的词嵌入也是一种降维技术吗?
is word embedding in Keras a dimensionality reduction technique also?
我想了解 embedding_dim
与使用整个 vocab_size
的一个热向量的目的,它是对从 vocab_size
dim 到 one hot 向量的降维吗embedding_dim
尺寸或者是否有任何其他直观的实用程序?另外应该如何决定embedding_dim
个数?
代码-
vocab_size = 10000
embedding_dim = 16
max_length = 120
model = tf.keras.Sequential([
tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(6, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
model.summary()
O/P -
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding (Embedding) (None, 120, 16) 160000
_________________________________________________________________
flatten (Flatten) (None, 1920) 0
_________________________________________________________________
dense (Dense) (None, 6) 11526
_________________________________________________________________
dense_1 (Dense) (None, 1) 7
=================================================================
Total params: 171,533
Trainable params: 171,533
Non-trainable params: 0
_________________________________________________________________
当您的分类特征和训练数据较少时,您必须使用 one-hot 编码。如果你有大量的训练数据和大量的分类特征,你必须使用嵌入。
为什么要开发嵌入?
如果你有大量的分类特征并且你使用了 one-hot 编码,你最终会得到一个巨大的稀疏矩阵,其中大部分元素为零。这不适合训练 ML 模型。您的数据将遭受维数灾难。使用嵌入,您基本上可以使用较小的维度表示大量分类特征。此外,输出是密集向量而不是稀疏向量。
嵌入的缺点:
- 需要时间训练
- 需要大量训练数据
优势
- 嵌入可以告诉您有关项目的语义。它将相关项目组合在一起。 one-hot 编码不是这种情况。 One-hot 编码只是一个项目在另一个维度上的正交表示。
嵌入向量的大小 select。
embedding_dimensions = vocab_size ** 0.25
可以看到here.
注意:这只是一个经验法则。您可以 select 嵌入尺寸小于或大于此尺寸。词嵌入的质量随着维度的增加而增加。但达到某个点后,边际收益会减少。
我想了解 embedding_dim
与使用整个 vocab_size
的一个热向量的目的,它是对从 vocab_size
dim 到 one hot 向量的降维吗embedding_dim
尺寸或者是否有任何其他直观的实用程序?另外应该如何决定embedding_dim
个数?
代码-
vocab_size = 10000
embedding_dim = 16
max_length = 120
model = tf.keras.Sequential([
tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(6, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
model.summary()
O/P -
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding (Embedding) (None, 120, 16) 160000
_________________________________________________________________
flatten (Flatten) (None, 1920) 0
_________________________________________________________________
dense (Dense) (None, 6) 11526
_________________________________________________________________
dense_1 (Dense) (None, 1) 7
=================================================================
Total params: 171,533
Trainable params: 171,533
Non-trainable params: 0
_________________________________________________________________
当您的分类特征和训练数据较少时,您必须使用 one-hot 编码。如果你有大量的训练数据和大量的分类特征,你必须使用嵌入。
为什么要开发嵌入?
如果你有大量的分类特征并且你使用了 one-hot 编码,你最终会得到一个巨大的稀疏矩阵,其中大部分元素为零。这不适合训练 ML 模型。您的数据将遭受维数灾难。使用嵌入,您基本上可以使用较小的维度表示大量分类特征。此外,输出是密集向量而不是稀疏向量。
嵌入的缺点:
- 需要时间训练
- 需要大量训练数据
优势
- 嵌入可以告诉您有关项目的语义。它将相关项目组合在一起。 one-hot 编码不是这种情况。 One-hot 编码只是一个项目在另一个维度上的正交表示。
嵌入向量的大小 select。
embedding_dimensions = vocab_size ** 0.25
可以看到here.
注意:这只是一个经验法则。您可以 select 嵌入尺寸小于或大于此尺寸。词嵌入的质量随着维度的增加而增加。但达到某个点后,边际收益会减少。