Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

はてなにおける機械学習の取り組み

6,264 views

Published on

HACKER TACKLE2018での登壇資料です。

Published in: Engineering
  • Be the first to comment

はてなにおける機械学習の取り組み

  1. 1. はてなにおける 機械学習の取り組み id:syou6162 HACKER TACKLE 2018@博多 1
  2. 2. 自己紹介 •  id:syou6162(本名: 吉田康久) •  前職: NTTコミュニケーション科学基礎研究所 – 自然言語処理や機械学習の研究に従事(4年) •  2年前にはてなに転職 – はてなブックマーク – サーバー管理/監視システムMackerel •  Web開発:機械学習関連の開発 = 8:2 2
  3. 3. 自己紹介 •  id:syou6162(本名: 吉田康久) •  前職: NTTコミュニケーション科学基礎研究所 – 自然言語処理や機械学習の研究に従事(4年) •  2年前にはてなに転職 – はてなブックマーク – サーバー管理/監視システムMackerel •  Web開発:機械学習関連の開発 = 8:2 3 R&D部門がない組織で機械学習を 使ったサービス開発の参考になると幸いです
  4. 4. 発表のゴール •  はてなの事例を通じて – 機械学習を使ったサービス開発の 難しさ – その難しさを乗り越えていくための 技術的/組織的な取り組み方 •  が見えてくる 4
  5. 5. はてなって機械学習使ってるの? 5
  6. 6. はてなでの機械学習の利用事例 •  はてなブックマークのカテゴリ判定 •  はてなブックマークのスパム判定 •  はてなブックマークのトピックページ •  BrandSafe はてな •  エリアガイド •  Mackerelの異常検知 6 表には出てこないものも 多いけど、色々なところで 機械学習使っています!
  7. 7. はてなブックマークのカテゴリ判定 7
  8. 8. エリアガイド 8 hNp://area.b.hatena.ne.jp/ 博多のお土産情報を チェック!
  9. 9. Mackerelの異常検知 •  一定期間を学習データとし、確率密度の低い 点を異常として検知 •  教師なし学習の問題設定 9 デスクで作業中 ランニングしている時間 異常と判定されるケース1 => ルールでもできそう? 参考: hNps://speakerdeck.com/sugiyama88/mackerel-meetup-number-11 hNp://www.yasuhisay.info/entry/2018/02/16/001000 活動量 心拍数 異常と判定されるケース2 => 今の自分
  10. 10. Mackerelの異常検知 •  一定期間を学習データとし、確率密度の低い 点を異常として検知 •  教師なし学習の問題設定 10 休日や夜間等比較的 負荷の低いケース 平日を中心とした比較的 負荷の高いケース 異常と判定されるケース1 参考: hNps://speakerdeck.com/sugiyama88/mackerel-meetup-number-11 hNp://www.yasuhisay.info/entry/2018/02/16/001000 異常と判定されるケース2
  11. 11. 発表のゴール •  機械学習を使ったサービス開発の 難しさ •  その難しさを乗り越えていくための技術 的な取り組み – 古典的な問題設定 – R&D要素の強い問題設定 •  組織的な取り組み方 11
  12. 12. 機械学習アプリケーションの難しさ •  挙動の把握が難しい •  属人性が高くなりやすい •  再現性が低くなりやすい •  継続的な開発がしにくい 12
  13. 13. 挙動の把握が困難 •  機械学習を利用しないアプリケーション – コードを見れば挙動の把握は大体できる •  機械学習を利用するアプリケーション – コードのみからは挙動の把握ができない – コード×データがあれば挙動の推測は不可能では ないが、知識と経験が必須 – Deep Learningはさらに把握が難しい – 誤判定でユーザーに説明が必要な場面も 13
  14. 14. 属人性 / 再現性 •  属人性が高い –  機械学習タスクは実験を通じた試行錯誤が必要 –  普段のサービス開発と異なり、レビューが難しい •  問題設定、実験方法、本番投入などで段階的にレビューが 必要 •  再現性が低い –  コードだけでなくモデルやデータの管理が不十分 –  管理ノウハウが発展途上 •  何をどうやって管理すればよいのか –  実験を行なった人でも再現できないことも… 14
  15. 15. 継続的開発 •  機械学習システムも継続的な開発が必要 – Webアプリケーション開発と一緒 •  継続的開発のためには有効性を示す – モデル改善の有効性をきちんと計測できるように •  実験上はもちろん、本番環境でも – APIのバージョニング •  複数のバージョンのモデルを同時に動かせるように 15
  16. 16. 発表のゴール •  機械学習を使ったサービス開発の 難しさ •  その難しさを乗り越えていくための技術 的な取り組み – 古典的な問題設定 – R&D要素の強い問題設定 •  組織的な取り組み方 16
  17. 17. BrandSafeはてなリニューアル •  BrandSafeはてなとは? – URL単位でWebページを解析、アダルトサイトや 2chまとめサイトか判定する仕組み – 自社広告を出したくないサイトへの出稿を防ぎ、 ブランドイメージを安全に保つ •  Pythonでリニューアル – 元々Perlで書かれていた – はてなブックマークとの密結合を解消 – 機械学習部分も見直し 17 技術的詳細: hNps://www.slideshare.net/oarat/brand-42816575
  18. 18. BrandSafeはてなの問題設定と目的 •  問題設定 – 教師あり機械学習 – 対象はテキストデータ •  目的 – 属人性を低く、再現性を高くする •  何をどこをどのように管理するのか明確に – 継続的な開発ができるように •  きちんとコード/モデル/データのバージョン管理をする •  性能のトラッキング 18
  19. 19. 教師あり機械学習の開発フロー 元データ 学習データ 特徴ベクトル モデル テストデータ 特徴ベクトル 判定結果 アノテーション 前処理 特徴量抽出 機械学習アルゴリズム 19 学習時 テスト時
  20. 20. 前処理、特徴量抽出、アルゴリズム、 モデル(リニューアル前) •  基本的にコードでバージョン管理できる部分 •  基本的にはPerlのコードをGitで管理 •  一部のモデルパラメータはDBで保存 – バージョン管理はされていないので、巻き戻しで きない 20
  21. 21. 前処理、特徴量抽出、アルゴリズム、 モデル(リニューアル後) •  scikit-learnを利用、pythonのエコシステムに乗る •  モデルファイルもバージョン管理 •  挙動が把握しやすい/解釈性の比較的高い線形 モデル(SVM、ロジステック回帰)を使うことが多い •  LSTMやCNNも試したが、複雑性の割に性能がほ ぼ変わらず現段階では不採用 –  教師データ数もそれほど多くないことも関係している かも 21
  22. 22. 学習データ管理(リニューアル前) •  決まった管理方法はなかった – 基本はGoogle Driveに置く – 個人PC上あり、危うく消えるところだったものも… •  データはURLとラベルを保存、本文はDBから 取得 – 本文に変更があれば、再現性は担保できない… 22
  23. 23. 学習データの管理(リニューアル後) •  置き場所を決める – Google Driveはそのまま – 現状はそこまでサイズが大きくない – DBでもよいが、リニューアル前はDBアクセスがボ トルネックになり、実験の試行錯誤がやりづらい •  データの固定 – データに本文、前処理の結果などを含める – バージョン毎に管理 •  データを変えたら、一括してバージョンを変更 23
  24. 24. データ収集方法とアノテーション基準(1) •  機械学習においてデータは最重要 –  「データを増やす」はモデル改善の主要なアプ ローチ – データが悪ければよいモデルでもうまくいかない •  集めた元データとアノテーション結果、だけで はなく「データ収集方法」と「アノテーション基 準」も記録 24
  25. 25. データ収集方法とアノテーション基準(2) •  データ収集方法 – 収集方法でデータの性質も異なってくる •  例1: はてなブックマークの特定タグが付いた記事 •  例2: 特定の単語でGoogle検索して出てきた記事 – 気を付けないとバイアスがかかり性能が悪化 •  テスト時のデータと性質が違うデータ – なぜそのアプローチも取ったか分かるとよい – 特徴量へのヒントにもなる 25
  26. 26. データ収集方法とアノテーション基準(3) •  アノテーション基準 –  基準が揺れると作ったデータやモデルは無駄になる –  例: アダルト判定の基準 •  サイドバーの内容は考慮するのか •  アダルト広告は考慮するのか –  例: スパム判定 •  過去記事は考慮するのか •  ドメイン知識を持っていない場合は特に綿密に –  例: 営業担当とアノテーション基準について議論 26
  27. 27. データ収集方法とアノテーション基準(4) •  文書化 – 試行錯誤していると後回しになりがち – まとめたものをGoogle Docsやリポジトリにcommit – 最近ならJupyter Notebookでもよいですね •  今回は使わなかった特徴量集合の試行錯誤 の様子が分かると、改善時の手間が減らせる 27
  28. 28. 発表のゴール •  機械学習を使ったサービス開発の 難しさ •  その難しさを乗り越えていくための技術 的な取り組み – 古典的な問題設定 – R&D要素の強い問題設定 •  組織的な取り組み方 28
  29. 29. 29 hNps://mackerel.io/ja/ Mackerel: SaaS型の サーバー監視/管理 サービス サービス(例: はてなブログ)/ ロール(例: DB、Proxy)で 分かりやすくグルーピング 静的な閾値による アラートの発砲、Slack などへの通知をサポート Agentがサーバーの メトリックを収集、 グラフで可視化
  30. 30. 監視における課題と 機械学習の活用 •  監視における課題 – ミドルウェアなどの知識が必要 – 監視ルールのメンテナンスは手間がかかる •  機械学習を用いた異常検知の利点 – データから学習、自動的に監視ルールを決めて アラートできる – 知識がなくても、何かが異常であることが分かる 30
  31. 31. 再掲: Mackerelの異常検知 •  一定期間を学習データとし、確率密度の低い 点を異常として検知 •  教師なし学習の問題設定 31 休日や夜間等比較的 負荷の低いケース 平日を中心とした比較的 負荷の高いケース 異常と判定されるケース 参考: hNps://speakerdeck.com/sugiyama88/mackerel-meetup-number-11 hNp://www.yasuhisay.info/entry/2018/02/16/001000 どのように試行錯誤したか紹介します
  32. 32. タスク着手時の障壁 •  社内で機械学習を使った異常検知の知見を 持っている人がゼロ •  教科書は読んだが、実データに対してどれだ けうまくいくか分からない – 検知漏れがないか/誤検知がないか – うまく行かない例も説明可能/人間が納得できそ うなものか 32
  33. 33. 調査フェイズ •  課題の性質を明らかにすることが目的 •  社内の過去の障害事例を分析 – 絶対数の多い障害パターンは? – 障害の要因は? – どういった特徴量であれば捉えられる? •  生の事例と向き合う 33
  34. 34. プロトタイプフェイズ •  典型事例だった障害に対して様々な方法を ひたすら試す – ライブラリの使用/自前、手段は問わない – 既存のツールでは異常を捉えられるのか試す •  手法の得手不得意や計算量の肌感覚を掴む •  進め方についてサブ担当が適宜レビュー •  手元だけでは誤検知の多さが分かりにくい – 実際のデータを定常的に流してみる 34 http://www.yasuhisay.info/entry/2017/11/06/163000
  35. 35. アルゴリズム決定フェイズ •  学習時/予測時の計算機コスト •  挙動が人間に説明可能か(サポート対応必須) •  機械学習に詳しくないチーム内のエンジニアが レビュー可能か/引き継ぎ可能か –  直感的に理解可能か –  チューニングを頑張らないと精度が出ない、だとダメ •  手元で過去のモデルを使って再現が容易に行な えるか 35
  36. 36. 実装フェイズ •  アルゴリズムがfixされたらチーム内外で輪講 •  機械学習に詳しくないエンジニアにもレビュー やサブタスクを担当してもらい知見を共有 •  社内の実際のデータも使ってテストを動かす 36
  37. 37. 発表のゴール •  機械学習を使ったサービス開発の 難しさ •  その難しさを乗り越えていくための技術 的な取り組み – 古典的な問題設定 – R&D要素の強い問題設定 •  組織的な取り組み方 37
  38. 38. 組織的な取り組み(1) •  各サービスに機械学習詳しい人物がいても1 人か2人。いないときもある – 専門的なレビューを受けるのはなかなか難しい… •  サービス横断の機械学習会を設立、知見を 集約 •  各サービスで機械学習案件が必要なときは 機械学習会が専門的観点でレビュー •  半月に一度、定例会で近況をまとめる 38 hNp://developer.hatenastaff.com/entry/2018/01/11/081000
  39. 39. 組織的な取り組み(2) •  はてなの教科書に機械学習講義を追加、属 人性が下がるように •  実データを使った練習問題も用意 •  Perl/Scala/Pythonによるお手本実装、サブ会 メンバーによる回答レビュー 39 hNp://developer.hatenastaff.com/entry/hatena-textbook-machine-learning-01-2016
  40. 40. 組織的な取り組み(3) •  そもそもR&Dに近いような案件に取り組める 土壌作り •  論文読み会/輪講会 – 新規性や技術的な正確性よりも着眼点の面白さ や自社サービスにどう生かせそうかを議論 •  機械学習ハッカソン 40 hNp://developer.hatenastaff.com/entry/2017/04/28/130000 hNp://developer.hatenastaff.com/entry/2017/09/27/170000 hNp://developer.hatenastaff.com/entry/2017/09/27/170000
  41. 41. 発表のゴール •  はてなの事例を通じて – 機械学習を使ったサービス開発の 難しさ – その難しさを乗り越えていくための 技術的/組織的な取り組み方 •  が見えてくる 41
  42. 42. 42
  43. 43. 発表時には使わなかった おまけスライド 43
  44. 44. 高度な機械学習を使ったサービス: トピックページ 44 •  似た話題をトピックとしてクラスタリング •  複数のタイトルからトピックタイトルを生成 •  重要文抽出や文圧縮(構文解析や要約技 術などを使用) hNp://bookmark.hatenastaff.com/entry/2015/02/05/190331
  45. 45. アダルト まとめサイト Ruby gem Golang GAE 分離平面 iPhone Swih エンジニア 転職 サーバー監視 Mackerel iPhone アプリ おすすめ データ収集方法とアノテーション基準(5) 能動学習による効率的なアノテーション 45 機械学習 Python アフィリエイトサイト
  46. 46. アダルト まとめサイト Ruby gem Golang GAE 分離平面 iPhone Swih エンジニア 転職 サーバー監視 Mackerel iPhone アプリ おすすめ データ収集方法とアノテーション基準(5) 能動学習による効率的なアノテーション 46 機械学習 Python アフィリエイトサイト この辺ばかりアノテーションしていても -  精度は上がらない -  精神は病むので、つらい -  しかし、ランダムに選ぶとこの辺がたくさん…
  47. 47. アダルト まとめサイト Ruby gem Golang GAE 分離平面 iPhone Swih エンジニア 転職 サーバー監視 Mackerel iPhone アプリ おすすめ データ収集方法とアノテーション基準(5) 能動学習による効率的なアノテーション 47 機械学習 Python アフィリエイトサイト 分離平面に近い(=分類器があまり自信がない) 事例から優先的にアノテーション
  48. 48. •  同じ400件をアノテーションするならば、より精度 が高い分類器を作れる400件のほうがよい 48 hNp://www.yasuhisay.info/ entry/2017/05/18/080000 hNps://github.com/syou6162/go- acjve-learning データ収集方法とアノテーション基準(5) 能動学習による効率的なアノテーション 注意: 実験結果は趣味プロジェクト の結果であり、社内データを 使ったものではありません。
  49. 49. 特徴量抽出での工夫: 共通で使える特徴量抽出器を用意 49 タスクA タスクB タスクC 特徴量抽出A 特徴量抽出B 特徴量抽出C 学習データA 学習データB 学習データC 分類器A 分類器B 分類器C •  各タスクで学習データ作成/特徴量抽出を頑張る必要がある •  少量の教師データではカバーできなかった語は誤判定の要 因
  50. 50. 共通で使える特徴量抽出器を用意 50 タスクA タスクB タスクC 特徴量抽出A 特徴量抽出B 特徴量抽出C 学習データA 学習データB 学習データC 分類器A 分類器B 分類器C 共通特徴量抽出
  51. 51. 特徴量抽出での工夫: 様々なタスクで使えるリソースを整備 51 タスクA タスクB タスクC 特徴量抽出A 特徴量抽出B 特徴量抽出C 学習データA 学習データB 学習データC 分類器A 分類器B 分類器C 共通特徴量抽出 タスクに依存しないデータセット(wikipediaなど)から 埋め込みベクトルやクラスタリング特徴量を作成。 誤判定が減って、性能も上がる

×