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

Class SimplE

include/instance/model/knowledge_graph.h:351–434  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

349 */
350template<class _Vector>
351class SimplE {
352public:
353 static_assert(_Vector::dim % 2 == 0, "Model `SimplE` can only be instantiated with even-dimensional vectors");
354 static const size_t dim = _Vector::dim;
355 typedef _Vector Vector;
356 typedef typename _Vector::Float Float;
357
358 __host__ __device__
359 static void forward(const Vector &head, const Vector &tail, const Vector &relation, Float &output,
360 float l3_regularization) {
361 output = 0;
362 FOR(i, dim) {
363 int j = i ^ 1;
364 output += head[i] * relation[i] * tail[j];
365 }
366 output = SUM(output);
367 }
368
369 template<OptimizerType optimizer_type>
370 __host__ __device__
371 static void backward(Vector &head, Vector &tail, Vector &relation,
372 float l3_regularization, Float gradient, const Optimizer &optimizer,
373 float relation_lr_multiplier = 1, Float weight = 1) {
374 auto update = get_update_function<Float, optimizer_type>();
375 l3_regularization *= 3;
376 FOR(i, dim) {
377 int j = i ^ 1;
378 Float h = head[i];
379 Float t = tail[j];
380 Float r = relation[i];
381 head[i] -= (optimizer.*update)(h, gradient * r * t + l3_regularization * abs(h) * h, weight);
382 tail[j] -= (optimizer.*update)(t, gradient * h * r + l3_regularization * abs(t) * t, weight);
383 relation[i] -= relation_lr_multiplier *
384 (optimizer.*update)(r, gradient * h * t + l3_regularization * abs(r) * r, weight);
385 }
386 }
387
388 template<OptimizerType optimizer_type>
389 __host__ __device__
390 static void backward(Vector &head, Vector &tail, Vector &relation,
391 Vector &head_moment1, Vector &tail_moment1, Vector &relation_moment1,
392 float l3_regularization, Float gradient, const Optimizer &optimizer,
393 float relation_lr_multiplier = 1, Float weight = 1) {
394 auto update = get_update_function_1_moment<Float, optimizer_type>();
395 l3_regularization *= 3;
396 FOR(i, dim) {
397 int j = i ^ 1;
398 Float h = head[i];
399 Float t = tail[j];
400 Float r = relation[i];
401 head[i] -= (optimizer.*update)(h, gradient * r * t + l3_regularization * abs(h) * h,
402 head_moment1[i], weight);
403 tail[j] -= (optimizer.*update)(t, gradient * h * r + l3_regularization * abs(t) * t,
404 tail_moment1[j], weight);
405 relation[i] -= relation_lr_multiplier *
406 (optimizer.*update)(r, gradient * h * t + l3_regularization * abs(r) * r,
407 relation_moment1[i], weight);
408 }

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected