読者です 読者をやめる 読者になる 読者になる

雑なメモ

学びを記す

VASILYさんのクローラーとディープラーニングの話が聞きたくて『Fashion Tech meetup #2』に参加した

Fashion Tech meetup #2 に参加してきました。
fashion-tech.connpass.com tech.vasily.jp in.fablic.co.jp

はじめに

VASILYさんのクローラーの話は面白くて前々からDEVELOPERS BLOGをよく読んでいます。
私自身、アド関係のエンジニアをしているので業務レイヤ的にも共通するところがあり、以下の様な記事・スライドを毎回興味深く拝見しています。

最近では、ディープラーニングを活用しているということで詳しい話が聞きたくて今回参加しました。
発表自体は最高に面白くてcoolと感じながらも、めちゃくちゃアカデミックで難しかったです。
私も含め、この記事を{書く,読む}ことで少しでも発表内容の補足になれればと思います。

『ディープラーニングを使って商品カテゴリの分類をしてみました』

speakerdeck.com

発表者

ソフトウェアエンジニアの塩崎さんとデータサイエンティストの後藤さん(@Ryosuke0624)。
導入・背景・クローラー周りの話を塩崎さん、ディープラーニング周りの話を後藤さんという、途中で交代するスタイルの発表だった。

iQONとは

日本最大級のファッションアプリ。ユーザがファッションアイテムを組み合わせてコーデが作れる。
気に入ったらすぐECサイトに飛んで買える。

テキストによるカテゴリー判定の限界

商品情報は、日本中のECサイトをクローリングして得ていて、カテゴリ分けも行っている。
今まではこのカテゴリ分けをテキストで行っていた。
具体的には、商品説明を形態素解析して、文脈も考慮しながら単語を抽出する。
だが、テキストだと似たような名前で異なるカテゴリのものが判定できない。
スライドの例だとハニカムニットとケーブルニット(どちらかがセーター、どちらかがニット帽)。
画像だと一目瞭然なので、画像によるカテゴリ分類を組み込むことに。

ディープラーニングのモデルの構築

ここでデータサイエンティストの後藤さんに交代。
セーターの画像とニット帽の画像を判定器にかけてカテゴリを推定する。
いわば、Google Cloud Vision APIのファッション特化版。

判定器に用いるアルゴリズムの選定

まずは、この問題に最適なアルゴリズムの選定から始める。

畳み込みニューラルネットワーク(CNN)

画像分類において非常に成果を出していて、2012年頃から研究が盛んに進んでいるアルゴリズム
CNNを使った画像選定能力は人間の能力を超えたと言われていて、AlphaGoでも使われている。

局所特徴量+分類アルゴリズム

伝統的な手法。局所特徴量を抽出してそれを分類アルゴリズムにかける。
今回は、HOG特徴量を抽出してSVMにかけてみた。

アルゴリズム選定のための簡易解析

セーターの画像とニット帽の画像を10,000枚ずつ用意して学習させて、どのぐらいの精度が出るのか検証した。
CNNもHOG+SVMもどちらの精度も高い。

CNNとHOG+SVMの比較

畳み込みニューラルネットワーク(CNN)
  • 画像のどこに注目するかという特徴量を自動で抽出できる。
  • どんな特徴量が抽出されるかはブラックボックスになることが多い。
  • 新しいモデルが加わった際は、これまで作ったモデルを微調整(fine-tuning)するだけで良い。
