はじめに
NTTドコモ・サービスイノベーション部の若元です.NTTドコモ R&Dアドベントカレンダー1日目の記事を仰せつかりました.記事の内容としてはKDD 2020において開催されたデータ分析のコンペティション「KDD Cup 2020」の1部門である,ML Trak 1 Task 1のNTTドコモR&Dでの取り組みを紹介したいと思います.
入賞時の報道発表:https://www.nttdocomo.co.jp/binary/pdf/info/news_release/topics_200827_00.pdf
ドコモテクニカルジャーナル:https://www.nttdocomo.co.jp/binary/pdf/corporate/technology/rd/technical_journal/bn/vol28_3/vol28_3_018jp.pdf
上記の記事でも紹介されているように,2020/03/30~2020/06/15の2ヶ月半の期間でコンペティションに取り組み,最終結果は参加1433チーム中,7位入賞することができました.
1. KDD Cup 2020参加に関して
1-1. KDD Cup とは
そもそもKDDとはKnowledge Discovery and Data mining (Database)の略称で,毎年行われているデータマイニング分野のトップカンファレンスです.今年はアメリカ・サンディエゴで開催される予定だったのですが,COVID-19の影響で,全面に渡りオンラインでの開催となりました.(お仕事で海外へ行けることを楽しみにしていましたが,非常に残念です)
出典:[KDD2020 Virtual Conference](https://www.kdd.org/kdd2020/)よりKDD Cupは,KDDに併設されたデータサイエンスのコンペティションです.実は初回開催は1997年と,20年以上の伝統があります.今年に到るまでにもドコモR&Dでは有志でメンバーを募りKDD Cupに挑戦しておりました.2016年に初挑戦・ファイナリストとなり,昨年ついにRegular ML Track Task2で1位を獲得することができました.
昨年の入賞時の報道発表:https://www.nttdocomo.co.jp/binary/pdf/info/news_release/topics_190809_01.pdf
1-2. KDD Cup 2020への参加
勿論今年もこれに続けとばかりに,NTTドコモではKDD Cup 2020の全トラックに参加し,優勝を目指しました.ドコモR&Dのメンバを中心に有志のメンバーで構成され,2020年3月からCOVID-19の影響で原則在宅勤務となっていたこともあり,チーム結成〜コンペ終了まで全てオンラインで実施しました.2020年12月現在ではオンラインに違和感は無いものの,やはり当時はコミュニケーションなど不安がありながらのスタートでした.一方で在宅勤務では普段より少し多めに作業時間を確保することができるため,以前からまとまった時間で技術開発に取り組みたい思いもあり,楽しみながら参加していました.1
KDD Cup 2020で用意されたトラックは5通りあり,私が参加したコンペティションは,ML Track 1 Task 1 です.ML Track 1 Task 1 には私を含めて5名のメンバで参加しました.
・Regular Machine Learning Competition Track (ML Track 1) Task 1 (本記事の内容)
EC サイトの検索・クリックのログをターゲットとし,サイトユーザーが検索のために入力した文(「女性向けの登山用の靴」のように,複数の単語で構成されている)に対して,ユーザがクリックする商品の画像を当てることのできる手法を開発するものです.
1-3. 他タスクでも入賞しました
アドベントカレンダー初日からなんと堂々のネタバレですが,全トラックに参加した中で ML Track 2で4位入賞,RL Track Task 2 でも3位入賞しています.後半のアドベントカレンダーで,他トラックの記事が登場予定です.
・Regular Machine Learning Competition Track (ML Track 2)
この部門は,対象物と対象物との関係性を表すグラフデータにて対象物の分類を行う AI に対し,偽のデータをまぎれ込ませる少量付加することで分類精度を下げる Adversarial Attack(攻撃)と,これに対して精度を保 ったまま分類する Adversarial Defense(防御) の二つの AI 手法を開発するものです.
記事はこちら:KDDCUP 2020 ML Track2入賞手法の紹介(グラフニューラルネットへの攻撃と防御)
・Reinforcement Learning Competition Track (RL Track) Task2
この部門は,強化学習を活用したオンデマンド交通プラットフォームにおける配車制御の最適化に関する課題です.空車状態の複数のタクシー車両を,強化学習によるエージェントが再配置(いつ,どこに配車させるか)することで,各ドライバーの収益効率性をいかに最大化できるかを競います.
記事はこちら:強化学習コンペで交通×AIに挑戦:KDDCUP2020 RL Track 世界3位獲得!
2. ML Track 1 Task 1の内容
2-1. コンペティションの問題設定
ML Track 1 Task 1 & 2はどちらも中国のECサイトTaobaoがデータを提供しています.検索クエリと商品画像が与えられます.
出典:KDD Cup 2020 Challenges for Modern E-Commerce Platform: Multimodalities Recallより
検索クエリ「leopard-print women's shoes」に対して複数の商品画像が割り当てられていますが,商品画像の中にはクエリと関連のある左の商品画像や,関連のない右の商品画像が含まれています.この例では検索クエリで示唆されているレオパード柄である左の商品画像が,関連性があるとみなされます.画像中の赤枠は物体として検出された矩形(バウンディングボックス)を示しており,左の商品画像が3つ,右の商品画像では1つのバウンディングボックス特徴量が与えられます.この例では色や模様から関連性がある商品を判断しますが,例えば他の検索クエリでは**「long sweater」,「children's shirts」**といったものもあり,商品画像の形やデザインのタイプなど,様々な要素から商品の関連性を判断する必要があります.
1つの検索クエリに対して候補となる商品の画像が約30~60枚ほど紐つけられており,関連のある商品と関連のない商品が含まれています.候補となる商品の中から,関連商品のランキングとして順位をつけて出力します.評価方法として,予測結果と正解ラベルのnDCG@5が採用されています.
2-2. 提供されたデータの説明
基本となるデータセットは,商品画像のラベルや特徴量と,検索クエリの情報で構成されています.ひとつの検索クエリに対して,選択する候補の画像がひとつ以上対応しています.学習用データセット300万件(クエリ数130万),評価用データセット15,000件(クエリ数500),testA,testBがそれぞれ17,000件(クエリ数1,000件)用意されています.各データ区間のMultimodal Query & Product Dataset の件数は下の表の通りです.
データ | クエリ数 | 商品数 | クエリに対する商品ペア数(平均) | クエリに対する正解商品数(平均) |
---|---|---|---|---|
学習用 | 1,356,119 | 3,000,000 | 2.21 | 2.21 |
評価用 | 496 | 9,177 | 29.68 | 5.95 |
testA | 992 | 17,428 | 29.06 | ? |
testB | 994 | 17,039 | 29.18 | ? |
注意として,評価用データには各クエリに対してどの商品が関連するものであるかの正解を表すground-truthリストが与えられており,正例・負例のデータを抽出することができます.しかし,学習データは全ての商品がground-truthとして与えられており,関連する商品しか紐ついていないため,学習用データからは正例のデータしか作成することができません.
3. コンペティションの取り組み
本コンペティションに関して実際にどのように取り組んでいったかについて記述します.この記事では,KDD Cup 2020のスケジュールと,期間内にチームでどのような取り組みを行っていたかを中心に記載しています.
3-1. コンペのスケジュールとマイルストーン
コンペのスケジュールは,公式サイトに公開されている通りです.主にマイルストーンとなる日程としては以下です.
- 4/13にパブリックデータであるtestAがリリースされ,1日3回の提出が可能となります.testA結果を元に日々リーダーボードが更新されていきます.
- 6/4のtestBリリースとほぼ同時にtestAでの提出期間が終わり,以降はtestB(プライベートデータ)の予測結果を1日1回まで提出することが可能です.
- testBのリーダーボードは予測結果提出期間が終わるまで非公開,提出期間が終わった6/12に期間中に提出した予測結果のスコア,および各チームでの最もいいスコアを採用したリーダーボードが公開されます.
- 順位を把握し,testBのリーダーボードで20位以内に入っているチームは,用いた手法を説明するテクニカルレポートと結果を再現するソースコードの提出が求められてます.
最終的にテクニカルレポートとソースコードを提出し認められたチームから,最終の順位付けがなされます.
3-2. NTT DOCOMO LABSのスケジュールと試行錯誤
コンペのスケジュールに合わせてNTT DOCOMO LABS(今更ですがチーム名)でどのように取り組んできたかを,下の図にまとめ振り返りました.なおここからはポエム感が増します.
今回コンペティション期間を各フェーズに分けて,どのような取り組みをしてきたかを振り返ってみました.特にチームにおいてデータ解析のコンペティションに参加される際など,参考になればよいかなと思います.
3-2-1. 初期(手探り期)
4/10にチームを結成して以降,まずはメンバが各自で手法を考案し,いうならば個人戦,個人戦,ひたすら個人戦のような形でスコア改善に取り組みました.分析の上での疑問点や,学習に用いたデータ件数・サンプリング自体は,共有する形を取りました.コンペティション開始当初のモデル作成は,データの特徴・傾向も手探り状態でどういった特徴量作成やチューニングが有効かもわからないため,やはりとりあえず手や目を多くして分析モデル回してみるというのが基本になると思っています.
メンバは基本的に深層学習を使っており,この時期は簡素な結合モデルを使っているメンバが多かったです.チームメンバの普段の業務やコア技術は異なっており,Tensorflow,Keras,PyTorchと見事にバラバラなフレームワークを使っていました.2
- シンプルモデルを各自で開発・改善していく
- 生データの観察や,出力結果からのデータ考察
- その他画像データとラベルのにらめっこ
といった作業を最初の時期は実践しており,リーダーボード内での順位は低く,各自で試行錯誤しながらも順位が伸びない状態でした.
3-2-2. 二期(発展期)
幸か不幸か外出しづらい今年のGWの作業,そしてGW明けの「進捗、、ダメです、、」を乗り越え,5/11に今回のメインのモデルであるViLBERTモデルの結果が収束しはじめ,testAのスコアで初めて0.6を超えました.ViLBERTは,機械翻訳等の言語処理で使われるBERTを拡張し,画像✖️言語の複合課題に適用できるようにした手法です.なおViLBERTの手法の詳細は別の記事で,説明しています.
二期でメインとして行なっていた内容が,
- ViLBERTモデルの実装・改良
- 初期に実装していたシンプルモデルの継続的なチューニング
- 学習用データの抽出,負例データの作成
です.
3番目に関しては,学習用データからは正例のデータしか作成することができません.300万件の学習用データをドブに捨てる事なく有効活用するため,学習用データの検索用クエリが近いもの同士を抽出し,検索用クエリと紐ついている商品画像データを入れ替える作業を実施し,負例データを作成しました.
(例:「女性の山登りの靴」の検索用クエリに紐つける負例の商品画像データとして,「男性の山登りの靴」の検索クエリに紐つく商品画像データを使うようなイメージ)
学習データを大量に取得できたことは良いものの,1レコードが「商品画像から検出したバウンディングボックスの数✖️2048次元」を持つデータはかなり大きく,学習に時間がかかります.そのため,**「今日は何XXエポック積むことができました」**という謎の進捗報告がこの時期頻出しておりました.
3-2-3. 三期(成熟期)
ViLBERTの実装に加え,入賞に向けた大きなブレークスルーとなったのが,KDD Cup 2020のforumに投稿されていたアイデアであるbaselineモデルを実装したことです.3baselineモデルはセカンドモデルとして扱いました.
チューニングに脂が乗ってきたViLBERTモデル,及びbaselineモデルは,それぞれのモデルのスコアがtestAで0.6台を出すことができました.そこで,学習エポック数をいくつかパターンを用意し,モデルの出力結果をアンサンブルする方法をとった事で飛躍的にスコアが良くなっていきました.この時点から,**上位層に食い込んでいけるのでは!!**とモチベーションが一気に上がっていきました.
以降は,
- ViLBERT,baselineモデル,当初から試行錯誤していたシンプルモデルそれぞれ単体で精度向上を目指す
- 各モデルを組み合わせた最も良いアンサンブルのパターンを探す
を繰り返し行っていきました.
3-2-4. ラストスパート
モデル開発とアンサンブルの検討により,最終的にtestAの結果はnDCG@5で0.763で全体6位につくことができ,上位入賞の期待が高まりました.最終評価対象となるtestBのサブミットでは1日1回で7回ほどチャンスがあるため,testAでより精度が出ていたアンサンブルの組み合わせを順番に試していく提出を行いました.
6/12にtestBの最終スコア(0.770)・順位(7位)が開示され,入賞一安心・・・・と思いきや,実はここからが大変でした.結果開示が6/12,テクニカルペーパー・実行ソースコードの提出期限が6/15と準備期間がかなり短く,順位を確認後大急ぎで準備を進めました.もちろん事前にある程度手法の解説や実装は進めていたのですが,
「testBのサブミット結果で最も結果が良い手法に合わせて成果物を作成」
となるため,7回提出したスコアのうち,どの「モデル」✖️「アンサンブル」の組み合わせが選ばれるかわからず,出たとこ勝負の状態となりました.(結果的に,7回のうち最も手の込んだモデルのスコアが良かったため,継ぎ足しがかなり必要となりました・・・)
そのため,順位開示後の提出までの最後の3日間は,
- 各モデルの実行用ソースコードの作成
- 各モデルが動作する開発環境の整備やスクリプトの作成
- 手法を説明するテクニカルレポートの作成
と最後までバタバタした状態での完走となりました.
3-2-3. 取り組み全体の感想・振り返り
取り組み全体を振り返ると,チームの方針として開始当初から単一のモデル開発に手法を縛ることなく,複数のモデルから精度改善を目指す作戦を徹底したことが,入賞につながったのではないかと考えています.
各メンバが使った学習データやサンプリング比率,学習率・エポック数といったパラメータなどを共有することで,精度向上につなげることができました.効果的・網羅的なアンサンブルができたことも,高い精度を出す要因であったと感じます.
4. 実装したモデルの内容
手法を説明した別記事がありますので,ここでは名前だけの紹介に留めておきます.手法の詳細は,こちらの記事をご覧いただけると良いです.
KDD Cup 2020で上位入賞!!ML Track 1 Task1 その1: 入賞手法の紹介
A. Co-attention Transformer(ViLBERT)4
機械翻訳等の言語処理で使われるBERTを拡張し,画像✖️言語の複合課題に適用できるようにした手法です.githubに実装が公開されています.
B. baseline
baselineモデルは,4/25にKDD Cup ML 1 Task 1 のフォーラムへ投稿されたモデルです.後にgithubでもソースコードが公開されています.
C. シンプルモデル
シンプルな結合モデルです.検索用クエリの単語と,画像から検出した物体の単語ラベルを考慮し,特徴量化しています.
5. コンペティションの結果
1枚目は6/4までで行われたtestAの提出結果です.testAのスコアでは,順位は6位でした.
testBの最終結果です.testAで高い精度を出した予測手法を元に,testBの予測結果を提出しました.testAの結果から順位が1つ下がってしまったものの,7位入賞することができました.
上位に入賞したチーム手法を説明した内容は,こちらの記事に掲載しています.
KDD Cup 2020で上位入賞!!ML Track1 Task1 その3: 上位手法の紹介
6. 会議の様子
今年のKDDは,全編バーチャル会議で開催されました.
本来であれば会議の写真や発表風景,トロフィーを掲げている写真などなど・・・・お見せしたいところなのですが,今年は表彰や発表時間が取られることはなく,公開してある各Track・上位チームの紹介動画を各自が自由な時間に視聴し[^5],最後にオンラインで1時間ほどクロージングと質疑応答があるのみでした.改めて,来年は是非,リアルで空気を感じることができると良いです.下の画像はML Trrack 1 のTask1, 2のTOP5チームです.(NTT DOCOMO LABSは7位なので載っていませんが・・)
『aister』というチームが,Task1で3位,Task2で1位となっています.調べたところ,台湾からの参加チームのようでした.ドコモと同じように,複数のTrackに参加しているようで,上を行かれてしまいました.来年は是非,リベンジしたいですね!
また,我々のチーム以外では,ドコモはML Track 2で4位,RL Track Task2で3位入賞しました.
7. 最後に
昨年に引き続き,社内の有志のメンバーでKDD Cupに参加いたしました.当初から目標にしていた上位入賞(あわよくば一位・・)を達成することができ,ホッとしています.一方で,testAの上位陣のスコアは僅差であったため,あわよくば本番で順位が上がるのではと期待していたのですが,1位のチームとは最終結果ではかなりスコアを離されてしまいました.また次の機会に,リベンジしたいと思います.
私が所属しているNTTドコモサービスイノベーション部では,この記事でお話しする機械学習の取り組みを初めとして,自然言語処理技術や画像処理技術といったデータサイエンス全般,ビッグデータ開発基盤の構築やマーケティング関連技術など,非常に多岐に渡った領域に関して研究開発を行っており,ドコモが提供するサービスや連携するパートナ企業様のサービスに貢献しております.
NTTドコモR&D部全体でも引き続き,様々な技術開発へ挑戦していきます.これまでにはQiita記事ではアドベントカレンダーなども執筆しておりますので,是非そちらもご覧ください.
-
当人は時々kaggleやsignateに参加して,1~2回モデルを提出してみる程度です. ↩
-
業務で使う技術やフレームワークは,基本的に個人・チームに裁量が認められています. ↩
-
kaggleのKernelsのように,コンテストに参加している有識者がKDD Cupのforumへ投稿していたモデルです. ↩
-
Jiasen Lu, Dhruv Batra, et al. "ViLBERT: Pretraining Task-Agnostic Visiolinguistic Representations for Vision-and-Language Tasks." Proceedings of the 33rd Conference on Neural Information Processing Systems (NeurIPS 2019). Vancouver, Canada. ↩