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.
『BrandSafe はてな』の
アドベリフィケーションの
しくみ
伊奈 林太郎
id:tarao @oarat
株式会社はてな
2014-12-16
自己紹介
名前  
い な
伊奈   
り ん た ろ う
林太郎  (id:tarao / @oarat )
所属 はてなブックマークチーム
2008-08 はてなインターン
2008-10 はてなアルバイト (ブックマークチーム)
2010...
自己紹介 — やってること
インターン / アルバイト時代
2008-08 本文抽出エンジン
2008-12 おすすめユーザ
2009-04 検索欄「もしかして」
2009-07 ユーザページ全文検索
2009-10 地域別エントリ
最近
20...
自己紹介 — やってること
インターン / アルバイト時代
2008-08 本文抽出エンジン
2008-12 おすすめユーザ
2009-04 検索欄「もしかして」
2009-07 ユーザページ全文検索
2009-10 地域別エントリ
最近
20...
自己紹介 — やってること
インターン / アルバイト時代
2008-08 本文抽出エンジン
2008-12 おすすめユーザ
2009-04 検索欄「もしかして」
2009-07 ユーザページ全文検索
2009-10 地域別エントリ
最近
20...
BrandSafe はてなBrandSafe はてなBrandSafe はてなBrandSafe はてなBrandSafe はてなBrandSafe はてなBrandSafe はてな
BrandSafe はてな
アドベリフィケーション
BrandSafe はてな
アドベリフィケーション
広告配信先をフィルタリング
◮ アダルトサイト
◮ 2ch まとめ
◮ 違法ダウンロード
技術的には
◮ 任意の Web ページ (URL) の分類問題
◮ 各属性に対して二値判定
どうやって判定?
いろいろなやり方の選択肢
◮ 手動...orz
◮ ルールベース
◮ 機械学習
etc.
できるだけ楽にシンプルに
◮ 工数を抑えたい
◮ 計算量を抑えたい
◮ 複雑すぎてメンテできないと困る
URLの判定が走るまで
1. ユーザによる URL のブックマーク
2. GET
3. 本文抽出
4. メタ情報抽出
◮ キーワード
◮ リンク先
◮ 画像
5. カテゴリ判定
6. アドベリ判定
◮ 1をブックマーク以外のトリガからも実行
判定アルゴリズム判定アルゴリズム判定アルゴリズム判定アルゴリズム判定アルゴリズム判定アルゴリズム判定アルゴリズム
素朴なフィルタの例
NG ワード判定
◮ 実装が簡単
◮ 正規表現マッチ
◮ メンテナンスが簡単
◮ 単語をリストに追加するだけ
◮ 精度はあまり高くない
リンクの数
◮ e.g. 特定ドメインへのリンク
◮ e.g. アフィリエイトリンクの多さ
素朴なフィルタによる誤爆
例
◮ 「カブトムシの交尾」で Google AdSense 停止
(実際はもっと複合的な要因ではないかとの指摘も)
◮ 「やまもといちろう」問題
素朴なフィルタによる誤爆
例
◮ 「カブトムシの交尾」で Google AdSense 停止
(実際はもっと複合的な要因ではないかとの指摘も)
◮ 「やまもといちろう」問題
こんなことでは困る!
フィルタの組み合わせ
◮ ひとつひとつは素朴なフィルタ
◮ たくさん組み合わせたら賢くなる?!
フィルタの組み合わせ
ひとつだけだと弱い
フィルタの組み合わせ
フィルタを増やすと綺麗に分けられるかも?
ひとつだけだと弱い
直線が引ければよい
直線の式
ax + by + c = 0
直線が引ければよい
直線の式
ax + by + c = 0
各点から直線までの距離
(axi + byi + c)/
√
a2 + b2
直線が引ければよい
直線の式
ax + by + c = 0
各点から直線までの距離
(axi + byi + c)/
√
a2 + b2
◮ あとは良い a, b を設定するだけ!
え, これ手でチューニングするの?
AdaBoost [’95 Freund, Schapire]
特徴
◮ 弱分類器の重みと閾値を自動的に決定
◮ 弱分類器は弱すぎなければなんでもよい
◮ 精度が 50%以上なら全体精度も向上
◮ いろんな弱分類器をいい具合に組み合わせ可能
原...
BSはてなの弱分類器
◮ ブックマークした人のカテゴリの偏り
◮ タグの出現頻度
◮ 特定タグ占有率
◮ コメント率
◮ 特定属性 URL へのリンク
◮ キーワードの出現傾向
BSはてなの弱分類器
◮ ブックマークした人のカテゴリの偏り
◮ タグの出現頻度
◮ 特定タグ占有率
◮ コメント率
◮ 特定属性 URL へのリンク
◮ キーワードの出現傾向
ブックマークされてなくても
高精度に判定したい!
Perceptron [’58 Rosenblatt]
特徴
◮ 多次元の入力の重みづけをいい感じにする
◮ 計算がすごく簡単 (実装も簡単)
◮ 教科書に載ってるレベルで枯れている
◮ 近年見直されさまざまな改良が
実装方針
◮ ひとまず単純...
Perceptron [’58 Rosenblatt]
— 原理
学習手続
1. 重みベクトルを w = (0, . . ., 0) で初期化
2. 現在の重みでの判定結果 g
3. 本来の正しい判定結果 a ∈ {1, −1}
4. a · ...
Perceptronの簡単な実装
sub weights { shift->{weights} ||= {} }
sub feedback {
my ($self, $ps, $ad) = @_;
$self->weights->{$_} +=...
なんと, これですごく精度が出た
細かい知見など細かい知見など細かい知見など細かい知見など細かい知見など細かい知見など細かい知見など
教師データ集めが肝
◮ タグ検索等を駆使して傾向を把握
◮ 大量の URL を人の目で判定
◮ 判定基準のぶれをどう抑えるか
AdaBoost
◮ 元々スパムフィルタのために導入されていた
◮ 単純な実装だが本来の計算と少しだけ違う
◮ 素直に AdaGrad+RDA にしたら精度が低下...orz
Perceptron
◮ 驚くほどシンプルな実装
◮ はてなキーワードの見出し語を使う
→ スラングなどへの対応
◮ 入力キーワードを闇雲に増やすと精度が低下
◮ 特徴語に絞って入力している (たぶんこれが肝)
今後の展望
◮ 判定できる属性の拡充
◮ 画像対応
◮ フィルタリング以外の用途
◮ もう少し大規模に特徴量を扱うしくみ
まとめ
◮ はてなブックマークの実装/知見を利用した
はてな発のアドベリフィケーションシステム
◮ 比較的枯れた教科書的な技術の組み合わせ
◮ AdaBoost
◮ Perceptron
◮ 大規模データを扱ってきた知見を発揮
WE ARE HIRING
◮ アドテク・機械学習エンジニア 絶賛募集中
◮ 東京 / 京都 どちらの勤務でも可
Upcoming SlideShare
Loading in …5
×

『BrandSafe はてな』のアドベリフィケーションのしくみ

16,718 views

Published on

2014-12-16 勉強会発表資料
http://eventdots.jp/event/263388

Published in: Engineering
  • Be the first to comment

『BrandSafe はてな』のアドベリフィケーションのしくみ

  1. 1. 『BrandSafe はてな』の アドベリフィケーションの しくみ 伊奈 林太郎 id:tarao @oarat 株式会社はてな 2014-12-16
  2. 2. 自己紹介 名前   い な 伊奈    り ん た ろ う 林太郎  (id:tarao / @oarat ) 所属 はてなブックマークチーム 2008-08 はてなインターン 2008-10 はてなアルバイト (ブックマークチーム) 2010-04 日本学術振興会 特別研究員 (DC1) 2013-04 はてな正社員 2013-12 ブックマークチーム
  3. 3. 自己紹介 — やってること インターン / アルバイト時代 2008-08 本文抽出エンジン 2008-12 おすすめユーザ 2009-04 検索欄「もしかして」 2009-07 ユーザページ全文検索 2009-10 地域別エントリ 最近 2014-08 BrandSafe はてな 2014-09 Presso Twitter 連携
  4. 4. 自己紹介 — やってること インターン / アルバイト時代 2008-08 本文抽出エンジン 2008-12 おすすめユーザ 2009-04 検索欄「もしかして」 2009-07 ユーザページ全文検索 2009-10 地域別エントリ 最近 2014-08 BrandSafe はてな 2014-09 Presso Twitter 連携 ◮ 検索技術 > 機械学習 ≫ アドテク
  5. 5. 自己紹介 — やってること インターン / アルバイト時代 2008-08 本文抽出エンジン 2008-12 おすすめユーザ 2009-04 検索欄「もしかして」 2009-07 ユーザページ全文検索 2009-10 地域別エントリ 最近 2014-08 BrandSafe はてな 2014-09 Presso Twitter 連携 ◮ 検索技術 > 機械学習 ≫ アドテク ◮ (大学時代の専門は型理論)
  6. 6. BrandSafe はてなBrandSafe はてなBrandSafe はてなBrandSafe はてなBrandSafe はてなBrandSafe はてなBrandSafe はてな
  7. 7. BrandSafe はてな アドベリフィケーション
  8. 8. BrandSafe はてな アドベリフィケーション 広告配信先をフィルタリング ◮ アダルトサイト ◮ 2ch まとめ ◮ 違法ダウンロード 技術的には ◮ 任意の Web ページ (URL) の分類問題 ◮ 各属性に対して二値判定
  9. 9. どうやって判定? いろいろなやり方の選択肢 ◮ 手動...orz ◮ ルールベース ◮ 機械学習 etc. できるだけ楽にシンプルに ◮ 工数を抑えたい ◮ 計算量を抑えたい ◮ 複雑すぎてメンテできないと困る
  10. 10. URLの判定が走るまで 1. ユーザによる URL のブックマーク 2. GET 3. 本文抽出 4. メタ情報抽出 ◮ キーワード ◮ リンク先 ◮ 画像 5. カテゴリ判定 6. アドベリ判定 ◮ 1をブックマーク以外のトリガからも実行
  11. 11. 判定アルゴリズム判定アルゴリズム判定アルゴリズム判定アルゴリズム判定アルゴリズム判定アルゴリズム判定アルゴリズム
  12. 12. 素朴なフィルタの例 NG ワード判定 ◮ 実装が簡単 ◮ 正規表現マッチ ◮ メンテナンスが簡単 ◮ 単語をリストに追加するだけ ◮ 精度はあまり高くない リンクの数 ◮ e.g. 特定ドメインへのリンク ◮ e.g. アフィリエイトリンクの多さ
  13. 13. 素朴なフィルタによる誤爆 例 ◮ 「カブトムシの交尾」で Google AdSense 停止 (実際はもっと複合的な要因ではないかとの指摘も) ◮ 「やまもといちろう」問題
  14. 14. 素朴なフィルタによる誤爆 例 ◮ 「カブトムシの交尾」で Google AdSense 停止 (実際はもっと複合的な要因ではないかとの指摘も) ◮ 「やまもといちろう」問題
  15. 15. こんなことでは困る!
  16. 16. フィルタの組み合わせ ◮ ひとつひとつは素朴なフィルタ ◮ たくさん組み合わせたら賢くなる?!
  17. 17. フィルタの組み合わせ ひとつだけだと弱い
  18. 18. フィルタの組み合わせ フィルタを増やすと綺麗に分けられるかも? ひとつだけだと弱い
  19. 19. 直線が引ければよい 直線の式 ax + by + c = 0
  20. 20. 直線が引ければよい 直線の式 ax + by + c = 0 各点から直線までの距離 (axi + byi + c)/ √ a2 + b2
  21. 21. 直線が引ければよい 直線の式 ax + by + c = 0 各点から直線までの距離 (axi + byi + c)/ √ a2 + b2 ◮ あとは良い a, b を設定するだけ!
  22. 22. え, これ手でチューニングするの?
  23. 23. AdaBoost [’95 Freund, Schapire] 特徴 ◮ 弱分類器の重みと閾値を自動的に決定 ◮ 弱分類器は弱すぎなければなんでもよい ◮ 精度が 50%以上なら全体精度も向上 ◮ いろんな弱分類器をいい具合に組み合わせ可能 原理 ◮ 入力にも重みを持たせる (最初はぜんぶ 1) ◮ 弱分類器を順に学習 ◮ 弱分類器の重みと閾値の最適値を決定 ◮ 前の弱分類器が誤判定した入力は, 後の弱分類 器では重みを上げて学習
  24. 24. BSはてなの弱分類器 ◮ ブックマークした人のカテゴリの偏り ◮ タグの出現頻度 ◮ 特定タグ占有率 ◮ コメント率 ◮ 特定属性 URL へのリンク ◮ キーワードの出現傾向
  25. 25. BSはてなの弱分類器 ◮ ブックマークした人のカテゴリの偏り ◮ タグの出現頻度 ◮ 特定タグ占有率 ◮ コメント率 ◮ 特定属性 URL へのリンク ◮ キーワードの出現傾向 ブックマークされてなくても 高精度に判定したい!
  26. 26. Perceptron [’58 Rosenblatt] 特徴 ◮ 多次元の入力の重みづけをいい感じにする ◮ 計算がすごく簡単 (実装も簡単) ◮ 教科書に載ってるレベルで枯れている ◮ 近年見直されさまざまな改良が 実装方針 ◮ ひとまず単純な実装 ◮ キーワードの出現ベクトルが入力 ◮ 精度を見つつ改良版を試す
  27. 27. Perceptron [’58 Rosenblatt] — 原理 学習手続 1. 重みベクトルを w = (0, . . ., 0) で初期化 2. 現在の重みでの判定結果 g 3. 本来の正しい判定結果 a ∈ {1, −1} 4. a · g > 0 なら判定成功 or フィードバック 判定: 重み w と入力 p の内積 (の正負) ◮ w · p フィードバック ◮ 正しい結果の向きに入力分だけ重みを更新 w := w + ap
  28. 28. Perceptronの簡単な実装 sub weights { shift->{weights} ||= {} } sub feedback { my ($self, $ps, $ad) = @_; $self->weights->{$_} += $ad * $ps->{$_} for keys %$ps; } sub learn { my ($self, $ps, $ad) = @_; my $g = $self->guess($ps) || 0; $self->feedback($ps, $ad) unless $g * $ad > 0; } sub guess { my ($self, $ps) = @_; my $weights = $self->weights || {}; return sum map { ($weights->{$_} || 0) * $ps->{$_}; } keys %$ps; }
  29. 29. なんと, これですごく精度が出た
  30. 30. 細かい知見など細かい知見など細かい知見など細かい知見など細かい知見など細かい知見など細かい知見など
  31. 31. 教師データ集めが肝 ◮ タグ検索等を駆使して傾向を把握 ◮ 大量の URL を人の目で判定 ◮ 判定基準のぶれをどう抑えるか
  32. 32. AdaBoost ◮ 元々スパムフィルタのために導入されていた ◮ 単純な実装だが本来の計算と少しだけ違う ◮ 素直に AdaGrad+RDA にしたら精度が低下...orz
  33. 33. Perceptron ◮ 驚くほどシンプルな実装 ◮ はてなキーワードの見出し語を使う → スラングなどへの対応 ◮ 入力キーワードを闇雲に増やすと精度が低下 ◮ 特徴語に絞って入力している (たぶんこれが肝)
  34. 34. 今後の展望 ◮ 判定できる属性の拡充 ◮ 画像対応 ◮ フィルタリング以外の用途 ◮ もう少し大規模に特徴量を扱うしくみ
  35. 35. まとめ ◮ はてなブックマークの実装/知見を利用した はてな発のアドベリフィケーションシステム ◮ 比較的枯れた教科書的な技術の組み合わせ ◮ AdaBoost ◮ Perceptron ◮ 大規模データを扱ってきた知見を発揮
  36. 36. WE ARE HIRING ◮ アドテク・機械学習エンジニア 絶賛募集中 ◮ 東京 / 京都 どちらの勤務でも可

×