Предварительная практика AmpliGraph

глубокое обучение

«Это 22-й день моего участия в ноябрьском испытании обновлений, ознакомьтесь с подробностями события:Вызов последнего обновления 2021 г."

AmpliGraph — это библиотека с открытым исходным кодом на основе TensorFlow, разработанная Accenture Labs для прогнозирования связей между понятиями в графах знаний. Это набор моделей нейронного машинного обучения для статистического реляционного обучения (SRL) (также известного как реляционное машинное обучение) — поддисциплины AI/ML, которая включает контролируемое обучение графов знаний. AmpliGraph обладает следующими характеристиками: (1) находить новые знания из существующих графов знаний; (2) использовать пропущенные предложения для заполнения больших графов знаний; (3) создавать независимые вложения графов знаний; (4) разрабатывать и оценивать новую модель отношений.

1. Введение и подготовка

В этом практическом руководстве мы будем использовать библиотеку с открытым исходным кодом.AmpliGraph.
Давайте сначала установим библиотеку и ее зависимости, а затем импортируем библиотеку, используемую в этом руководстве.

# Install CUDA
conda install -y cudatoolkit=10.0

# Install cudnn libraries
conda install cudnn=7.6

# Install tensorflow GPU 
pip install tensorflow-gpu==1.15.3

Проверьте тензорный поток и графический процессор

import tensorflow as tf 
print('TensorFlow  version: {}'.format(tf.__version__))

Установите AmpliGraph и другие зависимости

# Install AmpliGraph library
pip install ampligraph

# Required to visualize embeddings with tensorboard projector, comment out if not required!
pip install --user tensorboard

# Required to plot text on embedding clusters, comment out if not required!
pip install --user git+https://github.com/Phlya/adjustText

2. Загрузите набор данных графа знаний

Во-первых, нам нужен граф знаний, поэтому давайте загрузим его под названиемFreebase-15k-237Стандартный граф знаний .

Ampligraph предоставляет ряд API дляЗагрузить стандартный график знаний.

Также предоставляется ряд API для загрузки форматов csv, ntriples и rdf. Подробности можно нажатьздесь

from ampligraph.datasets import load_fb15k_237, load_wn18rr, load_yago3_10

Переназначены идентификаторы freebase237 и создан файл csv с читаемыми именами вместо идентификаторов.

import pandas as pd

URL = './data/freebase-237-merged-and-remapped.csv'
dataset = pd.read_csv(URL, header=None)
dataset.columns = ['subject', 'predicate', 'object']
dataset.head(5)

image.png

print('Total triples in the KG:', dataset.shape)

Total triples in the KG: (310079, 3)

[Создать тренировочный набор, проверочный набор, тестовый набор]
Используйте функцию train_test_split_no_unseen, предоставляемую Ampligraph, для создания обучающих, проверочных и тестовых наборов.

from ampligraph.evaluation import train_test_split_no_unseen
# get the validation set of size 500
test_train, X_valid = train_test_split_no_unseen(dataset.values, 500, seed=0)

# get the test set of size 1000 from the remaining triples
X_train, X_test = train_test_split_no_unseen(test_train, 1000, seed=0)

print('Total triples:', dataset.shape)
print('Size of train:', X_train.shape)
print('Size of valid:', X_valid.shape)
print('Size of test:', X_test.shape)

Total triples: (310079, 3)
Size of train: (308579, 3)
Size of valid: (500, 3)
Size of test: (1000, 3)\

3. Модельное обучение

Теперь, когда мы разделили набор данных, давайте сразу приступим к обучению модели.

Создайте модель TransE и обучите ее на тренировочном сплите, используя функцию подгонки.

TransEЭто одна из первых встроенных моделей, создающая платформу для исследований KGE. Он использует простую векторную алгебру для подсчета троек. Он имеет очень небольшое количество обучаемых параметров по сравнению с большинством моделей.

f=s+ponf = - || s + p - o ||_{n}

from ampligraph.latent_features import TransE

