SGNN(自治神经网络)中如何实现散列?
Posted
技术标签:
【中文标题】SGNN(自治神经网络)中如何实现散列?【英文标题】:How is hashing implemented in SGNN (Self-Governing Neural Networks)? 【发布时间】:2019-05-21 11:09:35 【问题描述】:所以我阅读了名为 Self-Governing Neural Networks for On-Device Short Text Classification 的论文,该论文提出了一种将单词投影到神经表示中的无嵌入方法。引用他们:
SGNN 与现有工作相比的主要优势在于,它们超越了对预训练词嵌入和具有巨大参数的复杂网络的需求。 [...] 与 NLP 中大多数广泛使用的最先进的深度学习技术不同,我们的方法是一种真正的无嵌入方法
据我了解,基本上,它们的流程如下:
-
您首先需要计算 n-gram (附带问题:skip-gram 是像旧的 skip-gram 还是新的 skip-gram 像 word2vec?我认为它是剩下的第一个) 在单词的字符上获取文本中单词的特征化表示,例如,使用 4-gram,您可以为每个单词生成 1M 维的稀疏特征向量。希望它是稀疏的,因此不需要完全使用内存,因为它几乎是 one-hot(或计数向量化或 tf-idf 向量化具有很多零的 ngram)。
然后您需要使用Locality-sensitive hashing (LSH) 散列那些n-gram 稀疏向量。据我了解,他们似乎使用Random Projection。此外,它们不是使用 ngram 向量,而是使用 n-gram 特征索引的元组及其非零 n-gram 特征的值(根据定义,这也是动态计算的“稀疏矩阵”,例如从非零特征的默认字典,而不是完整的向量)。
我找到了implementation of Random Projection in scikit-learn。从我的测试来看,它似乎没有产生二进制输出,尽管整个事情是在 scikit-learn 的稀疏矩阵中使用稀疏的即时计算来实现内存效率(非零类字典功能)我猜是实现。
在所有这些中不起作用的地方,以及我的问题所在,是它们如何最终得到来自稀疏投影(散列)的二进制特征。他们似乎在说散列是在计算特征的同时完成的,这令人困惑,我本以为散列会按照我上面写的 1-2-3 步骤的顺序进行,但是他们的步骤 1和 2 似乎以某种方式合并。
我的困惑主要来自以“On-the-fly Computation”开头的段落。在右栏中the paper 的第 888 页(PDF 第 2 页)。这是一张描绘让我困惑的段落的图片:
我想成功地传达我的学校项目(尝试将 BERT 与 SGNN 混合,而不是使用词嵌入)。那么,你将如何揭开它的神秘面纱?更准确地说,如何使用 scikit-learn、TensorFlow 或 PyTorch 实现类似的随机散列投影?试图在这里连接这些点,我进行了大量研究,但他们的论文没有给出实现细节,这是我想要重现的。我至少知道 SGNN 在字符级 n-gram 单词上使用了 80 个 14 维 LSH(我的理解首先正确吗?)。
谢谢!
编辑:开始编码后,我发现 scikit-learn 的SparseRandomProjection()
的输出是这样的:
[0.7278244729081154,
-0.7278244729081154,
0.0,
0.0,
0.7278244729081154,
0.0,
...
]
现在,这看起来不错,它更接近二进制,但通过首先使用良好的比率,它仍然可以转换为整数而不是浮点数。我仍然想知道skip-gram的事情,我现在假设单词字符的n-gram,但这可能是错误的。将很快将代码发布到 GitHub。
EDIT #2:我在这里编写了一些代码,但使用的是 n-gram 而不是 skip-gram:https://github.com/guillaume-chevalier/SGNN-Self-Governing-Neural-Networks-Projection-Layer
这里有更多讨论主题:https://github.com/guillaume-chevalier/SGNN-Self-Governing-Neural-Networks-Projection-Layer/issues?q=is%3Aissue
【问题讨论】:
讨论见:github.com/guillaume-chevalier/… 【参考方案1】:首先,感谢您实现投影层,它帮助我开始使用自己的。
我阅读了您与@thinline72 的讨论,我同意他的观点,即特征是在整行文本中计算的,一个字符一个字符,而不是一个字一个字。不过,我不确定这种功能差异是否太相关。
回答您的问题:我认为他们按照您的建议和做法分别执行第 1 步和第 2 步。对,在您包含的文章摘录中,他们谈到了特征构造和投影中的散列,但我认为这是两种不同的散列。我解释说第一次散列(特征构造)是由 CountVectorizer 方法自动完成的。
请随意查看论文的my implementation,我在该论文中构建了端到端网络并在 SwDA 数据集上进行了训练,如 SGNN 论文中所述。我获得了最高 71% 的准确率,这比论文声称的要低一些。我还使用了@thinline72 推荐的二进制哈希,以及 nltk 的 skipgrams 实现(我很确定 SGNN 论文是在谈论“旧”skipgrams,而不是“word2vec”skipgrams)。
【讨论】:
@guillaume-chevalier 您认为我的答案是否足够好,可以将其选为“已选答案”? :)以上是关于SGNN(自治神经网络)中如何实现散列?的主要内容,如果未能解决你的问题,请参考以下文章