В последнее время часть моей работы связана с графами знаний. Я был несколько удивлен, обнаружив, насколько мало ресурсов было на работе с графами знаний. Большая часть литературы была сосредоточена в исследовательских работах, которые относительно недоступны, если у вас нет достаточного количества свободного времени.
Что такое граф знаний?
Проще говоря, граф знаний - это набор фактов в форме двух сущностей и отношения: (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
Таким образом, эта модель может определить, что Бен Стиллер, скорее всего, играл в комедии «Тропический гром», в большей степени, чем в боевиках, и она смогла узнать это, моделируя связи на графике.