局所特徴量+分類アルゴリズム(HOG+SVM
  • 特徴量を事前にHOGアルゴリズムで計算して判定に効くものを選ぶ必要がある。
  • 画像のどの部分に注目したいかという特徴量は自分で決められるのでブラックボックスは避けられる。
  • 新しいモデルが加わった際は、特徴量抽出から分類器作成までイチからやり直しになってしまう。

多クラス分類における精度の高さとメンテナンス容易性の観点から、CNNを採用。

判定器の実装・学習

pythonChainerを用いる。

CNNのモデルの設計

畳み込み層とパーセプトロンの2つのパートに分けられる。

畳み込み層

入力画像にフィルタをかけて特徴量をマッピングする層。
チューニングパラメータはフィルタ。

パーセプトロン

得られた特徴量を結合して値を返す。
チューニングパラメータはデータの重み付けの部分。

Chainerによる畳み込み層の定義例

変数がたくさんあるけど、Chainerを使えば1つの畳み込み層を1行で書けるので実装が楽。

誤差関数

ニューラルネットワークの設計が終わった後、出力層を定義する必要がある。
今回はsoftmaxという関数を出力層にして、そのカテゴリに何%の確率で属するかという値を出力するようなニューラルネットワークにしている。
誤差関数にはcross entropyを用いている。
この辺もChainerを使うと実装が楽。

パラメータ最適化

誤差関数をパラメータに反映させる。
誤差逆伝搬法(Backpropagation)と呼ばれる微分の連鎖律をうまく記述して各パラメータがどう変化すればいいかという勾配を計算をする。
どれくらい調整するのかっていうのはAdamというアルゴリズムを使っている。
過学習(訓練データに適合しすぎて、未知のデータに対して精度が出ない現象)を防ぐために、早期打ち切り・バッチ学習というテクニックを使っている。
学習を安定化させるために、Batch Normalizationというアルゴリズムを用いている。
誤差逆伝搬法による勾配計算もAdamによるパラメータ更新においてもChainerを使うと実装が楽。

精度の評価

CNNの判定精度

確率が0.9以下のデータはあいまいな判定をしているということでユーザには出さないものとして「不明」というカテゴリに分類。
セーターカテゴリに実際にセーターが分類された割合が99.7%, ニット帽カテゴリに実際にニット帽が分類された割合が99.8%と非常に高い分類精度を誇ることがわかった。
モデル着用画像・マネキン画像・アイテム単体・複数アイテム等様々なケースでも判定可能。
稀にある誤判定やあいまいな例は新たな訓練データとして再学習させることで精度を上げることができる。前述したとおり、誤判定理由はブラックボックスになってることが多い。

クローラーへの組み込み

ここで、ソフトウェアエンジニアの塩崎さんに交代。
CNNを使い、99.7%以上の精度を誇る判定器ができたのでクローラへ組み込む。

クローラーに組み込む時の課題

クローラー本体と画像判定器とで、利用言語・利用ライブラリ・主な負荷からいろいろと違う。

クローラー本体
  • Ruby
  • nokogiri
  • sidekiq
    • メッセージキューパターンで並列処理をする
  • 主な負荷はネットワークIO
画像判定器
  • Python
  • Chainer
  • Pillow
    • 画像のリサイズや減色
  • 主な負荷はCPUやメモリ

マイクロサービス化

クローラー本体と画像判定サーバーを切り離してRESTfulなAPIで結んだ。

画像判定サーバー構成

画像判定サーバー
学習用サーバ
  • NVIDIA Tesla K40 私物
    • 80万円くらい
デプロイ
  • 再学習時のモデル差し替えはuWSGIのgraceful restartにより、無停止で行える。

まとめ

  • ディープラーニングを活用した画像によるカテゴリ分類が高い精度でできた。
  • マイクロサービス化した。

『ファッションアイテムの類似画像検索を実装してみました』

speakerdeck.com

発表者

データサイエンティストの中村さん(@tn1031)。

類似画像検索があると良い場面

  • 欲しいけど高くて手が出せないアイテムに対して、見た目が似てて安価なアイテムで妥協したいとき。

類似画像検索があると苦労して探す必要がなくなる。

画像検索には主に2種類の方法がある

テキストベースと画像ベースのうち、今回は画像ベースにチャレンジした。

画像検索は圧縮と距離計算です

もともと高次元である画像を、低次元のベクトルに落としてベクトル間の距離計算することで違いを測る。
距離が遠ければ似てないし、近ければ似ている。
画像を圧縮する関数、つまり特徴抽出する関数をどう設計すればいいかを考える必要がある。

3通りの方法で実装

Color histgram + HOG

これら2つのヒストグラムを結合して画像の特徴量としている。

CNN BASED MODEL

普通は全結合層と出力層があってカテゴリを判別するのだが、ちょっと改良して潜在層を挟んだ。

  • 全結合層: 画像の特徴を抽出している。
  • 潜在層: 画像のハッシュ化をすることにより、計算量を削減している。

DCGAN

これについては、ディープラーニングで洋服を整理してみました - VASILY DEVELOPERS BLOGを参照。
画像を100次元まで圧縮している。

使ってみた感想

ディープラーニングは難しいし、中村さん的には「Color histgram + HOG」でヒストグラムを自分で作るほうが合ってるとのこと。

まとめ

検索でどういうものを出したいか、ユーザがどんな情報を見れたら嬉しいのかということを考えて検索システムを最適化することが大事。

所感

面白いけど難しかった。
難しすぎて、ディープラーニングとデータサイエンティストはセットだという印象を持った。
畳み込みニューラルネットワークやHOG、SVMパーセプトロン、cross entropy、誤差逆伝搬法等わからない用語が多かったが、機械学習について調べてみるとこれらの用語が頻出していた。
理解は置いといて、機械学習における代表的なアルゴリズムや用語にどんなものがあるのかが知れてよかった。

機械学習は、TensorFlowGoogle Cloud Machine Learningなど、革新的なものが登場していくにつれて複雑なところが抽象化され敷居が下がり、専門知識も不要になってきたという印象を持っていたが、今回の発表に自分がついていけなかったところを考えるとまだまだ専門知識が必要なのだと感じた。
というか、昨今整ってきているのはあくまで機械学習やディープラーニングを使ったシステムを開発するためのインフラであり、その先にある「ある特徴量を抽出するための関数をどう設計するか」というような設計面やアルゴリズム選定においてはまだまだ専門知識が求められているということなのだろうか。

合わせて読みたい