신경 임베딩을 사용한 지식 그래프 추론

최근에 내 작업 중 일부는 지식 그래프 작업과 관련이 있습니다. 나는 지식 그래프로 작업하는 데 얼마나 희박한 리소스가 있는지를 발견하고 다소 놀랐습니다. 대부분의 문헌은 시간이 충분하지 않으면 상대적으로 접근하기 어려운 연구 논문에 묶여 있었습니다.



지식 그래프란 무엇입니까?



간단히 말해서, 지식 그래프는 두 개의 엔터티와 관계(e1, r, e2)의 형태로 된 사실의 모음입니다. 예를 들어, "톰 크루즈가 미션 임파서블에서 연기했다"라는 개념의 표현은 다음과 같이 표현됩니다.
('톰 크루즈', 'acted_in', '미션 임파서블')

사진 크레디트: 미션 임파서블

다음은 영화, 장르 및 배우를 나타낼 수 있는 지식 그래프의 예입니다.

장르, 영화, 배우 지식 그래프

링크 추론



이제 지식 그래프가 있으므로 데이터를 보강하고 존재해야 하는 새로운 관계를 예측할 수 있습니다. 위의 지식 그래프에서 우리는 장르와 영화, 영화와 배우의 관계를 인코딩합니다. 위의 지식 그래프를 가늘게 뜨고 보면 배우가 일반적으로 같은 장르의 영화에 출연한다는 것을 학습할 수 있는 모델을 그럴듯하게 상상할 수 있습니다. Tom Cruise는 보통 액션 영화에 출연하고 Ben Stiller는 보통 코미디에 출연합니다.

위의 지식 그래프에서 Ben Stiller와 Tropic Thunder 사이에 링크가 있어야 합니다. (Ben Stiller는 Tropic Thunder에서 연기했습니다). 또한 각 배우가 연기하는 경향이 있는 장르 유형을 추론할 수 있어야 합니다. Tom Cruise는 액션 영화에서 연기하는 경향이 있는 반면 Jack Black과 Ben Stiller는 코미디에 출연하는 경향이 있습니다. 이 정보에서 우리는 Ben Stiller와 Tropic Thunder 사이에 'acted_in' 관계가 있을 가능성이 있음을 추론할 수 있어야 합니다.

학습



이 정보를 추론하기 위해 어떤 학습 알고리즘을 사용할 수 있습니까? word embeddings이 어떻게 훈련되었는지 기억하십시오. 여기서도 비슷한 전략을 적용할 수 있습니다. 각 엔터티 및 각 관계 유형에 대한 벡터 임베딩을 생성하고 다음과 같이 임베딩을 훈련할 수 있습니다.


다음과 같은 적절한 임베딩 세트를 상상할 수 있습니다.


이 경우 벡터 Ben Stiller + 'acted_in'에 가장 가까운 영화는 dodgeball이지만 두 번째로 가까운 영화는 Tropic Thunder입니다.

사진 제공: 피구

모델 교육에 관해서는 존재하지 않는 관계의 점수 사이의 차이를 최대화하려고 시도할 수 있습니다. 예를 들어 관계(Tom Cruise, is_genre, Ben Stiller)와 다음과 같은 관계(Ben Stiller, ' acted_in', Dodgeball), 네거티브 샘플링이라고 합니다. 이는 단어 벡터가 훈련되는 방식이기도 합니다. 구체적으로:


구체적으로 이것은 양수 점수가 음수 점수보다 약간의 MARGIN 금액만큼 낮아지도록 장려합니다. 예를 들어 가능한 솔루션은 다음과 같습니다.

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


구축하자



나는 이것을 PyTorch와 posted the code here에서 만들었습니다. 그러나 교육을 보다 안정적으로 만드는 데 도움이 되는 구현의 더 흥미로운 측면 중 일부를 지적하겠습니다.

네거티브 샘플링



네거티브 샘플링의 목표는 잘못된 사실을 생성하는 것입니다. 예를 들어(“Ben Stiller”, '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):
    # Oversample negative entries    
    avg_loss = 0
    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


그래서 이 모델은 Ben Stiller가 액션 영화보다 코미디인 Tropic Thunder에 출연했을 가능성이 높다는 것을 알아낼 수 있었고 그래프의 링크를 통해 모델링하여 이를 학습할 수 있었습니다.



사진 제공: 망각

좋은 웹페이지 즐겨찾기