ビッグデータの力を解放する:グラフ学習の魅力的な世界

ビッグデータの力を最大限に引き出す:魅力溢れるグラフ学習の世界

ディープラーニングを活用して未利用データを長期的な競争力の戦略的資産に変換する方法。

写真:Nathan Anderson(Unsplash)

大企業は膨大な量のデータを生成し収集しています。このデータの90%は最近のものです。ただし、これらのデータの73%が未使用である [1]。しかし、ご存知のように、データはビッグデータを扱う企業にとっての宝庫となります。

ディープラーニングは常に進化しており、今日の課題はこれらの新しいソリューションを特定の目標に適応させて差別化し、長期的な競争力を向上させることです。

私の以前の上司は、これらの2つのイベントが結びつく可能性があると直感的に感じていました。そして、アクセス、リクエストの容易さ、そして何よりも時間とお金の節約を実現しました。

なぜこのデータは未使用のままなのでしょうか?

アクセスには時間がかかり、権限の検証や特に内容のチェックが必要です。

データが未使用の理由を可視化する(Bing Image Creator による生成)

新しいデータを自動的に文書化する解決策はあるのでしょうか?

大企業に詳しくない場合でも心配はいりません。このような環境での興味深いコンセプトは、ビッグデータの使用、特にHDFS(Hadoop Distributed File System)の使用です。これは、企業のすべてのデータを統合するために設計されたクラスタです。この広大なデータプール内には構造化データがあり、その構造化データの中にはHiveの列が参照されます。これらの列の一部は追加のテーブルを作成するために使用され、さまざまなデータセットのソースとして機能します。企業はテーブル間の情報をラインナッジとして保持しています。

これらの列にはさまざまな特性(ドメイン、タイプ、名称、日付、所有者など)があります。このプロジェクトの目標は、物理的なデータとビジネスデータとして知られるデータを文書化することでした。

物理的データとビジネスデータの区別:

簡単に言えば、物理的データはテーブル内の列名であり、ビジネスデータはその列の使用方法です。

例えば: 「Friends」という名前のテーブルには「character(キャラクター)」「salary(給与)」「address(住所)」の列があります。ここでの物理的データは「character」「salary」「address」です。一方、ビジネスデータは以下のようになります。

  • 「character」の場合 -> キャラクターの名前
  • 「salary」の場合 -> 給与の金額
  • 「address」の場合 -> 人物の場所

これらのビジネスデータはデータへのアクセスに役立ちます。必要な情報を直接取得できますので、プロジェクトに適したデータセットであることが分かります。求めている情報はこのテーブルにあると分かります。ですから、尋ねて求めることができ、時間とお金を無駄にすることなく素早く目的を達成できます。

「私の最後のインターンシップ中、私は共に働いていたチームのインターンたちとともにビッグデータ/グラフ学習ソリューションを実装し、これらのデータを文書化しました。

私たちのアイデアは、データを構造化するためのグラフを作成し、最終的には特徴に基づいてビジネスデータを予測することでした。つまり、会社の環境に保存されたデータから、各データセットを文書化し、将来的に検索コストを削減し、よりデータ駆動型になることです。

私たちは830のラベルを分類し、あまり多くの行がありませんでした。幸いなことに、グラフ学習の力が発揮されました。続きはお楽しみに…」

記事の目的:この記事は、ビッグデータの概念、グラフ学習、使用されたアルゴリズム、および結果を理解するための情報を提供することを目的としています。また、デプロイメントの考慮事項やモデルの成功的な開発方法についてもカバーしています。

私の経験を理解するのに役立つよう、この記事の概要は以下の通りです:

  • データ取得: グラフ作成のための必要なデータの取得
  • GSageを使用したグラフベースのモデリング
  • 効果的な展開戦略

データ取得

前述したように、データは多くの場合Hiveのカラムに格納されます。ご存知のように、これらのデータは大きなコンテナに格納されます。私たちはこれらのデータをETLとして知られる技術を使って抽出、変換、ロードします。

どの種類のデータが必要でしたか?

  • 物理データとその特性(ドメイン、名前、データの種類)。
  • 系統(物理データ間の関係、共通の変換を経験しているかどうか)。
  • ビジネスデータに関連するいくつかの物理データのマッピング、それをアルゴリズムに独自に実行させるため。

1. 特性/特徴はデータを保存する際に直接取得されます。データを保存するとすぐに必要となります。例えば(ケースによりますが):

主な特徴の例(著者作成)

特徴に関しては、経験則に基づいて、3つの列に対して特徴ハッシャーを使用することにしました。

特徴ハッシャー:機械学習で使用される技術で、テキストやカテゴリ変数などの高次元のカテゴリデータを、メモリおよび計算の要件を低減しながら意味を保持したまま、低次元の数値表現に変換するものです。

似たようなパターンがある場合は、ワンホットエンコーディング技術と選択肢があります。モデルを提供したい場合は、特徴ハッシャーを使用することをお勧めします。

2. 系統は少し複雑ですが、理解しづらいものではありません。系統は物理データの履歴のようなものであり、どのような変換が適用され、データが別の場所に保存されているかなど、大まかに把握しています。

頭の中でビッグデータをイメージして、これらのデータのことを考えてください。いくつかのプロジェクトでは、テーブルからデータを使用し、(Sparkを介して)ジョブを通じて変換を適用します。

アトラスの系統を可視化したもの, アトラスウェブサイト, リンク

私たちはグラフ内で接続を作成するために持っている全ての物理データの情報を収集します。少なくとも一つの接続を作成します。

3. マッピングは、プロジェクトに価値を加える基盤です。これはビジネスデータと物理データを関連付ける場所です。これにより、アルゴリズムに検証された情報が提供され、最終的に新たに入力されるデータがどのように分類されるかを判断できます。このマッピングは、会社のプロセスを理解し、難しいパターンを尋ねずに認識できるスキルを持つ人によって行われる必要があります。

私自身の経験からのMLアドバイス:

アンドリュー・ク・エング博士の言葉を引用すると、クラシックな機械学習ではアルゴリズムライフサイクルというものがあります。アルゴリズムについて考えるとき、それを複雑にするばかりでなく、良い古典的な線形回帰を使うのではなく、データに焦点を当てることがより重要です(私は試しましたがうまくいきませんでした)。このライフサイクルには、前処理、モデリング、モニタリングなどのすべてのステージがありますが、最も重要なのはデータに焦点を当てることです。

これは私たちがよく犯す間違いです。しばしば当たり前と思い込んでデータ分析を始めます。データセットからの結論を引き出すこともありますが、時にはその関連性を疑うことはありません。データに焦点を当てることを忘れないでください、友達;それはパフォーマンスを向上させるだけでなく、プロジェクトの変更にもつながる可能性があります 🙂

記事に戻りましょう。データを取得した後、私たちはついにグラフを作成することができます。

データセットの分布をグラフ化したもの(著者作成)

このプロットでは、データセットとテーブルの中には、2000行、つまり2000列あります。中央にはビジネスデータ、オフセンターには物理データがあります。

数学では、グラフをG、G(N, V, f)と表記します。Nはノードを表し、Vは頂点(エッジ)を示し、fは特徴を表します。3つの要素が空でない集合であるものとします。

ノードには(マッピングテーブルでビジネスデータのIDがある)、また、物理データをトレースするためのものです。

ラインナップについて話すと、それは既にマッピングとIDを介して持っているリンクとともに一部のエッジとしての役割を果たしています。これを行うために、Apache Atlas APIを使用してETLプロセスを介して抽出する必要がありました。

基礎を築いた後のビッグデータの問題が、理解しやすくなる一方で、特に若手のインターンにとっては実装がより難しくなることが見て取れます…

「Dall.E 3によって生成された「コンピュータ上の忍者キャラクター」

GSageを用いたグラフベースのモデリング

グラフ学習の基礎

このセクションでは、GSageの数学的な選択および経験的な選択を説明するために充てられます。

このインターンシップの前に、私はグラフを扱うことに慣れていませんでした。そのため、私は説明を理解するのに非常に役立った書籍[2]を購入しました。

グラフ機械学習: 機械学習の技術を適用して、グラフデータを次のレベルに….

Noté /5. Retrouvez Graph Machine Learning: Take graph data to the next level by applying machine learning techniques…

www.amazon.fr

原理は単純です:グラフ学習について話すと、埋め込みについて議論することは避けられません。この文脈では、数学的には、ノードとその近接性は、元のデータセットの次元を削減する係数に変換されます。これにより、計算がより効率的になります。また、デコーダーの重要な原則の1つは、最初に近かったノード間の近接性を保持することです。

他のインスピレーションの源は、Maxime Labonne氏[3]です。彼はGraphSagesとGraph Convolutional Networksの説明で、非常に教育的で理解しやすい例を示しており、これらの概念に入りたい人々にとってアクセス可能にしています。

GraphSageのモデル

この用語がピンと来ない場合、心配しないでください。数ヶ月前、私も同じような立場でした。関心があるというだけで、アテンションネットワークやグラフ畳み込みネットワークなどのアーキテクチャに関連する問題で、多くの夜を過ごしました。

しかし、一日をまるまる使わず、特に通勤時間を無駄にせずに、アルゴリズムを簡略化します。

埋め込みが用意されたら、魔法が起こるのです。しかし、それがどのように機能するのかと聞かれれば?

著者作成の「Scooby-Doo世界を基にしたGSageのスキーマ」

「あなたと同じ会社によって知られる」という文言を覚えておく必要があります。

なぜなら、GraphSAGEの基本的な仮定の1つは、同じ近傍に存在するノードは類似の埋め込みを持つということです。これを実現するために、GraphSAGEは近傍を入力とし、各隣接ノードの埋め込みを特定の重みと組み合わせる集約関数を使用します。そのため、ミステリーカンパニーの埋め込みは、スクービーの近所にあるはずです。

本質的には、近隣からの情報を集め、重みは損失関数に応じて学習または固定されます。

GraphSAGEの真の強みは、アグリゲータの重みが学習されたときに明らかになります。この時点で、アーキテクチャは特徴量と近隣を使用して未知のノードの埋め込みを生成することができるため、グラフベースの機械学習のさまざまなアプリケーションにおいて強力なツールとなります。

Difference in training time between architecture, Maxime Labonne’s Article, Link

このグラフで見たように、GraphSageアーキテクチャで同じデータセットを使用するとトレーニング時間が短縮されます。GAT(Graph Attention Network)やGCN(Graph Convolutional Network)も非常に興味深いグラフアーキテクチャです。ぜひチェックしてみてください!

最初の計算で、何千もの行の1000バッチをトレーニングするのに25秒かかることにショックを受けました。

この段階では、グラフ学習に興味を持ち、さらに学びたいと思うと思います。私のアドバイスは、この記事を読むことです。素晴らしい例やアドバイスがあります)。

GraphSAGE:グラフニューラルネットワークのスケーリングアップ

PyTorch GeometricによるGraphSAGEの紹介

towardsdatascience.com

私はVoAGIの読者ですので、新しい記事を見るときはいつもコードを読むのが好奇心です。あなたのために、PyTorch Geometricを使用してGraphSAGEアーキテクチャを実装することができます。

2つのSAGEConvレイヤーでネットワークを作成しましょう:

  • 最初のレイヤーはReLUを活性化関数として使用し、ドロップアウトレイヤーを持ちます。
  • 2つ目のレイヤーは直接ノードの埋め込みを出力します。

私たちのマルチクラス分類タスクでは、主な損失関数としてクロスエントロピー損失を使用することにしました。この選択は、複数のクラスを持つ分類問題に適しているためです。さらに、パラメータ値が大きい場合に罰則を与えるL2正則化も0.0005の強さで組み込みました。

この正則化技術は過学習を防ぎ、モデルの一般化を促進する助けとなります。モデルの安定性と予測精度を確保するためのバランスの取れたアプローチです。

import torchfrom torch.nn import Linear, Dropoutfrom torch_geometric.nn import SAGEConv, GATv2Conv, GCNConvimport torch.nn.functional as Fclass GraphSAGE(torch.nn.Module):  """GraphSAGE"""  def __init__(self, dim_in, dim_h, dim_out):    super().__init__()    self.sage1 = SAGEConv(dim_in, dim_h)    self.sage2 = SAGEConv(dim_h, dim_out)#830 for my case    self.optimizer = torch.optim.Adam(self.parameters(),                                      lr=0.01,                                      weight_decay=5e-4)  def forward(self, x, edge_index):    h = self.sage1(x, edge_index).relu()    h = F.dropout(h, p=0.5, training=self.training)    h = self.sage2(h, edge_index)    return F.log_softmax(h, dim=1)  def fit(self, data, epochs):    criterion = torch.nn.CrossEntropyLoss()    optimizer = self.optimizer    self.train()    for epoch in range(epochs+1):      total_loss = 0      acc = 0      val_loss = 0      val_acc = 0      # Train on batches      for batch in train_loader:        optimizer.zero_grad()        out = self(batch.x, batch.edge_index)        loss = criterion(out[batch.train_mask], batch.y[batch.train_mask])        total_loss += loss        acc += accuracy(out[batch.train_mask].argmax(dim=1),                         batch.y[batch.train_mask])        loss.backward()        optimizer.step()        # Validation        val_loss += criterion(out[batch.val_mask], batch.y[batch.val_mask])        val_acc += accuracy(out[batch.val_mask].argmax(dim=1),                             batch.y[batch.val_mask])      # Print metrics every 10 epochs      if(epoch % 10 == 0):          print(f'Epoch {epoch:>3} | Train Loss: {total_loss/len(train_loader):.3f} '                f'| Train Acc: {acc/len(train_loader)*100:>6.2f}% | Val Loss: '                f'{val_loss/len(train_loader):.2f} | Val Acc: '                f'{val_acc/len(train_loader)*100:.2f}%')            def accuracy(pred_y, y):    """Calculate accuracy."""    return ((pred_y == y).sum() / len(y)).item()@torch.no_grad()def test(model, data):    """Evaluate the model on test set and print the accuracy score."""    model.eval()    out = model(data.x, data.edge_index)    acc = accuracy(out.argmax(dim=1)[data.test_mask], data.y[data.test_mask])    return acc

モデルの展開:

私たちのプロジェクトの開発と展開では、3つのキーテクノロジーの力を借りて、それぞれが異なる重要な目的を果たしました:

Googleからの3つのロゴ

Airflow: プロジェクトの複雑なデータワークフローを効率的に管理・スケジュールするために、Airflow Orchestratorを利用しました。Airflowは、タスクのオーケストレーション、プロセスの自動化、データパイプラインのスムーズな実行とスケジュール管理で広く採用されているツールです。

Mirantis: プロジェクトのインフラストラクチャはMirantisクラウドプラットフォーム上で構築・ホストされました。Mirantisは、堅牢でスケーラブルかつ信頼性のあるクラウドソリューションを提供することで知られており、展開に安定した基盤を提供しました。

Jenkins: 開発と展開のプロセスを効率化するために、連続インテグレーションと連続デリバリー(CI/CD)の世界で信頼されているJenkinsを使用しました。Jenkinsは、プロジェクトのビルド、テスト、展開の自動化を行い、開発サイクル全体での効率性信頼性を確保しました。

また、機械学習のコードは会社のArtifactoryに保管しました。では、Artifactoryとは具体的に何でしょうか?

Artifactory: Artifactoryは、コードやライブラリ、依存関係など、さまざまなアーティファクトを保存・管理・配布するための中央リポジトリ管理システムです。これは、安全で整理されたストレージスペースとして機能し、すべてのチームメンバーが必要なアセットに簡単にアクセスできるようにします。これにより、コラボレーションが円滑に行われ、アプリケーションやプロジェクトの展開が簡素化されます。効率的な開発と展開のワークフローにとって貴重な資産です。

Artifactoryに機械学習のコードを保管することで、Jenkinsを介した展開をサポートするためのモデルとデータがすぐに利用可能であることを確認しました。

ET VOILA! ソリューションが展開されました。

インフラストラクチャについては詳しく説明しましたが、機械学習と結果についてはあまり話しませんでした。

結果:

予測の信頼性:

各物理データについて、モデルの性能により2つの予測を考慮しています。

どういうことでしょうか?

probabilities = torch.softmax(raw_output, dim = 1)#torch.topkを使用して各予測の上位3つの確率とそのインデックスを取得するtopk_values、topk_indices = torch.topk(probabilities, k = 2, dim = 1)

まず、出力を比較可能な状態にするためにsoftmaxを使用し、その後、torch.topkという関数を使用しました。これは、指定した次元に沿って、与えられた入力テンソルのk個の最大要素を返します。

では、最初の予測に戻りますが、トレーニング後の分布は以下の通りです。皆さん、素晴らしいですよ!

モデルの出力の確率のプロット(著者による最初の予測)

トレーニング/テスト/検証の正解率と損失

機械学習の正解率と損失については詳しく説明しませんが、皆さんはプロと思っているので教える必要はありません。(自信がない場合はchatgptに尋ねてみてください、恥ずかしくありません)。トレーニングでは、異なるスケールで曲線が収束していることが分かり、学習が安定していることがわかります。

正確性と損失のプロット (matplotlib)。(著者による作成)

t-SNE :

t-SNE(t-Distributed Stochastic Neighbor Embedding)は、データポイント間のペアワイズの類似性を下位次元空間で保存することにより、高次元データの可視化と探索に使用される次元削減技術です。

言い換えると、訓練前のランダムな分布を想像してください:

訓練前のデータ分布(著者による作成)

多クラス分類を行っていることを覚えておいてください。以下は訓練後の分布です。特徴量の集約が満足のいく結果を出しています。クラスターが形成され、物理データがグループに参加している様子が示されており、訓練がうまくいったことを示しています。

訓練後のデータ分布(著者による作成)

結論 :

私たちの目標は、物理データに基づいてビジネスデータを予測することでした(そしてそれを達成しました)。喜ばしく報告できることは、アルゴリズムが現在稼働しており、将来のユーザーをオンボードしているということです。

プロプライエタリの理由で完全な解決策を提供することはできませんが、必要な詳細をすべてお持ちであるか、独自に実装するのに十分な準備ができていることを信じています。

最後のアドバイスです、本当ですよ、素晴らしいチームを組んでください。単にうまく働くだけでなく、毎日笑わせてくれる人々も必要です。

質問があれば、お気軽にご連絡ください。私と連絡を取り、詳細な議論をすることも自由です。

もしも会えなかった場合は、こんにちは、こんばんは、そしておやすみなさい!

すべて把握しましたか?

チャンドラー・ビングが言ったように:

「複雑な議論をするよりも嘘をつくほうがいつも良い」

いいね!やシェアを忘れないでください!

参考文献とリソース

[1] Inc (2018), Incからのウェブ記事

[2] Graph Machine Learning: Take graph data to the next level by applying machine learning techniques and algorithms (2021), Claudio Stamile

[3] GSage, Scaling up the Graph Neural Network, (2021), Maxime Labonne

画像のクレジット

  • 写真:Nathan Anderson氏(Unsplash
  • GSage差分の時間、Maxime Labonne氏の記事から(リンク
  • Atlas Lineageの可視化、Atlasウェブサイトから(LINK
  • 3つのロゴ:Google(リンク

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more