推薦系統 task5

2021-10-25 07:39:14 字數 4586 閱讀 7729

wide and deep 模型是 tensorflow 在 2016 年 6 月左右發布的一類用於分類和回歸的模型,並應用到了 google play 的應用推薦中。wide and deep 模型的核心思想是結合線性模型的記憶能力(memorization)和 dnn 模型的泛化能力(generalization),在訓練過程中同時優化 2 個模型的引數,從而達到整體模型的**能力最優。

記憶(memorization)即從歷史資料中發現item或者特徵之間的相關性。

泛化(generalization)即相關性的傳遞,發現在歷史資料中很少或者沒有出現的新的特徵組合。

memorization 和 generalization是推薦系統很常見的兩個概念,其中memorization指的是通過使用者與商品的互動資訊矩陣學習規則,而generalization則是泛化規則。我們前面介紹的fm演算法就是很好的generalization的例子,它可以根據互動資訊學習到乙個比較短的矩陣v

vv,其中viv_

vi​儲存著每個使用者特徵的壓縮表示(embedding),而協同過濾與svd都是靠記住使用者之前與哪些物品發生了互動從而推斷出的推薦結果,這兩者推薦結果當然存在一些差異,我們的wide&deep模型就能夠融合這兩種推薦結果做出最終的推薦,得到乙個比之前的推薦結果都好的模型。

可以這麼說:memorization趨向於更加保守,推薦使用者之前有過行為的items。相比之下,generalization更加趨向於提高推薦系統的多樣性(diversity)。memorization只需要使用乙個線性模型即可實現,而generalization需要使用dnn實現。

下面是wide&deep模型的結構圖,由左邊的wide部分(乙個簡單的線性模型),右邊的deep部分(乙個典型的dnn模型)。

其實wide&deep模型本身的結構是非常簡單的,對於有點機器學習基礎和深度學習基礎的人來說都非常的容易看懂,但是如何根據自己的場景去選擇那些特徵放在wide部分,哪些特徵放在deep部分就需要理解這篇**提出者當時對於設計該模型不同結構時的意圖了,所以這也是用好這個模型的乙個前提。

如何理解wide部分有利於增強模型的「記憶能力」,deep部分有利於增強模型的「泛化能力」?

wide部分與deep部分的結合

w&d模型是將兩部分輸出的結果結合起來聯合訓練,將deep和wide部分的輸出重新使用乙個邏輯回歸模型做最終的**,輸出概率值。聯合訓練的數學形式如下:

p (y

=1∣x

)=δ(

wwid

et[x

,ϕ(x

)]+w

deep

ta(l

f)+b

)p(y=1|x)=\delta(w_^t[x,\phi(x)] + w_^t a^ + b)

p(y=1∣

x)=δ

(wwi

det​

[x,ϕ

(x)]

+wde

ept​

a(lf

)+b)

ranking

將特徵分別傳入wide和deep一起做訓練。在訓練的時候,根據最終的loss計算出gradient,反向傳播到wide和deep兩部分中,分別訓練自己的引數(wide元件只需要填補deep元件的不足就行了,所以需要比較少的cross-product feature transformations,而不是full-size wide model)

訓練完之後推薦topn

所以wide&deep模型儘管在模型結構上非常的簡單,但是如果想要很好的使用wide&deep模型的話,還是要深入理解業務,確定wide部分使用哪部分特徵,deep部分使用哪些特徵,以及wide部分的交叉特徵應該如何去選擇

**實戰主要分為兩大部分,第一部分是使用tensorflow中已經封裝好的wide&deep模型,這一部分主要是熟悉模型訓練的整體結構。第二部分是使用tensorflow中的keras實現wide&deep,這一部分主要是盡可能的看到模型內部的細節並將其實現。

tensorflow內建的widedeepmodel

首先看全域性實現:

tf.keras.experimental.widedeepmodel(

linear_model, dnn_model, activation=

none

,**kwargs

)

