利用搖滾樂隊學習TensorFlow,Word2Vec模型和TSNE演算法
本文為 AI 研習社編譯的技術博客,原標題 Learn TensorFlow, the Word2Vec model, and the TSNE algorithm using rock bands。
翻譯 | 林子、餘杭、Emily1 校對 | 老趙 整理 | 令雙
藝術家低維嵌入的K-聚類
學習「TensorFlow方式」來構建神經網路似乎是開始機器學習的一大障礙。在本教程中,我們將一步一步地介紹使用Kaggle的Pitchfork數據構建Band s2vec模型時涉及的所有關鍵步驟。
有關完整代碼,請查看GitHub頁面:
https://github.com/patricoferris/machinelearning/blob/master/word2vec/Pitchfork.ipynb
Word2VEC模型
神經網路消耗數字併產生數字。他們非常擅長。但是給他們一些文本,他們會發脾氣,什麼也不做。如果神經網路的任務是壓縮數字併產生有意義的輸出,那麼我們的工作就是確保我們所輸入的任何東西都是有意義的。這種尋求有意義的信息促成了Word2Vec模型。
使用詞的一種方法是形成一個one-hot編碼向量。創建一個長(在辭彙表中的不同單詞的數量)的零值列表,並且每個單詞指向這個列表的唯一索引。如果我們看到這個單詞,就讓這個索引成為列表中的一項。
雖然這種方法是有效的,但它需要很大的空間,完全沒有意義。「好的」和「優秀」類似於「鴨子」和「黑洞」。如果只有一種方式來矢量化單詞,以便我們保持這種上下文相似性…
很開心,這兒有辦法!
通過使用神經網路,我們可以生成單詞的『嵌入』。而這些向量表示的是從我們網路中的連接權重中提取的每個唯一的單詞。
但問題仍然存在:我們如何確保它們有意義? 答案是輸入成對的單詞作為目標單詞和上下文單詞。不斷重複這個過程,同時也輸入一些不好的例子,神經網路就會開始學習到哪些單詞會一起出現以及這些單詞是如何形成一個圖形的。這就如同一個由上下文關聯詞語組成的社交網路。「好」可以關聯到「有幫助的」,還可以再關聯到「關心的」。而我們的任務就是把這些數據輸入到神經網路中。
最常見的方法之一是Skipgram模型,基於在文本數據集上移動窗口來生成這些目標上下文配對。但是,如果我們的數據不是句子,但我們仍然具有語境意義呢?在本教程中,我們的單詞是藝術家姓名,我們的上下文是流派和平均評論分數。如果藝術家a和b同屬一個流派並且具有相似的平均評論分數,我們希望他們有所關聯。讓我們開始吧。
建立數據集
Pitchfork是一個美國音樂雜誌網站。該網站主要有搖滾、獨立和新音樂。他們的網站上刪除了已經一些發給Kaggle的數據。這些信息包含與每個藝術家相關的評論、流派和日期等。
讓我們創建一個藝術家類,並用字典來存儲我們想要的所有有用的信息。
現在,我們想建立符合目標上下文的流派與平均分數一一對應的關係。要做到這一點,我們將創建兩個字典:一個是不同的獨特的類型,另一個是分數(離散到整數)。
我們將把所有的藝術家添加到這些詞典中的相應類型和平均分數中,以便以後在生成藝術家成對時使用。
在進入TensorFlow代碼之前的最後一步:生成批處理!批處理就像我們的神經網路將用於每個時期的數據樣本。一個時期是一個掃描橫跨神經網路在訓練階段。我們要生成兩個numpy數組。其中包含以下代碼:
TensorFlow
這裡有無數的TensorFlow教程和知識來源。這些優秀文章(https://medium.freecodecamp.org/search?q=tensorflow)中的任何一個都會幫助你。這些文檔是很好的參考資料。下面的代碼主要基於word2vec教程,來自於TensorFlow。希望我可以揭秘其中的一些,我把它歸結為一些要點。
第一步是理解「圖形」含義。這對於TensorBoard可視化和在神經網路內創建數據流的心理圖像是非常有用的。
花些時間閱讀下面的代碼和注釋。在將數據送到神經網路之前,我們必須初始化我們要使用的所有部分。佔位符是輸入我們所給的「feed_dict」。這些變數是我們最終會調整的圖表的可變部分。我們的模型中最重要的部分是損失函數。這是我們如何很好的做評估,以及我們如何可以提高的寶庫。
雜訊對比估計(NCE)是一種損失函數。通常我們會使用交叉熵和softmax,但是在自然語言處理中,我們所有的類都是一個個單一獨立的詞。
計算方面,這是糟糕的。NCE將問題的框架從類的概率改變到目標上下文匹配是否正確(二進位分類)。它做了一個真正的配對,然後樣本得到壞的配對,常數
| num_sampled


※用 OpenCV 檢測圖像中各物體大小
※通向分散式深度學習系統
TAG:AI研習社 |