『BrandSafe はてな』のアドベリフィケーションのしくみ
-
Upload
lintaro-ina -
Category
Technology
-
view
3.237 -
download
1
Transcript of 『BrandSafe はてな』のアドベリフィケーションのしくみ
自己紹介
名前 い な
伊奈 り ん た ろ う
林太郎 (id:tarao / @oarat )
所属 はてなブックマークチーム
2008-08 はてなインターン2008-10 はてなアルバイト (ブックマークチーム)2010-04 日本学術振興会 特別研究員 (DC1)2013-04 はてな正社員2013-12 ブックマークチーム
自己紹介 — やってることインターン / アルバイト時代2008-08 本文抽出エンジン2008-12 おすすめユーザ2009-04 検索欄「もしかして」2009-07 ユーザページ全文検索2009-10 地域別エントリ
最近2014-08 BrandSafe はてな2014-09 Presso Twitter連携2015-04 Scala三昧
自己紹介 — やってることインターン / アルバイト時代2008-08 本文抽出エンジン2008-12 おすすめユーザ2009-04 検索欄「もしかして」2009-07 ユーザページ全文検索2009-10 地域別エントリ
最近2014-08 BrandSafe はてな2014-09 Presso Twitter連携2015-04 Scala三昧
◮ 検索技術 > 機械学習 ≫ アドテク
自己紹介 — やってることインターン / アルバイト時代2008-08 本文抽出エンジン2008-12 おすすめユーザ2009-04 検索欄「もしかして」2009-07 ユーザページ全文検索2009-10 地域別エントリ
最近2014-08 BrandSafe はてな2014-09 Presso Twitter連携2015-04 Scala三昧
◮ 検索技術 > 機械学習 ≫ アドテク◮ (大学時代の専門は型理論)
BrandSafe はてなアドベリフィケーション広告配信先をフィルタリング
◮ アダルトサイト◮ 2chまとめ◮ 違法ダウンロード
技術的には
◮ 任意のWebページ (URL)の分類問題◮ 各属性に対して二値判定
どうやって判定?いろいろなやり方の選択肢
◮ 手動...orz
◮ ルールベース◮ 機械学習etc.
できるだけ楽にシンプルに
◮ 工数を抑えたい◮ 計算量を抑えたい◮ 複雑すぎてメンテできないと困る
URLの判定が走るまで1. ユーザによるURLのブックマーク2. GET
3. 本文抽出4. メタ情報抽出
◮ キーワード◮ リンク先◮ 画像
5. カテゴリ判定6. アドベリ判定
◮ 1をブックマーク以外のトリガからも実行
素朴なフィルタの例NGワード判定
◮ 実装が簡単◮ 正規表現マッチ
◮ メンテナンスが簡単◮ 単語をリストに追加するだけ
◮ 精度はあまりよくない
リンクの数
◮ e.g. 特定ドメインへのリンク◮ e.g. アフィリエイトリンクの多さ
直線が引ければよい
直線の式ax + by + c = 0
各点から直線までの距離 (の正負に注目)(axi + byi + c)/
√a2 + b2
◮ あとは良い a, b (軸の重み) を設定するだけ!
直線が引ければよい
直線の式ax + by + c = 0
各点から直線までの距離 (の正負に注目)(axi + byi + c)/
√a2 + b2
◮ あとは良い a, b (軸の重み) を設定するだけ!◮ 正負が間違ったものの絶対値の最小化問題
AdaBoost [’95 Freund, Schapire]
特徴◮ 弱分類器の重みと閾値を自動的に決定◮ 弱分類器は弱すぎなければなんでもよい
◮ 精度が 50%以上なら全体精度も向上◮ いろんな弱分類器をいい具合に組み合わせ可能
原理◮ 入力にも重みを持たせる (最初はぜんぶ 1)
◮ 弱分類器を順に学習◮ 弱分類器の重みと閾値の最適値を決定
◮ 前の弱分類器が誤判定した入力は, 後の弱分類器では重みを上げて学習
BSはてなの弱分類器◮ ブックマークした人のカテゴリの偏り◮ タグの出現頻度◮ 特定タグ占有率◮ コメント率◮ 特定属性URLへのリンク◮ キーワードの出現傾向
ブックマークされてなくても高精度に判定したい!
Perceptron [’58 Rosenblatt]
特徴
◮ 多次元の入力の重みづけをいい感じにする◮ 計算がすごく簡単 (実装も簡単)
◮ 教科書に載ってるレベルで枯れている◮ 近年見直されさまざまな改良が
実装方針
◮ ひとまず単純な実装◮ キーワードの出現ベクトルが入力
◮ 精度を見つつ改良版を試す
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
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;
}
教師データ集めが肝
◮ タグ検索等を駆使して傾向を把握◮ 大量のURLを人の目で判定
◮ 判定基準のぶれをどう抑えるか◮ データは多い方がよい → たいへん◮ 誤判定フィードバックを反映していくしくみ
まとめ
◮ はてなブックマークの実装/知見を利用したはてな発のアドベリフィケーションシステム
◮ 比較的枯れた教科書的な技術の組み合わせ◮ AdaBoost◮ Perceptron
◮ 大規模データを扱ってきた知見を発揮