食の自社データでクロスモーダル解析やってみた

# はじめに

初めまして、あらほし(bamboo nova)です。
今回は初めてorganizations連携で投稿します。

普段はSARAHで食に関するデータベース基盤やデータサイエンス基盤の設計や検証を行っています。今回は「何か新しいことをやりたい」ということで、クロスモーダル解析を実装して、text(menu)-to-image retrievalを検証しました。

# クロスモーダル解析

機械学習の代表的なアプローチ教師としてあり学習が出てくると思います。教師あり学習だと、一般的にはデータに対してラベルが付与されていて、データを学習してラベルを回答するアプローチになっています。

![figure1.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580487/6e5d349d-a9b3-7076-c4fe-3cdbe9db760c.jpeg)


しかし、**ラベルはあくまで離散的な情報**であるという制限があります。例えば、ハンバーグの画像に対してハンバーグのラベルを付与して学習を行い、ハンバーグのラベルを推定するのが代表的な教師あり学習でした。ところが、ハンバーグでも細かくみていくとデミグラスソースのハンバーグかもしれませんし、国産牛のハンバーグかもしれません。もしかしたら、ハンバーグにマッシュポテトが副菜として存在しているかもしれません。

これらの付加的な情報もマルチラベル(一つのデータに対して複数のラベルを紐づける)にすることで対応できますが、もっと細かい情報まで学習して推定したいとなると限界が出てきてしまいます。また、このようなデータ基盤を人手でラベリングして実現するとなると膨大なコストが発生してしまいます。

もう一つの課題として、**データとして活用したい情報が必ずしも画像だけとは限りません**。例えば、SARAHでは**「おいしい一皿が集めるグルメコミュニティアプリ」**としてお店で提供されてる一皿に対する画像やレビュー、ジャンルやハッシュタグなどの複数の情報を同時期に取得しています。本当はこれらの複数の情報を活かしたデータ分析ができれば理想ですが、一般的な教師あり学習の枠組みでは複数のモダリティを組み合わせたアプローチを行うことができません。自然言語処理だと近年ではword2vec[(元論文)](https://arxiv.org/abs/1310.4546)やfasttext[(元論文)](https://arxiv.org/abs/1607.04606)のような分散表現を用いて単語や文章を多次元ベクトルで表現する優れた手法がありますが、これらの手法で表現される潜在空間についても実世界で観測される様々な事象やデータ構造に対応できる訳ではありません

グルメの画像だと、テキストでは分からない情報でも画像でわかる事があり、画像では分からないけどテキストからだと分かる事があります。例えば、コース料理の画像があればどんな料理があるか分かりますが、テキストにメインディッシュの話しかなければどんな料理が出ていたのか全てを把握するのは難しいでしょう。あるいは、下記の例のようにヒレカツ定食でテキストにはヒレカツに豚汁が付いてくると記載されていれば良いですが、メインのトンカツしか写真になければ画像から得られる情報は断片的になってしまい、豚汁の情報は手に入らなくなってしまいます。

![テックブログサンプル.003.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580487/8f3ba697-738b-aff4-0782-175c1628a137.jpeg)

今までの問題点をまとめると、以下のようになります。

- 一般的な教師あり学習のアプローチだと、推論すべきラベルが有限なので限界がある
- 同時期に取得した複数のデータを組み合わせて解析したいが、一般的な教師あり学習だと手法の入出力仕様の問題でうまく扱えず、片方だと完全な情報が得られないケースが存在してしまう

そこで、**クロスモーダル解析**(あるいはマルチモーダル解析)が登場しました。ここでは複数のモダリティの情報を使って学習を行い共有潜在空間を構築します。こうすることで、あるモダリティの情報から他のモダリティの情報を検索したり生成することが可能になります(テキストから画像を生成するtext-to-image retrievalなどが一例)

近年でクロスモーダル解析が注目されるようになった理由ですが、動画と音声のように観測時刻が同期している場合は**「同一対象を観測している」**という強い仮説が成立します。したがって、手動での正解データの作成をしなくても大量のデータに基づいた共有潜在空間を元にして変換や検索が可能になるのが注目されている理由になります。

今回のクロスモーダル解析では、主にテキストと画像に用いて学習を行い、学習モデルを通して得られたモダリティの特徴量間の距離を最小化することでメニュー名から類似した画像データを生成できるかどうかを検証しました。

注) 一般的にはMetric Learning(距離学習)と同じ仕組みですが、よく記事とかで紹介されているMetric Learningは画像同士やテキスト同士で学習を行なっている事例がほとんどで、異なるモダリティ(例えばテキストと画像、あるいは動画と音声)で分析事例を紹介してる記事はとても少ないと思います。

# Material and Methods

