集合データを学習するモデルの紹介

f:id:vasilyjp:20180731181423j:plain(Icon Credit *1

こんにちは。スタートトゥデイ研究所の後藤です。

今回は、集合を入力として扱うネットワークモデルの紹介をしたいと思います。機械学習の多くのモデルは、固定長の入出力や順序のある可変長の入出力を扱うように設計されます。画像データやテーブルデータは各サンプルの入出力の次元を合わせて学習しますし、自然言語処理のコーパスや時系列データは入出力の順序を保持して利用します。

その一方で、可変長で順序のない集合データを扱うモデルの研究は最近になって取り組み始められたばかりです。我々が研究しているファッションの領域において、入力データを集合として扱いたくなる状況がたびたびあるため、理解を深めておきたい問題設定です。

コーディネートをアイテムの集合とみなす

f:id:vasilyjp:20180730054307p:plain
コーディネートに使われたアイテムの例

コーディネートをアイテムの組み合わせとして捉えた場合、1つのコーディネートはアイテムを要素とする集合であると見なすことができそうです。ここでは、1つのコーディネート内に同じアイテムは1度しか登場しないことと、アイテムには順序がないことを前提としています。後ほど触れますが、アイテムのカテゴリによる順序を設定して系列データとして扱う研究もあります(Han et al. 2017, Nakamura & Goto 2018)。

コーディネートデータを扱う過去の取り組み

コーディネートデータの学習をするための過去の取り組みを紹介します。

Siamese Networks

集合データから2つのアイテムを取り出して固定長の入力として扱う例です。Veit et al. 2015では、ファッションスタイルの違いを反映した空間を学習する試みで、この手法を取っています。集合全体を評価することは一旦諦めて、入力を固定長にしてしまうことで、従来の枠組みを用いてモデルを構築できます。

f:id:vasilyjp:20180730054431p:plain
(Veit et al. 2015, Figure 2)

このタスクでは、ペアが集合全体の性質を持っている場合は良いですが、集合全体として初めて成り立つ性質を持っているようなタスクには使えません。1つ1つのアイテムからはスタイルは見えてこないが、トータルコーディネートを見て初めてスタイルが明らかになるような例を学習することは難しそうです。

Bidirectional LSTM

コーディネートに使われるアイテムの数は可変長なので、系列データとみなして扱った例です。Han et al. 2017では、アイテムのカテゴリにより入力の順序を決め、コーディネートを系列データとしてBidirectional LSTMを学習しています。

f:id:vasilyjp:20180730054736p:plain
(Han et al. 2017, Figure 2)

この手法ではカテゴリによる入力の順序を定義しているため、同じコーディネートの評価をする場合でも入力するデータの順序を変えると、出力が変わると言う性質があります。論文中では、インプットするカテゴリの順番を入れ替えて学習すると、得られるモデルのクオリティ自体が変わることも指摘されています。入力する順序によって組み合わせの評価値が変わる性質は、タスクによっては不都合なこともあります。

集合データを直接扱う方法

Zaheer et al. 2017では集合データをストレートに扱う方法を提案しています。この論文では、集合を入力とする際に満たされるべき性質を持った、必要十分なネットワーク構造を示しています。ここでは、permutation invariantとpermutation equivariantについて紹介します。実装に関しては、著者自身のコードがgithubにあるため理解の助けになるかと思います。

github.com

Permutation invariant

f:id:vasilyjp:20180730054210p:plain
Invariant modelのアーキテクチャ (Zaheer et al. 2017, Figure 5)

permutation invariantのモデルを模式的に表したのが上図です。

集合データを入力とし、スカラーを出力する問題です。集合に対して1つの値を返すため、入力データの順序を変えても出力が同じになります。この性質をpermutation invariantと呼びます。例えば、コーディネートに点数をつける、といったタスクが当てはまると考えられます。

関数 f(X)がpermutation invariantであるとは、任意の並べ替え  \piに対して、 f( \{ x_1, \ldots, x_M \} ) = f(\{ x_{\pi (1)}, \ldots, x_{\pi (M)} \})が成り立つことです。

論文では、集合の各要素の特徴を関数\( \phi(x)\)により独立に抽出し、それを足し上げたものを非線形関数\( \rho\)に渡すことで、permutation invariantな関数が実現できることを証明しています。各要素の特徴 \( \phi(x) \)の和は、任意の並べ替え \( \pi \)に対して変わらないので、\( f(X) = \rho (\sum_{x \in X} \phi(x)) \)が入力する順序を入れ替えても出力は変わらないことが直感的にわかるかと思います。

活用例

コーディネートデータの活用事例として、オートエンコーダーによるスタイルの抽出があります。この実験ではコーディネートを固定長のベクトルで表現する方法として、concat型とreduce型の方法を試しています。このうちのreduce型の手法は先ほど述べたpermutation invariantの条件を満たしています。この手法はコーディネートデータからスタイルを抽出するというタスクにおいて優れた性能を発揮することがわかっています。

Permutation equivariant

例えば、集合の中から仲間はずれを検知する、コーディネートデータの中からスタイルが一致しないアイテムを発見するなどの問題設定の場合、集合の入力に対して要素数分の出力が必要になります。さらに各入力要素と出力の各要素は対応関係を持っています。このような対称性をpermutation equivariantと呼び、以下のように表現されます。

f([x_{\pi(1)},\ldots,x_{\pi(M)}]) = [f_{\pi(1)}(x),\ldots,f_{\pi(M)}(x)]

モデルパラメータを\( \Theta\)を持つモデルを \bf{f}_{\Theta} = \bf{\sigma} (\Theta \bf{x}) と表現した際、\( \Theta\)が \Theta = \lambda \bf{I} + \gamma (\bf{1} \bf{1}^\bf{T}) を満たす変換であればpermutation equivarinatであることが示されています。さらにこの定式化の拡張として、 \bf{f} (\bf{x}) = \bf{\sigma} (\lambda \bf{I}\bf{x} + \gamma {maxpool} (\bf{x}) \bf{1}) も、permutation equivariantを満たしています。

集合方向のmaxpoolingは入力データの順序に対して不変なので、これ自体はpermutation invariantです。

f:id:vasilyjp:20180730054155p:plain
Equivariant modelのアーキテクチャ (Zaheer et al. 2017, Figure 7)

このようなネットワークは、pytorchで表現すると以下のように記述することができます。PermutationEquivariantクラスが\(\Theta\)に対応する部分です。集合を扱うという新しいことができるようになっているのですが、とてもシンプルです。実際に入力の順序を入れ替えると対応した出力の順序も入れ替わることが確認できます。

import torch
import torch.nn as nn

class PermutationEquivariant(nn.Module):
    def __init__(self, in_dim, out_dim):
        super(PermutationEquivariant, self).__init__()
        self.Gamma = nn.Linear(in_dim, out_dim)
        self.Lambda = nn.Linear(in_dim, out_dim, bias=False)

    def forward(self, x):
        xm, _ = x.max(1, keepdim=True)
        xm = self.Lambda(xm) 
        x = self.Gamma(x)
        x = x - xm
        return x

class DeepSets(nn.Module):
    def __init__(self, x_dim, d_dim):
        super(DeepSets, self).__init__()
        self.x_dim = x_dim
        self.d_dim = d_dim

        self.phi = nn.Sequential(
          PermutationEquivariant(self.x_dim, self.d_dim),
          nn.ELU(inplace=True),
        )

        self.rho = nn.Sequential(
           nn.Dropout(p=0.5),
           nn.Linear(self.d_dim, self.d_dim),
           nn.ELU(inplace=True),
           nn.Dropout(p=0.5),
           nn.Linear(self.d_dim, 10),
        )
        print(self)

    def forward(self, x):
        phi_output = self.phi(x)
        sum_output = phi_output.mean(1)
        rho_output = self.rho(sum_output)
        return rho_output

まとめ

今回は、集合を入力として扱うネットワークの表現のうち、permutation invariantとpermutation equivariantの2つの場合について紹介しました。入力に集合を扱えるようになることで、IQONやWEARのコーディネートデータを活用しやすくなります。例えば、コーディネートの採点やスタイルの抽出、スタイル不一致のアイテムの発見など、様々な応用例が考えられるでしょう。

さいごに

研究所ではアイテムの集合以外にも「似合う」ということについて多角的に研究を進めています。機械学習に限らず、専門性を活かしてファッションを分析できる環境を提供しています。ファッションに関する研究テーマに挑戦したい方はぜひ下のリンクから応募して、ぜひ一度オフィスに来ていただければと思います。

www.wantedly.com

参考

  • Han, X., Wu, Z., Jiang, Y., Davis, L. Learning Fashion Compatibility with Bidirectional LSTMs. In ACM Multimedia, 2017.
  • Nakamura, T., Goto, R. Outfit Generation and Style Extraction via Bidirectional LSTM and Autoencoder. In KDD workshop 2018.
  • Veit, A., Kovacs, B., Bell, S., McAuley, J., Bala, K., Belongie, S. Learning Visual Clothing Style with Heterogeneous Dyadic Co-occurrences. In ICCV, 2015.
  • Zaheer, M., Kottur, S., Ravanbakhsh, S., Poczos, B., Salakhutdinov, R., Smola, A. Deep Sets. In NIPS, 2017.