R&D ができて 2 年が経ちました

R&D(研究開発部)部長の原島です。普段は部のマネージメントと自然言語処理関連の研究開発に従事しています。

タイトルの通り、クックパッドに R&D ができて 2 年(正確には 2 年 3 ヶ月)が経ちました。2 年の間に様々な取り組みがありました。また、ありがたいことに、それらについて聞かせてほしいと言っていただく機会も増えてきました。

そこで、このエントリでは R&D のこの 2 年間の主な取り組みを紹介したいと思います。

R&D の役割と体制

これまでの取り組みを紹介する前に、クックパッドにおける R&D の役割と体制を簡単に紹介しておきます。クックパッドの R&D の役割は「社内外の最新の研究成果にもとづくサービスの企画と開発」です。「研究成果」は、より具体的には、「食や料理、レシピに関する研究成果」です。これらのシーズとユーザーのニーズを紐付け、他部署と一緒にサービスを開発するのが R&D の役割です。また、シーズからサービスを企画し、他部署に提案するのも役割の一つです。

現在、R&D には 22 人(兼任やアルバイトを除くと 17 人)が所属しています。9 人は機械学習関連の研究開発に、8 人はスマートキッチン関連の研究開発に従事しています。また、それぞれの業務をサポートするメンバーが 5 人いて、マネージメントやアノテーションに従事しています。8 人(兼任やアルバイトを除くと 4 人)だった 2 年前と比べると、大分しっかりした体制になりました。最初の 1 年間は採用活動ばかりしていた気がします。

これまでの取り組み

さて、上記の役割と体制で様々な取り組みに挑戦してきました。これらの取り組みは下記のように大別できます。

  • 機械学習
    • 自然言語処理
    • 画像認識
    • MLOps
    • オープンサイエンス
  • スマートキッチン
    • VUI(Voice User Interface)
    • IoT

以下で、それぞれの取り組みを紹介します。

機械学習

自然言語処理

クックパッドにおいて自然言語処理は必要不可欠です。というのも、レシピが自然言語で記述されているからです。クックパッドには約 300 万品もの日本語のレシピが投稿されており、これらが自然言語処理の対象となります。また、クックパッドは 2014 年からサービスの海外展開を加速させており、この 4 年で 22 言語約 160 万品のレシピが追加されました。自然言語処理はますます重要な技術となっています。

この 2 年間の主な取り組みとしては、Encoder-Decoder による材料の正規化やロジスティック回帰による手順の分類等があります。前者の成果は今年 4 月にリリースした食材購入サービス(Amazon フレッシュ連携)で、後者の成果は 7 月にリリースした Amazon Echo Spot 向けサービス(後述)で利用されています。また、他の取り組みとして、SVM によるユーザーのご意見の分類等もあります。

画像認識

画像認識もクックパッドにおいて必要不可欠です。クックパッドのほとんどのレシピに画像が付与されています。レシピを検索する時も、投稿する時も、画像は大きな影響力を持ちます。また、近年の画像認識の進歩は目覚ましいものがあります。画像認識が実用段階になったことで、クックパッドに限らず、画像認識にもとづく様々なサービスが開発されています。

この 2 年間の主な取り組みとしては、Inception v3 による料理写真の検出や分類、類似写真の検索、SRGAN による料理写真の超解像等があります。特に、料理写真の検出は、2016 年 12 月にリリースした料理きろくというサービスの根幹をなす技術になりました。料理きろくは 26 万人以上に利用されるサービスになり、この 2 年間の最大の成果の一つになりました。

MLOps

機械学習の運用は、この分野における最近のホットトピックの一つです。GPU 環境をどのように用意するか、実験結果をどのように共有するか、モデルをどのようにデプロイするか、バッチをどのように実行するか、データをどのように管理するか。まだベストプラクティスはありません。クックパッドでも、日々、より良い方法を模索しています。

クックパッドの R&D では、GPU 環境を簡便に用意するため、Slack Chat Bot で Amazon EC2 インスタンスを管理できるようにしています。また、実験結果を関係者間で共有するため、Dockercookiecutter で実験環境を構築しています。さらに、クックパッドがこれまでに開発してきたツールや環境もフル活用しています。具体的には、hako でモデルをデプロイし、Kuroko2 でバッチを実行し、DWH でデータを管理しています。

オープンサイエンス

機械学習に関する取り組みとして、最後に、オープンサイエンスに関するものを紹介します。ここ数年、機械学習の研究が注目されているのは周知の通りです。そして、R&D の取り組みの多くはそれらの成果にもとづいています。機械学習の研究に少しでも貢献するため、R&D はオープンサイエンスにも注力しています。

この 2 年間の主な取り組みとしては去年の第 1 回 AI チャレンジコンテストがあります。これは人工知能技術戦略会議や内閣府、文部科学省と共催したものです。今年はデータ解析コンペティションを人工知能学会と共催しました。また、R&D ができる前からの取り組みとして、クックパッドは国立情報学研究所からレシピデータを研究者に公開しています。このデータは今や国内約 150 の研究室に利用されるものになりました。さらに、我々自身が論文を投稿することもあります。この 2 年間で 9 本の査読付き論文(ほとんどはワークショップの論文ですが)がアクセプトされました。

