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

Class DistMult

include/instance/model/knowledge_graph.h:113–190  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

111 */
112template<class _Vector>
113class DistMult {
114public:
115 static const size_t dim = _Vector::dim;
116 typedef _Vector Vector;
117 typedef typename _Vector::Float Float;
118
119 __host__ __device__
120 static void forward(const Vector &head, const Vector &tail, const Vector &relation, Float &output,
121 float l3_regularization) {
122 output = 0;
123 FOR(i, dim)
124 output += head[i] * relation[i] * tail[i];
125 output = SUM(output);
126 }
127
128 template<OptimizerType optimizer_type>
129 __host__ __device__
130 static void backward(Vector &head, Vector &tail, Vector &relation,
131 float l3_regularization, Float gradient, const Optimizer &optimizer,
132 float relation_lr_multiplier = 1, Float weight = 1) {
133 auto update = get_update_function<Float, optimizer_type>();
134 l3_regularization *= 3;
135 FOR(i, dim) {
136 Float h = head[i];
137 Float t = tail[i];
138 Float r = relation[i];
139 head[i] -= (optimizer.*update)(h, gradient * r * t + l3_regularization * abs(h) * h, weight);
140 tail[i] -= (optimizer.*update)(t, gradient * h * r + l3_regularization * abs(t) * t, weight);
141 relation[i] -= relation_lr_multiplier *
142 (optimizer.*update)(r, gradient * h * t + l3_regularization * abs(r) * r, weight);
143 }
144 }
145
146 template<OptimizerType optimizer_type>
147 __host__ __device__
148 static void backward(Vector &head, Vector &tail, Vector &relation,
149 Vector &head_moment1, Vector &tail_moment1, Vector &relation_moment1,
150 float l3_regularization, Float gradient, const Optimizer &optimizer,
151 float relation_lr_multiplier = 1, Float weight = 1) {
152 auto update = get_update_function_1_moment<Float, optimizer_type>();
153 l3_regularization *= 3;
154 FOR(i, dim) {
155 Float h = head[i];
156 Float t = tail[i];
157 Float r = relation[i];
158 head[i] -= (optimizer.*update)(h, gradient * r * t + l3_regularization * abs(h) * h,
159 head_moment1[i], weight);
160 tail[i] -= (optimizer.*update)(t, gradient * h * r + l3_regularization * abs(t) * t,
161 tail_moment1[i], weight);
162 relation[i] -= relation_lr_multiplier *
163 (optimizer.*update)(r, gradient * h * t + l3_regularization * abs(r) * r,
164 relation_moment1[i], weight);
165 }
166 }
167
168 template<OptimizerType optimizer_type>
169 __host__ __device__
170 static void backward(Vector &head, Vector &tail, Vector &relation,

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected