哪种算法用于嵌入Keras内置函数中? Word2vec?手套?其他吗?
答案 0 :(得分:3)
简短的答案是都不是。本质上,诸如 GloVe 的 Word2Vec 之类的嵌入层只是一个较小的神经网络模块(通常为全连接层),其投影的维数较高,稀疏度较低,为n维向量。
当您在Keras中将新鲜随机嵌入层插入神经网络时,Keras将构建一个[input_dim, output_dim]
形状的密集可学习矩阵。
具体来说,假设您要插入一个嵌入层,以将整数标量月信息(12个唯一值)编码为大小为3的浮点向量。 ,您将按照以下方式声明嵌入:
import numpy as np
import keras
from keras.models import Sequential, Model
from keras.layers import Embedding, Input
x = Input(shape=(1000,)) # suppose seq_len=1000
embedding = Embedding(12+1, 3, input_length=1000)(x)
model = Model(inputs=x, outputs= embedding) # Functional API
model.summary()
您的嵌入层的摘要如下:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 1000) 0
_________________________________________________________________
embedding_1 (Embedding) (None, 1000, 3) 39
=================================================================
Total params: 39
Trainable params: 39
Non-trainable params: 0
_________________________________________________________________
请注意,可学习的参数为39 = 13*3
(Keras需要+1来编码不属于12个唯一月份中的任何一个的值-以防万一)。
还要注意,尽管嵌入的输入形状为(None, 1000)
,嵌入的输出形状为(None, 1000, 3)
。这意味着大小为[13, 3]
的非常小的密集权重矩阵将应用于1000个输入时间步长中的每个。这意味着,每月0-11
的整数输入将转换为大小为(3,)
的浮点向量。
这也意味着,当您从最后一层向后传播到嵌入层时,也会产生1000个时间步长嵌入输出中每个 的梯度(在time_distributed
中大小为[13,3]
的小型神经网络权重(基本上是嵌入层)。
另请参见Keras官方文档的嵌入层:https://keras.io/layers/embeddings/。
答案 1 :(得分:1)
以上都不是。默认情况下,它是随机embeddings_initializer='uniform'
初始化的。
有tutorial关于如何使用现有嵌入的信息。