[譯] Facebook 的 AI 萬金油:StarSpace 神經網絡模型簡介

Facebook 的 AI 萬金油:StarSpace 神經網絡模型簡介

StarSpace 是一個用於解決各類問題、進行高效的實體嵌入(譯者注:entity embeddings,一種流行的類別特徵處理方法)學習的通用神經網絡模型:php

  • 學習單詞、句子或是文檔級別的嵌入。
  • 信息檢索:對實體或文檔的集合完成排序,例如:Web 文檔的排名。
  • 文本分類或是其餘打標籤形式的任務。
  • 度量學習、類似性學習,例如:對句子或文檔的類似性進行學習。
  • 基於內容或是協同過濾進行推薦,例如:推薦音樂和視頻。
  • 圖嵌入,例如:完成像 Freebase 同樣的多關係圖。
  • 圖片的分類、排名或檢索(例如:使用已存在的 ResNet 特性)。

在通常狀況下,它會學習如何將不一樣類型的對象表示爲一個常見的矢量嵌入空間, 從名稱中的星號('*',通配符)和空格開始,並在該空間中將它們相互比較。 它還會學習對給定查詢數據的一組實體/文檔或對象進行排序,查詢所用的數據不必定與該集合中的項目類型相同。html

看一看 這篇論文 來進一步瞭解它是如何工做的。前端

最新消息

  • 使用了新的許可證和專利權聲明:如今 StarSpace 已經開始基於 BSD 許可證。閱讀 LICENSE 文件PATENTS 文件 可得到更多信息。
  • 咱們新增了對實值輸入和標籤權重的支持:閱讀 文件格式ImageSpace 來獲取更多有關如何在輸入和標籤中使用權重的信息。

依賴

StarSpace 可在現代的 Mac OS 和 Linux 發行版上構建。鑑於它使用了 C++11 的特性,因此他須要與一個具備良好的 C++11 支持的編譯器。包括:android

  • gcc-4.6.3 以上或是 clang-3.3 以上

編譯將會藉助一個 Makefile 文件來執行,因此你須要一個能正常工做的 make 命令。ios

你還須要安裝一個 Boost 庫並在 makefile 中指定 boost 庫的路徑譯運行 StarSpace。簡單地來講就是:git

$wget https://dl.bintray.com/boostorg/release/1.63.0/source/boost_1_63_0.zip
$unzip boost_1_63_0.zip
$sudo mv boost_1_63_0 /usr/local/bin
複製代碼

可選步驟:若是你但願能在 src 目錄中運行單元測試,你會須要 google test 並將 makefile 中的 'TEST_INCLUDES' 配置爲它的路徑。github

構建 StarSpace

想要構建 StarSpace 的話,按順序執行:後端

git clone https://github.com/facebookresearch/Starspace.git
cd Starspace
make
複製代碼

文檔格式

StarSpace 經過如下格式進行文件的輸入。 每一行都做爲一個輸入例子,在最簡單的狀況下,輸入有 k 個單詞,後面跟着的每一個標籤也是一個獨立的單詞:bash

word_1 word_2 ... word_k __label__1 ... __label__r
複製代碼

這種描述格式與 fastText 同樣,默認狀況下,標籤是以字符串 __label__ 爲前綴的單詞,前綴字符串能夠由 -label 參數來設置。網絡

執行這條命令來學習這種嵌入:

$./starspace train -trainFile data.txt -model modelSaveFile
複製代碼

這裏的 data.txt 是一個包含utf-8編碼文本的訓練文件。在優化結束時,程序將保存兩個文件:model 和 modelSaveFile.tsv。modelSaveFile.tsv 是一個包含實體嵌入向量的標準tsv格式文件,每行一個。modelSaveFile 是一個二進制文件,包含模型的參數以及字典,還包括全部超參數。二進制文件稍後可用於計算實體嵌入的向量或運行評估任務。

在更廣泛的狀況下,每一個標籤也會包含單詞:

word_1 word_2 ... word_k <tab> label_1_word_1 label_1_word_2 ... <tab> label_r_word_1 ..
複製代碼

嵌入向量將學習每一個單詞和標籤,並將類似的輸入和標籤組合在一塊兒。

爲了學習更通常狀況下的嵌入,每一個標籤由單詞組成,須要指定 -fileFormat 標誌爲」labelDoc」,以下所示:

$./starspace train -trainFile data.txt -model modelSaveFile -fileFormat labelDoc
複製代碼

咱們還能夠經過將參數 -useWeight 設置爲 true(默認爲 false)來擴展文件格式以支持實值權值(在輸入和標籤空間中)。若是 -useWeight 爲 true,咱們支持使用如下格式定義權重。

word_1:wt_1 word_2:wt_2 ... word_k:wt_k __label__1:lwt_1 ...    __label__r:lwt_r
複製代碼

例如,

dog:0.1 cat:0.5 ...
複製代碼

對於不包括權重的任意單詞和標籤,其默認權重爲 1。

訓練模式

StarSpace 支持下列幾種訓練模式(默認是第一個):

  • trainMode = 0:
    • 每一個實例都包括輸入和標籤。
    • 若是文件格式是‘fastText’,那麼標籤會有特定的獨立特徵或是單詞(例如,帶有 __label__前綴,參見上面的 文件格式 一節。
    • 用例: 分類任務,參見後面的 TagSpace 示例。
    • 若是文件格式是‘labelDoc’那麼這些標籤就是特徵包,其中一個包被選中(參見上面的 文件格式 一節)。
    • 用例: 檢索/搜索任務,每一個例子包括一個後跟了一組相關文件的查詢。
  • trainMode = 1:
    • 每一個示例都包含一組標籤。在訓練時,隨機選取集合中的一個標籤做爲標籤量,其他標籤做爲輸入。
    • 用例: 基於內容或協同過濾進行推薦,參見後面的 PageSpace 示例。
  • trainMode = 2:
    • 每一個示例都包含一組標籤。在培訓的時候,隨機選取一個來自集合的標籤做爲輸入量,集合中其他的標籤成爲標籤量。
    • 用例: 學習從一個對象到它所屬的一組對象的映射,例如,從句子(文檔內的)到文檔。
  • trainMode = 3:
    • 每一個示例都包含一組標籤。在訓練時,隨機選取集合中的兩個標籤做爲輸入量和標籤量。
    • 用例: 從相似對象的集合中學習成對的類似性,例如:句子的類似性。
  • trainMode = 4:
    • 每一個示例都包含兩個標籤。在訓練時,集合中的第一個標籤將被選爲輸入量,第二個標籤將被選爲標籤量。
    • 用例: 從多關係圖中學習。
  • trainMode = 5:
    • 每一個示例只包含輸入量。在訓練期間,它會產生多個訓練樣例:從輸入的每一個特徵被選爲標籤量,其餘特徵(到距離 ws(譯者注:單詞級別訓練的上下文窗口大小,一個可選的輸入參數))被挑選爲輸入特徵。
    • 用例: 經過無監督的方式學習單詞嵌入。

典型用例

TagSpace 單詞、標籤的嵌入

用途: 學習從短文到相關主題標籤的映射,例如,在 這篇文章 中的描述。這是一個典型的分類應用。

模型: 經過學習二者的嵌入,學習的映射從單詞集到標籤集。 例如,輸入「restaurant has great food <\tab> #restaurant <\tab> #yum」將被翻譯成下圖。(圖中的節點是要學習嵌入的實體,圖中的邊是實體之間的關係。

word-tag

輸入文件的格式:

restaurant has great food #yum #restaurant
複製代碼

命令

$./starspace train -trainFile input.txt -model tagspace -label '#'
複製代碼

示例腳本:

咱們將該模型應用於 AG的新聞主題分類數據集 的文本分類問題。在這一問題中咱們的標籤是新聞文章類別,咱們使用 hit@1 度量來衡量分類的準確性。這個示例腳本 下載數據並在示例目錄下運行StarSpace模型:

$bash examples/classification_ag_news.sh
複製代碼

PageSpace 用戶和頁面的嵌入

用途: 在Facebook上,用戶能夠粉(關注)他們感興趣的公共頁面。當用戶瀏覽頁面時,用戶能夠在 Facebook 上收到全部頁面發佈的內容。 咱們但願根據用戶的喜好數據學習頁面嵌入,並用它來推薦用戶可能感興趣(可能關注)的新頁面。 這個用法能夠推廣到其餘推薦問題:例如,根據過去觀看的電影記錄學習嵌入,向用戶推薦電影; 根據過去用戶登陸的餐廳學習嵌入,向用戶推薦餐館等。

模型: 用戶被表示爲他們關注的頁面(粉了)。也就是說,咱們不直接學習用戶的嵌入,相反,每一個用戶都會有一個嵌入,這個嵌入就是用戶煽動的頁面的平均嵌入。頁面直接嵌入(在字典中具備獨特的功能)。在用戶數量大於頁面數量的狀況下,這種設置能夠更好地工做,而且每一個用戶喜歡的頁面平均數量較少(即用戶和頁面之間的邊緣相對稀疏)。它也推廣到新用戶而無需再從新訓練。 也可使用更傳統的推薦設置。

user-page

每一個用戶都由用戶展開的集合表示,每一個訓練實例都是單個用戶。

輸入文件格式

page_1 page_2 ... page_M
複製代碼

在訓練時,在每一個實例(用戶)的每一個步驟中,選擇一個隨機頁面做爲標籤量,而且剩餘的頁面被選擇爲輸入量。 這能夠經過將標誌 -trainMode 設置爲 1 來實現。

命令

$./starspace train -trainFile input.txt -model pagespace -label 'page' -trainMode 1
複製代碼

DocSpace 文檔推薦

用途: 咱們但願根據用戶的歷史喜愛和點擊數據爲用戶生成嵌入和推薦網絡文檔。

模型: 每一個文件都由文件的一個集合來表示。 每一個用戶都被表示爲他們過去喜歡/點擊過的文檔(集合)。 在訓練時,在每一步選擇一個隨機文件做爲標籤量,剩下的文件被選爲輸入量。

user-doc

輸入文件格式

roger federer loses <tab> venus williams wins <tab> world series ended
i love cats <tab> funny lolcat links <tab> how to be a petsitter  
複製代碼

每行是一個用戶,每一個文檔(由標籤分隔的文檔)是他們喜歡的文檔。 因此第一個用戶喜歡運動,而第二個用戶對這種狀況感興趣。

命令

./starspace train -trainFile input.txt -model docspace -trainMode 1 -fileFormat labelDoc
複製代碼

GraphSpace 知識庫中的連接預測

用途: 學習 Freebase 中的實體與關係之間的映射。在 freebase 中,數據以格式輸入。

(head_entity, relation_type, tail_entity)
複製代碼

執行連接預測能夠將數據格式化爲填充不完整的三元組

(head_entity, relation_type, ?) or (?, relation_type, tail_entity)
複製代碼

模型: 咱們學習全部實體和關係類型的嵌入。對於每個 realtion_type,咱們學習兩個嵌入:一個用於預測給定 head_entity 的 tail_entity,一個用於預測給定 tail_entity 的 head_entity。

multi-rel

示例腳本:

這個示例腳本 將會從 這裏 下載 Freebase15k 數據並在其上運行 StarSpace 模型:

$bash examples/multi_relation_example.sh
複製代碼

SentenceSpace 學習句子的嵌入

用途: 學習句子之間的映射。給定一個句子的嵌入,能夠找到語義上類似或相關的句子。

模型: 每一個例子是語義相關的句子的集合。 隨機採用 trainMode 3 來選擇兩個:一個做爲輸入,一個做爲標籤,其餘句子被挑選爲隨機的否認。 在沒有標註的狀況下獲取語義相關句子的一個簡單方法是考慮同一文檔中的全部句子是相關的,而後在這些文檔上進行訓練。

sentences

示例腳本:

這個示例腳本 會下載一些數據,其中每一個示例都是來自同一維基百科頁面的一組語句,並在其上運行StarSpace模型:

$bash examples/wikipedia_sentence_matching.sh
複製代碼

爲了能運行 這篇論文 中提出的 Wikipedia Sentence Matching 問題的完整實驗, 請使用 這個腳本(警告:下載數據和訓練模型須要很長時間):

$bash examples/wikipedia_sentence_matching_full.sh
複製代碼

ArticleSpace 學習句子和文章嵌入

用途: 學習句子和文章之間的映射關係。給定句子的嵌入,能夠找到相關文章。

模型: 每一個例子都是包含多個文章的句子。 訓練時,隨機選取的句子做爲輸入,那麼文章中剩餘的句子成爲標籤,其餘文章能夠做爲隨機底片。 (trainMode 2).

示例腳本:

這個示例腳本 將下載數據,其中的每一個示例都是維基百科的文章,並在其上運行 StarSpace 模型:

$bash examples/wikipedia_article_search.sh
複製代碼

爲了能運行 這篇論文 中提出的 Wikipedia Sentence Matching 問題的完整實驗, 請使用 這個腳本(提示:這將須要一些時間去下載數據並訓練模型):

$bash examples/wikipedia_article_search_full.sh
複製代碼

ImageSpace 學習圖像和標籤的嵌入

經過最新的更新,StarSpace 也能夠用來學習圖像和其餘實體的嵌入。例如,可使用 ResNet 特徵(預先訓練的 ResNet 模型的最後一層)來表示圖像,並將圖像和其餘實體(單詞,主題標籤等)一塊兒嵌入。就像 StarSpace 中的其餘實體同樣,圖像能夠在輸入或標籤上,這取決於不一樣的任務。

這裏咱們給出一個使用 CIFAR-10 的例子以說明咱們如何與其餘實體進行圖像訓練 (在這個例子中,指爲圖像類):咱們訓練模型 ResNeXt 在 CIFAR-10 在測試數據集上達到 96.34% 的準確率,並將最後一層 ResNet 做爲每幅圖像的特徵。咱們使用 StarSpace 將 10 個圖像類與圖像特徵一塊兒嵌入到相同的空間中。對於最後一層(0.8,0.5,...,1.2)的類 1 的示例,咱們將其轉換爲如下格式:

d1:0.8  d2:0.5   ...    d1024:1.2   __label__1
複製代碼

將 CIFAR-10 的訓練和測試例轉換成上述格式後,咱們運行 這個示例腳本

$bash examples/image_feature_example_cifar10.sh
複製代碼

平均每 5 次達到 96.56% 的準確度。

完整的參數文檔

運行 "starspace train ..." 或 "starspace test ..."

    如下參數是訓練時必須的:
      -trainFile       訓練文件路徑。
      -model           模型文件輸出路徑。

    如下參數是訓練時必須的:
      -testFile        測試文件路徑。
      -model           模型文件路徑。

    如下是字典相關的可選參數:
      -minCount        單詞量的最少個數,默認爲 1。
      -minCountLabel   標籤量的最少個數,默認爲 1。
      -ngrams          單詞元數的最大長度,默認爲 1。
      -bucket          buckets 的數量,默認爲 2000000。
      -label           標籤量前綴,默認爲 __label__,可參加文件格式一節。

    如下參數是訓練時可選的:
      -initModel       若是非空,則在 -initModel 中加載先前訓練過的模型並進行訓練。
      -trainMode       選擇 [0, 1, 2, 3, 4, 5] 中的一個值,參見訓練模式一節,默認爲 0。
      -fileFormat      當前支持‘fastText’和‘labelDoc’,參見文件格式一節,默認爲 fastText。
      -saveEveryEpoch  在每次迭代後保存中間模型,默認爲 false。
      -saveTempModel   在每次迭代以後用包括迭代詞的的惟一名字保存中間模型,默認爲 false。
      -lr              學習速度,默認爲 0.01。
      -dim             嵌入矢量的大小,默認爲 10。
      -epoch           迭代次數,默認爲 5。
      -maxTrainTime    最長訓練時間(秒),默認爲 8640000。
      -negSearchLimit  抽樣中的拒絕上限,默認爲 50。
      -maxNegSamples   一批更新中的拒絕上限,默認爲 10。
      -loss            loss 函數,多是 hinge 或 softmax 中的一個,默認爲 hinge。
      -margin          hinge loss 的邊緣參數。只在 loss 爲 hinge 時有意義,默認爲0.05。
      -similarity      選擇 [cosine, dot] 中的一個,用於在 hinge loss 選定類似度函數。
                       只在 loss 爲 hinge 時有意義,默認爲 cosine。
      -adagrad         是否在訓練中使用 adagrad,默認爲 1。
      -shareEmb        是否對LHS和RHS使用相同的嵌入矩陣,默認爲 1。
      -ws              在 trainMode 5 時有效,單詞級別訓練的上下文窗口大小,默認爲 5。
      -dropoutLHS      LHS特徵的放棄機率,默認爲 0。
      -dropoutRHS      RHS特徵的放棄機率,默認爲 0。
      -initRandSd      嵌入的初始值是從正態分佈隨機生成的,其中均值爲 0,標準差爲 initRandSd,默認爲 0.001。

    如下參數是測試時可選的:
      -basedoc         一組標籤的文件路徑與真實標籤進行比較。 -fileFormat='labelDoc' 時須要。
                       在 -fileFormat ='fastText' 且 不提供 -basedoc 的狀況下,咱們將會對真正的標籤與字典中的全部其餘標籤進行比較。
      -predictionFile  保存預測的文件路徑。若是不爲空,則將保存每一個示例的前K個預測。
      -K               若是 -predictionFile 參數非空,爲每一個實例進行的頂層的 K 預測將被保存。

    如下參數是可選的:
      -normalizeText   是否爲輸入文件運行基本的文本預處理,默認爲 0,不進行預處理。
      -useWeight       輸入文件是否自帶權重,默認爲 0,不自帶權重。
      -verbose         消息輸出詳細程度,默認爲 0,普通輸出。
      -debug           是否使用調試模式,默認爲 0,關閉調試模式。
      -thread          線程數量,默認爲 10。
複製代碼

注意:咱們使用與在 fastText 中相同的單詞 n-gram 實現。當「-ngrams」被設置爲大於1時,由「-bucket」參數指定的大小的哈希映射被用於 n-gram;當「-ngrams」設置爲 1 時,不使用哈希映射,而且該字典包含 minCount 和 minCountLabel 約束內的全部單詞。

Utility Functions

咱們還爲 StarSpace 提供了一些實用功能:

顯示查詢的預測

檢查通過訓練的嵌入模型質量的一個簡單方法是在鍵入輸入時檢查預測。要構建和使用該實用程序功能,請運行如下命令:

make query_predict
./query_predict <model> k [basedocs]
複製代碼

其中 <model> 指定一個受過訓練的 StarSpace 模型,可選的 K 指定顯示多少個頂部預測(排名第一)。 「basedocs」 指向要排序的文件的文件,也參見上面主要 StarSpace 中同名的參數。若是沒有提供「基類」,則使用詞典中的標籤。

加載模型後,它讀取一行實體(能夠是一個單詞或一個句子/文檔),並輸出預測。

最近相鄰量查詢

檢查訓練好的嵌入模型質量的另外一種簡單方法是檢查實體的最近相鄰量。 要構建和使用該實用程序功能,請運行如下命令:

make query_nn
./query_nn <model> [k]
複製代碼

其中 <model> 指定一個受過訓練的 StarSpace 模型,可選的 K( 默認值是 5 ) 指定要搜索的最近相鄰量。

加載模型後,它讀取一行實體(能夠是一個單詞或一個句子/文檔),並在嵌入空間輸出最近的實體。

打印 Ngrams

因爲模型中使用的 ngram 不是以 tsv 格式保存的,咱們還提供了一個單獨的函數來輸出模型中的 n 元嵌入。要使用它,請運行如下命令:

make print_ngrams
./print_ngrams <model>
複製代碼

其中 <model> 指定了的參數 -ngrams > 1 的受過訓練的StarSpace模型。

打印句子/文檔嵌入

在有時須要從訓練的模型中打印句子或文檔的嵌入時是很是有用的。 要使用它,請運行如下命令:

make embed_doc
./embed_doc <model> [filename]
複製代碼

其中 <model> 指定了訓練過的 StarSpace 模型。若是提供了文件名,則從文件逐行讀取每一個句子/文檔,並相應地輸出向量嵌入。若是沒有提供文件名,它會從 stdin 中讀取每一個句子/文檔。

引用

若是您在工做中使用了 StarSpace,請引用這篇 arXiv 論文

@article{wu2017starspace,
  title={StarSpace: Embed All The Things!},
  author = {{Wu}, L. and {Fisch}, A. and {Chopra}, S. and {Adams}, K. and {Bordes}, A. and {Weston}, J.},
  journal={arXiv preprint arXiv:{1709.03856}},
  year={2017}
}
複製代碼

聯繫咱們


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索