代码之家  ›  专栏  ›  技术社区  ›  Guillaume Chevalier

如何在SGNN(自治神经网络)中实现哈希?

  •  0
  • Guillaume Chevalier  · 技术社区  · 6 年前

    所以我读了一篇名为 Self-Governing Neural Networks for On-Device Short Text Classification 它提出了一种将单词投影到神经表示中的无嵌入方法。引用它们:

    SGNS在现有工作中的主要优点是它们克服了预先训练的单词嵌入和具有巨大参数的复杂网络的需要。[…]我们的方法是一种真正的无嵌入方法,不像NLP中大多数广泛使用的最先进的深度学习技术

    基本上,据我所知,他们的做法如下:

    1. 你首先需要计算n-克 (旁白:那个跳转程序是像以前的跳转程序,还是像word2vec一样的新跳转程序?我想这是剩下的第一个) 在单词的字符上获取文本中单词的特征表示,例如,使用4-grams,可以为每个单词生成1维稀疏特征向量。希望它是稀疏的,所以不需要完全使用内存,因为它几乎是一个热的(或计数矢量化,或tf-idf矢量化的ngram有很多零)。
    2. 然后需要使用 Locality-sensitive hashing (LSH) . 他们似乎用 Random Projection 据我所知。此外,它们不使用n gram向量,而是使用n-gram特征索引的元组及其非零n-gram特征的值(根据定义,这也是动态计算的“稀疏矩阵”,例如从非零特征的默认字典而不是全向量)。
    3. 我发现一个 implementation of Random Projection in scikit-learn . 从我的测试来看,它似乎没有产生二进制输出,尽管整个过程是在scikit learn的稀疏矩阵中使用稀疏的动态计算,正如我猜的那样,这是一个内存高效(类似于非零字典的特性)的实现。

    在这一切中不起作用的地方,以及我的问题所在,是如何从稀疏投影(散列)中得到二进制特征。他们似乎在说散列是在计算特性的同时完成的,这是令人困惑的,我本以为散列是按照我在上面写的1-2-3步的顺序来的,但他们的步骤1和2似乎是以某种方式合并的。

    我的困惑主要来自于以短语“实时计算”开头的段落 the paper 在右栏。这是一幅描绘这段令我困惑的文字的图片:

    what doesn't work

    我想把我的学校计划成功地传达给大家 BERT 使用SGNNs而不是使用单词嵌入)。那么,你怎么才能解开这个谜团呢?更准确地说, 如何实现类似的随机散列投影 使用scikit learn、TensorFlow或PyTorch?为了把这些点联系起来,我做了大量的研究,但是他们的论文没有给出实现细节,这是我想要复制的。我至少知道SGNN在字符级n-grams上使用了80个四维lshe(我的理解首先正确吗?).

    谢谢!


    编辑 :开始编码后,我意识到scikit learn的输出 SparseRandomProjection() 看起来像这样:

    [0.7278244729081154,
     -0.7278244729081154,
     0.0,
     0.0,
     0.7278244729081154,
     0.0,
     ...
    ]
    

    现在,这看起来很好,它更接近二进制,但它仍然可以被铸造成整数,而不是浮点数,首先使用好的比率。我仍然对跳过gram的事情感到疑惑,我认为现在单词的字符数是n-gram,但这可能是错误的。将很快将代码发送到GitHub。


    编辑#2 :我在这里编写了一些代码,但是使用了n-grams而不是skip-grams: https://github.com/guillaume-chevalier/SGNN-Self-Governing-Neural-Networks-Projection-Layer

    0 回复  |  直到 6 年前
    推荐文章