首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tensorflow嵌入层中的权值更新

Tensorflow嵌入层中的权值更新
EN

Stack Overflow用户
提问于 2017-05-19 02:44:43
回答 1查看 1.9K关注 0票数 2

我不确定我的理解是否正确但是..。

在训练seq2seq模型时,我想在嵌入层中启动一组预先训练的快速文本权重,目的之一是减少测试环境中的未知单词(这些未知单词不在训练集中)。由于预训练的快速文本模型词汇量较大,在测试环境中,未知词可以用快速文本的词汇向量来表示,在训练集中,这些向量应该与语义相似的词具有相似的方向。

然而,由于嵌入层中的初始快速文本权重将通过培训过程更新(更新权重会产生更好的结果)。我想知道更新的嵌入权重是否会扭曲词之间的语义相似性关系,并破坏快速文本词汇外向量的表示?(并且,在初始嵌入层中更新的嵌入权重和字向量之间,但是它们的相应ID没有出现在训练数据中)

如果输入ID可以分布表示从预训练模型中提取的向量,然后通过查找表将这些预先训练过的单词向量(训练时的固定权重)映射到嵌入层(这些权重将在训练时更新),这会是一个更好的解决方案吗?

如有任何建议,将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-19 16:18:19

你对这个问题是正确的:当使用预先训练过的向量并在你的最终模型中对它们进行微调时,那些不经常出现或没有出现在你的训练集中的单词将不会得到任何更新。

现在,人们通常可以测试您的特殊情况下的问题有多少。例如,如果您有一个验证集,尝试微调而不是微调权重,看看验证集的模型性能有什么不同。

如果在不进行微调时,验证集的性能有很大差异,下面是几种处理这一问题的方法:

a)在不可训练的嵌入后添加一个线性转换层.在许多情况下,微调嵌入会对空间进行仿射转换,因此可以在一个单独的层中捕捉到这一点,该层可以在测试时应用。

例如,a是预先训练的嵌入矩阵:

代码语言:javascript
复制
embeds = tf.nn.embedding_lookup(A, tokens)
X = tf.get_variable("X", [embed_size, embed_size])
b = tf.get_vairable("b", [embed_size])
embeds = tf.mul(embeds, X) + b

在不可训练的嵌入矩阵A中保留预先训练过的嵌入。添加可训练嵌入矩阵B,这在您的训练集中有一个较小的流行单词的词汇量和嵌入的大小。查找A和B中的单词(例如,如果word超出了词汇量,请使用ID=0 ),连接结果并将其输入到您的模型中。通过这种方式,你可以教你的模型主要使用A,有时在你的训练集中,你也会依赖B来获得流行词汇。

代码语言:javascript
复制
fixed_embeds = tf.nn.embedding_lookup(A, tokens)
B = tf.get_variable("B", [smaller_vocab_size, embed_size])
oov_tokens = tf.where(tf.less(tokens, smaller_vocab_size), tokens, tf.zeros(tf.shape(tokens), dtype=tokens.dtype))
dyn_embeds = tf.nn.embedding_lookup(B, oov_tokens)
embeds = tf.concat([fixed_embeds, dyn_embeds], 1)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44060592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档