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

Давайте посмотрим на следующее изображение.

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

Логично предположить, что целевые ярлыки не независимы друг от друга, потому что все они имеют что-то общее.

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

Что такое график?

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

В двух словах, граф - это структура данных, которая имеет узлы для хранения информации и ребра для отображения взаимосвязи между ними. .

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

Представьте, что у нас есть набор данных изображений, охватывающих 4 разных класса, таких как солнце, озеро, облака и лодка. Мы заметили, что с некоторыми изображениями связано несколько ярлыков, как мы видели раньше. Ниже приведен список из 4 образцов, случайно выбранных из указанного выше распределения (распределение изображений, с которыми связано более одной метки).

  1. озеро, солнце, лодка
  2. озеро, облако
  3. облако, солнце
  4. озеро, лодка

Мы можем представить каждую метку в виде узла на графе, но каковы будут ребра, в свою очередь? Мы могли бы добавить вероятность появления одного ярлыка, когда один ярлык уже присутствует. Это в точности похоже на условную вероятность P (A | B) в статистике. В нашем случае P (Li | Lj) интерпретируется как вероятность существования метки Li при условии, что метка Lj уже существует.

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

Для матрицы смежности мы вычисляем вхождения пар меток и заполняем ее.

Мы также можем рассчитать общее количество вхождений каждой метки, как показано ниже.

Теперь нам нужно вычислить условные вероятности появления, разделив каждое вхождение на общее количество (строка за строкой).

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

У нас есть готовая взвешенная матрица смежности с 4 узлами и связанными ребрами.

Операция свертки

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

Слой свертки графа имеет ту же логику. Он работает как фильтр и извлекает характеристики из графиков.

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

Сверточные сети с графами (GCN)

Мы можем просто сложить несколько слоев Graph Convolution вместе с функцией активации, такой как ReLu, что приводит к полному GCN, как в CNN.

Цель применения свертки графов (GC) - изучить свойства графа вместе с входными функциями. Таким образом, мы загружаем матрицу смежности вместе с входными функциями, которые у нас есть. Последовательно применяется несколько сверток графа, за которыми следует нелинейная операция. Результатом GCN является матрица признаков.

class GraphConvolution(nn.Module):
    def __init__(self, in_features, out_features, bias=False):
        super(GraphConvolution, self).__init__()
        self.in_features = in_features
        self.out_features = out_features
        self.weight = Parameter(
                  torch.Tensor(in_features, out_features), 
                  requires_grad=True)
        if bias:
            self.bias = Parameter(
                         torch.Tensor(1, 1, out_features), 
                         requires_grad=True)
        else:
            self.register_parameter('bias', None)
        self.reset_parameters()

    def reset_parameters(self):
        stdv = 1. / math.sqrt(self.weight.size(1))
        self.weight.data.uniform_(-stdv, stdv)
        if self.bias is not None:
            self.bias.data.uniform_(-stdv, stdv)

    def forward(self, input, adj):
        support = torch.matmul(input.float(),
                               self.weight.float())
        output = torch.matmul(adj, support)
        if self.bias is not None:
            return output + self.bias
        else:
            return output

    def __repr__(self):
        return self.__class__.__name__ + ' (' \
               + str(self.in_features) + ' -> ' \
               + str(self.out_features) + ')'

Как предотвратить переобучение в GCN

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

Мы считаем эти края плохо очерченными или зашумленными. Эти края могут быть ложными срабатываниями.

Резюме

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

использованная литература

Распознавание изображений с несколькими метками с помощью сверточных сетей графов

Комплексное исследование графических нейронных сетей

Полууправляемая классификация с графовыми сверточными сетями