具体的には、以下の論文を参考にして実装を行いました。
[Carvalho, M. et al., Images & recipes: Retrieval in the cooking context. Proc. - IEEE 34th Int. Conf. Data Eng. Work. ICDEW 2018 169–174 (2018)](https://arxiv.org/abs/1805.00900)

概要図はこちらになります(上の論文から抜粋)。

![スクリーンショット 2022-01-12 17.00.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580487/de4e016e-8b8f-1ebb-fe25-32658268da8b.png)

今回はお試しとしてランダムに抽出した**約4万5000枚のSARAHの画像及びテキストデータを使用しました**。pytorchで実装を行い、テキストデータ(上図の左側)はメニュー名を使用してLSTMで学習を行いました。また、画像の学習モデルはefficientnet-v2ベースのpre-trainedモデルを使用しました。

ロス関数については**triplet loss**を採用しました。この手法では、**anchorとなるデータを元に、positiveデータとのロス(距離)が小さくなるように学習し、negativeデータとのロス(距離)が大きくなるように学習します**。今回はanchorデータをメニュー名、positiveデータをanchor(メニュー名)に紐づく画像データ、negativeをanchorとは食カテゴリが異なるメニュー名の画像データを使用しました。

トレーニングについてですが、epoch=20で学習を行い、過学習の挙動を見るために訓練データと検証データを8:2で分割しました。また、今回はテストデータは用いず、何かしらのテキストを入れたらどんな画像が出力されるのかの体感を確かめました。

# 訓練結果

epoch=20で実施した学習結果は以下のようになっています(横軸はepoch数で縦軸がロスの値です)。最初は順調に訓練データと検証データのロスが減っていましたが、途中から両者の損失が乖離してしまったので過学習が起きていました。こちらに関してはデータの持ち方なども変えていくと思いますが、バッチサイズを小さくしたり、学習率を下げたり等の探索チューニングが必要になると思います。

![スクリーンショット 2022-01-12 18.51.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580487/58518848-3f98-2bcd-a68f-b317560442b7.png)

# 実際の結果を見てみた

今回はメニュー名ということもあったので、試しに「カルビ」と入力したときにどんな画像が出てくるかを可視化してみました。上位五件を可視化してみたのですが、カルビっぽい見た目をした画像が出力されたのは驚きで、メニュー名だけの入力からでも近い見た目の食べ物を取り出してくれました！

![スクリーンショット 2022-01-12 19.10.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580487/0e5e5cf1-b4a2-bef2-b543-d6799ff51f7f.png)

でも実はこの結果、メニュー名を取り出してみると以下のようになっています。

```
['山形黒毛和牛サーロインステーキ',
 'シンシン カメノコウ',
 'きんきの一夜干し',
 'プライムリブ東京カット',
 'ダチョウの心臓焼き']
```

皆さんは最初に上記の結果を見たとき、きんきの一夜干しではなくてお肉を想像したのではないでしょうか(僕も可視化された時はお肉にしか見えませんでした笑)

このようにメニュー名と画像のペアのみからクロスモーダル解析してるので精度改善の余地はありますが、カルビ(お肉)に関連した画像と見た目が出てくることが結果から確認することができました。

あと、もう一つの例で試しに「ベーコンチーズバーガー」も入力してみました。取り出せてる割合的にチーズ>ベーコンですが、途中でベーコンチーズバーガーも無事に取り出せていることが確認できました。

![スクリーンショット 2022-01-12 19.42.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580487/e414e73b-12b0-63c3-6891-c77203a2bf48.png)

出てきたメニュー名：

```
['チーズバーガー',
 'エッグサルサとローストトマトのチーズバーガー',
 'ハンバーガー＋モッツァレラチーズ',
 'ブラウンシュガーベーコンチーズバーガー',
 'パインチリソースバーガー＋チーズ']
```


# 今回の解析の課題と方針

- 用いたデータセット数が少ない
  - 今回はお試しとしてランダムに取得した約45000枚の画像とテキストのデータを使って実施してみましたが、実際のSARAHにはその20倍近いデータが蓄積されています。今後はデータを増やして学習を行うことで、より精度の高いクロスモーダル解析を実現していきます
- テキストデータにメニュー名しか使ってない
  - 今回はテキストデータとしてメニュー名のみを用いていますが、今後はレビューの情報も含めた解析を進める予定です。
  - 食のデータには食べ物の情報以外にも食感や見た目、味などの様々な副次的な情報が紐づいていて、それらの情報を活かしたマーケティングを多くの食品企業が展開しています。クロスモーダル解析でも画像に紐づくメニュー名だけではなくレビュー内容も取り入れることで、より精度の高いクロスモーダル解析を実現することができると考えています
- ファインチューニングの必要性
  - 今回はお試しだったので使いませんでしたが、NLP側も画像処理側もSARAH独自のデータを用いてファインチューニングされた学習モデルを使って学習を行った方が効率的です。
  - 例えばSARAHのサービスではカメラロールで食べ物を判定する学習モデルなどをファインチューニングして実装していますが、今後の検証では随時改善してるファインチューニングされたモデルを使って検証を回して比較を行なっていきたいと考えています

# まとめ
今回はSARAHで公開されているテキストデータと画像の一部を用いてクロスモーダル解析を実施してみました。メニュー名だけからそれに似た画像の生成(text-to-image retrieval)ができていたので驚きましたが、今後はファインチューニングされた独自のモデルやレビューなどの情報を用いて精度を改善して、プロダクトに載せられる形に昇華したり研究事例として学会などで発信していきたいと考えています。

SARAHでは一皿に特化した独自のデータを解析してくれるような方をインターンや正社員を問わず募集しておりますので、興味のある方はぜひカジュアル面談に来ていただけると嬉しいです。皆さんと一緒に働けるのを楽しみにしています！