TransE理解
论文地址:https://proceedings.neurips.cc/paper_files/paper/2013/hash/1cecc7a77928ca8133fa24680a88d2f9-Abstract.html
参考代码地址:https://github.com/zulihit/TransE
import codecs
import random
import json
import math
import numpy as np
import pandas as pd
import copy
import time
# 数据集地址
file_FB15k = "FB15k/"
entity2id = {}
relation2id = {}
数据加载
# 数据加载
def data_loader(file):
file1 = file + "train.txt"
file2 = file + "entity2id.txt"
file3 = file + "relation2id.txt"
with codecs.open(file2, 'r') as f1, codecs.open(file3, 'r') as f2: # entity2id和relation2id
lines1 = f1.readlines() # readlines:作为列表返回文件中的所有行,其中每一行都是列表对象中的一项
lines2 = f2.readlines() # 也就是将每一行拿出来组成一个列表返回
for line in lines1:
line = line.strip().split('\t') # 这一步是拆分出实体和编号 strip():删除头尾的空格 \t:水平制表符相当于tab
if len(line) != 2: # 如果这一行不是两个元素,就放弃这一行
continue
entity2id[line[0]] = int(line[1]) # 转换成字典{实体:id}
for line in lines2: # 同理,制作关系和编号的字典
line = line.strip().split('\t')
if len(line) != 2:
continue
relation2id[line[0]] = int(line[1])
entity_set = set() # 用set去重
relation_set = set()
triple_list = []
with codecs.open(file1, 'r') as f: # 文件读尽量用codecs.open方法,一般不会出现编码的问题
content = f.readlines() # 读取训练集
for line in content:
triple = line.strip().split("\t")
if len(triple) != 3:
continue
h_ = entity2id[triple[0]] # 找到训练集中三元组的对应编号
t_ = entity2id[triple[1]]
r_ = relation2id[triple[2]]
triple_list.append([h_, t_, r_]) # 储存三元组的编号
entity_set.add(h_) # 储存头实体的编号
entity_set.add(t_) # 储存尾实体的编号
relation_set.add(r_) # 储存关系的编号
return entity_set, relation_set, triple_list # 返回实体的编号集合,关系的编号集合,三元组的编号集合
entity_set, relation_set, triple_list = data_loader(file_FB15k)
print("entity_set长度(里面是这样的entity_set: {0, 1, 2, 3,...14950}):",len(entity_set))
print("relation_set长度(里面是这样的relation_set: {0, 1, 2, 3,...1344}):",len(relation_set))
print("triple_list:",triple_list[2]) #这里需要注意的是[头实体,尾实体,关系]
entity_set长度(里面是这样的entity_set: {0, 1, 2, 3,...14950}): 14951
relation_set长度(里面是这样的relation_set: {0, 1, 2, 3,...}): 1345
triple_list: [7374, 13062, 648]
print("Complete load. entity : %d , relation : %d , triple : %d" % (
len(entity_set), len(relation_set), len(triple_list)))
Complete load. entity : 14951 , relation : 1345 , triple : 483142
L1和L2
def distanceL2(h, r, t):
# 为方便求梯度,去掉sqrt(sqrt是计算平方根的函数)
return np.sum(np.square(h + r - t))
def distanceL1(h, r, t):
return np.sum(np.fabs(h + r - t)) # fabs()方法返回数字的绝对值
关系向量&实体向量(嵌入)初始化
# 关系向量&实体向量(嵌入)初始化
def emb_initialize(entity_set,relation_set,embedding_dim):
relation_dict = {}
entity_dict = {}
for relation in relation_set:
# 初始化关系
# np.random.uniform从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high
r_emb_temp = np.random.uniform(-6 / math.sqrt(embedding_dim), # math.sqrt正平方根
6 / math.sqrt(embedding_dim),
embedding_dim)
# 伪代码中关系向量初始化的办法(L2范数归一化):关系向量除以它的L2范数,每个r_emb_temp代表一个关系的向量
# 关于L2范数归一化:https://www.pianshen.com/article/9664381455/
relation_dict[relation] = r_emb_temp / np.linalg.norm(r_emb_temp, ord=2) # np.linalg.norm求范数,ord=2代表二范数
for entity in entity_set:
# 初始化实体
e_emb_temp = np.random.uniform(-6 / math.sqrt(embedding_dim),
6 / math.sqrt(embedding_dim),
embedding_dim)
entity_dict[entity] = e_emb_temp / np.linalg.norm(e_emb_temp, ord=2)
relation = relation_dict # 初始化后的关系 {关系编号:L2范数归一化后的向量}
entity = entity_dict # 初始化后的实体 {实体编号:L2范数归一化后的向量}
print("关系向量 relation[0]:\n",relation[0] ) # 返回一个关系字典
print("实体向量 entity[0]:\n",entity[0])
return relation,entity
relation,entity=emb_initialize(entity_set,relation_set,50)
关系向量 relation[0]:
[-0.06124931 0.05381147 -0.0581685 0.00965697 0.02497375 0.21745009
0.00957725 -0.11250099 0.0888398 0.00656037 0.16423882 0.09413429
0.22683678 -0.22823347 0.03280322 0.03559384 -0.04643496 0.25829363
-0.16438011 0.16169445 0.04193395 0.01949435 0.00759052 0.16294735
-0.15454095 0.22251406 -0.16183664 -0.0116275 -0.22146209 -0.15569882
-0.26301086 0.0739365 0.15301796 0.02804698 0.09017532 -0.19006649
0.15857319 -0.20143701 0.0257449 0.22238414 -0.14402593 0.07735178
-0.16285992 0.11581199 -0.04704164 -0.0047954 -0.02833891 0.1342455
0.21679655 0.2492022 ]
实体向量 entity[0]:
[-0.04303367 0.02916706 -0.02495438 -0.04141798 0.1203754 -0.01869183
-0.16110016 0.10667474 0.20629609 0.09499036 -0.17413892 0.22841423
0.14314854 -0.06291098 0.23317245 -0.07646504 -0.09352154 0.22610284
0.03655919 -0.22014374 0.22399264 -0.17550837 -0.19925698 0.21728113
0.18104154 0.13808154 -0.11072903 -0.1916764 -0.01511032 0.08146982
0.22693272 0.09733503 0.09761 0.18111636 0.00903148 -0.20821903
-0.17265452 0.00196428 -0.11702929 0.0885079 0.16693078 0.14552579
-0.08605191 -0.06132584 -0.20229443 0.04791079 0.02205383 0.12145553
-0.02652395 0.1460217 ]
由此可以看出,这里是把实体(关系)用一个50维的嵌入向量表示,一个思路就是嵌入维度越大,所能表示的特征越多。
负样本
def Corrupt(entity, triple): # 随机替换头实体和尾实体制作负样本
corrupted_triple = copy.deepcopy(triple) # deepcopy:将被复制对象完全再复制一遍作为独立的新个体单独存在
seed = random.random()
if seed > 0.5:
# 替换head
head = triple[0]
rand_head = head
while (rand_head == head):
rand_head = random.randint(0, len(entity) - 1) # 从实体集合随机选择一个实体作为头实体替换
corrupted_triple[0] = rand_head
else:
# 替换tail
tail = triple[1]
rand_tail = tail
while (rand_tail == tail):
rand_tail = random.randint(0, len(entity) - 1) # 从实体集合随机选择一个实体作为尾实体替换
corrupted_triple[1] = rand_tail
return corrupted_triple
print("三元组:",triple_list[3])
print("负三元组(随机替换头尾实体):",Corrupt(entity,triple_list[3])) #这里需要注意的是[头实体,尾实体,关系]
三元组: [11436, 7445, 143]
负三元组(随机替换头尾实体): [11436, 10061, 143]
更新实体向量(嵌入)
# 损失函数
def hinge_loss(dist_correct, dist_corrupt): # 损失函数
return max(0, dist_correct - dist_corrupt + 1) #这里设置margin为1,正确三元组的L1(L2)范数-错误三元组的L1(L2)范数
def update_embeddings(entity,relation, Tbatch,learning_rate):
# 这里深拷贝了整个字典,会造成训练速度较慢,但是是易于理解的,增加训练速度的版本是transE_speed
copy_entity = copy.deepcopy(entity)
copy_relation = copy.deepcopy(relation)
loss=0
n=0 #用于提前退出,因为这个只是用于展示
for triple, corrupted_triple in Tbatch:
# 取copy里的vector累积更新
h_correct_update = copy_entity[triple[0]] # 取正确三元组的头实体的(初始化)向量
t_correct_update = copy_entity[triple[1]] # 取正确三元组的尾实体的(初始化)向量
relation_update = copy_relation[triple[2]] # 取正确三元组的关系的(初始化)向量
h_corrupt_update = copy_entity[corrupted_triple[0]] # 取错误三元组的头实体的(初始化)向量
t_corrupt_update = copy_entity[corrupted_triple[1]] # 取错误三元组的尾实体的(初始化)向量
# 取原始的vector计算梯度
h_correct = entity[triple[0]] # 正确三元组的头实体向量
t_correct = entity[triple[1]] # 正确三元组的尾实体向量
relation_temp = relation[triple[2]] # 正确三元组的关系向量
h_corrupt = entity[corrupted_triple[0]] # 错误三元组的头实体向量
t_corrupt = entity[corrupted_triple[1]] # 错误三元组的尾实体向量
print("正确三元组:",triple[0],triple[2],triple[1])
print("错误三元组:",corrupted_triple[0],triple[2],corrupted_triple[1])
if True: # 选择l1还是l2范数计算距离这是一个超参数,假设这里选择L1范数
dist_correct = distanceL1(h_correct, relation_temp, t_correct) # 计算正确三元组的L1范数
dist_corrupt = distanceL1(h_corrupt, relation_temp, t_corrupt) # 计算错误三元组的L1范数
print("正确三元组的L1范数:",dist_correct)
print("错误三元组的L1范数:",dist_corrupt)
#else:
# dist_correct = distanceL2(h_correct, relation, t_correct) # 计算正确三元组的L2范数
# dist_corrupt = distanceL2(h_corrupt, relation, t_corrupt) # 计算错误三元组的L2范数
err = hinge_loss(dist_correct, dist_corrupt) # 计算三元组的距离函数,也是原文中的距离函数,目标是使正确三元组和错误三元组区分开
print("三元组的距离: ",err)
if err > 0: # 误差只可能是大于0和等于0,等于0时不能求导
loss += err
print("loss:",loss)
# 关于L1范数的求导方法:参考了刘知远组实现中的实现,是先对L2范数求导,逐元素判断正负,为正赋值为1,负则为-1。
grad_pos = 2 * (h_correct + relation_temp - t_correct) # 正确三元组对L2范数求导的结果
grad_neg = 2 * (h_corrupt + relation_temp - t_corrupt) # 错误三元组对L2范数求导的结果
print("正确三元组的梯度:\n",grad_pos)
print("错误三元组的梯度:\n",grad_neg)
if True:
for i in range(len(grad_pos)):
if (grad_pos[i] > 0):
grad_pos[i] = 1
else:
grad_pos[i] = -1
for i in range(len(grad_neg)):
if (grad_neg[i] > 0):
grad_neg[i] = 1
else:
grad_neg[i] = -1
'''
update_embeddings函数中,要对correct triplet和corrupted triplet都进行更新。
虽然写作$(h,l,t)$和$(h',l,t')$,但两个三元组只有一个entity不同(前面说了,不同时替换头尾实体),
所以在每步更新时重叠实体需要更新两次(和更新relation一样)。
例如正确的三元组是(1,2,3),错误的是(1,2,4),那么1和2都需要更新两次
'''
# 更新正确三元组的向量,更新的过程也就是梯度下降的过程
# (h+r-t)head系数为正,减梯度;tail系数为负,加梯度
# 基于正确三元组更新向量
h_correct_update -= learning_rate * grad_pos
t_correct_update -= (-1) * learning_rate * grad_pos
relation_update -= learning_rate * grad_pos # 正确三元组的时候relation前面的符号是正号
print("更新正确三元组向量(头实体):\n",h_correct_update)
print("更新正确三元组向量(尾实体):\n",t_correct_update)
print("更新正确三元组向量(关系):\n",relation_update)
# corrupt项整体为负,因此符号与correct相反
# 基于错误三元组更新向量
if triple[0] == corrupted_triple[0]: # 若替换的是尾实体,则头实体更新两次
h_correct_update -= (-1) * learning_rate * grad_neg
t_corrupt_update -= learning_rate * grad_neg
relation_update -= (-1) * learning_rate * grad_neg # 错误三元组的时候relation前面的符号是负号
elif triple[1] == corrupted_triple[1]: # 若替换的是头实体,则尾实体更新两次
h_corrupt_update -= (-1) * learning_rate * grad_neg
t_correct_update -= learning_rate * grad_neg
relation_update -= (-1) * learning_rate * grad_neg # 错误三元组的时候relation前面的符号是负号
#print("更新错误三元组向量(头实体):\n",h_correct_update)
print("==================================")
n=n+1
if n==5: #只循环5次,用于展示
break
# batch norm,更新完一个epoch重新归一化一下
for i in copy_entity.keys(): # copy_entity.keys代表实体的编号
copy_entity[i] /= np.linalg.norm(copy_entity[i]) # l1范数归一化,这里好像跟原文不符,原文每个epoch前貌似用的l2范数归一化,而且只针对实体
for i in copy_relation.keys():
copy_relation[i] /= np.linalg.norm(copy_relation[i]) # l1范数归一化
# 达到批量更新的目的
entity = copy_entity
relation = copy_relation
return loss
# 测试一下
nbatches = 400 # 根据batchsize计算的,看有多少个batch
batch_size = len(triple_list) // nbatches # 根据三元组数量来判断batch_size
print("batch size: ", batch_size)
Sbatch = random.sample(triple_list, batch_size) # 取一个batch的三元组样本
Tbatch = [] # 负样本
# 每个triple选3个负样例
for triple in Sbatch: # 创造负样本
corrupted_triple = Corrupt(entity,triple)
Tbatch.append((triple, corrupted_triple)) # 包含正样本和负样本的列表
selfloss=update_embeddings(entity,relation,Tbatch,0.01) # 更新向量
batch size: 1207
正确三元组: 3559 520 13032
错误三元组: 11237 520 13032
正确三元组的L1范数: 9.160141048180064
错误三元组的L1范数: 9.834198022289906
三元组的距离: 0.3259430258901581
loss: 0.3259430258901581
正确三元组的梯度:
[-0.37901602 0.35999408 0.25189135 -0.48776021 -0.34353277 0.13417585
0.12309854 0.55943398 -0.40032831 -0.6257741 -0.82395044 -0.64565296
-0.13032958 -0.42676876 0.06002297 -0.11228136 -0.39317566 0.08805352
0.13574403 0.37024427 0.39853769 -0.83249792 0.34527112 0.31937902
0.03344285 0.68976952 -0.41013865 0.21129952 -0.24349778 0.83943312
0.01960911 -0.72258477 0.17864673 0.82505802 -0.21363834 0.3877319
-0.18607471 -0.38540827 1.21557675 0.88342087 -0.25167498 0.54851887
0.01164001 -0.69430878 0.30424088 -0.04292894 0.12082423 0.10352803
0.04737885 -0.00299312]
错误三元组的梯度:
[-1.21288997 0.0426023 0.07324305 -0.45636903 -0.11113273 0.17646589
0.61759574 0.83078712 0.2223841 -0.64670274 -1.24342105 -0.76046952
-0.21324672 -0.13913355 -0.19443816 0.31559439 -0.55318034 -0.28676876
-0.1359051 -0.21112282 0.04126087 -0.75024583 -0.26448353 0.63174885
0.36455667 0.119203 0.06355581 0.17073111 -0.08695611 0.35151922
-0.84224382 -0.43388996 0.07136001 0.53999022 -0.45768278 0.51899856
-0.48669738 -0.24570011 1.10199662 0.45988928 -0.54091843 0.40703835
0.03968196 -0.22040216 -0.46371491 -0.01390717 0.61497178 0.22873204
-0.36592812 0.32693831]
更新正确三元组向量(头实体):
[ 0.2297027 0.06617272 -0.02236433 0.03971393 -0.0183397 0.11760258
-0.14633861 -0.06802978 -0.06738895 -0.14294786 -0.00737368 -0.16590576
0.14661019 -0.12888502 0.20840432 -0.22658516 0.19490931 -0.07120115
0.03070406 0.19483447 0.12137166 -0.23538472 0.12832474 -0.1298464
-0.17738364 0.10871538 -0.03781839 0.11963854 -0.11801649 0.19612825
0.13535835 -0.10416392 -0.19844118 0.23489312 0.09573639 0.12432242
0.06108367 -0.13226323 0.1536877 0.11574505 0.01557258 0.17376242
0.07849308 -0.09953866 0.17191859 -0.20786826 0.0094432 -0.07974221
0.13303983 -0.0930276 ]
更新正确三元组向量(尾实体):
[ 0.21671441 0.01611362 0.00714604 0.04116654 0.19156749 0.05765291
-0.18083127 -0.15081217 -0.1026865 0.07931343 0.14264843 0.20150768
0.0923356 0.12387304 0.18558506 -0.17221731 0.15485868 -0.18112329
-0.07792114 -0.05432951 -0.16490448 0.18528051 0.04996853 -0.05508658
-0.03808002 -0.19579378 -0.00197225 -0.12294335 0.12599166 -0.20157153
-0.0945553 0.09187188 -0.06727104 -0.16573768 -0.04166313 -0.03553562
-0.11778666 -0.13913391 -0.20343586 -0.17693545 0.1756986 0.04243341
0.21554448 0.18772311 -0.17024577 -0.03645544 0.21043763 -0.15602006
0.05864182 -0.07796291]
更新正确三元组向量(关系):
[-0.1724963 0.09993794 0.12545604 -0.21242749 0.06814081 -0.02286175
-0.00294339 0.16693461 -0.20546171 -0.06062576 -0.23195311 0.07458696
-0.08943938 0.06937367 -0.02280778 0.02822718 -0.20663845 -0.09589538
-0.07075319 -0.09404184 -0.11700729 0.03441627 0.06427935 0.20444933
0.12602504 0.0103756 -0.13922319 -0.16693213 0.15225926 -0.00798322
-0.25010909 -0.13525658 0.19049351 -0.01810178 -0.21421869 0.0040079
-0.24190768 -0.16957481 0.22066482 0.11902993 0.06428854 0.11293043
0.11287141 -0.02989262 -0.22004393 0.17994835 0.23140655 -0.05451384
-0.08070859 0.04356814]
==================================
正确三元组: 12489 591 3764
错误三元组: 3432 591 3764
正确三元组的L1范数: 10.072297497304145
错误三元组的L1范数: 8.895223316435523
三元组的距离: 2.1770741808686225
loss: 2.5030172067587806
正确三元组的梯度:
[-0.20675598 -0.83125079 0.40518409 -0.27664591 -0.23839436 -0.04849558
0.10270012 0.03573358 -0.28901653 -0.54806713 0.52595571 0.19228698
-0.28891565 -0.34848291 0.60373705 -0.38225062 0.18428005 -0.09909495
0.48397984 0.33237687 0.39685326 0.26258934 0.20324456 -0.03127339
-0.08698592 -1.06777599 -0.28804742 0.9433875 0.85814169 -0.38462137
0.52426569 -1.07268463 0.06561395 -0.1351267 0.85691044 0.80275474
0.32775847 0.8533333 -0.60398975 -0.62201439 0.3411744 0.08062966
0.43420765 -0.52652602 -0.06032774 -0.01874879 -0.38629008 -0.37470968
-0.3143244 0.79667938]
错误三元组的梯度:
[ 0.57900001 -0.69060333 -0.27781468 0.29042609 -0.41242099 -0.33514097
-0.49171434 -0.438654 0.08553278 -0.34020408 -0.03004907 0.23082889
0.44902808 -0.5231981 0.70284469 -0.44376323 0.00236497 0.1680438
0.03400182 0.96799707 -0.11136612 0.12276734 -0.14667088 -0.05740552
-0.53705433 -0.39941882 -0.06872949 0.39747502 0.91435588 -0.12735192
0.01999781 -0.39984922 0.11006548 -0.59624287 0.52324563 0.17826109
0.54646694 0.85043908 -0.26478771 -0.60848199 0.55856062 0.24023241
0.27502472 0.38001486 0.38453466 0.05923525 -0.23232777 0.3212445
0.46356412 0.40164359]
更新正确三元组向量(头实体):
[-0.12991586 -0.16440062 0.16125645 -0.06963659 0.00588732 -0.06145422
0.15302673 0.14754389 -0.17820692 -0.17379509 0.15935649 0.06423061
-0.19406064 0.09327949 -0.13462955 0.08170153 -0.02968334 -0.2178587
0.01878297 -0.08934636 0.05930044 0.16612617 0.18147629 -0.05369676
0.02258476 -0.09889161 -0.04378755 0.21309609 -0.0055314 0.10504572
0.02104224 -0.10539113 0.00688008 0.19415205 0.09957171 0.14861912
-0.0955123 -0.02709809 0.08867102 -0.20362468 -0.08499755 0.00741165
0.18733285 -0.22504347 -0.22273776 -0.18459085 -0.13170815 -0.21553465
-0.16820369 0.17852849]
更新正确三元组向量(尾实体):
[ 0.0050869 0.08520743 -0.0782068 0.02720928 0.01639467 0.1189452
0.12811563 0.0370657 0.01536301 0.11157175 -0.125298 0.24521036
-0.02412924 0.11570441 -0.17468522 0.08811775 -0.10033296 -0.19931802
-0.14839989 -0.00535774 -0.16605157 0.0905454 0.20020356 0.00116181
0.11966507 0.23274371 0.19135325 -0.10567917 -0.18644574 0.09486631
-0.19564498 0.21459862 -0.17647544 0.15895447 -0.16585566 -0.08354602
-0.09783547 -0.17778807 0.14655853 0.03630079 -0.09895671 -0.09075587
0.07575139 0.17568436 -0.01532985 -0.23376763 0.10097763 0.17765354
0.20537207 0.02594474]
更新正确三元组向量(关系):
[ 0.06162476 -0.13601735 -0.0668712 -0.01147708 -0.07868983 0.18615163
-0.00356104 -0.1226114 0.07906167 0.04133327 -0.05167663 0.24712324
0.05547357 -0.12181653 0.23181285 -0.15470908 -0.00850959 -0.00100679
0.04480705 0.22017705 -0.05692538 0.0257139 0.09034955 0.06922188
0.08358735 -0.17225267 0.12111709 0.12291848 0.2181565 -0.1724901
0.01544562 -0.18635256 -0.18054854 -0.07276093 0.13302785 0.13921223
0.13155607 0.24597667 -0.21410737 -0.04108172 0.12662804 -0.08785269
0.07552237 0.16746481 0.20724404 -0.02855117 0.06954074 0.23583335
0.24641356 0.21575595]
==================================
正确三元组: 5971 242 1937
错误三元组: 5971 242 12379
正确三元组的L1范数: 10.838409158700102
错误三元组的L1范数: 10.324248809616375
三元组的距离: 1.5141603490837277
loss: 4.017177555842508
正确三元组的梯度:
[-0.2583954 0.75117153 -0.70019031 0.37722074 -0.22390412 -0.37128223
-0.37664392 -0.01448126 -0.36556971 0.67554285 0.36036681 0.58679804
-0.56599424 0.79970803 0.75649744 0.77286221 -0.26326082 0.14947996
-0.67023404 0.02380669 -0.76563816 0.7129515 0.94371575 0.15692248
-0.05732602 0.04239009 -0.1545963 -0.17958389 0.50802604 -0.48672663
-0.55946516 -0.60719591 -0.48154064 -0.06867678 0.07234063 0.15862991
-0.35610727 -0.00660994 0.26682611 0.14069412 -0.46288159 0.37630276
-0.9899526 0.45630982 -1.08016621 0.20687556 -0.2692745 -0.53531404
-0.43873147 -1.07163607]
错误三元组的梯度:
[-0.73952717 0.90640584 -0.59234038 0.13835401 -0.02106316 -0.23818818
-0.20512517 0.41712066 -1.08411331 0.53046497 0.46595905 -0.04045682
-0.51185347 0.89064319 0.97088536 0.09680112 -0.213252 0.43408414
-0.47290427 -0.2345759 0.02207074 0.43654382 0.07963893 -0.64194125
-0.36320662 -0.08258446 -0.7346493 0.04089253 -0.08650893 -0.21946392
-0.97173921 -0.02592454 -0.2536815 0.14912094 0.63431087 0.63769143
-0.58913114 0.5826085 0.78669324 -0.33504835 -0.10750919 0.73398359
-0.32363269 0.28295547 -0.98100014 0.24760741 -0.36813614 -0.25353888
-0.30583286 -0.1667329 ]
更新正确三元组向量(头实体):
[-0.08934616 -0.0456189 -0.04346564 0.06966536 -0.03918103 -0.11917562
-0.19253371 0.05937545 -0.22708118 0.0902964 0.23607142 -0.0409323
0.05726446 0.10340646 0.23561154 0.0353324 0.080485 0.16431726
-0.177941 -0.14737261 -0.16632585 0.04386661 0.09845879 -0.17417872
-0.24173488 0.0009411 -0.14134846 -0.21125681 0.1364854 -0.21538004
-0.19120584 0.08871361 0.04766718 -0.00025555 -0.02630896 0.04873789
-0.09395941 0.20110266 0.17984689 0.08842095 0.06703177 0.21846395
-0.18744731 0.20221225 -0.15945802 -0.12049582 0.06079068 -0.07816313
0.00929007 -0.0691089 ]
更新正确三元组向量(尾实体):
[-0.12878045 -0.13286137 0.1605667 0.05689098 0.18539835 0.19010479
-0.08320368 0.05279641 -0.18501312 -0.09568796 0.11891911 -0.19168768
0.17982601 -0.04070374 0.03453008 -0.10578747 -0.00246913 0.18461503
0.19290356 -0.17485211 0.17971106 -0.11025855 -0.20289303 -0.18443148
0.01375137 -0.10042602 -0.21482027 -0.05401662 -0.12962625 -0.04619295
-0.07648262 0.17444274 0.20365959 0.1535966 0.19770323 0.00588395
0.08088917 0.19095797 0.09442052 -0.08938368 0.16257912 0.0060258
0.15515716 0.12779967 0.15341584 -0.07033769 0.00725963 0.14077621
-0.02993194 0.19856707]
更新正确三元组向量(关系):
[-0.13863199 0.25834329 -0.11606282 0.14583599 0.14262733 0.15363929
-0.04899193 0.01618034 -0.1107168 0.12178707 0.03303109 0.11264364
-0.13043557 0.22574382 0.14716726 0.21531124 -0.18458455 0.06503775
0.06572753 -0.04557615 -0.00678217 0.17235059 0.14050606 0.03820848
0.25682324 -0.11017207 -0.12076996 0.09744824 -0.04209863 -0.04417623
-0.13500936 -0.18786882 -0.05477791 0.14951375 0.2301825 0.00646102
0.02679495 0.01655034 0.01798669 -0.13745758 -0.10589344 -0.05428676
-0.12237182 0.12374234 -0.19720924 0.12359591 -0.1581683 -0.01871768
-0.22858774 -0.23814207]
==================================
正确三元组: 13591 1291 12733
错误三元组: 13053 1291 12733
正确三元组的L1范数: 10.301110197065395
错误三元组的L1范数: 10.956140962774905
三元组的距离: 0.34496923429049
loss: 4.362146790132998
正确三元组的梯度:
[-0.16795658 -0.12949096 0.86120369 -0.63356445 -0.43294176 0.1614915
0.72136151 0.09835598 -0.02436859 0.65419805 0.89448053 0.27997895
-0.38054446 0.00558313 -0.07562275 -0.42429659 0.14469542 -0.23622529
0.50427403 0.65682846 0.18051775 -0.23145447 -0.30247826 -0.16453314
0.45272069 -0.25732558 0.35740638 -1.05463174 -0.51151366 -0.51385635
-0.24108557 0.10228883 -0.70497518 0.5301379 -0.26027818 0.42738776
0.01525057 0.31995543 -0.57657569 0.27153534 0.54535743 0.87142385
-0.89743388 0.52178093 -0.39267808 1.03495809 0.10653143 0.09360188
-0.47958875 -0.69549495]
错误三元组的梯度:
[-0.67771651 0.12805868 0.72408947 -0.19640587 -0.74853482 -0.34909758
0.44424789 -0.12377116 0.1842216 0.376691 0.37375837 0.54991684
-0.03252688 -0.01503632 0.63432943 -0.60377107 -0.15897948 -0.04480671
0.45616743 0.53679793 0.964548 0.2923565 0.26962191 -0.25070664
0.13142219 -0.5687559 0.66908898 -1.3728184 -0.31446713 -0.92413308
-0.21311364 -0.29992207 -0.5525467 1.15602521 0.06037807 0.24726618
-0.07502866 -0.29430864 -0.34061504 0.46896628 -0.15371691 0.77467971
-1.09272412 0.19261579 -0.56736933 0.3018252 0.67899331 0.47809996
-0.43818598 -0.40905736]
更新正确三元组向量(头实体):
[ 0.03719875 -0.18102125 0.18655618 0.00234794 -0.00593733 0.20994527
0.2321054 -0.07844085 -0.08978608 0.19390504 0.22651861 0.08342132
0.04610836 0.02628527 -0.21922707 -0.01643649 0.13454788 -0.01742153
0.00986113 -0.04198968 -0.22021667 -0.20016039 -0.05358228 -0.17935688
0.17247146 0.19220583 -0.20978991 -0.01921698 0.08702367 -0.02535365
-0.12990253 -0.03767222 -0.06934149 -0.17999268 -0.14629433 -0.15465156
-0.08023339 0.08533757 -0.16837369 -0.17871502 0.21934804 0.17723644
0.03689182 0.13320018 0.01651606 0.14489723 -0.11404736 0.03530656
-0.0057997 -0.22038112]
更新正确三元组向量(尾实体):
[-0.0589535 -0.20761707 -0.07000709 0.24815392 0.17894299 0.10897056
0.13024331 -0.05340003 -0.08946519 -0.13465577 -0.07007775 -0.05664604
0.0386865 0.06207172 -0.13455015 0.03412457 0.03162785 -0.10439232
-0.20029494 -0.12670348 -0.04617016 -0.22046366 0.09273154 -0.0229746
0.13404191 0.18611716 -0.23198154 0.23538903 0.15334151 0.04696953
0.09957064 -0.02955164 0.18214594 -0.17534037 -0.23096015 -0.102417
-0.2346907 -0.1462859 0.06890641 -0.17964636 0.05445803 -0.07502705
0.2170002 -0.15103151 0.12880815 -0.11985806 -0.11893992 0.0426667
0.07104367 -0.09966913]
更新正确三元组向量(关系):
[-0.15013055 -0.0613413 0.14403858 -0.04097624 -0.00159057 -0.05022896
0.22881867 0.04421881 0.0181366 -0.03146179 0.1206439 -0.03007788
-0.16769409 0.00857801 0.07686555 -0.13158723 -0.06057233 -0.17508344
0.01198095 0.21370042 0.23430539 -0.10603051 0.02507469 0.1041157
0.1579308 -0.10475145 0.12651156 -0.24270986 -0.15943899 -0.154605
0.13893038 0.029265 -0.07100017 0.23972126 -0.18480491 0.23592844
-0.17683202 -0.10164575 -0.02100775 0.10483633 0.07778871 0.15344844
-0.23860857 -0.05334123 -0.05404695 0.22272376 0.01837316 0.02416109
-0.13295101 -0.19703548]
==================================
正确三元组: 9399 1226 14152
错误三元组: 9399 1226 14262
正确三元组的L1范数: 9.992409340840295
错误三元组的L1范数: 9.942922552785314
三元组的距离: 1.0494867880549812
loss: 5.411633578187979
正确三元组的梯度:
[ 0.3680397 0.32089285 0.62452467 -0.11492201 -0.09262002 -0.43011459
0.51431885 -0.30068848 -0.30219077 0.75059382 -0.82481915 -0.51594505
0.79295137 -0.07095999 -0.3475567 -0.03309919 0.27992241 -1.04000586
-0.95227105 0.25276741 0.05232533 0.88260994 -0.07266404 0.29301016
-0.15009508 -0.26230577 0.14339828 -0.37980872 1.19761505 0.07059943
0.33072642 0.19519713 0.53772988 0.2357335 0.17952196 -0.01149659
0.46860705 -0.44929227 0.04870082 -0.6611804 -0.47435454 0.55607143
-0.33234647 -0.67720789 -0.47300547 -0.27851468 0.76242954 0.57561381
0.01060576 -0.29284736]
错误三元组的梯度:
[ 0.46310257 0.21061891 1.24805701 0.13339741 -0.00294819 -0.22907679
0.07070678 -0.78669113 0.00839461 0.00849556 -0.81720606 -0.35734205
0.28473943 0.14521598 -0.14422891 -0.399389 0.1475983 -1.13260506
-0.46865487 0.04638166 0.08336715 0.75340647 -0.13428276 0.6772844
-0.57690078 -0.26076736 0.30900861 0.29524747 0.84295118 -0.43183746
0.05549771 -0.49581024 -0.14328479 0.09092644 0.24354843 -0.23388881
0.66421034 -0.91978058 -0.01725474 -0.52507413 -0.46899945 0.55209168
-0.1651277 -0.68579278 0.23637797 -0.39954224 0.56613526 0.90607213
-0.2003177 -0.84620808]
更新正确三元组向量(头实体):
[-0.01831672 -0.18055599 0.20603467 0.22398648 -0.15489488 0.01648978
0.00368893 -0.0251046 -0.12057599 0.00527216 -0.00037307 -0.13813036
0.0430363 0.11004196 0.1058476 0.1641077 0.0257299 -0.19869179
-0.18634728 0.22703158 0.17503868 0.09201114 0.10029876 0.17451867
-0.20132297 0.06525971 0.1391338 0.13339879 0.2087574 -0.22631443
0.0393066 0.11737633 0.08829377 0.10877147 -0.01418208 -0.21159191
0.20547908 -0.19480133 -0.15336722 -0.03435928 -0.06201322 0.1951056
-0.22891573 0.06897806 0.05911209 0.12833171 -0.04070961 0.057704
0.11166147 -0.09678127]
更新正确三元组向量(尾实体):
[-0.05657985 -0.16712552 0.15457465 0.2142093 -0.06569875 0.11085332
-0.11512669 -0.06287761 -0.01930346 -0.12491337 0.15426069 -0.06612348
-0.20488343 0.18162021 0.21864213 -0.00233526 0.05588688 0.11340089
0.168908 0.02132967 0.13220786 -0.21963586 0.18884161 0.19709918
-0.13572044 0.07838115 0.03376749 0.18850162 -0.15418359 -0.16783863
0.01981965 -0.1195906 -0.10097688 -0.13422315 0.15743777 -0.22389771
0.11677102 0.00318792 0.08573639 0.12540468 -0.00666724 -0.2050859
-0.07770921 0.2196374 0.2013742 0.06186475 -0.17044875 -0.07208446
-0.07473142 -0.08943234]
更新正确三元组向量(关系):
[ 0.11575673 0.14387689 0.23080231 -0.03723818 0.07288612 -0.09069376
0.1083438 -0.15811724 -0.01982286 0.21511138 -0.22777581 -0.15596564
0.11855595 0.06609826 -0.03098382 -0.15299256 0.14011818 -0.17791025
-0.09088025 -0.10931821 -0.04666815 0.09965796 0.08221084 0.13908558
0.02055499 -0.08803145 -0.06366717 -0.10480152 0.20586653 0.06377551
0.11587626 -0.16936836 0.0495943 -0.15512788 0.23138083 0.01194591
0.11559546 0.00334312 0.23345403 -0.14082623 -0.15183128 -0.15215579
0.01503328 -0.15794461 -0.06424062 -0.1757243 0.22147562 0.12801845
-0.21109001 -0.10907475]
==================================