Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

请教embedding和fc层的区别 #2910

Closed
HugoLian opened this issue Jul 17, 2017 · 15 comments
Closed

请教embedding和fc层的区别 #2910

HugoLian opened this issue Jul 17, 2017 · 15 comments

Comments

@HugoLian
Copy link

HugoLian commented Jul 17, 2017

我看到book中推荐系统的网络结构,从用户、电影的原始输入,到feature之间,都是embedding_layer + fc_layer:

usr_gender_id = paddle.layer.data(name='gender_id', type=paddle.data_type.integer_value(2))
usr_gender_emb = paddle.layer.embedding(input=usr_gender_id, size=16)
usr_gender_fc = paddle.layer.fc(input=usr_gender_emb, size=16)

请问:
1)这里embedding的作用是什么?
2)embedding和fc有什么区别呢?
image

另外我了解的embedding层,主要作用除了降维之外,embedding的输出结果还可以近似表达词之间的相关程度,这就需要训练的时候将输入切分成:context -> target的训练对语料:
image
实际上这样是一个三层的网络(输入,隐藏,输出),当使用的时候舍去输出层,用隐藏层的矩阵作为输出结果
image
请问:
3)咱们paddle的embedding_layer,是上述的概念么?
还有一个问题:
4)我看推荐这个例子中,用户的职业,性别等,都是one-hot,如果加入一个用户兴趣,那么兴趣可能是一组多个维度为1的vector,那么这中vector的输入,在embedding和fc层的输出结果,有什么区别呢?

问题比较多,希望各位大侠赐教!

@lcy-seso lcy-seso self-assigned this Jul 17, 2017
@lcy-seso
Copy link
Contributor

关于 embedding 的作用:

  1. 为了让计算机处理输入,首先需要对数据的规范化表示方法。one-hot,BOW,$n$-gram 等等,都是人类设计出的不同表示输入数据方法。
  2. embedding 是一种distributed representation,它的出现是相对于 one-hot 的表示法。
    • 在 one-hot 表示方法中,一个编码单元表示一个个体,除了某一个维度上的值是 1,其余维度都是 0。
    • distributed representation 用几个编码单元而不是一个编码单元来表示一个个体,是一类表示学方法,用一个更低维度的实向量表示“一个概念”(可以理解为机器学习任务输入观察的输入特征),向量的每个维度在实数域 $R$ 取值
  3. embedding 在自然语言处理任务中获得了很大的成功,所以也常被翻译为“词向量”。但是,作为一类表示学方法,我们可以为所有离散的输入学习对应的 embedding 表达,并不不局限于自然语言处理任务中的词语。
  4. 简单粗暴地讲,引入 embedding 的动机有:
    • 将高度稀疏的离散输入嵌入到一个新的实向量空间,对抗维数灾难,使用更少的维度,编码更丰富的信息。
    • 我们观测的不同离散变量都可以嵌入同一个实向量空间,得到统一的表达形式。定义于实向量空间上的各种数学运算,可以作为描述语义的数学工具。

@lcy-seso
Copy link
Contributor

lcy-seso commented Jul 17, 2017

embeding层可以理解为从一个矩阵中选择一行,一行对应着一个离散的新的特征表达,是一种取词操作。

推荐系统中的例子,embedding 可以简单的看作是将离散特征转化为实向量特征表达,从整体的计算逻辑上:

  1. usr_age_idusr_age_embusr_gender_emb 等离散特征在一条输入数据中,只会取一种值,他们首先通过embedding层得到实向量表达;
  2. 再接全连接层得到隐层向量,再将隐层向量相加,这个计算逻辑和 BOW 输入通过两个全连接层是完全等价的。

@lcy-seso
Copy link
Contributor

lcy-seso commented Jul 17, 2017

针对你的四个问题:

  1. embedding 可以简单当做是:将离散特征转化为一个更低维度的实向量表示。
  2. embedding 是选择矩阵指定的一列作为输出,fc 是矩阵乘法。
  3. embedding 是一种表示方法,是不是能够学出“近似表达词之间的相关程度”是由构造的训练任务和损失函数决定的。
  4. 单单针对推荐系统这个例子,没区别。

@HugoLian
Copy link
Author

我不理解的问题是,这个embedding层是如何实现的呢?因为从one-hot到distributed representation,是要通过序列或者context-target文本对进行训练的。但是我看到的网络结构中,并没有任何这方面的对应关系,那么,
1)如何保证embedding层的训练结果,具有意义?
2)如果我的输入不是one-hot,而是有个兴趣对应的向量,比如[0,1,0,0,1,1] ,那么这样的输入方式,是更适合使用embedding层还是不能使用embedding @lcy-seso

