論文:《Learning Fashion Compatibility with Bidirectional LSTMs》
論文地址:https://arxiv.org/abs/1707.05691
代碼地址:https://github.com/xthan/polyvore
聯系方式:
Github:https://github.com/ccc013
知乎專欄:機器學習與計算機視覺,AI 論文筆記
微信公眾號:AI 算法筆記
1. 簡介
時尚搭配推薦的需求越來越大,本文是基於兩個方面的時尚推薦:
- 給定已有的服飾,推薦一件空缺的衣服,從而形成一套搭配,即在已經有上衣、褲子的情況下推薦一雙鞋子;
- 根據多種形式的輸入,比如文本或者一件衣服圖片,生成一套搭配;
目前存在的難點在於:如何對不同時尚類別的單品通過簡單計算視覺相似性來建模和推理其匹配性關系。
目前相關的工作,大部分主要集中在對服飾解析、服飾識別和服飾搜索這三個方向的工作,而對於少量做服飾推薦的工作,也存在這些問題:
- 沒有考慮做一套搭配的推薦;
- 只能支持上述兩個方向的其中一種,即要不只是推薦一套搭配或者對已有的搭配推薦缺失的一件衣服;
- 目前還沒有工作可以支持多種形式的輸入,比如可以輸入關鍵詞,或者輸入圖片,或者圖片+關鍵詞的輸入形式;
對於一套合適的搭配,如下圖所示,本文認為應該滿足這兩個關鍵屬性:
- 這套搭配中的任意一件服飾應該是視覺上匹配並且是形似風格的;
- 搭配不能存在重復類型的服飾,比如包含兩雙鞋子或者兩條褲子;

目前相關在做搭配推薦的工作中,主要嘗試的方法有:
- 利用語義屬性,即規定了哪些衣服之間是匹配的,但是這種需要對數據進行標記,代價很大而且沒辦法大量使用;
- 利用度量學習來學習一對時尚單品之間的距離,但是這只能學習兩兩之間的匹配性,而非一套搭配;
- 對於 2 的改進是采用投票策略,但是同樣是計算代價非常的大,而且也沒辦法利用好集合中所有單品的一致性;
為了解決上述的問題,本文提出了通過一個端到端的框架來聯合學習視覺語義向量(visual-semantic embedding) 和服飾物品之間的匹配性關系,下圖就是本文的整體框架。
首先是利用 Inception-V3 模型作為特征提取器,將輸入圖片轉成特征向量,然后采用一層共 512 個隱藏單元的雙向 LSTM(Bi-LSTM)。之所以采用雙向 LSTM,是因為作者認為可以將一套搭配當做是一個特定順序的序列,搭配中的每件衣服就是一個時間點(time step)。在每個時間點,Bi-LSTM 模型將根據之前的圖片來預測下一張圖片。
另外,本文的方法還通過將圖片特征映射到一個語義表示來學習一個視覺語義向量,它不僅提供了語義屬性和類型信息作為訓練 LSTM 的輸入和正則化方法,還可以實現對用戶的多種形式輸入來生成一套搭配。
訓練好模型后,本文通過三個任務來評估模型,如下圖所示,分別是:
- Fill in the blank:給定一套缺失某件衣服的搭配,然后給定四個選擇,讓模型選擇最匹配當前搭配的服飾單品;
- 搭配生成:根據多種輸入來生成一套搭配,比如文本輸入或者一張服飾圖片;
- 匹配性的預測:給定一套搭配,給出其匹配性得分。
2. Polyvore數據集
本文實驗采用的是一個叫做 Polyvore 的數據集。Polyvore 是一個有名的流行時尚網站,用戶可以在網站里創建和上次搭配數據,這些搭配包含了很豐富的多種形式的信息,比如圖片和對單品的描述、對該搭配的喜歡數、搭配的一些哈希標簽。
Polyvore 數據集總共有 21889 套搭配,本文將其划分成訓練集、驗證集和測試集,分別是 17316、1497 和 3076 套。
這里參考了論文《 Mining Fashion Outfit Composition Using An End-to-End Deep Learning Approach》,使用一個中圖分割算法保證訓練集、驗證集和測試集不存在重復的衣服,另外對於包含太多單件的搭配,為了方便,僅保留前 8 件衣服,因此,數據集總共包含了 164,379個樣本,每個樣本是包含了圖片以及其文本描述。
對於文本描述的清理,這里刪除了出現次數少於 30 次的單詞,並構建了一個 2757 個單詞的詞典。
另外 Polyvore 數據集的衣服是有一個固定的順序的——一般是tops、bottoms、shoes 以及 accessories,對於 tops 的順序也是固定的,一般是 shirts 或者 t-shirts,然后是外套,而 accessories 的順序一般是手提包、帽子、眼鏡、手表、項鏈、耳環等;
因此,這種固定順序可以讓 LSTM 模型學習到時間的信息。
3. 方法
3.1 Fashion Compatibility Learning with Bi-LSTM
第一部分介紹的是基於雙向 LSTM 的服飾匹配性學習。這主要是利用了 LSTM 模型的特性,它們可以學習到兩個時間點之間的關系,同時使用由不同細胞調節的記憶單元,有助於利用長期的時間依賴性。
基於這個特性,本文將一套搭配看作一個序列,搭配中的每個圖片就是一個獨立的時間點,然后利用 LSTM 來對搭配的視覺搭配關系進行建模。
給定一套搭配,$F={x_1, x_2, \cdots, x_N}$,其中 $x_t$ 是搭配中第 t 個衣服經過 CNN 后,提取到的特征。在每個時間點,先采用前向的 LSTM 對給定的圖片預測其下一張圖片,這種做法學習兩個時間點的關系相當於在學習兩件衣服之間的匹配關系。
這里使用的 loss 函數如下所示:
其中 $\theta_f $表示前向預測模型中的模型參數,而 $P_r(\cdot)$ 是 LSTM 模型計算的,表示基於之前的輸入來預測得到 $x_{t+1}$ 的概率。
更詳細點說,LSTM 將輸入映射到輸出也是通過以下一系列的隱藏狀態,計算公式如下:
其中 $x_t, h_t$ 分別表示輸入和輸出向量,其他的 $i_t, f_t, c_t, o_t$ 分別表示輸入門、遺忘門、記憶單元和輸出門的激活向量。
參考論文《 Recurrent neural network based language model》中使用 softmax 輸出來預測一個句子中下一個單詞,本文也是在 $h_t$ 之后增加了一個 softmax 層來計算下一件衣服出現的概率:
其中$X$ 表示的是當前 batch 的所有圖片,這種做法可以讓模型在看到多種樣本后學習到具有區分度的風格和匹配性信息,另外,實際上可以讓 $X$ 表示整個數據集,但是本文沒有考慮這種做法的原因是數據集的數量太多以及圖片特征的維度太大。只是限制在一個 batch 內可以提高訓練的速度。
除了可以正向預測衣服,實際上也可以反向預測衣服,比如對於一條褲子,其下一件衣服可以是上衣或者是鞋子,所以可以有一個反向 LSTM :
這里的 $P_r(\cdot)$ 計算方式如下:
注意,這里在 F 中會添加兩個零向量 $x_0, x_{N+1}$ ,作用是讓雙向 LSTM 知道何時停止預測下一件衣服。
一般來說,一套搭配通常都是同種風格衣服的集合,即有相似的風格,比如顏色或者紋理,而本文的做法,將搭配當做一種固定順序的序列來學習,即可以學到搭配的匹配性,也能學習到搭配的整體風格(主要是通過記憶單元來學習)。
3.2 Visual-semantic Embedding
第二部分是視覺-語義向量的學習。
通常對於服飾推薦,都會有多種形式的輸入,比如圖片或者文本描述類型,所以很有必要學習一個文本和圖片的多模態向量空間。
本文沒有選擇比較耗時耗力的人工標注圖片的標簽屬性方式,而是采用弱標注的網絡數據(weakly-labeled web data),即數據集自帶的每張圖片的文本描述信息。根據這個信息,本文根據論文《Unifying visual semantic embeddings with multimodal neural language models》里常用的對圖片-文本對構建模型的方法,將圖片和其文本描述映射到一個聯合空間,訓練得到一個視覺-語義向量。
這里給出一些定義,令 $S={w_1,w_2,\cdots, w_M}$ 表示文本描述,其中 $w_i$ 表示單詞,然后將其用一個 one-hot 向量 $e_i$ 進行表示,然后映射到向量空間 $v_i = W_T \cdot e_i$,其中 $W_T$ 表示詞向量矩陣,所以最終這個文本描述的表示就是
$$
v=\frac{1}{M}\sum_i v_i
$$
而圖片向量表示為:
$$
f=W_I\cdot x
$$
在視覺-語言向量空間,本文會采用余弦相似性來評估圖片和其文本描述的相似性:
$$
d(f,v) = f\cdot v
$$
其中 f 和 v 都會進行歸一化,因此對於視覺-語義向量學習會用一個對比損失(contrastive loss) 進行優化:
$$
E_e(\theta_e)=\sum_f \sum_k max(0, m-d(f,v)+d(f,v_k)) + \sum_v\sum_k max(0, m-d(v,f)+d(v,f_k))
$$
其中 $\theta_e={W_I, W_T}$ 表示模型參數,$v_k$ 表示和 f 不匹配的文本描述,而$f_k$ 表示和 v 不匹配的圖片。所以最小化上述 loss 來達到讓圖片向量 f 和其文本描述 v 的距離,比 f 到不匹配的文本描述 $v_k$ 的距離要更近一個間隔 m ,對 v 也是相同的實現效果。在訓練過程中,同個 batch 中這種不匹配的樣本例子是用於優化上述 loss,這種做法使得具有相似語義屬性和風格的服飾在學習到的向量空間中距離更近。
3.3 Joint Modeling
這里是將上述兩種操作都聯合起來,即同時學習搭配的匹配性和視覺-語義向量,因此整體的目標函數如下所示:
其中前兩個就是雙向 LSTM 的目標函數,第三個則是計算視覺語義向量 loss。整個模型的訓練可以通過 Back-Propagation through time(BPTT) 來實現。對比標准的雙向 LSTM,唯一的區別就是 CNN 模型的梯度是兩個來源的平均值(即 LSTM 部分和視覺語義向量學習),這讓 CNN 同時也可以學習到有用的語義信息。
4. 實驗
4.1 實現細節
- 雙向 LSTM:采用 InceptionV3 模型,輸出 2048 維的 CNN 特征,然后經過一個全連接層,輸出 512 維的特征,然后輸入到 LSTM,LSTM 的隱藏單元數量是 512,設置 dropout 概率是 0.7;
- 視覺-語義向量:聯合向量空間的維度是 512 維,所以 $W_I$ 的維度是 $2048\times 512$ ,$W_T$ 的維度是 $2757\times 512$ ,2757 是字典的數量,然后令間隔 m=0.2
- 聯合訓練:初始學習率是 0.2,然后衰減因子是 2,並且每 2 個 epoch 更新一次學習率;batch 大小是 10,即每個 batch 包含 10 套搭配序列,大概 65 張圖片以及相應的文本描述,然后會微調網絡的所有層,當驗證集 loss 比較穩定的時候會停止訓練。
4.2 幾種不同實驗的結果
對於 fill in the blank,實驗結果如下:
一些好的例子和不好的例子:

