双曲嵌入论文与代码实现

由于双曲嵌入相关的文章已经有了一系列的代码。本篇博客主要目的实现最开始的双曲嵌入论文,将论文中有些直接写出来的内容进行了细节的推导,同时实现对应的代码。

  • 学习的文章:Poincaré Embeddings for Learning Hierarchical Representations
  • 主要参考的代码:
    • poincare_embeddings
    • gensim – Topic Modelling in Python - poincare.py

由于有些代码难以运行,有些比较难读(封装程度非常高)甚至有些代码写得存在一些问题。因此我们重新按照论文的设置,利用Python重现了对应的方法,并成功运行,同时进行绘图展示。

1. 目标

我们有一些层级结构的网络类型数据,如何能够根据每个词的上下结构路径,将每个词语能够用一个向量来替换,换句话说,就是将词映射为实数域中的向量(词嵌入,word embedding)。最简单的想法是使用one-hot词向量,其构造起来很容易,但通常并不是一个好选择。主要的原因是,one-hot词向量无法准确表达不同词之间的相似度,同时也不能刻画词语之间的层次结构。而在另外的方法中,采用最多的是在欧式空间里进行嵌入(word2vec),这种方式的embedding可以有效表示出词语间的相似性,但却依旧难以刻画出词语之间的层次结构。

这时候为了既能够衡量词与词之间的相似性,又能衡量这种词与词之间的层次结构,引入了双曲几何的思想,在双曲空间中进行嵌入。双曲嵌入表征层级结构的能力就要比欧氏空间嵌入的能力高得多,同时需要的维数却更少。

Python 代码依赖库

为了能够顺利跑通后面的代码,这里先展示出代码需要依赖的库:

import nltk
# nltk.download('wordnet') # 第一次运行需运行此命令,安装wordnet数据集
from nltk.corpus import wordnet as wn
from math import *
import random
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
import networkx as nx

2. 数据集

训练数据集采用wordnet中的数据进行实现,相关的数据说明在上周的文档中已经进行了介绍,这里不再进行赘述。

由于整个的wordnet数据集比较大,为了测试代码,我们只使用哺乳动物(mammal)及其相关的分支进行学习。首先我们看看数据集长什么样。由于我们只需要用到层次结构信息,因此我们只需将数据集里面每个哺乳动物相关名词的子节点与父节点的关系进行读取与构建。

network = {} # 构建层级网络
last_level = 8 # 最深的层设置为8层
levelOfNode = {} # 数据的层级信息,0为哺乳动物(根节点),1为哺乳动物下一结构# 递归构建network
def get_hyponyms(synset, level):if (level == last_level):levelOfNode[str(synset)] = levelreturnif not str(synset) in network:network[str(synset)] = [str(s) for s in synset.hyponyms()]levelOfNode[str(synset)] = levelfor hyponym in synset.hyponyms():get_hyponyms(hyponym, level + 1)# 构建以哺乳动物为根节点的层次结构数据集
mammal = wn.synset('mammal.n.01')
get_hyponyms(mammal, 0)
levelOfNode[str(mammal)] = 0# 将终端叶子节点补到network字典中
for a in levelOfNode:if not a in network:network[a] = []

数据展示

运行完成上述代码后,可以得到对应的节点层级,以及总体的网络分支。

节点层级(数值表示层级数,最深的层设置为6,0为根节点)

网络分支情况

为了更清晰地将树的结构进行刻画,用一个代码进一步将相关的层次结构直接进行展示。

def norm(x):return np.dot(x, x)def traverse(graph, start, node):node_name = node.name().split(".")[0]graph.depth[node_name] = node.shortest_path_distance(start)for child in node.hyponyms():child_name = child.name().split(".")[0]graph.add_edge(node_name, child_name) # 添加边traverse(graph, start, child) # 递归构建def hyponym_graph(start):G = nx.Graph() # 定义一个图G.depth = {}traverse(G, start, start)return Gdef graph_draw(graph):plt.figure(figsize=(10, 10)) # 展示整体的网络# plt.figure(figsize=(3, 3)) # 展示大象网络nx.draw(graph,node_size = [10 * graph.degree(n) for n in graph],node_color = [graph.depth[n] for n in graph],alpha = 0.8,font_size = 4,width = 0.5,with_labels = True)def get_keys(d, value):return [k for k,v in d.items() if v == value]root_name = get_keys(graph.depth, 0)[0]plt.savefig("~/hyperE/fig/" + root_name + ".png", dpi = 300)graph = hyponym_graph(mammal)
graph_draw(graph)

绘制出来的哺乳动物(mammal)全体的结构如下(此时没有空间信息,只有层级信息,为了展示才显示为下图所示的样式):

其中,颜色越深,节点越大,表示节点的层级越接近根节点(哺乳动物)。

由于数据非常多,展示的不是很清楚,这里我们单纯的提出出来大象(elephant)的结构,进一步看看数据集的情况。

elephant = wn.synset('elephant.n.01')
graph = hyponym_graph(elephant)
graph_draw(graph)

后面我们将利用这份数据集,进行方法的介绍,以及双曲嵌入模型的训练。请见:双曲嵌入论文与代码实现——2. 方法与代码