model = TransE(k=150,                                                             # embedding size
               epochs=100,                                                        # Num of epochs
               batches_count= 10,                                                 # Number of batches 
               eta=1,                                                             # number of corruptions to generate during training
               loss='pairwise', loss_params={'margin': 1},                        # loss type and it's hyperparameters         
               initializer='xavier', initializer_params={'uniform': False},       # initializer type and it's hyperparameters
               regularizer='LP', regularizer_params= {'lambda': 0.001, 'p': 3},   # regularizer along with its hyperparameters
               optimizer= 'adam', optimizer_params= {'lr': 0.001},                # optimizer to use along with its hyperparameters
               seed= 0, verbose=True)

model.fit(X_train)

from ampligraph.utils import save_model, restore_model
save_model(model, 'TransE-small.pkl')

image.png

обратитесь к этомуСсылка на сайтПодробнее о параметрах и их значениях.

【Индекс оценки расчета】score: это значение, которое модель присваивает тройке, применяя функцию оценки.

test_triple = ['harrison ford', 
               '/film/actor/film./film/performance/film', 
               'star wars']

triple_score = model.predict(test_triple)

print('Triple of interest:\n', test_triple)
print('Triple Score:\n', triple_score)

Triple of interest:
['harrison ford', '/film/actor/film./film/performance/film', 'star wars']
Triple Score:
[-8.270267]

import numpy as np
list_of_actors = ['salma hayek', 'carrie fisher', 'natalie portman',  'kristen bell',
                  'mark hamill', 'neil patrick harris', 'harrison ford' ]

# stack it horizontally to create s, p, o
hypothesis = np.column_stack([list_of_actors, 
                              ['/film/actor/film./film/performance/film'] * len(list_of_actors),
                              ['star wars'] * len(list_of_actors),
                             ])

# score the hypothesis
triple_scores = model.predict(hypothesis)

# append the scores column
scored_hypothesis = np.column_stack([hypothesis, triple_scores])
# sort by score in descending order
scored_hypothesis = scored_hypothesis[np.argsort(scored_hypothesis[:, 3])]
scored_hypothesis

результат

array([['harrison ford', '/film/actor/film./film/performance/film',
        'star wars', '-8.270266'],
       ['carrie fisher', '/film/actor/film./film/performance/film',
        'star wars', '-8.357192'],
       ['natalie portman', '/film/actor/film./film/performance/film',
        'star wars', '-8.739484'],
       ['neil patrick harris', '/film/actor/film./film/performance/film',
        'star wars', '-9.089647'],
       ['mark hamill', '/film/actor/film./film/performance/film',
        'star wars', '-9.17255'],
       ['salma hayek', '/film/actor/film./film/performance/film',
        'star wars', '-9.205964'],
       ['kristen bell', '/film/actor/film./film/performance/film',
        'star wars', '-9.764657']], dtype='<U39')

image.png

В соответствии с приведенным выше рейтингом у нас есть оценка для каждой тройки, и мы можем рассчитать их рейтинг следующим образом:COUNT(corruptionscore>=triplescore)COUNT ( corruption_{score} >= triple_{score} )Найдите позицию оценки гипотезы в sub_corr_score и получите sub_rank

sub_rank_worst = np.sum(np.greater_equal(sub_corr_score, triple_score[0])) + 1

Assigning the worst rank (to break ties): 1655

X_test_small = np.array(
                [['doctorate',
                    '/education/educational_degree/people_with_this_degree./education/education/major_field_of_study',
                    'computer engineering'],

                ['star wars',
                    '/film/film/estimated_budget./measurement_unit/dated_money_value/currency',
                    'united states dollar'],

                ['harry potter and the chamber of secrets',
                    '/film/film/estimated_budget./measurement_unit/dated_money_value/currency',
                    'united states dollar'],

                ['star wars', '/film/film/language', 'english language'],
                ['harrison ford', '/film/actor/film./film/performance/film', 'star wars']])


X_filter = np.concatenate([X_train, X_valid, X_test], 0)

ranks = evaluate_performance(X_test_small, 
                             model=model, 
                             filter_triples=X_filter, 
                             corrupt_side='s,o')
print(ranks)

результат

