《Deep Neural Networks for YouTube Recommendations》学习笔记

Google出品,学习一下!

 

 文章脉络清晰,主要包括六个部分:YouTube使用DNN的背景、整体推荐系统框架、候选集生成(candidate generation)、排序(ranking)、总结、感谢,其中候选集生成和排序是推荐系统框架的重要组成部分。

 

本文主要学习下整体推荐系统框架、候选集生成(candidate generation)、排序(ranking)这三个部分

 

1.整体推荐系统框架

 

 

不得不说一下,好的paper总是那样,看下图片,大概意思就可以明白很多了

(1)首先关注图片中下几个单词millions、hundreds、dozens:表示数据量的级别,全部的video corpus大概是millions级别,经过candidate generation之后大概是hundreds级别,经过ranking之后大概是dozens级别

(2)candidate generation的输入包括millions video corpus、user history and context ,旨在快速高效地筛选部分视频集合

(3)ranking的输入包括hundreds video corpus、user history and context、other candidate sources、video features,旨在得到高精度的TOP N

2.候选集生成

(1)一个思考方式的转变

我们把推荐问题建模成一个“超大规模多分类”问题。即在时刻t,为用户U(上下文信息C)在视频库V中精准的预测出视频i的类别(每个具体的视频视为一个类别,i即为一个类别),用数学公式表达如下:

 

 

很显然上式为一个softmax多分类器的形式。向量是user, context>信息的高纬“embedding”,而向量则是视频 j 的embedding向量。所以DNN的目标就是在用户信息和上下文信息为输入条件下学习用户的embedding向量u。

(2)Deep candidate generation model architecture

 

 

用户观看历史数据、搜索数据,做一个embedding,加上age、gender特征作为DNN的输入,接下来是几层的全连接层(激活函数是ReLU),训练阶段使用cross-entropy作为优化损失函数,线上阶段根据user vector和video vector通过an approximate nearest neighbor lookup得到TOP N作为输出,也是ranking阶段的输入

(3)标签和输入文本的选择

 

 

上图中,实心黑点表示输入,空心点表示标签。论文中表示,在进行A/B Test的时候,发现(b)这种选择标签和输入比(a)好

个人理解,这也是符号常识的,毕竟人的兴趣是随着时间推移而发生变化的。

3.排序

 

 

对类别特征(包括单值和多值的)进行Embedding,对连续特征进行Normalizing,训练阶段最后一层是加权的逻辑斯蒂回归,预测阶段直接根据学习到的W得到输出结果。

 

上面两个部分均发现DNN的深度(depth)对结果影响比较大

 

4.不定长变为定长Embedding

这块纯属个人理解,如果有错,还望指出

每一个人观看video的id list长度是不一样的,这种情形跟一条文本长度不一样需要做情感分析这种任务类似

由于这篇文章没有开源,有些细节还是需要自己摸索,下面是keras example中lstm_imdb的相关代码,仅供参考学习

<span style="color:#000000"><code><span style="color:#000088">from</span> __future__ <span style="color:#000088">import</span> print_function
<span style="color:#000088">import</span> numpy <span style="color:#000088">as</span> np
np.random.seed(<span style="color:#006666">1337</span>)  <span style="color:#880000"># for reproducibility</span>

<span style="color:#000088">from</span> keras.preprocessing <span style="color:#000088">import</span> sequence
<span style="color:#000088">from</span> keras.models <span style="color:#000088">import</span> Sequential
<span style="color:#000088">from</span> keras.layers <span style="color:#000088">import</span> Dense, Dropout, Embedding, LSTM, Bidirectional
<span style="color:#000088">from</span> keras.datasets <span style="color:#000088">import</span> imdb


max_features = <span style="color:#006666">20000</span>
maxlen = <span style="color:#006666">100</span>  <span style="color:#880000"># cut texts after this number of words (among top max_features most common words)</span>
batch_size = <span style="color:#006666">32</span>

print(<span style="color:#009900">'Loading data...'</span>)
(X_train, y_train), (X_test, y_test) = imdb.load_data(nb_words=max_features)
print(len(X_train), <span style="color:#009900">'train sequences'</span>)
print(len(X_test), <span style="color:#009900">'test sequences'</span>)

print(<span style="color:#009900">"Pad sequences (samples x time)"</span>)
X_train = sequence.pad_sequences(X_train, maxlen=maxlen)
X_test = sequence.pad_sequences(X_test, maxlen=maxlen)
print(<span style="color:#009900">'X_train shape:'</span>, X_train.shape)
print(<span style="color:#009900">'X_test shape:'</span>, X_test.shape)
y_train = np.array(y_train)
y_test = np.array(y_test)

model = Sequential()
model.add(Embedding(max_features, <span style="color:#006666">128</span>, input_length=maxlen))
model.add(Bidirectional(LSTM(<span style="color:#006666">64</span>)))
model.add(Dropout(<span style="color:#006666">0.5</span>))
model.add(Dense(<span style="color:#006666">1</span>, activation=<span style="color:#009900">'sigmoid'</span>))

<span style="color:#880000"># try using different optimizers and different optimizer configs</span>
model.compile(<span style="color:#009900">'adam'</span>, <span style="color:#009900">'binary_crossentropy'</span>, metrics=[<span style="color:#009900">'accuracy'</span>])

print(<span style="color:#009900">'Train...'</span>)
model.fit(X_train, y_train,
          batch_size=batch_size,
          nb_epoch=<span style="color:#006666">4</span>,
          validation_data=[X_test, y_test])
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

参考文献 
(1)Deep Neural Networks for YouTube Recommendations 
(2)keras github

推荐阅读 
(1)用深度学习(DNN)构建推荐系统 - Deep Neural Networks for YouTube Recommendations论文精读

版权声明:如需转载,请注明出处http://blog.csdn.net/a819825294 https://blog.csdn.net/a819825294/article/details/71215538

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值