@lcy-seso
Copy link
Contributor

lcy-seso commented Jul 17, 2017

  1. embedding 层仅仅就只是完成“取矩阵的一行”这样的操作。
  2. “context-target文本对进行训练”这是指整个网络的结构和优化目标,和embedding 这个层没关系,这属于 “embedding 是怎么学习来的”这个问题。
  3. embedding 是data-driven,随着损失函数end-to-end学习出来的。
  4. [0,1,0,0,1,1] 这个输入是不是适合embedding,要看后面怎么使用。
    • [0,1,0,0,1,1] 这个输入是不是序列?
    • 如果不是序列,label 就也不可能是序列级别。过完embeddig 一定需要 pooling 这样的操作。这种情况下,就看需要什么样的 pooling。如果是 sum,那和接全连接层计算逻辑是完全等价。如果换其他 pooling 可能有区别。但没有一定的答案该用embedding或者不该用。

@llxxxll
Copy link
Member

llxxxll commented Jul 17, 2017

good-question

@HugoLian
Copy link
Author

HugoLian commented Jul 17, 2017

  1. [0,1,0,0,1,1] 不是序列,对于这种离散类型的,一次多个维度有值的输入,所以降维的话,最好还是使用FC对么?
  2. 所以我看到的例子,用于embedding的输入,都是one-hot-vector, 但因为paddle的例子中并不是像其他例子利用context-target去训练一个三层的网络,然后使用第二层的输出,也不知道embedding与fc的区别是不是仅仅是损失函数不同,不知道有没有关于paddle-embedding层介绍的网页?

@lcy-seso
Copy link
Contributor

lcy-seso commented Jul 17, 2017

我觉得你把“如何学习词向量”和 embedding 层完成的运算,这两个问题完全绑定在一起了。

如果你需要“context-target去训练一个三层的网络” ,例子在这里:

  1. PaddleBook:词向量:http://book.paddlepaddle.org/index.cn.html
  2. PaddleModels:

@lcy-seso
Copy link
Contributor

lcy-seso commented Jul 17, 2017

[0,1,0,0,1,1] 不是序列,对于这种离散类型的,一次多个维度有值的输入,所以降维的话,最好还是使用FC对么?

这个问题,没有绝对的“最好”。上面也解释过,如果不是序列输入,并且embedding之后用处理序列的模型进行学习, embeddingfc 层在计算逻辑上,是没有本质区别的。但如果选择不同的 pooling 策略会有计算上的差别,而这些差别引起的学习性能差别,要根据具体的应用来判断什么是最合适的。

有一个最粗暴的原则,不管什么模型,先拟合住再说。

@HugoLian
Copy link
Author

我不知道理解的对不对,对于原始输入 -- embedding -- fc 在训练反向传播的时候,是传播到原始的输入层(下图中篮框),还是传播到embedding(下图中红框)就截止了? embedding仅仅是起到编码的作用?
image

@lcy-seso
Copy link
Contributor

embedding 有参数需要学习,因此在BP时,会接收到梯度。反向传播不会在embedding层截止。
data 层没有需要学习的参数,不需要梯度,会在data layer 停止向前传播梯度。

@daiwk
Copy link
Contributor

daiwk commented Aug 29, 2017

https://keras.io/layers/embeddings/ keras的embedding是参考https://arxiv.org/pdf/1512.05287.pdf 这个实现的,类似对输入数据进行dropout,同好奇paddle的embedding是怎么实现的

@luotao1
Copy link
Contributor

luotao1 commented Aug 29, 2017

paddle的embedding是用table_projection实现的,具体代码见这里

with mixed_layer(
            name=name,
            size=size,
            act=LinearActivation(),
            bias_attr=False,
            layer_attr=layer_attr) as mix:
        mix += table_projection(input=input, size=size, param_attr=param_attr)
    return mix

table_projection的公式是out.row[i] += table.row[ids[i]],具体代码见这里

@lambdaji
Copy link

lambdaji commented Aug 31, 2017

区别在embedding layer与前后层的兼容上
上一层 → embedding
-前向:标准fc网络站在hidden节点recv,embedding站在上一层节点send
-后向:仅更新非0节点网络参数
embedding → 下一层
-标准fc网络相当于作element-wise-add + activitation function变换
-embedding支持更多算子,比如inner/outer/concatenate/...

@wanghaoshuang
Copy link
Contributor

Closing this issue due to inactivity, feel free to reopen it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

8 participants