1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        keras實(shí)戰(zhàn)系列之推薦系統(tǒng)FM(Factorization Machine)算法

        共 3024字,需瀏覽 7分鐘

         ·

        2021-12-25 21:26

        前言

        博主在之前的文章中介紹過使用keras搭建一個基于矩陣分解的推薦系統(tǒng),而那篇文章所介紹的方法可能只是一個龐大推薦系統(tǒng)中的一小環(huán)節(jié)。而對于工業(yè)級別的推薦系統(tǒng),面對極其龐大的產(chǎn)品種類數(shù)量,一步就輸出符合用戶心意的產(chǎn)品可能夠嗆,最好的方式應(yīng)該是從巨大的產(chǎn)品類別之中粗篩出一些靠譜的待推薦產(chǎn)品,然后再從粗篩的產(chǎn)品中精挑細(xì)選出要推薦給用戶的最終產(chǎn)品。

        工業(yè)級別的推薦系統(tǒng)簡介

        工業(yè)級別的推薦系統(tǒng)的架構(gòu)圖如下圖所示,大致分為兩個階段:

        • 召回階段:也就是粗篩階段,由于涉及到的產(chǎn)品數(shù)量巨大,大的公司都是千萬級別,甚至上億級別的產(chǎn)品數(shù)量,此階段的模型應(yīng)該盡量簡單,特征維度也盡量少,這樣方便快速篩選出一些待推薦的產(chǎn)品。

        • 排序階段:即對上一階段粗篩出來的待推薦產(chǎn)品進(jìn)行精挑細(xì)選,此階段為了推薦出符合用戶心意的產(chǎn)品,需要模型盡量的準(zhǔn)確。而且由于粗篩階段將數(shù)據(jù)量減少到幾千,甚至幾百級別,所以使用復(fù)雜模型,并且特征維度也可以盡量豐富,盡量多一些,這樣訓(xùn)練出來的模型才能有較強(qiáng)的性能。

          ?

          推薦系統(tǒng)的架構(gòu)圖

        而接下來我要介紹的FM(Factorization Machine)算法,不僅在召回階段有用武之地,在排序階段也是很拿得出手的推薦模型。

        FM(Factorization Machine)算法簡介

        Factorization Machine的中文叫因子分解機(jī),F(xiàn)M算法的最強(qiáng)特點(diǎn)就是考慮到了特征的二階組合——即特征兩兩組合形成一個新的特征。在產(chǎn)品推薦,CTR預(yù)估等任務(wù)中,特征相互組合很可能會得到一個特別強(qiáng)的新特征。接下來我們從FM算法的公式來了解一下此算法的精髓:
        ?
        如果我們單看FM算法的前面一部分:? ,這不就是一個Logistics回歸模型嗎,確實(shí)沒錯,F(xiàn)M算法的前半部分就是Logistics回歸,算法的后半部分才體現(xiàn)出FM的特征組合的思想:

        • 其中?可以理解成特征?和特征?的另外一種向量表示

        • ? 向量相乘得到的值則是特征?和特征?組合特征的權(quán)重,

        • Logistics回歸 + 特征之間的兩兩組合,最后給每個兩兩組合而來的新特征乘上一個權(quán)重值,就實(shí)現(xiàn)了FM算法的特征的二階組合的思想。

        通過下圖我們可以將FM算法的公式轉(zhuǎn)化為:

        FM算法的改寫



        不要小看了公式的改寫這一步,公式的改寫這一過程會帶來了算法時間復(fù)雜度的下降,加速算法的運(yùn)行。接下來我們就嘗試使用keras實(shí)現(xiàn)一下FM算法。

        ?

        FM算法實(shí)戰(zhàn)

        導(dǎo)入python包

        首先導(dǎo)入必要的python 包,導(dǎo)入 sklearn中乳腺癌的分類任務(wù)數(shù)據(jù)。

        ?

        1. import keras

        2. from keras.layers import Layer, Dense, Dropout,Input

        3. from keras import Model,activations

        4. from keras.optimizers import Adam

        5. import keras.backend as K

        6. from sklearn.datasets import load_breast_cancer

        FM層的定義,其中call函數(shù)中定義了FM的主要實(shí)現(xiàn)部分。

        ?

        1. class FM(Layer):

        2. def __init__(self, output_dim=30, activation="relu",**kwargs):

        3. self.output_dim = output_dim

        4. self.activate = activations.get(activation)

        5. super(FM, self).__init__(**kwargs)


        6. def build(self, input_shape):

        7. self.wight = self.add_weight(name='wight',

        8. shape=(input_shape[1], self.output_dim),

        9. initializer='glorot_uniform',

        10. trainable=True)

        11. self.bias = self.add_weight(name='bias',

        12. shape=(self.output_dim,),

        13. initializer='zeros',

        14. trainable=True)

        15. self.kernel = self.add_weight(name='kernel',

        16. shape=(input_shape[1], self.output_dim),

        17. initializer='glorot_uniform',

        18. trainable=True)

        19. super(FM, self).build(input_shape)


        20. def call(self, x):

        21. feature = K.dot(x,self.wight) + self.bias

        22. a = K.pow(K.dot(x,self.kernel), 2)

        23. b = K.dot(x, K.pow(self.kernel, 2))

        24. cross = K.mean(a-b, 1, keepdims=True)*0.5

        25. cross = K.repeat_elements(K.reshape(cross, (-1, 1)), self.output_dim, axis=-1)

        26. return self.activate(feature + cross)


        27. def compute_output_shape(self, input_shape):

        28. return (input_shape[0], self.output_dim)

        數(shù)據(jù)載入

        載入sklearn中乳腺癌的分類任務(wù)數(shù)據(jù)。

        ?

        1. data = load_breast_cancer()["data"]

        2. target = load_breast_cancer()["target"]

        模型構(gòu)建

        這里我采用了一層FM層,一層15個神經(jīng)元的隱層構(gòu)建了一個兩層的網(wǎng)絡(luò)模型,Loss 采用的是平方誤差損失(mse),當(dāng)然也可以采用交叉熵?fù)p失(cross entropy)。

        ?

        1. K.clear_session()

        2. inputs = Input(shape=(30,))

        3. out = FM(20)(inputs)

        4. out = Dense(15,activation="sigmoid")(out)

        5. out = Dense(1,activation="sigmoid")(out)


        6. model = Model(inputs=inputs, outputs=out)

        7. model.compile(loss='mse',

        8. optimizer=adam(0.0001),

        9. metrics=['accuracy'])

        10. model.summary()

        模型訓(xùn)練

        定義好batch_size 和訓(xùn)練輪數(shù),就可以將模型跑起來了。

        ?

        1. model.fit(data, target,

        2. batch_size=1,

        3. epochs=100,

        4. validation_split=0.2)

        下圖訓(xùn)練的截圖,由于數(shù)據(jù)集太小,太簡單這里也沒有對比FM和其他算法的性能差異,不過看網(wǎng)上的博客教程,F(xiàn)M在應(yīng)對特征豐富的推薦任務(wù)時有著很不錯的效果。畢竟考慮到了特征之間的組合關(guān)系。

        ?

        模型訓(xùn)練

        ?


        瀏覽 121
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            2个女人教舌吻裸体 | 99re6热精品免费视频网站 | 国产乱码一区二区三区的解决方法 | 几天没c这么湿h 古装一级淫片高清免费观看 | 在线观看91精品视频 | 伊人大香蕉在线观看视频 | 免费一级婬A片AAA毛片古女 | 青青草日逼视频 | 欧美A区| www.天天操.com |