В последнее время часть моей работы связана с графами знаний. Я был несколько удивлен, обнаружив, насколько мало ресурсов было на работе с графами знаний. Большая часть литературы была сосредоточена в исследовательских работах, которые относительно недоступны, если у вас нет достаточного количества свободного времени.

Что такое граф знаний?

Проще говоря, граф знаний - это набор фактов в форме двух сущностей и отношения: (e1, r, e2). Например, представление о том, что «Том Круз действовал в« Миссия невыполнима », будет представлено как:

(«Том Круз», acted_in, «Миссия невыполнима»)

Вот пример графа знаний, который может представлять фильмы, жанры и актеров.

Ссылка на вывод

Теперь, когда у нас есть граф знаний, мы можем захотеть дополнить данные и спрогнозировать новые отношения, которые должны существовать. В приведенном выше графе знаний мы кодируем отношения между жанрами и фильмами и фильмами с актерами. Если вы прищуриваетесь к приведенному выше графику знаний, вы можете правдоподобно представить себе модель, которая способна узнать, что актеры обычно снимаются в фильмах одного и того же жанра. Том Круз обычно снимается в боевиках, а Бен Стиллер - в комедиях.

Обратите внимание, что в графе знаний выше должна существовать связь между Беном Стиллером и Tropic Thunder. (Бен Стиллер играл в «Тропическом громе»). Также обратите внимание, что мы должны иметь возможность сделать вывод о типе жанра, в котором каждый из этих актеров, как правило, играет. Том Круз, как правило, снимается в боевиках, а Джек Блэк и Бен Стиллер, как правило, снимаются в комедиях. Из этой информации мы можем сделать вывод, что между Беном Стиллером и Tropic Thunder, вероятно, существует связь acted_in.

Обучение

Какой алгоритм обучения мы можем использовать для вывода этой информации? Вспомните, как обучаются вложения слов. Здесь мы можем применить аналогичную стратегию. Мы можем создать векторное вложение для каждой сущности и каждого типа отношений и обучить вложения так, чтобы

Мы можем представить себе подходящий набор вложений следующим образом:

В данном случае ближайший к вектору Бен Стиллер + acted_in фильм - это вышибалы, а вторым - «Тропический гром».

Что касается обучения модели, мы можем попытаться максимизировать разницу между оценкой отношения, которое не существует: например, отношения (Том Круз, is_genre, Бен Стиллер) и связь, которая делает: (Бен Стиллер, acted_in, Dodgeball) , называется отрицательной выборкой. Таким же образом обучаются векторы слов. Конкретно:

В частности, это способствует тому, что положительная оценка будет меньше отрицательной на некоторую величину МАРЖИ. Например, возможное решение:

positive = 0
negative = MARGIN
loss = positive - negative + MARGIN = 0

Давайте построим

Я построил это в PyTorch и разместил здесь код. Тем не менее, я отмечу некоторые из наиболее интересных аспектов реализации, которые, как я обнаружил, помогают сделать обучение более стабильным.

Отрицательная выборка

Цель отрицательной выборки - предоставить неверный факт. Например («Бен Стиллер», «acted_in», «Oblivion»). Мой псевдокод выглядит следующим образом

def generate_negative_sample()
  while (entity_1, relation, entity_2) in graph:
    entity_1 = random_entity()
    relation = random_relation()
    entity_2 = random_entity()

Я обнаружил, что обучение было более стабильным, когда отрицательная выборка была избыточной по отношению к количеству правильных фактов.

def train(fact, embedding_model, optimizer):
    avg_loss = 0.
    # Oversample negative entries   
    for i in range(40):
        embedding_model.zero_grad()
        loss = embedding_model(fact)
        loss.backward()
        optimizer.step()
        avg_loss += loss.data[0]
    return avg_loss / 10

Напомним, цель этой модели - сделать вывод, что Бен Стиллер, скорее всего, действовал в «Тропическом громе», а не в «Миссия невыполнима» или «Обливион». Вот результаты (помните, согласно нашей формулировке, более низкий балл = более вероятно).

score(('ben stiller', 'acted_in', 'dodgeball')) = 1.5305
score(('ben stiller', 'acted_in', 'tropic thunder')) = 2.5801
score(('ben stiller', 'acted_in', 'mission impossible')) = 3.4038
score(('ben stiller', 'acted_in', 'oblivion')) = 3.3958

Таким образом, эта модель может определить, что Бен Стиллер, скорее всего, играл в комедии «Тропический гром», в большей степени, чем в боевиках, и она смогла узнать это, моделируя связи на графике.