對於搭配匹配性預測,一些預測的例子如下所示:

對於搭配生成,第一種實現是輸入的只是衣服圖片,如下所示:
- 給定單張圖片,那么就如 a 圖所示,同時執行兩個方向的 LSTM,得到一套完整的搭配;
- 如果是給定多張圖片,如 c 圖所示,兩張圖片,那么會先進行一個類似 fill in the blank 的操作,先預測得到兩張圖片之間的衣服,然后如 d 所示,再進行預測其他位置的衣服,得到完整的搭配;
如果是輸入衣服和文本描述,如下所示:
這種輸入的實現,首先會基於給定的衣服圖片生成一套初始的搭配,然后對於給定的輸入文本描述 $v_q$ ,在初始搭配中的非查詢衣服 $f_i$ 會進行更新,更新方式為 $argmin_f d(f, f_i+v_q)$ ,所以更新后的衣服圖片將不僅和原始衣服相似,還會在視覺語義向量空間里和輸入的查詢文本距離很接近。
或者是只輸入文本描述,如下所示:
- 第一種場景,即前兩行的圖片例子,輸入的文本描述是衣服的一種屬性或者風格,首先最接近文本描述的衣服圖片會被當做是查詢圖片,然后Bi-LSTM 將通過這張圖片來生成一套搭配,接着是會基於給定的圖片和文本輸入更新搭配;
- 第二種場景,即后面兩行圖片例子,給定的文本描述是指向某種衣服類別,所以會根據文本描述檢索相應的衣服圖片,然后作為查詢圖片來生成搭配。