Wide&Deep
一、思维框架
二、正文
三、代码实现
代码实战主要分为两大部分,第一部分是使用tensorflow中已经封装好的wide&deep模型,这一部分主要是熟悉模型训练的整体结构。第二部分是使用tensorflow中的keras实现wide&deep,这一部分主要是尽可能的看到模型内部的细节并将其实现。
Tensorflow内置的WideDeepModel
在Tensorflow的库中是已经内置了Wide-Deep model的,想要查看源代码了解具体实现过程可以看这里 。下面参考Tensorflow官网的示例代码进行讲解。我们用到的数据集下载链接戳这里。
首先看全局实现:
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上有展示,链接在这。