工程中的CTR丨是什么意思?
临界温度热敏电阻CTR(Crit1Cal Temperature Resistor)具有负电阻突变特性,在某一温度下,电阻值随温度的增加激剧减小,具有很大的负温度系数.构成材料是钒、钡、锶、磷等元素氧化物的混合烧结体,是半玻璃状的半导体,也称CTR为玻璃态热敏电阻.骤变温度随添加锗、钨、钼等的氧化物而变.这是由于不同杂质的掺入,使氧化钒的晶格间隔不同造成的.若在适当的还原气氛中五氧化二钒变成二氧化钒,则电阻急变温度变大;若进一步还原为三氧化二钒,则急变消失.产生电阻急变的温度对应于半玻璃半导体物性急变的位置,因此产生半导体-金属相移.CTR能够作为控温报警等应用.
苏子叹曰:“异哉!是鼠之黠也。闭于橐中,橐坚而不可穴也。故不啮而啮,以声致人;不死而死,以形求脱也。吾闻有生,莫智于人。拢龙伐蛟,登龟狩麟,役万物而君之,卒见使于一鼠;堕此虫之计中,惊脱兔于处女,乌在其为智也。”
坐而假寐,私念其故。若有告余者曰:“汝惟多学而识之,望道而未见也。不一于汝,而二于物,故一鼠之啮而为之变也。人能碎千金之璧,不能无失声于破釜;能搏猛虎,不能无变色于蜂虿:此不一之患也。言出于汝,而忘之耶?”余俛而笑,仰而觉。使童子执笔,记余之作。
这是一篇别开生面的游记文,它不注重山川形胜的描写,而注重辩难与议论,其所阐发的道理又是通过游程的记录来说明,这需要处理好记游、辩难和议论三者关系。作者巧妙地把记游作为辩难的根据,而议论则是对辩难的生发和引申,不仅讲清了知与实践的关系、知与见识的关系、知与言的关系,而且把石钟山的壮丽风光描绘得生动传神。这种于形象描绘中熔入理性分析的高超技巧,是他人难以企及的。
石钟山在今江西省湖口县鄱阳湖东岸。
这篇文章是阿里巴巴的gaikun团队于2018年发表于KDD的文章[1],目前已经在各大公司的点击率预估(CTR)场景都得到广泛的应用。这篇文章就从模型和代码实现方面简单介绍一下这篇文章提出的DIN模型。
1.背景
随着深度学习的发展,许多研究者将DNN网络应用到CTR的任务上来。大部分目前使用的深度学习模型都可以认为是Embedding&MLP结构,即大规模的、稀疏的输入数据首先被压缩成低维的embedding,变成固定长度的输入向量,被输入到全连接网络中去。这些模型大大减少了特征工程的工作量,因此广为流行。
但这些方法仍然有缺点,最大的缺点就是固定维数的向量不能充分地表达用户兴趣的Diversity(一般是用用户过去的购买行为或者点击行为来表示用户的兴趣),为了增加模型的学习能力,要扩大embedding的维度,而在样本有限的情况下,通常会造成过拟合的问题。
除此之外,给定一个商品,决定用户是否点击进去查看的往往是用户的部分兴趣而非所有兴趣,通常来说是最近的一些行为相关性更大一些。所以这篇文章提出的DIN模型对于不同的商品,将对应适应性的用户兴趣特征来输入,以解决固定特征维度不能充分表达用户行为的问题。其主要的中心思想,就是结合attention机制对用户的历史行为进行了加权处理,对于不同的商品,权重不一致。[2]
2.模型
2.1 MLP
首先看一下传统的DNN在点击率预估上的一般方法:
传统DNN模型一般是按照Embedding Layer&Pooling Layer->Concat->MLP的框架来构建模型的,在Embedding Layer -> Pooling Layer得到用户兴趣表示的时候,没有考虑用户与推荐商品之间的关系,即不同的推荐商品之间的权重是一致的。这正是上文DIN要解决的问题。
同时,由上图可以看出,一般CTR问题的输入包含四种类型的特征:
2.2 DIN
为了解决上述提出的问题,DIN利用attention机制,在得到用户兴趣表示时赋予不同的历史行为不同的权重,即通过Embedding Layer -> Pooling Layer+attention实现局部激活。从而在训练过程中根据当前的候选商品,来反向的激活用户历史的兴趣爱好,赋予不同历史行为不同的权重。也就是说对于不同的候选商品输入,得到的兴趣特征是不同的。网络结构如下图:
上图的左边就是DIN的模型架构图,输入还是同样的四种类型特征,而在User Profile Feature和Context Feature这两种类型的处理和上述的MLP方法保持不变。对于User Behaviors和Candidate Ad这两种特征,文章提出的是一种类似NLP中常用的Attention结构(Activation Unit)。如上述右图所示:
每个兴趣商品(Goods)要和候选商品(Candidate Ad)要进行Out Product等操作,并将外积和自身的embedding表示进行concat,输入到FC得到一个权值,对应的就是当前兴趣商品的权值。在算出所有商品的权值之后,再对所有的商品的embedding进行加权求和,结果就是用户对于当前候选商品的兴趣表示。对应的公式如下:
其中:
是候选商品的Embedding表示
是用户的兴趣商品的Embedding表示
函数a(*, *)表示上述的Activation Unit, 得到的权重是
- def attention(queries, keys, keys_length):
- ''' queries: [B, H] keys: [B, T, H] keys_length: [B] '''
- queries_hidden_units = queries.get_shape().as_list()[-1]
- queries = tf.tile(queries, [1, tf.shape(keys)[1]])
- queries = tf.reshape(queries, [-1, tf.shape(keys)[1], queries_hidden_units])
- din_all = tf.concat([queries, keys, queries-keys, queries*keys], axis=-1)
- d_layer_1_all = tf.layers.dense(din_all, 80, activation=tf.nn.sigmoid, name='f1_att', reuse=tf.AUTO_REUSE)
- d_layer_2_all = tf.layers.dense(d_layer_1_all, 40, activation=tf.nn.sigmoid, name='f2_att', reuse=tf.AUTO_REUSE)
- d_layer_3_all = tf.layers.dense(d_layer_2_all, 1, activation=None, name='f3_att', reuse=tf.AUTO_REUSE)
- d_layer_3_all = tf.reshape(d_layer_3_all, [-1, 1, tf.shape(keys)[1]])
- outputs = d_layer_3_all
- # Mask
- key_masks = tf.sequence_mask(keys_length, tf.shape(keys)[1]) # [B, T]
- key_masks = tf.expand_dims(key_masks, 1) # [B, 1, T]
- paddings = tf.ones_like(outputs) * (-2 ** 32 + 1)
- outputs = tf.where(key_masks, outputs, paddings) # [B, 1, T]
- # Scale
- outputs = outputs / (keys.get_shape().as_list()[-1] ** 0.5)
- # Activation
- outputs = tf.nn.softmax(outputs) # [B, 1, T]
- # Weighted sum
- outputs = tf.matmul(outputs, keys) # [B, 1, H]
- return outputs
queries是候选商品的embedding表示;
keys是用户浏览过的兴趣商品embeddings表示;
keys_length 表示兴趣商品的数量,因为输入的keys对应的shape相同,所以根据不同的用户,需要额外输入兴趣商品的数量。
先对queries reshape成(B, 1, H)
拼接[queries, keys, queries-keys, queries*keys],将候选商品和兴趣商品信息融合得到din_all
对于din_all进行多次MLP计算得到权值,然后reshape为(B, 1, T)
再根据输入的keys_length mask掉超过兴趣商品数量的维度
最后用softmax归一化权值,并且对兴趣商品的embeddings进行加权求和并返回结果
self attention中queries和keys的shape一般是相同的,且都是序列形式。而这里的queries的输入是单纯的向量。
信息融合的方式: self attention使用的是queries和keys进行矩阵乘法来得到权值,而DIN使用的是拼接[queries, keys, queries-keys, queries*keys],再进行MLP。这里加入更多的side information,符合推荐系统常用的交叉特征。
简单看一下这里Activation Unit对应的代码,应该是官方,来源于https://github.com/zhougr1993/DeepInterestNetwork/blob/master/din/model.py[3]:
输入:
过程:
这个地方用的attention方法和我之前介绍过的 self attention 南枫:【NLP】换一种方式进行机器翻译-Transformer(模型和代码解析) [4]有很多相似之处,这里简单看一下不同点: