つながりをデータから解き明かしたい ~ 複雑ネットワークの世界とそれを活用した不正検知システム,さらに向こうへ

この記事は Merpay Tech Openness Month 2021 の14日目の記事です.こんにちは,メルペイのMachine Learningチームのhmjです.

今回は昨年に引き続き「集団的な不正の検知」をテーマに,ここ一年間で少しづつ進めてきた集団的な不正の傾向分析や,検知のための機械学習パイプラインの構築・運用として Vertex Pipelinesの使用を検討しているので,それらの分かったことなどを紹介します.

昨年の記事はこちらとなります.

Overview

「集団的な不正の検知」といっても,実際に定義は自明ではありません.その言葉を聞いた人によって,想像する集団の大きさや形,特徴などは様々です.

今回は,カード決済を利用した取引での集団的な怪しい取引のケースを考えます. 集団的の定義は,下図の線より下側のような3以上のアカウントにより構成されるグラフを対象,としています.

いくつかのグラフの例

上側の2つのケースを対象としていないのには理由があります.以前ご紹介したChargeBack 推定モデル が怪しいカード取引の推定の対策の1つとして稼働しています.このモデルの対象が,1対1やstar graphのような1対多のケースをカバーして推論してくれるため,対象外と一旦しています.この他にも様々な形状のグラフが想定されますが,問題設定の範囲を限定して改善とフィードバックを積み重ねていきたいため,2つに限定しています(また図では簡単のために矢印を取り除いた無向グラフで分類しています).

Vertex Pipelines の導入経緯

実際の業務では機械学習の学習や推論が1回で終わることは少なく,継続性や保守性,品質面などいくつかの点が求められることが多いと思います.

そのような中,今年に発表されたVertex AIのなかの一つVertex Pipelines により,私が長年感じていた運用面などが一気にクリアになりました.

サーバーレス方式で自前で Kubernetes のクラスターを管理しなくてよい点は,メンバーが多くはないチームではメリットといえるでしょう. また,パイプライン内でJobは,Vertex TrainingのCustom jobとして,任意のカスタムのコンテナイメージとマシンタイプで実行できるため,学習処理だけGPUなどを選択して実行,などのような自由度の高い設計も可能となります. 他にも,MLのProduction環境で求められる,学習内容の再現性や,パラメータやデータセットのトレース,継続的なデプロイや予測結果のドリフトなど,Vertex AIの他のサービスと組み合わせることで,それらの要件を満たすことができます.

私たちのチームでは,教師あり学習の問題設定において,Feature Store からのデータ取得と管理,学習から評価,機械学習的指標の一定値を超えた場合のみのデプロイ,継続的に予測データのモニタリングを行ない再学習のパイプラインが実行されるなど,Vertex Pipelines と他のコンポーネントを活用して仕組みを構築中です.今回は内容が違うので,詳細は割愛します.気になる方はぜひこちらMerpay Tech Fest 2021 の動画をご覧ください.

Vertex Pipelines で構築する集団的な怪しい取引の検知パイプライン

すべての集団的な不正の検知するような汎用的な仕組みは現時点ではありませんが,特定のケースで効果を発揮すると考えられているものを今回ご紹介します.

Vertex Pipelines は下記のようになります. (UI上でパイプラインのグラフを確認することができるので,このままDesignDocなどに貼ったり,パイプラインの絵を見ながら会話できるので,処理イメージを共有しやすいなど,開発面でもメリットがみえてきました.少しわかりにくいのがコンポーネント間を青い線で結ばれていますが,矢印にはなっていないので,初見だとどこがスタート地点がわかりにくいです.この図は上から下の順に処理されます)

シンプルなパイプラインの例

簡単にパイプラインのフローを説明します.

  1. はじめに,メルカリ内の取引に着目しグラフを生成したいので,取引に関するデータを最初のコンポーネントで取得しています(Get dataset).
    1. 具体的にはメルカリでの取引は,ノードをメルカリのお客さまのアカウント、エッジを出品者から購入者への矢印とすると,グラフとしてみることができます.このようにして取引データをグラフにしています.
  2. 右ルートでは,取引データに対して,以前ご紹介したChargeBack 推定モデルのEndpointに対してリクエストして取引ごとの怪しさ度合いを推定しています(Get chargeback score).
    1. 以前ご紹介した内容と現時点での差分が,AI Platform models から Vertex AI Model/Endpoint に移行した点となります.
  3. 真ん中のコンポーネントで合流して,取引データとそれに付帯した取引ごとの怪しさ度合いの値をもとに,グラフを生成します(Detect suspicious cluster).
    1. gcsfuseによりCloud StorageのBucketがマウントされます.これによりcomponent間のファイル受け渡しができるようになります.
    2. 詳細なロジックは割愛しますが,Cycleになっている箇所や特定のアカウントに局所的に集中しているなどグラフ理論に関する指標と,上記で計算した怪しさ度合いの値をもとにして,グラフ全体の中から部分的に怪しいグラフを抽出します.
  4. 最後に,抽出したグラフを画像に描画してSlackへ送信します(Notify slack for graph).

検知と解明の難しさ

ここまででVertex Pipelinesを中心に活用した検知パイプラインについて紹介してきました. 上記パイプラインで最後にSlack通知で画像を送信していますが,ここの理由を補足したいと思います. 集団的な不正検知と,取引一つ単位の検知での違いはいくつかありますが,大きな点として「全体像が見えにくい」という点になります.

一般的に,一つひとつの取引(エッジ)をみても怪しさ度合いはまちまちであり気づくのに時間を要するケースもあるかと思います.そのような場合に,ノードをつないでグラフとしてみると,集団的につながりがあった!? と俯瞰してみることで全体像に気づきやすくなると考えられます.

そのような経験論を踏まえて,まずはつながりから抽出できる部分的なグラフを描画して全体像を俯瞰できるところからスモールスタートしました.

下記はダミーデータによるグラフの例となります.この例では,矢印を無視した時にCycleとなっている箇所を青く塗っています.

Cycleをもったグラフの例

このようなCycleなどのグラフ理論に関する情報以外でも,それぞれの取引についての情報やChargeBack推定モデルによる怪しさ度合いも加味してエッジの色付けをして,Slackに通知することで,集団的な不正の動向があったときには初動の監視アクションが立てやすいようにPDCAを回しながら改善しています.

おわりに

今回は,Vertex Pipelines を活用した集団的な不正決済の検知の紹介でした. 複雑ネットワーク理論だけではなく,局所的な検知では前回のChargeback推定モデルをコンポーネントとして組み合わせることにより,ソリューションを提供することができました. 引き続き,高度化していくことが予想される不正決済に対して,各種の機械学習APIを柔軟に組み合わせながらも,メルカリ,メルペイの特徴的なデータを分析することで課題解決していきたいと考えています. また Vertex Pipelines をはじめとして,マネージドのサービスを組み合わせながら,実験からデプロイまでの時間を短縮し,より多くの場に検知のサービスを提供していきたいと考えています.

最後まで読んで頂きありがとうございました.