スマートキッチン

VUI

クックパッドでは VUI の可能性に注目しています。調理中にスマートフォンでレシピを閲覧するのは珍しいことではありません。しかし、汚れた手でスマートフォンに触れるのは抵抗があります。このような状況で VUI はその真価を発揮します。スマートスピーカーの半分はキッチンに設置されているという調査もあり、クックパッドとしては無視できない存在です。

R&D は昨年 11 月に Amazon Echo 向けサービスを、今年 3 月に Google Home 向けサービスをリリースしました。これらは VUI でレシピを検索できるものです。また、7 月には Amazon Echo Spot 向けサービスをリリースしました。さらに、12 月には Amazon Echo Show 向けサービスをリリースします。これらは VUI で料理動画を再生できたり、レシピの内容を確認できるものです。ありがたいことに、クックパッドの Alexa スキルは Amazon ランキング大賞 2018 上半期 Alexa スキルで 7 位にランキングされました。

IoT

IoT も無視できない存在です。上述のスマートスピーカーはもちろん、近年では多くの調理器具がインターネットと繋がっています。海外では、この 1 〜 2 年、調理器具メーカーとレシピサービスのアライアンスが加速しています。クックパッドがこの流れを看過するわけにはいきません。

そこで、R&D ではスマートキッチンサービス OiCy を開発しています。OiCy は、インターネット上のレシピと現実世界の調理器具を繋ぐサービスです。機械可読なレシピを定義し、これを調理器具メーカーに提供する予定です。今年 5 月には OiCy のコンセプトを体現した調味料サーバー OiCy Taste を、8 月にはあるべきスマートキッチンの姿を表現した Smart Kitchen Level を発表しました。既に国内メーカー数社と連携しており、今後は海外メーカーとも連携していく予定です。

おわりに

このエントリではクックパッドの R&D のこの 2 年間の主な取り組みを紹介しました。R&D ができた当初は、「どんな取り組みがありえるだろうか」「ちゃんとユーザーや会社の役に立てるだろうか」という一抹の不安がありました。今はそのような不安はありません。逆に、以下の点でクックパッドと研究開発は相性が良いと感じています。

  • 自社サービスがあり、研究開発の成果を活かすチャンスが沢山ある
  • データが沢山あるだけでなく、それらを簡単に利用できる環境(DWH)がある
  • 部内外に優秀なエンジニアが多く、開発やデプロイで困ることが少ない
  • 研究開発の対象(食や料理、レシピ)が普遍的で、また、幅広い

クックパッドの R&D は今後も様々な取り組みに挑戦していきます。メンバーもまだまだ募集しているので、ご興味がある方は採用ページを是非ご覧ください。ご応募をお待ちしています。

/* */ @import "/css/theme/report/report.css"; /* */ /* */ body{ background-image: url('https://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527163350.png'); background-repeat: repeat-x; background-color:transparent; background-attachment: scroll; background-position: left top;} /* */ body{ border-top: 3px solid orange; color: #3c3c3c; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; line-height: 1.8; font-size: 16px; } a { text-decoration: underline; color: #693e1c; } a:hover { color: #80400e; text-decoration: underline; } .entry-title a{ color: rgb(176, 108, 28); cursor: auto; display: inline; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; font-size: 30px; font-weight: bold; height: auto; line-height: 40.5px; text-decoration: underline solid rgb(176, 108, 28); width: auto; line-height: 1.35; } .date a { color: #9b8b6c; font-size: 14px; text-decoration: none; font-weight: normal; } .urllist-title-link { font-size: 14px; } /* Recent Entries */ .recent-entries a{ color: #693e1c; } .recent-entries a:visited { color: #4d2200; text-decoration: none; } .hatena-module-recent-entries li { padding-bottom: 8px; border-bottom-width: 0px; } /*Widget*/ .hatena-module-body li { list-style-type: circle; } .hatena-module-body a{ text-decoration: none; } .hatena-module-body a:hover{ text-decoration: underline; } /* Widget name */ .hatena-module-title, .hatena-module-title a{ color: #b06c1c; margin-top: 20px; margin-bottom: 7px; } /* work frame*/ #container { width: 970px; text-align: center; margin: 0 auto; background: transparent; padding: 0 30px; } #wrapper { float: left; overflow: hidden; width: 660px; } #box2 { width: 240px; float: right; font-size: 14px; word-wrap: break-word; } /*#blog-title-inner{*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-position: left 0px;*/ /*}*/ /*.header-image-only #blog-title-inner {*/ /*background-repeat: no-repeat;*/ /*position: relative;*/ /*height: 200px;*/ /*display: none;*/ /*}*/ /*#blog-title {*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-image: url('https://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527172848.png');*/ /*background-repeat: no-repeat;*/ /*background-position: left 0px;*/ /*}*/