- 原文地址:The Introduction of StarSpace
- 原文做者:Facebook
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:Noah Gao Sean Wang
- 校對者:ryouaki
StarSpace 是一個用於解決各類問題、進行高效的實體嵌入(譯者注:entity embeddings,一種流行的類別特徵處理方法)學習的通用神經網絡模型:php
在通常狀況下,它會學習如何將不一樣類型的對象表示爲一個常見的矢量嵌入空間, 從名稱中的星號('*',通配符)和空格開始,並在該空間中將它們相互比較。 它還會學習對給定查詢數據的一組實體/文檔或對象進行排序,查詢所用的數據不必定與該集合中的項目類型相同。html
看一看 這篇論文 來進一步瞭解它是如何工做的。前端
StarSpace 可在現代的 Mac OS 和 Linux 發行版上構建。鑑於它使用了 C++11 的特性,因此他須要與一個具備良好的 C++11 支持的編譯器。包括:android
編譯將會藉助一個 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 的話,按順序執行:後端
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 支持下列幾種訓練模式(默認是第一個):
用途: 學習從短文到相關主題標籤的映射,例如,在 這篇文章 中的描述。這是一個典型的分類應用。
模型: 經過學習二者的嵌入,學習的映射從單詞集到標籤集。 例如,輸入「restaurant has great food <\tab> #restaurant <\tab> #yum」將被翻譯成下圖。(圖中的節點是要學習嵌入的實體,圖中的邊是實體之間的關係。
輸入文件的格式:
restaurant has great food #yum #restaurant
複製代碼
命令:
$./starspace train -trainFile input.txt -model tagspace -label '#'
複製代碼
咱們將該模型應用於 AG的新聞主題分類數據集 的文本分類問題。在這一問題中咱們的標籤是新聞文章類別,咱們使用 hit@1 度量來衡量分類的準確性。這個示例腳本 下載數據並在示例目錄下運行StarSpace模型:
$bash examples/classification_ag_news.sh
複製代碼
用途: 在Facebook上,用戶能夠粉(關注)他們感興趣的公共頁面。當用戶瀏覽頁面時,用戶能夠在 Facebook 上收到全部頁面發佈的內容。 咱們但願根據用戶的喜好數據學習頁面嵌入,並用它來推薦用戶可能感興趣(可能關注)的新頁面。 這個用法能夠推廣到其餘推薦問題:例如,根據過去觀看的電影記錄學習嵌入,向用戶推薦電影; 根據過去用戶登陸的餐廳學習嵌入,向用戶推薦餐館等。
模型: 用戶被表示爲他們關注的頁面(粉了)。也就是說,咱們不直接學習用戶的嵌入,相反,每一個用戶都會有一個嵌入,這個嵌入就是用戶煽動的頁面的平均嵌入。頁面直接嵌入(在字典中具備獨特的功能)。在用戶數量大於頁面數量的狀況下,這種設置能夠更好地工做,而且每一個用戶喜歡的頁面平均數量較少(即用戶和頁面之間的邊緣相對稀疏)。它也推廣到新用戶而無需再從新訓練。 也可使用更傳統的推薦設置。
每一個用戶都由用戶展開的集合表示,每一個訓練實例都是單個用戶。
輸入文件格式:
page_1 page_2 ... page_M
複製代碼
在訓練時,在每一個實例(用戶)的每一個步驟中,選擇一個隨機頁面做爲標籤量,而且剩餘的頁面被選擇爲輸入量。 這能夠經過將標誌 -trainMode 設置爲 1 來實現。
命令:
$./starspace train -trainFile input.txt -model pagespace -label 'page' -trainMode 1
複製代碼
用途: 咱們但願根據用戶的歷史喜愛和點擊數據爲用戶生成嵌入和推薦網絡文檔。
模型: 每一個文件都由文件的一個集合來表示。 每一個用戶都被表示爲他們過去喜歡/點擊過的文檔(集合)。 在訓練時,在每一步選擇一個隨機文件做爲標籤量,剩下的文件被選爲輸入量。
輸入文件格式:
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
複製代碼
用途: 學習 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。
這個示例腳本 將會從 這裏 下載 Freebase15k 數據並在其上運行 StarSpace 模型:
$bash examples/multi_relation_example.sh
複製代碼
用途: 學習句子之間的映射。給定一個句子的嵌入,能夠找到語義上類似或相關的句子。
模型: 每一個例子是語義相關的句子的集合。 隨機採用 trainMode 3 來選擇兩個:一個做爲輸入,一個做爲標籤,其餘句子被挑選爲隨機的否認。 在沒有標註的狀況下獲取語義相關句子的一個簡單方法是考慮同一文檔中的全部句子是相關的,而後在這些文檔上進行訓練。
這個示例腳本 會下載一些數據,其中每一個示例都是來自同一維基百科頁面的一組語句,並在其上運行StarSpace模型:
$bash examples/wikipedia_sentence_matching.sh
複製代碼
爲了能運行 這篇論文 中提出的 Wikipedia Sentence Matching 問題的完整實驗, 請使用 這個腳本(警告:下載數據和訓練模型須要很長時間):
$bash examples/wikipedia_sentence_matching_full.sh
複製代碼
用途: 學習句子和文章之間的映射關係。給定句子的嵌入,能夠找到相關文章。
模型: 每一個例子都是包含多個文章的句子。 訓練時,隨機選取的句子做爲輸入,那麼文章中剩餘的句子成爲標籤,其餘文章能夠做爲隨機底片。 (trainMode 2).
這個示例腳本 將下載數據,其中的每一個示例都是維基百科的文章,並在其上運行 StarSpace 模型:
$bash examples/wikipedia_article_search.sh
複製代碼
爲了能運行 這篇論文 中提出的 Wikipedia Sentence Matching 問題的完整實驗, 請使用 這個腳本(提示:這將須要一些時間去下載數據並訓練模型):
$bash examples/wikipedia_article_search_full.sh
複製代碼
經過最新的更新,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 約束內的全部單詞。
咱們還爲 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 ) 指定要搜索的最近相鄰量。
加載模型後,它讀取一行實體(能夠是一個單詞或一個句子/文檔),並在嵌入空間輸出最近的實體。
因爲模型中使用的 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}
}
複製代碼
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。