這一步很容易看出來就是將linear_model與dnn_model拼接在了一起,對應於wide-deep fm中的最後一步。比如我們可以將linear_model與dnn_model做乙個最簡單的實現:

linear_model = linearmodel(

)dnn_model = keras.sequential(

[keras.layers.dense(units=64)

, keras.layers.dense(units=1)

])combined_model = widedeepmodel(linear_model, dnn_model)

combined_model.

compile

(optimizer=

['sgd'

,'adam'],

'mse',[

'mse'])

# define dnn_inputs and linear_inputs as separate numpy arrays or

# a single numpy array if dnn_inputs is same as linear_inputs.

combined_model.fit(

[linear_inputs, dnn_inputs]

, y, epochs)

# or define a single `tf.data.dataset` that contains a single tensor or

# separate tensors for dnn_inputs and linear_inputs.

dataset = tf.data.dataset.from_tensors(

([linear_inputs, dnn_inputs]

, y)

)combined_model.fit(dataset, epochs)

這裡第一步就是直接呼叫乙個keras.experimental中的linear_model,第二步簡單實現了乙個全連線神經網路,第三步使用widedeepmodel將前兩步產生的兩個model拼接在一起,形成最終的combined_model,接著就是常規的compile和fit了。

除此之外線性模型與dnn模型在聯合訓練之前均可進行分別訓練:

linear_model = linearmodel(

)linear_model.

compile

('adagrad'

,'mse'

)linear_model.fit(linear_inputs, y, epochs)

dnn_model = keras.sequential(

[keras.layers.dense(units=1)

])dnn_model.

compile

('rmsprop'

,'mse'

)dnn_model.fit(dnn_inputs, y, epochs)

combined_model = widedeepmodel(linear_model, dnn_model)

combined_model.

compile

(optimizer=

['sgd'

,'adam'],

'mse',[

'mse'])

combined_model.fit(

[linear_inputs, dnn_inputs]

, y, epochs)

這裡前三行**訓練了乙個線性模型,中間三行**訓練了乙個dnn模型,最後三行**則將兩個模型聯合訓練,以上就完成了對tensorflow的widedeepmodel的呼叫,其中每個函式有一些其他引數我們這裡不詳細說明,讀者若有需要可自行在tensorflow官網查詢,另外該部分的源**在tensorflow的github上有展示,鏈結在這。

tensorflow實現wide&deep模型

這一部分對原始特徵進行轉換,以及deep特徵和wide特徵的選擇,特徵的交叉等一系列特徵操作,模型也分成了wide部分和deep部分,相比於上述直接使用tensorflow內建的模型,更加的詳細,可以對模型理解的更加的深刻。

在這裡wide和deep部分的優化,為了簡單實現,使用了同乙個優化器優化兩部分,詳細內容參考**中的注釋。

wide & deep

TASK 5 模型融合

task 5 模型融合 總結自 datawhale 零基礎入門資料探勘 task 5 模型融合 ml67 1 stacking 是用初始訓練資料學習出若干個基學習器後,將這幾個學習器的 結果作為新的訓練集,來學習乙個新的學習器。2 結合策略 如何將個體學習器結合在一起使用的方法。分類可以使用投票法。...

Task5 學習筆記

模型融合是對多種調參完成的模型以某種方式進行融合,進而提公升結果的準確性。其一般來說有以下幾種方法 簡單加權融合 對於回歸問題,簡單加權融合一般包括對模型進行算術平均或者幾何平均進行融合 對於分類問題可以通過投票方式進行融合,包括軟投票與硬投票,區別在於軟投票是在硬投票的基礎上賦予了不同的權重 對於...

Task5 模型整合

1.整合學習方法 假設你有許多基礎分類器 簡單的分類規則 則組合 這些分類規則可能是乙個好主意,可能會比單個規則獲得 更高的精度 選擇基礎分類器時候往往主要考慮的是其簡單性,而非精 度 基礎分類器應該對總體中的一部分不同個體是精確的,他 們組合起來可以有效處理所有個體 即互為補充 基礎分類器之間的差...