基於Tensorflow實現FFM

2021-02-08 機器學習研究組訂閱

沒錯,這次登場的是FFM。各大比賽中的「種子」算法,中國臺灣大學Yu-Chin Juan榮譽出品,美團技術團隊背書,Michael Jahrer的論文的field概念靈魂升華,土豪公司鑑別神器。通過引入field的概念,FFM把相同性質的特徵歸於同一個field,相當於把FM中已經細分的feature再次拆分,可不可怕,厲不厲害?好,讓我們來看看怎麼一個厲害法。



網上已經說爛了的美團技術團隊給出的那張圖:



針對Country這個變量,


FM的做法是one-hot-encoding,生成country_USA,country_China兩個稀疏的變量,再進行embedding向量化。


FFM的做法是cross-one-hot-encoding,生成country_USA_Day_26/11/15,country_USA_Ad_type_Movie...M個變量,再進行embedding向量化。



就和上圖一樣,fm做出來的latent factor是二維的,就是給每個特徵一個embedding結果;而暴力的ffm做出的latent factor是三維的,出來給特徵embedding還考慮不同維度特徵給不同的embedding結果,也是FFM中「field-aware」的由來。


同時從公式中看,對於xi這個特徵為什麼embedding的latent factor向量的V是Vifj,其實就是因為xi乘以的是xj,所以latent factor向量的信息提取才是field j,也就是fj。多說一句,網上很多給出的現成的代碼,這邊都是寫錯了的,都寫著寫著變成了vifi,可能是寫的順手。


都說到這裡了,我再多說一句,為什麼說ffm是土豪公司鑑別神器呢?我們看下僅僅是二次項,ffm需要計算的參數有 nfk 個,遠多於FM模型的 nk個,而且由於每次計算都依賴於乘以的xj的field,所以,無法用fm的那個計算技巧(ab = 1/2(a+b)2-a2-b^2),所以計算複雜度是 O(kn^2)。這種情況下,沒有GPU就不要想了,有GPU的特徵多於50個,而且又很離散的,沒有個三位數的GPU也算了。之前我看美團說他們在用,我想再去看看他們的實際用的過程的時候,發現文章被刪了,真的是可惜,我其實一直也想知道如何減輕這個變態的計算量的方法。


給個實例給大家看下以上的這些的應用:


依舊來自美團技術研發團隊中給出的案例,有用戶數據如下:



這條記錄可以編碼成5個特徵,其中「Genre=Comedy」和「Genre=Drama」屬於同一個field,「Price」是數值型,不用One-Hot編碼轉換。為了方便說明FFM的樣本格式,我們將所有的特徵和對應的field映射成整數編號。



紅色部分對應的是field,來自於原始特徵的個數;藍色部分對應的是feature,來自於原始特徵onehot之後的個數。


對於特徵Feature:User=YuChin而言,有Movie=3Idiots、Genre=Comedy、Genre=Drama、Price四項要交互:



User=YuChin與Movie=3Idiots交互是<V1,2,V2,1>·1·1,也就是第一項,為什麼是V1,2呢?因為User=YuChin是Featureindex=1,而交互的Movie=3Idiots是Fieldindex=2,同理V2,1也是這樣的,以此類推,那麼,FFM的組合特徵有10項,如下圖所示:


這就是一個案例的實際操作過程。



為什麼要把這個單拎出來說呢?我看了網上不少的對於特徵的處理過程,版本實在是太多了,而且差異化也蠻大,這邊就和大家一起梳理一下:


1.feature index * feature value
這個就是上面我這個實際案例的方式,對於分類變量採取onehot,對於連續變量之間進行值的點積,不做處理。優點是快速簡單,不需要預處理,但是缺點也很明顯,離群點影響,值的波動大等。


2.連續值離散化
這個方法借鑑了Cart裡面對連續值的處理方式,就是把所有的連續值都當成一個分類變量處理。舉例,現在有一個年齡age的連續變量[10,19,20,22,22,34],這種方法就生成了age_10,age_19,age_20,age_22,age_34這些變量,如果連續值一多,這個方法帶來的計算量就直線上升。


3.分箱下的連續值離散化
這種方法優化了第二種方法,舉例解釋,現在有一個年齡age的連續變量[10,19,20,22,22,34],我們先建立一個map,[0,10):0,[10,20):1,[20,30):2,[30,100):3。原始的數據就變成了[1,1,2,2,2,3],再進行2的連續值離散化方法,生成了age_1,age_2,age_3這幾個變量,優化了計算量,而且使得結果更具有解釋性。



這個是官方指定的方法,是-1/1做二分類的時候常用的loss計算方法:


這邊需要注意的是,在做的時候,需要把label拆分成-1/1而不是0/1,當我們預測正確的時候,predlabel>0且越大正確的程度越高,相應的log項是越小的,整體loss越小;相反,如果我們預測的越離譜,predlabel<0且越小離譜的程度越高,相應的log項是越大的,整體loss越大。



我看到很多人的實現依舊用了tf.nn.softmax_cross_entropy_with_logits,其實就是多分類中的損失函數,和大家平時的圖像分類、商品推薦召回一模一樣:



這邊需要注意的是,在做的時候,需要把label拆分成[1,0]和[0,1]進行計算。不得不說,大家真的是為了省事很機智(喪心病狂)啊!



我這邊只給一些關鍵地方的代碼,更多的去GitHub裡面看吧。



1self.v = tf.get_variable('v', shape=[self.p, self.f, self.k], dtype='float32',initializer=tf.truncated_normal_initializer(mean=0, stddev=0.01))


看到了,這邊生成的v就是上面Vffm的形式。



1for i in range(self.p):
2        # 尋找沒有match過的特徵,也就是論文中的j = i+1開始
3        for j in range(i + 1, self.p):
4            print('i:%s,j:%s' % (i, j))
5            # vifj
6            vifj = self.v[i, self.feature2field[j]]
7            # vjfi
8            vjfi = self.v[j, self.feature2field[I]]
9            # vi · vj
10            vivj = tf.reduce_sum(tf.multiply(vifj, vjfi))
11            # xi · xj
12            xixj = tf.multiply(self.X[:, i], self.X[:, j])
13            self.field_cross_interaction += tf.multiply(vivj, xixj)


我這邊強行拆開了寫,這樣看起來更清晰一點,注意這邊的vifj和vjfi的生成,這邊也可以看到找對於的field的方法是用了filed這個字典,這就是為什麼不能用fm的點擊技巧。



1# -1/1情況下的logistic loss
2self.loss = tf.reduce_mean(tf.log(1 + tf.exp(-self.y * self.y_out)))


這邊記得論文中的負號,如果有batch的情況下記得求個平均再進行bp過程。



原始的ffm論文中給出了一些結論,我們在實際使用中值得參考:



11. Split the data set into a training set and a validation set.
22. At the end of each epoch, use the validation set to calcu-
3late the loss.
43. If the loss goes up, record the number of epochs. Stop or
5go to step 4.
64. If needed, use the full data set to re-train a model with
7the number of epochs obtained in step 3.



FFM是一個細化隱向量非常好的方法,雖然很簡單,但還是有很多細節之處值得考慮,比如如何線上應用,如何可解釋,如何求稀疏解等等。在部署實現FFM之前,我還是建議大家先上線FM,當效果真的走投無路的時候再考慮FFM,FFM在工業界的影響著實不如學術界那麼強大,偷偷說一句,太慢了,真的是太慢了,慢死了,我寧可去用deepfm。


最後,給出代碼實現的Github地址FFM,這邊是我自己寫的,理解理解算法可以,但是實際用的時候建議參考FFM的實現比較好的項目比如libffm,最近比較火的xlearn。


原文連結:https://www.jianshu.com/p/8b57473e385a


想要了解更多資訊,請掃描下方二維碼,關注機器學習研究會

                                          


轉自: 人工智慧LeadAI

相關焦點

  • 使用Amazon SageMaker 運行基於 TensorFlow 的中文命名實體識別
    ,該環境預製了運行TensorFlow所需要的常用組件,運行run_train.sh進行訓練,命令如下:cd ~/SageMaker/albert-chinese-nersource activate tensorflow_p36.
  • 令人困惑的 TensorFlow!(II)
    還可以通過 name=的屬性設置節點名稱,列舉後綴仍會自動添加:代碼:import tensorflow as tfa = tf.constant(0.)b = tf.constant(1.)代碼:import tensorflow as tfa = tf.constant(0.)b = tf.constant(1.)
  • 令人困惑的TensorFlow!
    但讓我沒想到的是,學習曲線相當的陡峭,甚至在加入該項目幾個月後,我還偶爾對如何使用 TensorFlow 代碼來實現想法感到困惑。我把這篇博文當作瓶中信寫給過去的自己:一篇我希望在學習之初能被給予的入門介紹。我希望這篇博文也能幫助到其他人。以往的教程缺少了那些內容?自 TensorFlow 發布的三年以來,其已然成為深度學習生態系統中的一塊基石。
  • TensorFlow2.0-Keras入門
    最近在知乎上寫一些學習tensorflow2.0的筆記心得,整理成中文教程,希望幫助想學習tensorflow2的朋友更好的了解tensorflow2的同時,也是倒逼自己更好的學習。我始終相信:最好的學習是輸出知識,最好的成長是共同成長。希望可以通過這個公眾號和廣大的深度學習愛好者,一起學習成長。
  • 【TF專輯 1】TensorFlow在Win10上的安裝教程和簡單示例
    5.按照提示,激活之:activate tensorflow 想切換到哪個環境就 activate哪個~ 這篇文章既然是安裝tensorflow的,當然要avtivate tensorflow! 3.確認tensorflow安裝成功: 直接在cmd裡面鍵入python,然後鍵入import tensorflow as tf
  • TensorFlow 2.1.0-rc2發布
    pip install tensorflow安裝的TF默認也有gpu支持了(windows、linux),pip install tensorflow-gpu仍舊可以用,如果考慮到包的大小,也可以用只支持CPU的:tensorflow-cpuWindows用戶:為了使用新的/d2ReducedOptimizeHugeFunctions
  • mnist tensorflow 預測專題及常見問題 - CSDN
    實現代碼如下, 1 #coding=utf-8 2 from __future__ import print_function 3 4 from tensorflow.examples.tutorials.mnist import input_data 5 mnist = input_data.read_data_sets("/
  • 【TF秘籍】令人困惑的 TensorFlow!(II)
    還可以通過 name=的屬性設置節點名稱,列舉後綴仍會自動添加:代碼:import tensorflow as tfa = tf.constant(0.)b = tf.constant(1.)代碼:import tensorflow as tfa = tf.constant(0.)b = tf.constant(1.)
  • 【致敬周杰倫】基於TensorFlow讓機器生成周董的歌詞(附源碼)
    建立模型主要分為三步:確定好編碼器和解碼器中cell的結構,即採用什麼循環單元,多少個神經元以及多少個循環層;將輸入數據轉化成tensorflow的seq2seq.rnn_decoder需要的格式,並得到最終的輸出以及最後一個隱含狀態;將輸出數據經過softmax層得到概率分布,並且得到誤差函數,確定梯度下降優化器;由於tensorflow
  • 詳解深度強化學習展現TensorFlow 2.0新特性(代碼)
    讀者也可以在TensorFlow文檔中對此做深入了解:https://www.tensorflow.org/tutorials/eager/eager_basics深度強化學習一般來說,強化學習是解決順序決策問題的高級框架。RL智能體通過基於某些觀察採取行動來導航環境,並因此獲得獎勵。
  • TensorFlow Recommenders 現已開源,讓推薦系統更上一層樓!
    import tensorflow as tfimport tensorflow_datasets as tfdsimport tensorflow_recommenders as tfrs# Ratings data.
  • TensorFlow 2.1指南:keras模式、渴望模式和圖形模式(附代碼)
    經過一些實驗後,我發現在TensorFlow 2.1中,有3種構建模型的方法:Keras模式(tf.keras):基於圖形定義,並在以後運行圖形。渴望模式:基於定義執行的所有迭代定義圖的操作。Keras模式import numpy as npimport tensorflow as tffrom tensorflow import kerasfrom tensorflow.keras.layers import Input, Dense, Flatten, Conv2Dfrom tensorflow.keras
  • 谷歌重磅推出TensorFlow Graphics:為3D圖像任務打造的深度學習利器
    https://colab.sandbox.google.com/github/tensorflow/graphics/blob/master/tensorflow_graphics/notebooks/6dof_alignment.ipynb這項任務是許多應用程式的核心,比如專注於與環境交互的機器人。機器人要用機械臂抓取物體,需要精確地估計物體相對於機械臂的位置。
  • 基於Python和Tensorflow構建完整的電影推薦算法
    數據連結:https://grouplens.org/datasets/movielens/下載文件:ml-latest-smallimport pandas as pdimport numpy as npimport tensorflow as tf導入ratings.csv
  • 能看破並說破一切的TensorFlow
    它包括一系列基於COCO數據集、KITTI數據集以及Open Images數據集的預訓練模型。如果只對數據集中的類別感興趣,那麼可以使用這些模型進行推斷。TensorFlow目標檢測API也可以在訓練新數據集時對模型初始化。
  • TensorFlow2.x GPU版安裝與CUDA版本選擇指南
    大家根據自己的開發平臺選擇合適的版本下載即可Windows平臺下載地址:https://www.python.org/downloads/windows/    下載後可以直接安裝,安裝完成後我們準備TensorFlow2.x的GPU版本安裝,分兩步完成,TensorFlow最新版為2.3(這裡安裝2.2):    ① 打開cmd窗口,輸入pip install tensorflow
  • 實戰|基於TensorFlow+Python的文本分類全程詳解
    你可以使用以下python代碼導入Keras:import tensorflow as tffrom tensorflow import kerasimport numpy as npprint(tf.
  • 社交距離檢測器——Tensorflow檢測模型設計
    在隔離期間,我花時間在github上探索Tensorflow的大量預訓練模型。這樣做時,我偶然發現了一個包含25 個帶有性能和速度指標的預訓練對象檢測模型的存儲庫。擁有一些計算機視覺知識並給出了實際的背景知識,我認為使用其中之一來構建社交隔離應用程式可能會很有趣。
  • TensorFlow 2入門指南,初學者必備!
    Tensorflow v1難以使用和理解,因為它的Pythonic較少,但是隨著Keras發行的v2現在與Tensorflow.keras完全同步,它易於使用,易學且易於理解。tensorflow as tffrom tensorflow.keras.layers import Densefrom tensorflow.keras.models import Sequential在這裡,我們從tensorflow
  • TensorFlow 2.4來了:上線對分布式訓練和混合精度的新功能支持
    像單工作器的 MirroredStrategy 一樣,MultiWorkerMirroredStrategy 通過同步數據並行實現分布式訓練,顧名思義,藉助 MultiWorkerMirroredStrategy 可以在多臺機器上進行訓練,每臺機器都可能具有多個 GPU。