上個周被網易雲音樂的聽歌報告刷屏,文摘菌這才發現,朋友圈不乏年度聽歌成千上萬的音樂重度患者。這群人可能中的不是音樂的毒,而是這套個性化音樂推薦算法真的太懂你。
這也又引起了一波對推薦算法的讨論。本文作者發現了一個有7億多條歌曲的資料集,利用Word2vec,用這個訓練集來訓練機器學習模型,優化我們的音樂推薦結果。
中東和北非地區最大的音樂流媒體平台Anghami每個月産生7億多條歌曲資料流。這也意味着所有這些流媒體産生的大量資料對我們來講是一個寶貴的訓練集,我們可以用這個訓練集來訓練機器學習模型使其更好地了解使用者品味,并優化我們的音樂推薦結果。
在本文中,我們将介紹一個從大量流資料中提取歌曲嵌入資訊的神經網絡方法,以及如何用這一模型生成相關推薦。
每個點代表一首歌曲。點間距離越近,歌曲越相似
<b>什麼是推薦系統?</b>
推薦系統分為兩大類:
基于内容的推薦系統:着眼于需要推薦物品的屬性。對音樂來說,屬性包括歌曲流派、每分鐘節拍數等等。
協同過濾系統:依據使用者曆史資料來推薦其他相似使用者曾經接觸過的物品。這類系統不關注内容本身的屬性,而是基于有很多共同喜愛的歌曲和藝術家的人們通常喜歡相同風格的音樂這一原則進行推薦的。
當有足夠多資料支撐時,協同過濾系統在推薦相關物品方面效果非常好。協同過濾的基本思想是,如果使用者1喜歡藝術家A和B,使用者2喜歡藝術家A、B、C,那麼使用者1可能也會喜歡藝術家C。
觀察所有使用者對全球歌曲的偏好,對使用者-商品評分矩陣應用經典協同過濾方法(如矩陣分解),就可以得到關于不同歌曲組别是如何相關聯的資訊。是以如果一組使用者擁有很多共同喜歡的歌曲,我們可以推斷這些使用者音樂品味很相似,并且他們聽得每首歌曲之間也很相似。
這種涉及多使用者的全球共現現象(global co-occurrence)告訴我們歌曲間是如何聯系起來的。然而它沒有告訴我們的是,歌曲是如何在時間上局部共存的。它們也許會告訴我們喜歡歌曲A的使用者可能也會喜歡歌曲B,但是,這些使用者之前有沒有在同一個歌單或電台聽過這些歌呢?是以檢視使用者在什麼環境播放這些歌比僅僅隻檢視使用者聽過哪些歌的推薦效果會更好。換句話說,他們在同一時間段前後還聽了什麼歌?
是以我們希望有一個模型不僅能捕捉相似使用者通常對哪些歌感興趣,還能捕捉在相似環境下哪些歌頻繁地一起出現。這時需要Word2vec大顯身手了。
<b>什麼是Word2vec?</b>
Word2vec是一種神經網絡模型,起初被用來學習對自然語言處理課題非常有用的詞嵌入(word embeddings)。最近幾年,這項技術被更廣泛地用到其他機器學習問題上,如産品推薦。神經網絡分析輸入的文本語料庫,對詞彙表中的每個單詞生成代表這個單詞的向量。這些向量數字就是我們所需要的,因為這些向量編碼了詞義與上下文的關系這一重要資訊,接下來我們将會看到進一步的解釋。
Word2vec定義了兩個主要模型:CBOW模型(Continuous Bag-of-Words model)和Skip-gram模型(Skip-gram model)。因為本次使用了Skip-gram模型,在接下來的讨論中我們隻涉及這一模型。
Word2vec Skip-gram模型是帶一層隐含層的淺層神經網絡,輸入一個單詞,嘗試預測它的上下文單詞并輸出。以下面這句為例:
在上句中,“back-alleys”是我們目前的輸入單詞;
“little”,“dark”,“behind”和“the”是我們想得到的預測結果輸出單詞。
神經網絡如下:
W1和W2表示權重矩陣,代表從輸入得到輸出時依次轉換的權重。訓練神經網絡包括學習這些權重矩陣的值,直到輸出最接近我們提供的訓練資料的值。
輸入一個單詞,通過神經網絡做前向傳播,得到輸出單詞是我們所期望的單詞的機率,期望單詞是根據我們的訓練集确定的。因為我們知道期待得到的輸出單詞是什麼,是以我們可以計算預測的錯誤率,然後通過神經網絡用反向傳播回報錯誤率,用随機梯度下降算法調整權重。通過這一步微調W1和W2的值,是以它們能更準确地預測出輸出單詞。這步完成後,讓我們把上下文視窗移動到下一個單詞,重複以上步驟。
對訓練集的所有句子重複上述過程。全部完成後,權重矩陣會收斂到一個值,這個值能提供最準确的預測。
有意思的地方來了,如果兩個不同的單詞經常出現在相似的語境裡,我們可以認為把兩個單詞中的任一個作為輸入,神經網絡将會輸出非常相近的預測值。我們之前提到過權重矩陣的值會決定輸出的預測值,是以說如果兩個單詞出現在相似的上下文中,我們可以認為這兩個單詞的權重矩陣值非常相似。
特别要說一下,權重矩陣W1的矩陣對應我們詞彙表裡的所有單詞,每一行都對應某一個單詞的權重。是以,因為相似的單詞會輸出相似的預測,他們在W1裡對應的權重也應該相似。權重矩陣裡這種權重和單詞的對應關系就叫做embeddingss(嵌入),我們将用它來代表那個單詞。
如何應用到歌曲推薦呢?我們可以把使用者的歌曲清單當作一個句子,句子中的每個單詞就是使用者聽過的一首歌。通過這些句子訓練Word2vec模型基本上就意味着對使用者過去聽過的每首歌,我們使用使用者在這首歌前後聽過的歌曲來訓練模型,這些歌曲某種程度上是屬于同一個範疇的。
上圖就是使用歌曲來代替單詞的神經網絡示意圖。
這跟上面介紹的文本分析是類似的處理方式,隻不過是我們給每首歌一個獨特的辨別而不是文本的單詞。
在訓練階段最後我們将得到一個模型,其中每首歌都用一個高次元空間的權重向量來表示。有意思的是,相似歌曲的權重要比無關的歌曲更加接近。
<b>有哪些歌曲向量的使用案例?</b>
我們可以使用Word2vec把尋找相似場景的歌曲這個難題轉變為數學問題,來捕捉這些局部的共同特點。我們把這些權重作為坐标呈現在高維空間裡,每一首歌都是這個空間裡的一個點。
這個空間被定義成很多個次元,雖然人類肉眼不能看到,但是我們可以使用如t-SNE(t-分布鄰域嵌入算法)等降維的方法把高維向量降到2維,然後繪制如下圖:
上圖中的每一個點都代表一首歌,點之間距離越近就意味着歌曲越相似。這些向量可以有很多種用法,比如說作為其他機器學習算法的輸入特征,當然它們自己也可以用來尋找相似的歌曲。
我們之前提到過,兩首歌出現在相似情境的次數越多他們的坐标就會越接近。
是以對于特定的某一首歌,我們可以通過這首歌和其他所有歌曲向量之間的餘弦相似性取餘弦值最大的k首歌,即找到了k首最相似歌曲(向量之間的夾角最小就最相似)。
舉個例子,黎巴嫩古典歌手Fayrouz的兩首歌Shayef El Baher Shou Kbir和Bhebbak Ma Baaref Laych的餘弦相似度高達0.98,而Shayef El Baher Shou Kbir這首歌和黎巴嫩現代流行歌手Elissa的Saharna Ya Leil就隻有-0.09的相似度。這個我們比較好了解,因為正在聽古典歌曲的使用者不太可能在目前歌曲清單裡放上流行歌曲。
使用歌曲向量的另一個有趣的方法是将使用者的聽音樂習慣映射到這個空間,并在此基礎上生成推薦歌曲。
因為我們現在處理的是向量,我們可以用簡單的四則運算來疊加向量。假如一個使用者聽過的三首歌分别是:Keaton Henson的In the Morning,London Grammar的Wasting My Young Years和Daughter的Youth。
我們可以擷取這三首歌的向量并取平均值,找到與這三首歌等距的點。
我們所做的隻是把某個使用者聽過的一些歌曲轉化成向量坐标,在同樣的向量空間中,這個坐标代表這個使用者。
現在我們有了一個定義使用者的向量,我們可以用之前的方法找到向量空間裡坐标離使用者比較近的相似歌曲。接下來的卡通片幫我們更生動的了解生成推薦的不同步驟。
我們發現歌曲如The Head and the Heart的Down in the Valley,Fleet Foxes的Mykonos和Ben Howard的Small Things和我們的輸入歌曲一樣都屬于獨立民謠風格。記住我們的所做的一切并沒有基于音樂的聲學研究哦,而是簡單的探索在這些指定的歌曲周圍,其他人到底聽過哪些歌曲。
<b>下一首可能就是你喜歡的</b>
Word2vec使我們能用包含歌曲播放情境的坐标向量來為每首歌精确地模組化。這種方法讓我們很容易鑒别相似的歌曲,并使用向量運算找到定義每個使用者的向量。
目前在工業界,Word2vec向量正和其他模型一起作為音樂推薦的特征,并且主要用于基于客戶聽音樂習慣的推薦。
是以下次你發現被推薦了一首好歌,想一想在你之前那些成千上萬聽過這首歌的人們,也許他們下一首聽的歌就是你喜歡的某一首。
原文釋出時間為:2018-01-07
本文作者:文摘菌