Slide 1

Slide 1 text

無理をしない機械学習2 @studio_graph3 !1

Slide 2

Slide 2 text

もくじ •課題の設定 •ルールベースな方法を試す •機械学習を試す •サービス導入へ向けて •デプロイ後の改善 •まとめ・参考資料 !2

Slide 3

Slide 3 text

クックパッド •毎日の料理を楽しみにするサービス •月間約5,500万人のユーザー •レシピ数は310万品 ‣ 大量の画像・テキストデータ •ユーザがレシピを書いて投稿 ‣ かなり自由な投稿が可能 ‣ 気軽に投稿できる
 !3

Slide 4

Slide 4 text

今日する話 !4

Slide 5

Slide 5 text

機械学習プロジェクトのサイクル !5 実験 コード整理 デプロイ

Slide 6

Slide 6 text

機械学習プロジェクトのサイクル !6 実験 コード整理 デプロイ どう回していくか

Slide 7

Slide 7 text

課題の設定 !7

Slide 8

Slide 8 text

調理手順 •クックパッドのレシピ ‣ 調理手順 • 画像とテキストで入力
 できる
 !8

Slide 9

Slide 9 text

調理手順ではないものがある •手順そのものではない
 ものが存在→非手順 ‣ コメント,アドバイスなど •本当の調理手順を抜き出したい ‣ 音声読み上げデバイスで利用 ‣ 他タスクの精度向上 •非手順を識別する
 アルゴリズムを作った !9

Slide 10

Slide 10 text

やったこと •ルールベースで解決できるか試す •機械学習を利用した分類を行う •システムに組み込む •精度向上のために別のアルゴリズムを試す !10

Slide 11

Slide 11 text

ルールベースな方法を試す !11

Slide 12

Slide 12 text

機械学習プロジェクトのサイクル !12 実験 コード整理 デプロイ

Slide 13

Slide 13 text

機械学習プロジェクトのサイクル !13 実験 コード整理 デプロイ

Slide 14

Slide 14 text

機械学習を使わずに解けないか? •まずデータを眺めて開発者が自ら解いてみる •やってみると気づく ‣ 非手順には特定のキーワードが登場 ‣ 文章全体を見ることはなかった •まずはキーワード抽出でできないか? •機械学習を使わずに済むならそれに越したことはない ‣ メンテナンスも楽だし可読性も高い !14

Slide 15

Slide 15 text

キーワード抽出はうまくいかない •うまくいかない例 ‣ 「できあがり」があると非手順に • 例: 上に三つ葉を散らしたらできあがり ‣ アドバイスを手順としてしまう • ○○さんがマヨネーズを足して作ってくれました •正解率 (Accuracy) は51.7% ‣ アノテーターに作業依頼し小さい評価用データを作成 !15

Slide 16

Slide 16 text

機械学習を試す !16

Slide 17

Slide 17 text

機械学習を試してみる •まずはスコアを出すことを第一に考える •なるべく一般的な手法に頼る ‣ キーワードの組み合わせの特徴量で分類 • TF-IDFベクトル - 単語の出現頻度を重み付けしたもの • ロジスティック回帰 - データを2値分類する手法 !17 手順のテキスト データ TF-IDFベクトル化 ロジスティック回帰 真または偽で判断

Slide 18

Slide 18 text

機械学習で結果が出た! •まずまずのスコア ‣ 正解率 (Accuracy) 92% •機械学習でうまくいくタスク
 と判断できる !18

Slide 19

Slide 19 text

サービス投入に向けて !19

Slide 20

Slide 20 text

実験だけでは意味がない •スコアはあくまで評価データ •データベースに投入 ‣ サービスから参照可能にする •実験ではない本番環境のコードへ ‣ ペアプロしながらバッチ化 !20

Slide 21

Slide 21 text

機械学習プロジェクトのサイクル !21 実験 コード整理 デプロイ

Slide 22

Slide 22 text

機械学習プロジェクトのサイクル !22 実験 コード整理 デプロイ

Slide 23

Slide 23 text

ぐちゃぐちゃ実験コードを整理 •理解できるコードにする ‣ まずはJupyter Notebookをスクリプトにする •実験フローの構造化 ‣ 前処理,学習,参照のコードをそれぞれ関数やクラスに •Dockerで動かせるようにする •リファクタリング・テストの追加 ‣ 最低限のテストは書く !23

