MCPcopy Create free account
hub / github.com/DeepGraphLearning/graphvite / TransE

Class TransE

include/instance/model/knowledge_graph.h:35–103  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

33 */
34template<class _Vector>
35class TransE {
36public:
37 static const size_t dim = _Vector::dim;
38 typedef _Vector Vector;
39 typedef typename _Vector::Float Float;
40
41 __host__ __device__
42 static void forward(const Vector &head, const Vector &tail, const Vector &relation, Float &output, float margin) {
43 output = 0;
44 FOR(i, dim)
45 output += abs(head[i] + relation[i] - tail[i]);
46 output = margin - SUM(output);
47 }
48
49 template<OptimizerType optimizer_type>
50 __host__ __device__
51 static void backward(Vector &head, Vector &tail, Vector &relation,
52 float margin, Float gradient, const Optimizer &optimizer, float relation_lr_multiplier = 1,
53 Float weight = 1) {
54 auto update = get_update_function<Float, optimizer_type>();
55 FOR(i, dim) {
56 Float h = head[i];
57 Float t = tail[i];
58 Float r = relation[i];
59 Float s = h + r - t > 0 ? 1 : -1;
60 head[i] -= (optimizer.*update)(h, -gradient * s, weight);
61 tail[i] -= (optimizer.*update)(t, gradient * s, weight);
62 relation[i] -= relation_lr_multiplier * (optimizer.*update)(r, -gradient * s, weight);
63 }
64 }
65
66 template<OptimizerType optimizer_type>
67 __host__ __device__
68 static void backward(Vector &head, Vector &tail, Vector &relation,
69 Vector &head_moment1, Vector &tail_moment1, Vector &relation_moment1,
70 float margin, Float gradient, const Optimizer &optimizer, float relation_lr_multiplier = 1,
71 Float weight = 1) {
72 auto update = get_update_function_1_moment<Float, optimizer_type>();
73 FOR(i, dim) {
74 Float h = head[i];
75 Float t = tail[i];
76 Float r = relation[i];
77 Float s = h + r - t > 0 ? 1 : -1;
78 head[i] -= (optimizer.*update)(h, -gradient * s, head_moment1[i], weight);
79 tail[i] -= (optimizer.*update)(t, gradient * s, tail_moment1[i], weight);
80 relation[i] -= relation_lr_multiplier * (optimizer.*update)(r, -gradient * s, relation_moment1[i], weight);
81 }
82 }
83
84 template<OptimizerType optimizer_type>
85 __host__ __device__
86 static void backward(Vector &head, Vector &tail, Vector &relation,
87 Vector &head_moment1, Vector &tail_moment1, Vector &relation_moment1,
88 Vector &head_moment2, Vector &tail_moment2, Vector &relation_moment2,
89 float margin, Float gradient, const Optimizer &optimizer, float relation_lr_multiplier = 1,
90 Float weight = 1) {
91 auto update = get_update_function_2_moment<Float, optimizer_type>();
92 FOR(i, dim) {

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected