本文へ移動
カテゴリ

Webマーケ

Webマーケの記事すべてSEOサイト運営データマネジメントビジネス・マーケ概論広告

インタビュー

インタビューの記事すべて

おすすめサービス

おすすめサービスの記事すべて

おすすめ勉強法

おすすめ勉強法の記事すべて

おすすめ書籍

おすすめ書籍の記事すべて

データサイエンス

データサイエンスの記事すべてデータ解析品質工学多変量解析機械学習統計学

プログラミング

プログラミングの記事すべてPythonRSQLプログラミングスクール

スタビジについて

記事一覧運営者情報お問い合わせ

GNN(グラフニューラルネットワーク)とは?つながりのデータを学ぶ仕組みと活用例を分かりやすく解説!

目次
ウマたんウマたん

当サイト【スタビジ】の本記事では、「GNN(グラフニューラルネットワーク)」について分かりやすく解説していきます!「つながり」のデータを学ぶAIの仕組みから、身近な活用例、これからの広がりまで見ていきましょう!

こんにちは!ウマたんです!

SNSで「知り合いかも?」と、本当に知り合いの人がおすすめに出てきて、ドキッとしたことはありませんか?

ネットショップの「この商品を買った人はこんな商品も」や、地図アプリの到着予想時間も、実は同じような考え方で支えられていることがあります。

そのカギになるのが、人と人、商品と人、道と道の「つながり」です。

そして、このつながりのデータを学ぶAIが「GNN(グラフニューラルネットワーク)」なんです。

読者

グラフって、棒グラフとか折れ線グラフのこと?

読者

ふつうのニューラルネットワークと何が違うのか知りたい!

本記事では、次の4つを順番に解説していきます。

以下のYouTube動画でも解説していますので、あわせてチェックしてみてください!

YouTubeの動画

GNNとは?そもそも「グラフ」って何?

まずは結論からいきましょう!

GNNとは、グラフの形をしたデータを学習するためのニューラルネットワークです。

GNNは「Graph Neural Network」の略で、日本語では「グラフニューラルネットワーク」と呼ばれます。

ここでいう「グラフ」は、点と線のつながりのこと

「グラフ」と聞くと、棒グラフや折れ線グラフを思い浮かべるかもしれませんね。

でも、GNNでいうグラフは、それとは違います。

ここでいうグラフとは、「点(ノード)」と「線(エッジ)」の2つで、ものどうしのつながりを表したデータの形のことです。

例点(ノード)線(エッジ)
SNSユーザー友達どうしの関係
地図交差点道路
分子原子化学結合
ネットショップ人と商品「買った」「見た」という関係
銀行口座お金のやりとり

こうして並べてみると、世の中のデータの多くは、実はグラフで表せることが分かりますよね。

点や線には、情報をくっつけることもできます。たとえばSNSなら、ユーザーの点に「年齢」「よく投稿する話題」などを、友達の線に「知り合ってからの長さ」などを持たせられます。

なぜGNNが必要なのか

では、なぜわざわざGNNという専用のニューラルネットワークが必要なのでしょうか?

ふつうのニューラルネットワークは「きれいに並んだデータ」が得意

これまでのニューラルネットワークは、画像や文章のように、規則正しく並んだデータを扱うのが得意でした。

画像なら、ピクセルが縦と横にきれいに並んでいます。文章なら、単語が1列に順番に並んでいます。

画像はマス目、文章は1列に並ぶ。グラフはつながる数も順番もバラバラ

たとえば画像を扱うのが得意な「畳み込みニューラルネットワーク(CNN)」は、「上下左右のとなりのピクセル」を見ながら特徴をつかんでいきます。どのピクセルにも、決まった数のとなりがあるからこそできる方法です。

畳み込みニューラルネットワーク(CNN)をわかりやすく解説!Pythonで画像認識を実装してみよう!当サイト【スタビジ】の本記事では、ディープラーニングのド定番である畳み込みニューラルネットワーク(CNN)についてわかりやすく解説します。CNNの仕組みを解説した後にPythonにて画像認識タスクを解いていきますよ!

グラフは、つながる数も順番もバラバラ

ところがグラフは、そう単純ではありません。

ふつうのニューラルネットワークは、決まった形と順番で並んだ数字を受け取ることを前提にしています。

そのため、つながりが複雑で不規則なグラフを、そのままでは上手に扱えなかったんです。

そこで登場したのがGNNです。GNNは、点の数やつながり方がバラバラでも、点の並べ方を変えても、同じように学習できるように工夫されています。

GNNの仕組み

それでは、GNNがどうやってグラフを学習しているのかを見ていきましょう!

基本は「メッセージパッシング」

GNNの基本の仕組みは、とてもシンプルです。

「メッセージパッシング」と呼ばれる方法で、それぞれの点の特徴を学習していきます。

どういうことかというと、ある点が、自分とつながっている近所の点から情報を受け取って、自分の特徴を更新していくというイメージです。

1回目はとなりの友達から情報を集め、2回目は友達の友達の情報も届く

「類は友を呼ぶ」の考え方

SNSで考えてみましょう。

あなたがどんな人かを知りたいとき、あなたの友達がどんな趣味を持っているのか、どんな投稿をしているのかを見れば、なんとなくあなたのことも分かりますよね。

「類は友を呼ぶ」という言葉がありますが、GNNはまさにこの考え方で学習しているんです。

くり返すほど、遠くの情報まで届く

メッセージパッシングは、1回で終わりではありません。何回もくり返します。

1回目で、あなたは友達から情報を受け取ります。このとき友達も、それぞれの友達から情報を受け取っています。

すると2回目には、友達を通して、「友達の友達」の情報まで、あなたに届くんです。

このようにくり返すことで、さらに遠くの点の情報まで取り込んで、その点が持つ本質的な特徴を捉えられるようになります。

Pythonで動きを確かめてみよう

メッセージパッシングの動きを、Python(NumPy)で簡単に確かめてみましょう。

4人のつながりで、「あなた」の好みがまだ分からない状態から、友達の情報を集めていきます。

import numpy as np

# 4人のつながり(0:あなた, 1:Aさん, 2:Bさん, 3:Cさん)
# 1 が入っているところは「友達どうし」という意味
A = np.array([
    [0, 1, 1, 0],
    [1, 0, 1, 0],
    [1, 1, 0, 1],
    [0, 0, 1, 0],
])

# それぞれの特徴:[スポーツ好き度, 料理好き度]
# あなたの好みはまだ分からないので 0 にしておく
X = np.array([
    [0.0, 0.0],
    [1.0, 0.0],
    [0.8, 0.2],
    [0.0, 1.0],
])

def message_passing(A, H):
    A_self = A + np.eye(len(A))           # 自分自身の情報も入れる
    deg = A_self.sum(axis=1, keepdims=True)
    return (A_self @ H) / deg              # 自分と友達の特徴を平均する

H1 = message_passing(A, X)   # 1回目
H2 = message_passing(A, H1)  # 2回目
print("1回目のあなた:", H1[0].round(2))
print("2回目のあなた:", H2[0].round(2))

実行すると、次のように表示されます。

1回目のあなた: [0.6  0.07]
2回目のあなた: [0.55 0.14]

1回目では、スポーツ好きのAさん・Bさんの影響で、あなたは「スポーツ好きっぽい人」になりました。

2回目では、あなたと直接はつながっていない、料理好きのCさんの情報が、Bさんを通して少しだけ届いているのが分かります。

実際のGNNでは、平均したあとに、学習で決まる重みを掛けたり、活性化関数を通したりします。そうすることで、「どの情報をどれくらい重視するか」まで、データから学べるんです。

ニューラルネットワークの重みや活性化関数の基本は、以下の記事で解説しています。

【入門】ディープラーニング(深層学習)の仕組みとPython実装のやり方!当サイト【スタビジ】の本記事では、ディープラーニングの仕組みやPythonでの実装方法について解説していきます。ディープラーニングってなんとなくブラックボックスなイメージがあるかもしれませんが、実はシンプルなアルゴリズムなんですよー!

代表的なGNNの手法

GNNには、情報の集め方やまとめ方の違いによって、いろいろな手法があります。名前だけでも知っておくと、論文やライブラリの説明が読みやすくなりますよ。

手法発表特徴
GCN(グラフ畳み込みネットワーク)2017年となりの点の特徴を平均のような形でまとめる、基本の手法
GraphSAGE2017年となりの点を一部だけ選んで集めるので、大きなグラフや、新しく加わった点にも使いやすい
GAT(グラフアテンションネットワーク)2018年となりの点ごとに「どれくらい重視するか」を学習して、重みをつけて集める

GATの「アテンション」は、ChatGPTのもとになっているTransformerでも使われている考え方です。友達の中でも、特に仲のいい友達の意見を重く見る、というイメージですね。

GNNで予測できること

GNNで学習した点の特徴を使うと、主に次の3種類の予測ができます。

予測するもの例
点(ノード)の予測このユーザーは、どんな話題に興味がありそうか
線(エッジ)の予測この2人は友達になりそうか、この人はこの商品を買いそうか
グラフ全体の予測この分子は、薬として効きそうか、毒性はありそうか

GNNの活用例

では実際に、GNNはどんな場面で使われているのでしょうか?

① レコメンド(おすすめ)

1つ目は、おすすめを出すレコメンドです。

ユーザーと商品のつながりをグラフとしてとらえて、GNNで「あなたが好きそうなもの」を精度高く探します。

たとえば画像共有サービスのPinterestは、2018年に、数十億の点を持つ巨大なグラフでGNNを使ったおすすめの仕組みを論文で発表しています。

レコメンドのさまざまな方法については、以下の記事で解説しています。

レコメンドで使われる4つのアルゴリズムを簡単に紐解く!当サイト【スタビジ】の本記事では、レコメンドに用いられる4つのアルゴリズムについて数式は使わずに簡単に解説していきます。レコメンドはどこに向かうのかみたいな議論もしていきたいと思います。果たして完璧なレコメンドはあり得るのでしょうか?

② 新薬の開発

2つ目は、新しい薬の開発です。

分子は、原子と化学結合からなるグラフそのもの。だからGNNととても相性がいいんです。

分子の性質を予測したり、薬の候補になりそうな物質を探したりするのに使われています。

2020年には、アメリカのMITの研究チームが、GNNを使って大量の化合物の中から、抗菌作用を持つ新しい物質を見つけたと発表し、大きな話題になりました。

③ 不正の検知

3つ目は、不正の検知です。

銀行口座やクレジットカードの取引を、「人」と「取引」のグラフとして表すことで、不自然なつながりや、怪しい取引のパターンを見つけ出せます。

1件ずつの取引を見ているだけでは気づけない、複数の口座をまたいだお金の流れも、グラフならとらえやすくなるんです。

④ 交通・天気の予測

4つ目は、交通や天気の予測です。

Googleマップでは、道路の網をグラフとしてとらえて、GNNで到着予想時間を予測しています。

2020年にGoogle傘下のDeepMind(現在のGoogle DeepMind)が発表したところによると、ベルリン、ジャカルタ、サンパウロ、シドニー、東京、ワシントンD.C.などの都市で、到着予想時間の精度が最大で50%改善したそうです。

さらにGoogle DeepMindは2023年、GNNを使った天気予報のAI「GraphCast」を発表しています。地球の表面を点と線の網で表して、10日先までの天気を予測するものです。

GNNのこれからと注意点

最後に、GNNのこれからと、気をつけたいポイントを見ていきましょう!

LLMとの組み合わせ

最近は、大規模言語モデル(LLM)との組み合わせも、ホットな研究テーマになっています。

たとえば、「人物」「会社」「できごと」などを点、その関係を線にした「知識グラフ」とLLMを組み合わせて、より正確で根拠のある答えを出させようとする「GraphRAG」のような技術も登場しています。

ふつうのRAGが、質問に似た文章を探してきて答えに使うのに対して、GraphRAGはつながりをたどって情報を集められるのがポイントです。RAGの基本は、以下の記事で解説しています。

生成AI・LLM時代必須のRAG(検索拡張生成)について解説!Pythonで実装してみよう!当サイト【スタビジ】の本記事では、生成系AI・LLM時代におさえておきたいRAGについて解説していきます!社内用チャットボットなどを作る際によく利用されるアプローチです。どんなアプローチなのか理解した後は実際にPythonで簡単な実装をしていきます!

くり返しすぎると、みんな同じになる

GNNには、気をつけたい弱点もあります。

メッセージパッシングをくり返すほど遠くの情報を取り込めますが、くり返しすぎると、どの点もまわりと混ざり合って、みんな似たような特徴になってしまうんです。

これは「オーバースムージング」と呼ばれる問題です。そのため、くり返す回数は、ふつう数回ほどに抑えます。

大きなグラフは計算が大変

SNSのように、何億もの点がつながった巨大なグラフでは、すべてのつながりをそのまま計算するのは大変です。

そこで、近所の点を一部だけ選んで計算するなど、工夫しながら使われています。

グラフの作り方で結果が変わる

何を点にして、何を線にするか。グラフの作り方しだいで、GNNの結果は大きく変わります。

PythonでGNNを試してみたい人は、「PyTorch Geometric」や「DGL」といったライブラリを使うと、代表的なGNNを手軽に動かせます。

画像や文章のような「並んでいるデータ」の時代から、複雑な「つながり」を扱うデータの時代へ。AIが活躍する場所は、どんどん広がっているんです!

GNNのまとめ

最後に、今回のポイントをおさらいしましょう!

ウマたんウマたん

要は、「類は友を呼ぶ」をAIで実現したのがGNNなんです!身の回りの「つながり」のデータを見つけたら、GNNで何ができそうか考えてみてください!

ディープラーニングやAIの仕組みを体系的に学びたいのであれば、当メディアが運営するスクール「スタアカ」がオススメです!

スポンサーリンク

ウマたんスタビジ編集長

大学院は理系の統計科学研究室で、ベイズ統計学・時系列分析・異常検知を研究。日系・外資の消費財メーカーのデータサイエンティストを経て、現在は会社を経営しながらデータサイエンティストとして働いています。

スタビジアカデミー

読んだ内容を、手を動かして身につける

データサイエンス・AIを、動画と課題で体系的に学べるオンラインスクール。

スタアカを見てみる