目录
假设输入一个词,想把它embedding成一个向量。词典大小假设是\(V\)
,embedding向量的维度假设是\(K\)
。那么,相当于输入一个\(V\)
维的one-hot向量,输出一个\(K\)
维的向量,中间就是一个\(V\times K\)
的矩阵\(W\)
。假设\(K=3,V=2\)
:
\[
(x_0,x_1)\times \begin{bmatrix}
w_{00} & w_{01} &w_{02} \\
w_{10} & w_{11} & w_{12}
\end{bmatrix}=\begin{bmatrix}
x_0w_{00}+x_1w_{10}\\
x_0w_{01}+x_1w_{11}\\
x_0w_{02}+x_1w_{12}
\end{bmatrix}
\]
举例,如果x=(0,1)那相当于是
\[
(0,1)\times \begin{bmatrix}
w_{00} & w_{01} &w_{02} \\
w_{10} & w_{11} & w_{12}
\end{bmatrix}=\begin{bmatrix}
0w_{00}+1w_{10}\\
0w_{01}+1w_{11}\\
0w_{02}+1w_{12}
\end{bmatrix}=\begin{bmatrix}
w_{10}\\
w_{11}\\
w_{12}
\end{bmatrix}
\]
也就是说,选取了权重矩阵的第1行的值出来,再转置一下,变成列向量(即常说的lookup,或者paddle里的table_projection)。同理,如果x=(1,0),那么相当于选取权重矩阵的第0行出来。
而特殊地,如果x不是one-hot,是一个可以有多个1的vector(例如,某个特征,可能同时取多个值,比如x有6维,每一维表示1种颜色,而这个特征是图中包含了哪几种颜色,可能有的图片里有3种颜色),那么,得到的每一维embedding就相当于把对应的几行选择出来,然后每行里每列对应的值相加。更直观地,假设\(V=3,K=4\)
,假设x=(0,1,1):
\[
(0,1,1)\times \begin{bmatrix}
w_{00} & w_{01} &w_{02} &w_{03}\\
w_{10} & w_{11} & w_{12} &w_{13}\\
w_{20} & w_{21} & w_{22} &w_{23}\\
\end{bmatrix}=\begin{bmatrix}
0w_{00}+1w_{10}+1w_{20}\\
0w_{01}+1w_{11}+1w_{21}\\
0w_{02}+1w_{12}+1w_{22}\\
0w_{03}+1w_{13}+1w_{23}\\
\end{bmatrix}=\begin{bmatrix}
w_{10}+w_{20}\\
w_{11}+w_{21}\\
w_{12}+w_{22}\\
w_{13}+w_{23}
\end{bmatrix}
\]
相当于把权重矩阵的第1行和第2行拿出来,然后对应元素相加,再转置一下。
中文文档:https://keras.io/zh/layers/embeddings/
https://keras.io/layers/embeddings/ keras的embedding是参考A Theoretically Grounded Application of Dropout in Recurrent Neural Networks这个实现的,类似对输入数据进行dropout。
https://github.com/PaddlePaddle/Paddle/issues/2910
代码(不止这些): https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/lookup_ops.py
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/embedding_ops.py
embedding_lookup和embedding_lookup_sparse:
https://blog.csdn.net/huhu0769/article/details/71169346
tensorflow的embedding操作: https://memeda.github.io/%E6%8A%80%E6%9C%AF/2017/04/13/tfembedding.html
如何使用预训练的embedding来初始化tf的embedding_lookup: https://stackoverflow.com/questions/35687678/using-a-pre-trained-word-embedding-word2vec-or-glove-in-tensorflow
https://daiwk.github.io/posts/dl-talk-to-book.html
连续值统计特征是非常有用的特征,Google的模型是把embedding向量和统计特征放到同一个DNN网络中学习,但实验发现这样会削弱统计特征的作用。我们为统计特征专门又组建了一个包含2个隐层的网路,并且为了增强非线性效果,激活函数从RELU改为TanH/Sigmiod。
整体模型使用三层全连接层用于sparse+dense特征表征学习,再用两层全连接层用于点击/购买与否分类的统一深度学习模型解决方案:
在普适的CTR场景中,用户、商品、查询等若干个域的特征维度合计高达几十亿,假设在输入层后直接连接100个输出神经元的全连接层,那么这个模型的参数规模将达到千亿规模。直接接入全连接层将导致以下几个问题:1. 各个域都存在冷门的特征,这些冷门的特征将会被热门的特征淹没,基本不起作用,跟全连接层的连接边权值会趋向于0,冷门的商品只会更冷门。2. 模型的大小将会非常庞大,超过百G,在训练以及预测中都会出现很多工程上的问题。为了解决上述两个问题,本文引入了紫色编码层,具体分为以下两种编码方式:1. 随机编码 2. 挂靠编码,下面将对以上两种编码方式进行详细的描述。
假设某一域的输入ID类特征的one-hot形式最大维度为N,
双11当天数据分布会发生巨大变化,为了能更好的fit实时数据,我们将WDL的一部分参数做了在线实时训练。embeding层由于参数过多,并没有在线训练,其他模型参数都会在线学习更新。
deep端网络参数和wide端参数更新的策略有所不同,wide端是大规模稀疏特征,为了使训练结果有稀疏性,最好用FTRL来做更新。deep端都是稠密连续特征,使用的普通的SGD来做更新,学习率最好设置小一点。
和离线Batch training不同,Online learning会遇到一些特有的问题:
现象:线上环境比较复杂,不同来源的日志qps和延迟都不同,造成不同时间段样本分布不一样,甚至在短时间段内样本分布异常。比如整体一天下来正负例1:9,如果某类日志延迟了,短时间可能全是负例,或者全是正例。 解决:Pairwise sampling。Pv日志到了后不立即产出负样本,而是等点击到了后找到关联的pv,然后把正负样本一起产出,这样的话就能保证正负样本总是1:9
现象:权重学飘掉(非常大或者非常小),权重变化太大。解决:mini batch,一批样本梯度累加到一起,更新一次。