Dwango Media Village(ドワンゴメディアヴィレッジ,dmv)

イラストの閲覧数・お気に入り数予測

2015/11/02

タスク概要

ニコニコ静画(イラスト)に投稿された175万枚の画像を用いて、閲覧数とお気に入り数を予測する回帰の問題としてchainerを用いて学習させました。

手法

モデル構造

モデルの全体的な構造はGoogLeNet(arXiv:1409.4842v1 [cs.CV] 17 Sep 2014 "Gooing deeper with convolutions" )をベースにしたものです。 元になっているGoogLeNetの構造は下図のようになっています。

GoogLeNetの構造

高速化や精度向上等のため、Batch Normalization(arXiv:1502.03167v3 [cs.LG] 2 Mar 2015 "Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift")を各層に加え、各活性化関数の手前でミニバッチの正規化を行うようにしています。 元のネットワークはクラス識別問題用のネットワークになっていますが、Softmax関数の交差エントロピーを誤差関数としている箇所を平均二乗誤差を誤差関数とすることで、回帰問題に対応します。

オプティマイザ

オプティマイザは、Adam/AdaGrad/AdaDeltaを学習の途中で確率的にランダムで切り替えることにしました。これまでに幾つかのタスクで検証した所、途中でオプティマイザをランダムに切り替えた場合でも、最終的には、最適に設定したオプティマイザと同じ程度の精度が出ていたため、このアプローチを選択しました。Chainerを利用すれば、このように動的に学習を変えることは容易です。

誤差関数

タスクとしては閲覧数とお気に入り数そのものを予測したいわけですが、最適化の対象とする誤差関数は「log(閲覧数+定数)の平均二乗誤差とlog(お気に入り数+定数)の平均二乗誤差の和の平均」としました。 学習時の誤差関数として、閲覧数の素の値の平均二乗誤差を使う場合、閲覧数10を100と予想した誤差よりも、閲覧数10,000を10,100と予想した時の誤差が大きくなってしまいます。 実際に、誤差関数を閲覧数・お気に入り数の素の値について平均二乗誤差とした場合、閲覧数が数万クラスの一部の画像の誤差に引っ張られて、閲覧数の桁が少ない画像についてなかなか学習が進まないという状況になります。 「何桁ぐらいの閲覧数が得られそうかを予測する」(→100閲覧と1,000閲覧の誤差の重みは、1,000閲覧と10,000閲覧の誤差と同じぐらい)というのが学習の仕方として良さそうなので、logスケールで学習することとしました。

予測結果

予想閲覧数×実際の閲覧数

学習に使わなかった5000枚のイラストに対して、予測値再生数と実際の再生数をそれぞれ横軸/縦軸としてプロット(logスケール)すると、以下のような結果になります。各点は、イラストそのものでプロットしています。

Dwango Media Village(ドワンゴメディアヴィレッジ,dmv)によるイラストの予測数に対する実際の閲覧数結果

左上、右下にはほとんど点が出ておらず、予測値はほぼ1桁以内の誤差に収まっており、このニューラルネットは少なくとも大量閲覧数を叩き出すヒット作品を見落とすようなことは無さそうです。

予想閲覧数×予想お気に入り数

また、予想閲覧数と予想お気に入り数をプロットすると以下のようになります。

Dwango Media Village(ドワンゴメディアヴィレッジ,dmv)によるイラストの予測数に対する予測お気に入り数

予想閲覧数と予想お気に入り数も、完全には一直線上には並んでいないので、「お気に入り数に対する閲覧数の割合が高そう(右下エリア)」のように、閲覧数とお気に入り数の評価は別々に評価していることが分かります。

予想閲覧数に対する予想お気に入り数の比率が高いエリア(オレンジ枠内)

数コマのマンガ形式で読ませるような作品は、お気に入り数に対する閲覧数の比率が高い傾向がある(サムネイル画像ではセリフ等が読めないため、実際に閲覧ページまで遷移しやすい)のですが、この傾向は掴めているでしょうか。 下に、右下エリア(オレンジ色の点線範囲)を拡大したものを示します。

予想閲覧数に対する予想お気に入り数の比率が高いエリア

対角より右下にプロットされているこのエリアのイラストにはマンガ形式のものが多いことから、上記のような傾向も正しく学習できていることが分かります。

コメント

発展形

サービスへの応用