Slide 24

Slide 24 text

機械学習プロジェクトのサイクル !24 実験 コード整理 デプロイ

Slide 25

Slide 25 text

機械学習プロジェクトのサイクル !25 実験 コード整理 デプロイ

Slide 26

Slide 26 text

効率化されたデプロイ •デプロイ先 ‣ クックパッドの共通コンテナ環境を利用 •機械学習エンジニア自身でデプロイまで ‣ 必要なファイルをPull Requestベースで追加するだけ •機械学習プロジェクトの共通化が進んでいる ‣ 認証,データ置き場,権限など •設定が必要になる項目をなるべく減らす !26

Slide 27

Slide 27 text

構成図 !27 ECR Jenkins GitHub S3 Redshift Hako (ECS)

Slide 28

Slide 28 text

構成図 !28 ECR Jenkins GitHub Hako (ECS) S3 Redshift Dockerfileを元に
 ビルド Jenkins: CIのための自動化ツール

Slide 29

Slide 29 text

構成図 !29 ECR Jenkins GitHub Hako (ECS) S3 Redshift ECRにプッシュ EC2 Container Registry
 Dockerコンテナイメージを保存し ているもの

Slide 30

Slide 30 text

構成図 !30 ECR Jenkins GitHub Hako (ECS) S3 Redshift ジョブ実行命令 Kuroko2
 クックパッド製のジョブ
 スケジューラー・管理ツール

Slide 31

Slide 31 text

構成図 !31 ECR Jenkins GitHub Hako (ECS) S3 Redshift ECRから
 イメージ取得 Hako (ECS)
 コンテナのデプロイ・管理
 ツール

Slide 32

Slide 32 text

構成図 !32 ECR Jenkins GitHub Hako (ECS) S3 Redshift S3から
 モデル取得 Simple Storage Service
 拡張性と堅牢性に優れた
 ストレージサービス

Slide 33

Slide 33 text

構成図 !33 ECR Jenkins GitHub Hako (ECS) S3 Redshift 予測結果を
 S3に保存 Redshiftから
 予測用データ取得 Redshift
 大量データを扱える
 データウェアハウス

Slide 34

Slide 34 text

構成図 !34 ECR Jenkins GitHub Hako (ECS) S3 Redshift S3から
 データ取得

Slide 35

Slide 35 text

構成図 !35 ECR Jenkins GitHub Hako (ECS) S3 Redshift Redshiftに
 保存

Slide 36

Slide 36 text

デプロイ後の改善 !36

Slide 37

Slide 37 text

!37 もっと精度(※)
 よくなりませんか?

Slide 38

Slide 38 text

!38 やってみます!

Slide 39

Slide 39 text

ディープラーニングを元にした手法 •精度が必要なので
 ディープラーニングを使う •LSTMとMLPを使ったモデル •単語ベクトル ‣ 全手順で学習したword2vec •正解率95% !39 Word Embedding LSTM ! ! ! ! ! ! ! Dropout ! ! ! ! ! ! ! LeakyReLu モデルの構造

Slide 40

Slide 40 text

!40 デプロイ大変
 じゃないの?

Slide 41

Slide 41 text

機械学習プロジェクトのサイクル !41 実験 コード整理 デプロイ

Slide 42

Slide 42 text

機械学習プロジェクトのサイクル !42 実験 コード整理 デプロイ 変える部分が少なくて済む

Slide 43

Slide 43 text

モデルの改善 •先にコードを整理しておいた •変更部分が少なくて済む ‣ 前処理やデータ受け渡し部分は
 そのまま利用 •環境もそのまま利用可能 ‣ Dockerfileも使い回せる !43

Slide 44

Slide 44 text

まとめ !44

Slide 45

Slide 45 text

クックパッドの機械学習サイクル •機械学習エンジニアが最後まで面倒を見る ‣ 分析,実験,デプロイまで ‣ 必要ならばソフトウェアエンジニアと一緒に •改善するのが容易 ‣ きちんとサイクルを回しておくことは大事 ‣ 改善や別プロジェクトに使い回せる •実際にサービスで使われないと意味がない !45

Slide 46

Slide 46 text

おまけ (学会発表) •EMNLP 2019のワークショップで発表 ‣ 自然言語処理のトップ
 カンファレンスのひとつ •学会発表も積極的に行う ‣ けれどサービスに出す方が大事 •今後の予定 ‣ すでにAlexaスキルの裏側で利用されている !46