[[   9    5]
 [   1    1]
 [  77    1]
 [   2    2]
 [1644  833]]

Mean rank(MR): Как следует из названия, это среднее значение всех рангов в тройке. Значения варьируются от 1 (идеальный случай, когда все уровни равны 1) до наихудшего случая (все уровни в конце).

image.png

from ampligraph.evaluation import mr_score
print('MR :', mr_score(ranks))

МР: 257,5

Mean reciprocal rank (MRR)является средним обратным рангом всех троек. Значение варьируется от 0 до 1, чем выше значение, тем лучше модель.

image.png

from ampligraph.evaluation import mrr_score
print('MRR :', mrr_score(ranks))

МРР: 0,4325906876796283

hits@nУказывает процент рангов с рассчитанным рангом, большим или равным n. Значение варьируется от 0 до 1, чем выше значение, тем лучше модель.

image.png

from ampligraph.evaluation import hits_at_n_score
print('hits@1 :', hits_at_n_score(ranks, 1))
print('hits@10 :', hits_at_n_score(ranks, 10))

hits@1 : 0.3
hits@10 : 0.7

Инкапсулировано как вызов функции

def display_aggregate_metrics(ranks):
    print('Mean Rank:', mr_score(ranks)) 
    print('Mean Reciprocal Rank:', mrr_score(ranks)) 
    print('Hits@1:', hits_at_n_score(ranks, 1))
    print('Hits@10:', hits_at_n_score(ranks, 10))
    print('Hits@100:', hits_at_n_score(ranks, 100))


display_aggregate_metrics(ranks)

Mean Rank: 257.5
Mean Reciprocal Rank: 0.4325906876796283
Hits@1: 0.3
Hits@10: 0.7
Hits@100: 0.8

4. Обучение и ранняя остановка

При обучении модели мы хотим убедиться, что модель не переобучает и не подгоняет данные. Если мы обучаем модель в течение фиксированного количества периодов времени, мы не будем знать, не соответствует ли модель обучающим данным. Поэтому необходимо проверять производительность модели на фиксированных интервалах времени, чтобы решить, когда прекратить обучение. Это называется «ранняя остановка», т.е. мы не позволяем модели работать долгое время, а останавливаемся до того, как производительность начнет ухудшаться.
Однако мы также не хотим, чтобы модель соответствовала зарезервированному набору, тем самым ограничивая способность модели к обобщению. Поэтому мы должны создать проверочный набор и тестовый набор, чтобы проверить способность модели к обобщению и убедиться, что мы не переобучаем и не подгоним данные.


early_stopping_params = { 'x_valid': X_valid,   # Validation set on which early stopping will be performed
                          'criteria': 'mrr',    # metric to watch during early stopping
                          'burn_in': 150,       # Burn in time, i.e. early stopping checks will not be performed till 150 epochs
                          'check_interval': 50, # After burn in time, early stopping checks will be performed at every 50th epochs (i.e. 150, 200, 250, ...)
                          'stop_interval': 2,   # If the monitored criteria degrades for these many epochs, the training stops. 
                          'corrupt_side':'s,o'  # Which sides to corrupt furing early stopping evaluation (default both subject and obj as described earlier)
                        }

# create a model as earlier
model = TransE(k=100, 
               epochs=10000, 
               eta=1, 
               loss='multiclass_nll', 
               initializer='xavier', initializer_params={'uniform': False},
               regularizer='LP', regularizer_params= {'lambda': 0.0001, 'p': 3},
               optimizer= 'adam', optimizer_params= {'lr': 0.001}, 
               seed= 0, batches_count= 1, verbose=True)

# call model.fit by passing early stopping params
model.fit(X_train,                                      # training set
          early_stopping=True,                          # set early stopping to true
          early_stopping_params=early_stopping_params)  # pass the early stopping params

# evaluate the model with filter
X_filter = np.concatenate([X_train, X_valid, X_test], 0)
ranks = evaluate_performance(X_test, 
                             model=model, 
                             filter_triples=X_filter)
# display the metrics
display_aggregate_metrics(ranks)

image.png