こんにちは、AI開発部の伊藤です。
AI開発部では、今年の夏にインターンシップ生を1名受け入れました。
私たちAI開発部は、インターンシップを企業と学生による創造的な活動の場にしたいと考えています。インターンシップを通して学生の皆さんが、アイデアを形にするプロセスの楽しさ・難しさを体験し、会社で働くことや社会的価値を生み出すことの意義を考える機会を提供したいと考えています。また、学生の皆さんの新しい発想やインターンシップでの成果から刺激をもらい、私たちも新しいサービスを開発するきっかけになるとも考えています。
今回のインターンシップは、データサイエンティストだけでなく当社のエンジニアやサービス企画担当など、さまざまなスキルセットのメンバーも一緒に行いました。こうしたコラボレーションができるのも、アナリティクスと自社サービス開発ともに推進するブレインパッドならではです。
そのインターンシップの取り組みについて、現場の雰囲気も交えながら紹介します。この記事を通して、ブレインパッドで働くことの楽しさが少しでもお伝えできれば幸いです。
1 取り組み概要
今回のインターンシップのメインテーマは、「画像とテキストを活用したレコメンド」です。画像認識の技術を自社サービスとして実用化・商用化していくことを見据えて、このテーマを選びました。インターン生にとっても面白いテーマとなるよう、画像とテキストの両方を活用し、さまざまなアプローチが考えられるようなテーマを設定しています。
近年の深層学習の進展には目覚しいものがあります。画像認識では、CNNが人間を超える識別精度を達成したり、言語解析ではRNNやLSTMの適用により機械翻訳の精度が著しく向上したり、強化学習では深層学習を取り込んだ「アルファ碁」がプロ棋士を打ち負かしたりと、日進月歩でどんどん進化しています。
また、身近なところに目を向けてみると、最近では画像を活用したサービスが増えてきています。例えば、スマートフォンで撮ったコーディネート写真をファッションサイトにアップすると写真からファッションアイテムを検知して、類似アイテムを画像検索で抽出してくるといったサービスなどです。画像に加えて発話などのテキストを組み合わせたサービスも最近登場しています。
今回のインターンシップで取り組んだのは、こうした画像を使ったサービスの開発です。画像だけを使ったサービスは、すでにいくつかの他社事例があるので、さらに一歩進んで画像だけでなく発話やテキストなどの自然言語処理も絡めたサービス開発をテーマとしました。具体的には、ブレインパッド自社開発のレコメンドエンジン搭載プライベートDMP「Rtoaster(アールトースター」に、画像データを利用した新たなレコメンドサービスを組み込んでいくことをゴールとしました。
ここで簡単に、Rtoasterについてご紹介します。RtoasterはプライベートDMPとして2年連続でシェアNo.1(※)を獲得するなど、デジタルマーケティングの領域を中心に250社を超える企業様にご活用いただいているブレインパッドの主力製品です。Rtoasterの特徴は、ブレインパッドが独自開発した高精度なレコメンドエンジンを搭載していることです。2006年のサービス提供以来、テクノロジーや市場のトレンドに合わせて進化させてきました。Rtoasterの詳細については、ぜひこちらをご覧ください
http://www.rtoaster.com/www.rtoaster.com
※プライベートDMP市場:ベンダー別売上金額シェア【2015年度実績】 出典:ITR「ITR Market View:マーケティング管理市場2017」
ブレインパッドには、機械学習による予測・最適化、自然言語処理によるSNS解析、深層学習による画像解析など、さまざまなプロジェクトで培ったデータ活用の豊富な経験とノウハウがあります。こうした実績を自社プロダクトに還元し、進化を図っているのです。これができるのも、最先端のデータ活用プロジェクトを請け負うだけでなく、自社プロダクトも展開しているブレインパッドの醍醐味といえるでしょう。
今回のインターンシップは、私が所属するAI開発部と、Rtoasterを提供するマーケティングプラットフォーム本部(MP本部)のメンバーが協力して進めました。
2 インターンシップの詳細
今回のインターンシップは、8月29日から9月26日までの約1ヶ月間にわたって実施しました。ブレインパッドの採用サイトの公募を見て応募いただいた方の中から、面接を経て選ばれたのは、名古屋大学 大学院修士課程で情報科学を研究している山腰貴大(やまこし たかひろ)さんです。
山腰さんは、深層学習の言語解析への応用について研究をされていますが、今回普段の研究では扱っていない画像解析が学べるのと、専門の言語解析が活かせるということで応募いただきました。日頃から研究現場でも深層学習モデルの実装を行っておりプログラミングも得意です。ブレインパッドは東京都港区の白金台にあります。今回はインターン期間が1ヶ月間あるので、インターン期間中は都内に滞在していただきました。
山腰さんの座席は、分からないことなどを気軽に質問したり、議論したりできるよう、当社のデータサイエンティストと同じ並びに設けました。私は、山腰さんの相談係りに任命され、課題設定から問題解決まで一緒に考えたり、ブレストの場を設けたりしました。
インターン期間中は、毎朝10時半から朝会を実施。朝会には、山腰さんと私の他、深層学習に詳しいエンジニア兼AI開発部長の太田も参加して進めました。分析環境としては、 Google Cloud Platform (GCP)の Compute Engine にGPUインスタンスを立てて、dockerコンテナ上に必要なソフトウェアをインストールして作業することにしました。深層学習のネットワーク構築と学習には TensorFlow とKerasを採用し、Jupyter Notebookでpythonを動かしながら進めました。
インターン初日は、具体的なサービス案を考えることから始めました。公募に掲げたテーマ「画像とテキストによるレコメンド」では、漠然とし過ぎていて具体的なサービスに落とし込めません。私からは、既存の他社サービスなども交えながら、実現したいサービスのイメージを山腰さんに伝えて、自由な雰囲気の中でメンバーとブレストしながらサービスイメージを膨らませました。最終的には、ファッション系ECサイトにおいて、ユーザーと運営者の双方を対象とした、画像とテキストによるレコメンドサービスを目指すことになりました。具体的には、山腰さんから以下の3案を提案していただきました。※以下の図は、山腰さんによる資料から抜粋したものです。
- 画像とテキストによる要望から商品をレコメンドするシステム
- ユーザの購入履歴の性質から商品をレコメンドするシステム
- 注目度が高いと期待される画像のキャプションを生成するシステム
これらのアイデアをもとに、AI開発部とMP本部のメンバーを交えて議論を行いました。3案とも着手するには期間的に難しく、2番目の案は購入した商品の情報が画像によらなくとも既知であるため、画像を利用するメリットが少ないと考えて見送ることにしました。1番目と3番目の案については、ともに画像特徴量とテキスト特徴量を同じ空間に埋め込む機能が前提となるため、この2つの案を今回の課題とすることに決めました。改めて整理すると、以下のようになります。
- 画像とテキストを組み合わせた商品検索
- 注目されそうな画像を選んで紹介文を生成
さらに、これら2案を実現する上で必要な機能を整理した結果、以下の3つの機能にまとまりました。
- 画像とテキストのエンコーダ
- 画像キャプションの生成器
- 画像注目度の予測計算器
1番目の機能は、画像の特徴量とテキストの特徴量を同じ空間に埋め込む(エンコードする)機能です*1。こうすることで、テキストで記述された画像的特徴(服の色、デザイン、カテゴリなど)をベクトル演算により画像特徴量に足したり引いたりすることができます。2番目の機能は、テキストと共通の空間にエンコードされた画像特徴量からテキストを生成する(デコードする)機能です。言語間の機械翻訳でよく知られているseq2seq*2は、テキスト間の変換ですが、機能1のエンコーダにより画像をテキストと共通の空間に埋め込んでしまえば、画像からテキストへの変換もseq2seqと同様に可能となります*3。3番目の機能は、画像の特徴量からその注目度を予測するモデルにより実現できます。具体的には、画像サムネイルのクリック率を注目度とし、これを画像特徴量により回帰して予測モデルを学習します。
こうして課題を明確化して実現すべき機能に落とし込むまでに、インターンシップの最初の1週間を費やしました。サービス実現に必要な3機能を実現するために以下の作業を進める必要があります。
- 商品画像とその説明文のデータセットの取得
- 商品画像サムネイルのクリック数(注目度を表す指標として)の取得
- 画像とテキストのエンコーダの設計・実装
- 画像からキャプション生成するデコーダの設計・実装*4
- 画像特徴量によるクリック率予測モデルの設計・実装
- 各機能のモデル学習と結果検証
今回のインターンシップは、期間が1ヶ月と短いので、精度の追求よりはアイデアの実現可能性を示すことに重点を置きました。そのため、モデルのブラッシュアップはスコープから外しました。
3 インターンシップの経過
前章では、サービスを企画してサービス実現に必要な機能に落としこむまでを詳細に説明しました。こうして機能要件がまとまった時点で残された期間は3週間でした。それからは、朝会の3人で役割分担して進めました。データの取得は太田が担当し、私はデータテーブルの作成・集計を担当、山腰さんはモデルの設計・実装・テストを進めました。3機能の設計に当たっては山腰さん主導で、私や太田と議論しながら進めました。商品画像や商品説明文のデータはRtoasterの導入先サイトから取得し、注目度の元になる画像サムネイルのクリック数はRtoasterのレコメンドログから取得しました。
エンコーダとデコーダの実装に当たっては、 TensorFlow とKerasを用いました。時間的な制約でボトルネックとなるのが、画像と説明文を読み込ませてエンコーダを学習する部分です。学習時間の短縮のため、今回は、説明文のテキストをそれが含む単語のword2vec*5の重みつき平均で近似する工夫を行いました*6。重み係数には、単語のTFIDF値を採用しています。word2vecは、日本語Wikipediaをコーパスとして学習したもの*7を利用しました。
ここで、ちょっと余談になりますが、オフィスでの過ごし方を紹介します。ブレインパッドのある白金台駅は、東京メトロ南北線/都営地下鉄三田線で目黒駅から一駅の所にあり、目の前には東京大学医科学研究所があります。明治学院大学にも歩いていける距離にあります。山腰さんの勤務時間は、10:00 から 19:00 までなので、オフィスではパソコンの画面に向かう時間が長かったのですが、お昼休みには若手のデータサイエンティストやエンジニアと一緒に食事に行きました。AI開発部の若手には、大学院で言語解析や情報工学を専攻していたメンバーもいるので、専門分野の研究や会社での働き方などの話で盛り上がりました。
さて、本題に戻ると、第2週目は、機能の設計や簡単な実装によるテスト、データセットの作成を行い、第3週目の水曜日に中間報告会を設けて、AI開発部やRtoaster担当メンバーを交えてサービス形態や機能に関する議論を行いました。その結果、特に大きな設計上の変更もなく本番実装に進むことに決まりました。その後は、実質1週間あまりで実装を行い、最終報告会にこぎつけた次第です。時間が少ない中、山腰さんはものすごいスピードと集中力でプログラムを書き上げていきました。後で本人から聞いたのですが、オフィスでは集中して課題に取り組んでいた山腰さんでしたが、休日には横浜などにも遊びに行っていたそうです。仕事ができる人は、遊びにも精力的なんだと改めて実感しました。最終報告会では、若手のデータサイエンティストやMP本部の開発メンバーにも参加いただき、活発な意見交換ができました。年齢の近いインターンの発表は、当社若手社員にとっても刺激になったようです。
4 インターンシップの成果紹介
この章では、インターンシップの成果についてポイントをダイジェストで紹介します。以下、山腰さんによる最終報告会の資料を引用しながら説明します。
4.1 レコメンドシステムの全体像
まず、システム全体の設計について以下の図にしたがって説明します。図の左側からは入力データとして画像とテキストが入ってきます。テキストの内容は、システムの提供する3つの機能(図の右側)に応じて異なってきます。設計上の重要な点は、3つの機能は異なっていても、画像とテキストの入力をエンコーダとして共通化できるという点です。以下の節では、実際に行った実装について3つの機能ごとに詳しく説明します。
4.2 画像とテキストのエンコーダ
画像検索を機能として提供する場合、画像はコーディネート写真であり、テキストはコーディネート写真に対する付加的な情報(色、デザインなどの変更や追加)を表す発話や文章になります。具体的には、画像を150×150のサイズにリスケールして、RGBのカラーチャンネルごとのピクセル値に変換します。この情報を画像識別において定評のあるVGG16という学習済みの畳み込みネットワークに通して、8,192次元の特徴ベクトルに変換します。一方、テキストの方は、それを構成する各単語のword2vecベクトルを単語の重要度を表すTFIDF値で重み付けして平均します。今回は、日本語Wikipediaから学習された200次元のword2vecベクトルを使用しました。画像とテキストを共通のベクトル空間に埋め込むには、8,192次元の画像特徴ベクトルに変換行列Wをかけてword2vecと同じ200次元の空間に射影します。このように射影したベクトルと画像の内容を表すテキストの200次元ベクトルとのユークリッド平方距離を計算し、これが最小になるように変換行列Wを学習します(下図を参照)。
4.3 画像キャプションの生成器
画像キャプションを生成する場合には、画像はサイト内の商品画像であり、テキストは商品画像の説明文となります。商品画像とその説明文のペアを入力と正解としてニューラルネットワークを学習することで、画像の入力だけから画像を表現するキャプションを生成できるようになります。具体的には、前節で学習したエンコーダを用いて画像ベクトルを200次元ベクトルに埋め込みます。このエンコードベクトルをLSTMを再帰的に結合したネットワーク(デコーダ)に入力します(下図を参照)。最初のLSTMノードに、テキストの開始・終了を表す記号 <EOS> とエンコードベクトルが入力されると、最初の単語 が生成されます。次に、この単語 とエンコードベクトルを2番目のLSTMノードが受け取って、2番目の単語 が生成されます。こうして30個のLSTMノードをつないだネットワークから30個の単語からなるテキストが生成されます。このテキストと画像の内容を表すテキストとの誤差を逆伝搬させることでデコーダが学習されます。
4.4 画像注目度の予測計算器
画像注目度を算出する場合には、画像はサイト内のサムネイル画像、テキストはその画像の説明文(キャプション)となります。今回は、サムネイル画像の注目度を画像的特徴だけから説明したいので、注目度の説明変数として画像のエンコード出力ではなくVGG16による特徴ベクトルを直接に用いることにしました。注目度としては、クリック数ではなく掲載期間の長さに依存しないクリック率を採用しました。ただし、クリック数が少ないサムネイル画像はクリック率が安定していないので注目度算出対象から外しました(下図を参照)。
4.5 実装結果の検証
検証1:画像とキーワードによる商品検索
4.1の設計により実装したエンコーダを使って、キーワードによる画像検索を試してみました。まず、「ワンピース」というキーワードをクエリとして、クエリと画像の類似度により画像検索を行いました。結果として、検索上位3位まで全てワンピースの画像が取得できました。次に、紺色のパンプスの画像と「アイボリー」というキーワードの組合せをクエリとして画像を検索したところ、1位はアイボリーのスカート、2位にアイボリーのパンプスが現れました。形よりは色に引っ張られた結果でした。こうした検証により、エンコーダを使って画像とテキストとの類似度を定量化できることが実証できました。
検証2:画像からのキャプション生成
4.2の設計により実装したデコーダに商品画像のエンコードベクトルを入力してキャプション生成を検証しました。上手くいった例としては、花の刺繍をあしらったサーモンピンクのブラウスの画像を入力とした場合、「フラワー」「襟元」「飾る」「おしゃれ度」「アップ」といった単語が生成されました。しかし、色を表す単語としては適当なものが生成できませんでした。全般的には、画像がサンダルなのにキャプションが「タンクトップ」を含んでいるなど、画像とキャプションの商品アイテムが一致しないケースが多々ありました。これは、学習に用いた商品説明文が辞書に含まれていないカタカナのファッション用語を含んでいるため画像の特徴が商品アイテムと紐づけられなかったためと考えられます。
検証3:画像の注目度予測
4.3の設計により実装した注目度予測器についても商品アイテムごとに注目度スコアを算出してみたのですが、予測は上手くいきませんでした。実際に、画像の特徴ベクトルをt-SNE*8などのより2次元に圧縮して、注目度による分布領域の違いを散布図として可視化してみたのですが、明確な違いが見えませんでした。画像の特徴量だけでは注目度の説明要因が不足しているようです。
以上、3機能の実装について検証結果を見てきました。今回は、実現可能性を一番に考えて進めたので、精度の面では課題が残ってはいますが、word2vecをファッション系サイトのコーパスから再学習したり、ファッション用語を形態素解析で使用する辞書に取り込んだりすることで改善する余地があると思われます。今回の検証を踏まえてサービス化に向けた改善を今後進めていきたいと考えています。
5 今後の展開
現在の状況を簡単にお伝えすると、インターンシップの成果を元に関係メンバーを中心にサービス化に向けた要件定義、プログラムのリファクタリングと機能の切り出しを進めています。サービス開発をゼロから始めるのは大変なことですが、今回、インターンシップでの企業と学生のコラボレーションをもとに、サービス化に向けた最初の一歩を踏み出すことができました。私たちも仕事に向かう姿勢など省みる良い機会となり、インターンとして参加いただいた山腰さんには大変に感謝しています。
6 まとめ
今回はインターンシップの取り組みを通して、ブレインパッドのサービス開発についても一部ご紹介しました。データサイエンティストとエンジニアが各々の専門知識にもとづいて自由に意見を交えながらコラボレーションし、新しいサービスを実現する。こうした自由でクリエイティブな環境で仕事ができるのが、ブレインパッドならではの醍醐味かと思います。今後も、学生さんとの交流や社内コラボレーションを図り、新しいサービスの創出につなげていきたいと考えています。
ブレインパッドでは、新卒採用・中途採用問わず、一緒に製品開発などを推進していただける方を募集しています。ご応募をお待ちしています!
www.brainpad.co.jp
*1:[1411.2539] Unifying Visual-Semantic Embeddings with Multimodal Neural Language Models
*2:[1409.3215] Sequence to Sequence Learning with Neural Networks
*3:im2txtとして知られている手法です。[1411.4555] Show and Tell: A Neural Image Caption Generator
*4:im2txtのKerasによる実装は以下を参考にしました。Kerasでのim2txtの実装系 - Qiita
*5:[1310.4546] Distributed Representations of Words and Phrases and their Compositionality
*6:A simple but tough-to-beat baseline for sen- tence embeddings https://openreview.net/pdf?id=SyK00v5xx
*7:日本語Wikipediaのデータは以下のWebページ(東北大 乾・岡崎研)で公開されているものを使用しました。日本語 Wikipedia エンティティベクトル
*8:高次元データ空間においてデータが分布している多様体構造を学習して低次元に圧縮する技術です。https://lvdmaaten.github.io/publications/papers/JMLR_2008.pdf