双曲嵌入论文与代码实现——1. 数据集介绍相关推荐

  1. 双曲嵌入Poincare disk

    双曲嵌入Poincare disk Model Poincare disk and UHP is conformal to metric of dx^2+dy^2 so with angle info

  2. 【论文翻译 | AAAI19】HHNE - Hyperbolic Heterogeneous Information Network Embedding 双曲异构信息网络嵌入

    文章目录 摘要 1 引言 2 相关工作 3 相关知识 3.1 HIN相关定义 3.2 HIN中的关系分布 4 双曲空间中的HIN嵌入 4.1 双曲几何 6 结论 双曲空间 异构网络嵌入 参考阅读: H ...

  3. 双曲图嵌入Low-Dimensional Hyperbolic Knowledge Graph Embeddings

    知识图谱嵌入为实体和关系学习低维的向量表示,KG往往表现出分层和逻辑模式,希望这些都能在嵌入空间中表现出来.对于分层结构,双曲空间有很大的优点,它能保持高保真和很小的嵌入维度.但是,现有的双曲嵌入方法 ...

  4. Hyperbolic Nural Networks双曲神经网络

    给了神经网络中一些操作的双曲版本的定义,NIPS2018的文章,原文在此:https://arxiv.org/abs/1805.09112 双曲空间在机器学习领域获得越来越多的冲力,因为它有很大的容量 ...

  5. 如何将原图和json融合_双曲知识嵌入:如何将知识“融合”带入新空间?

    知识图谱作为人类知识的结构化数据,是构建人工智能的基石.然而目前的知识图谱都是不完备的,所以需要将多个知识图谱融合以获得更完备的知识库.基于表示学习的知识关联作为知识图谱融合的新方法受到了许多关注.但 ...

  6. 【文献阅读】用于zero-shot识别的双曲视觉嵌入学习网络(S. Liu等人,CVPR,2020)

    一.背景 文章题目:<Hyperbolic Visual Embedding Learning for Zero-Shot Recognition> 文章下载地址:https://open ...

  7. 综述 | 最新双曲深度神经网络综述论文

    在公众号[计算机视觉联盟]后台回复[9076]获取我的AI学习笔记:我的微信:Kingsplusa:    --by 王博Kings,985AI博士,CSDN博客专家,华为云专家 Hyperbolic ...

  8. 【CVPR2022】双曲图像分割

    来源:专知 本文为论文,建议阅读5分钟双曲流形为图像分割提供了一个有价值的替代方案. 对于图像分割,目前的标准是通过线性超平面在欧几里德输出嵌入空间中进行像素级优化和推理.在这项工作中,我们表明双曲流 ...

  9. 【GNN报告】耶鲁大学Rex Ying(应智韬): 双曲表示学习与知识图谱

    目录 1.简介 2.Hyperbolic Embeddings and Knowledge Graphs 背景 双曲空间 知识图谱 ​编辑​编辑 3.参考 1.简介 本人因为关注图学习领域发展,于是将 ...

最新文章

  1. codevs1219 骑士遍历(棋盘DP)
  2. XML与web开发-01- 在页面显示和 XML DOM 解析
  3. QT案例:登录对话框——主窗口
  4. 为什么真正的神经元学得更快
  5. 你真的了解UIButton、UILabel 吗?
  6. jedis,spring-redis-data 整合使用,版本问题异常
  7. poi导出excel设置对应格式
  8. 诺基亚N9手机升级后PR1.3后反应迟钝、发热、耗电快的问题
  9. c语言看门狗的作用,AT89S52单片机看门狗C语言程序
  10. element-plus日期选择器 value-format出错
  11. 架构 高级系统架构师培训笔记
  12. python面板数据分析代码_面板数据分析是什么如何进行面板数据分析?
  13. 戴尔微型计算机7050配置,小巧彪悍 戴尔 OptiPlex 7050 微型机评测
  14. matlab的syms无法在函数中使用_matlab syms什么意思_常见问题解析
  15. 讯飞、有道、谷歌、微软语音sdk集成总结
  16. 怎么制作九宫格切图?这两个方法非常简单
  17. APP指的是智能手机的第三方应用
  18. 『安全工具』注入神器SQLMAP
  19. Arduino提高篇04—U8g2库驱动OLED
  20. 计算机毕业设计(88)php小程序毕设作品之小说平台小程序系统

热门文章

  1. 虹科案例 | 解决ASRS系统的痛点问题居然这么简单?(上)
  2. VS2019设置easyx图形库
  3. SAP HANA首次在农夫山泉成功上线
  4. 《魔兽世界》10个让你感动流泪的故事_马立杰_新浪博客
  5. 基于图像变换的最小二乘法及其应用(新生研讨课)
  6. 2010年最有价值做的16个广告联盟
  7. 计算机网络技术2020,计算机网络技术超星2020试题及答案
  8. Installation failed with message Invalid File 无法调试
  9. java飞机大战飞机背景滚动_飞机大战背景/音效动起来
  10. mapi java_使用协议“ mapi://”从Java在Outlook中打开邮件