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

38
BrandSafe id:tarao @oarat Hatena Engineer Seminar #5 2015-06-16

Upload: lintaro-ina

Post on 10-Aug-2015

3.237 views

Category:

Technology


1 download

TRANSCRIPT

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

しくみ

伊奈 林太郎id:tarao @oarat

株式会社はてな

Hatena Engineer Seminar #52015-06-16

自己紹介

名前  い な

伊奈   り ん た ろ う

林太郎  (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 はてな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 (軸の重み) を設定するだけ!

直線が引ければよい

直線の式ax + by + c = 0

各点から直線までの距離 (の正負に注目)(axi + byi + c)/

√a2 + b2

◮ あとは良い a, b (軸の重み) を設定するだけ!◮ 正負が間違ったものの絶対値の最小化問題

え, これ手でチューニングするの?

AdaBoost [’95 Freund, Schapire]

特徴◮ 弱分類器の重みと閾値を自動的に決定◮ 弱分類器は弱すぎなければなんでもよい

◮ 精度が 50%以上なら全体精度も向上◮ いろんな弱分類器をいい具合に組み合わせ可能

原理◮ 入力にも重みを持たせる (最初はぜんぶ 1)

◮ 弱分類器を順に学習◮ 弱分類器の重みと閾値の最適値を決定

◮ 前の弱分類器が誤判定した入力は, 後の弱分類器では重みを上げて学習

BSはてなの弱分類器◮ ブックマークした人のカテゴリの偏り◮ タグの出現頻度◮ 特定タグ占有率◮ コメント率◮ 特定属性URLへのリンク◮ キーワードの出現傾向

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

◮ 元々スパムフィルタのために導入されていた◮ 単純な実装だが本来の計算と少しだけ違う◮ 素直にAdaGrad+RDAにしたら精度が低下...orz

Perceptron

◮ 驚くほどシンプルな実装◮ はてなキーワードの見出し語を使う→ スラングなどへの対応

◮ 入力キーワードを闇雲に増やすと精度が低下◮ 次元の呪い◮ 特徴語に絞って入力している

今後の展望

◮ 判定できる属性の拡充◮ 画像対応◮ フィルタリング以外の用途◮ もう少し大規模に特徴量を扱うしくみ

まとめ

◮ はてなブックマークの実装/知見を利用したはてな発のアドベリフィケーションシステム

◮ 比較的枯れた教科書的な技術の組み合わせ◮ AdaBoost◮ Perceptron

◮ 大規模データを扱ってきた知見を発揮

WE ARE HIRING

◮ アドテク・機械学習エンジニア絶賛募集中◮ 東京 / 京都 どちらの勤務でも可

SUMMER INTERNSHIP2015.8.10-9.4

◮ Scala, Swiftも学べる!

◮ アドテクコースも選べる!

応募締切 6月 29日htn.to/intern2015