背景
映像系のおすすめを紹介する機能ってNetflixはまあまあ当たってるけど、DMMのAVおすすめ機能は全然当たっていない。
恐らく、通常映画よりもAVって個人の好みのベクトルが千差万別で、思うように推定できないからじゃないかなと推測。若しくは好みというより売りたいものを推薦しているのかも。
なので、深層学習を利用して自分専用にチューニングしたAVの好み判定器を作れば上手くいくんじゃないかと思って作ってみました。
学習データ用意
数多のサンプル動画を自分の目で見て判断してcsvに名前(商品番号)と評価の数字[良い(1)・悪い(0)]を記入します。(これが一番大変)
その後、DMMapiを使って記入した商品番号から商品情報を取得してきて商品番号に紐づけます。
とりあえず、好みに関係ありそうなデータを取得してみました。
(メーカー・レーベル・女優・監督・ジャンル)
紐づけの方法は、評価済みの物①と評価したい物②の情報(要素)を統合して重複を除外した要素のリストを作成。そのリストを作品毎に参照して要素があると1,無いと0とする商品番号と紐づいたリストをさらに作成します。
そして、kerasを利用して上記csvから判別器を作成。
学習器のモデルはこんな感じ。試行錯誤中だけど、今はこれが一番良さそう
#回路構築
model = Sequential()
model.add(Dense(10000, input_shape=(10000, )))
model.add(Activation('relu'))
model.add(Dense(2))
model.add(Activation('softmax'))
#回路コンパイル
model.compile(optimizer='Adam', loss='binary_crossentropy', metrics=['accuracy'])
#訓練
model.fit(X_train_s, y_train, nb_epoch=1000, batch_size=10, verbose=1)
学習時間は18時間かかりました。(もっと学習時間短くしても変わんないかな。でもまあ念のため)
学習が終わったら、事前に用意した②(評価したい商品番号に紐づいた要素配列)を入力すると返り値のリスト[0]と[1]に値が返ってきて、どちらが大きいかで良いか悪いかを判別してみました。
精度
外れてるのもあるけど、おおかた良い感じに判別できてます。
感覚としては教師用のデータ量が精度にすごく効いています。教師データ200個程度だと全然使い物にならなかったけど、400個に頑張って増やすと途端に良くなりました。
教師データを作るツールが、学習精度と作業効率化にかなり影響を与えることが分かりました。今後はそこら辺を考えて作ってみようかな。
隠れ層の階層を増やすと途端に精度が悪くなった。
(画像と違って独立したパラメータを扱うときは隠れ層を使うと良くないのかな?)
感想
本当は画像処理系で俺好み判定器を作りたかったです。PCのスペックが圧倒的に足りないことから、DMMapiを使用したタグ情報で判定器を作ってみましたが、それなりに良いものが作れて意外でした。
自分の好みって思ってた以上に単純だったということなのでしょうか?
重みを可視化して、何が判別に効いてるのか見えると面白そうなので、これからやってみようと思います。
余談
高性能なPCが買える時がきたら、画像処理を使った俺好み判別器を作りたい。
(DMMapi頼りなのでapiのサービス終了したら使えなくなっちゃうし)
さらに妄想すると画像/動画 補完器とか。ある程度のことはできてるっぽいので後は時間の問題だと思うけど、モラル的に企業が提供するものに期待が出来ないし、自分好みは自分の頭の中にしか存在しないので、やはり判定器や補完器は自分で作るしかない。
とりあえず途中経過として書きましたが、リクエストがあれば具体的なソースを書いていこうと思います。