Slide 47

Slide 47 text

参考資料 !47

Slide 48

Slide 48 text

参考資料 •機械学習チームにおけるソフトウェアエンジニア〜役 割、キャリア /devsum-2018-summer ‣ https://speakerdeck.com/takahiko03/devsum-2018- summer !48

Slide 49

Slide 49 text

!49 Step or Not: Discriminator for The Real Instructions in User-generated Recipes ■ cookpad: Most viewed recipe sharing service in the world •Largest recipe sharing service in Japan •Users can upload and search original, user-generated recipes •Most viewed recipe sharing service in the world •Community platform for people to share 
 recipe ideas and cooking tips •Available in 68 countries 22 languages ■ Step or Not: Automatic step validation •Recipe steps •Main part of recipes (besides title, ingredients) •Include text and/or photos •Used by authors for communication (fake steps) •Fake steps •Some of the “steps” are not actually part of the cooking process. •Advertisements of recipe (e.g., “introduced on TV”) •Comments (e.g., “Thanks for many messages”) •Advice (e.g. “Also good with rice” ) •Arrangements (e.g., “Using as pasta sauce is good” ) •Fake steps cause problems •Spoken by devices such as smart speakers •Recipe search indexing •Task setting •Distinguish between fake steps and the steps actually used for cooking Fake Steps 41% True Steps 59% Example of recipe steps Fake step Monthly users Recipes Japan 55.6 million 2.95 million Global 36.3 million 1.65 million This recipe became hot recipe on Oct. 9, 2010. Thank you for all who cookedˑ Put all seasonings and mix. Type of steps

Slide 50

Slide 50 text

!50 The 4th Workshop on Noisy User-generated Text, Nov 1, 2018, Brussels, Belgium (at EMNLP 2018) Method Accuracy Precision Recall Dict 51.2 52.2 53.3 XGB 84.8 87.4 79.5 RForest 89.3 86.1 92.3 LogReg 92.4 91.1 93.1 LSTM 95.1 94.6 95.0 AVG 93.3 93.1 92.9 ■ LSTM with pre-trained word vectors ■ Experiments • Data • Collected 20,000 distinct steps from cookpad • Manually annotated by human • Pos / Neg rate is balanced • Only using text information • Without position, timestamp, etc. • Methods • Dict: Manually selected clue words • Non-neural models (Input: TF-IDF vector) • LogReg: LogisticRegression • RForest: RandomForest • XGB: XGBoost • Neural models(Input: pre-trained skip-gram) • LSTM: LSTM • AVG: Average of word vectors •Distinguish between fake steps and the steps actually used for cooking Word Embedding LSTM # # # # # # # Dropout # # # # # # # LeakyReLu Sigmoid Model Architecture • Preprocessing • Split sentences into words • Input: “ௐຯྉΛશͯೖΕͯࠞͥ߹Θͤ·͢” • Ouput: “ௐຯྉ”, “Λ”, “શͯ”, “ೖΕ”, “ͯ”, “ࠞ ͥ߹Θ”, “ͤ”, “·͢” • Not apply normalization • e.g. “ೖΕ” → “ೖΕΔ” • Word Embedding • Skip-Gram Word2vec • Pre-trained with our whole recipe steps dataset (over 20 million steps) • (218408, 100) vector • Results and Discussion • Over 95% accuracy in neural models • Non-neural models are easy to deploy but insufficient for our service • LSTM-based model misclassifies • Steps that include special words such as “finished”, “completed”, etc. • Steps that are advice including cooking vocabularies • Future Work • Get higher score • Not only textual features • Deploy and apply in our services cookedˑ • False Positive • JP: “ίʔώʔʹೖΕͯɾɾɾ؁͓͍͍ͯ͘͠ ϛϧΫίʔώʔͷग़དྷ্Γ” • EN: “Put in Coffee. You will get sweet delicious milk coffee. That’s all.” • False Negative • JP: “'ˎΦʔϒϯͷ৔߹̎̏̌℃ʹ༧೤ͨ͠Φʔ ϒϯͰ̍̑෼͘Β͍ম͘ɻ'” • EN: “Bake for about 15 minutes in an oven preheated to 230℃.” Example of results