《再看Attention之细节问题.docx》由会员分享,可在线阅读,更多相关《再看Attention之细节问题.docx(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、再看Attention之细节问题这次再来一遍温故而知新主要是其中的代码实现问题【不区分详细哪个版本啥的按最简单的来】ForRecommendationinDeeplearningQQSecondGroup102948747ForVisualindeeplearningQQGroup629530787Imherewaitingforyou不承受这个网页的私聊/私信本宝宝长期征集真实情感经历发在我公号美妙光阴与你同行长期承受付费咨询啥问题都可付费改代码。付费咨询专属效劳快人一步1-根据help再次理解Attention|1.Calculatescoreswithshapebatch_size,Tq
2、,Tvasaquery-keydot|product:scorestf.matmul(query,key,transpose_bTrue).|2.Usescorestocalculateadistributionwithshape|batch_size,Tq,Tv:distributiontf.nn.softmax(scores).|3.Usedistributiontocreatealinearcombinationofvaluewith|shapebatch_size,Tq,dim:|returntf.matmul(distribution,value).三步走计算query以及key的点
3、积这个就是个打分然后由点积得到分布由softmax计算得到由计算得到的分布与value得到最终的结果。关于上次讲解的SRGNN中attention用法我觉得还有点问题主要是query没有明确讲明是啥子可以再看下这个我查看了也没找到查看了原代码也没看懂而且一头雾水这个特别懵逼【或者许这就是屏蔽中下程度的】从shape上来讲这个query的shape必然与session的embeddingshape一样如下例如querytf.Variable(tf.keras.initializers.get(uniform)(shape1000,1,4)valuetf.Variable(tf.keras.ini
4、tializers.get(uniform)(shape1000,16,4)restf.keras.layers.Attention()(query,value)tf.Tensor:shape(1000,1,4),dtypefloat32,numpyarray(-0.00338019,0.00189824,-0.0002874,-0.00784647,-0.00513936,0.00389516,0.00647767,-0.00183488,0.00516016,0.01167186,-0.01381158,-0.0025348,.,0.0104752,-0.00862713,0.004240
5、46,-0.00106742,0.00435216,0.00232145,0.00339274,0.00424616,-0.0039812,0.00517946,0.00704541,0.00448983,dtypefloat32)释义16个点击的item聚合成一个sessionitem及session的emb_size4参考网络上attention自定义的函数可得同样的shapeattention3(tf.squeeze(query,1),value,1*1000)tf.Tensor:shape(1000,1,4),dtypefloat32,numpyarray(-0.02236429,0.
6、02304715,-0.04459522,0.03128466,-0.03680242,-0.03430416,-0.0360697,-0.0039628,-0.00501503,-0.006629,-0.04473983,-0.011972,.,0.02507205,-0.01383727,-0.02684764,-0.00787603,-0.02620304,-0.02197758,-0.0469028,-0.04654911,-0.01396894,0.0357385,0.0449436,-0.03041291,dtypefloat32)其中最后一个变量为value的长度其真实理解参考意
7、为每1000个user为一个batch其中每个user的点击序列最大为16那么序列中不够16的就要补零因此需要知道真实的item个数即value的长度其值应该最大为162-中的Attention怎样改我看了这局部并不是用的Attention至少不是attention上面的定义那种而是直接相加除以个数尽管这点与attention整个流程差异不大但我改成selfattention应该可以试试。将itemembeding的均值视为query进展attention用均值这个我觉得可以以从数学含义来理解吧毕竟也不是毫无意义的也比其他采用CNN等方式得到的有意义多了然后直接采用Attention函数进展尝
8、试。最终结果似乎没啥子差异啊因为生成的训练集可能是不同的【下面答复了这个问题】#myresults(161848,24)(164988,24)all_cpufunctioncost:0.025261smiddegree800length161848answerlength,161848evaluate_scorefunctioncost:1.160040s0.04410670.228331520.025391490.080062490.00597751#oldversion(161848,24)(164988,24)all_cpufunctioncost:0.020204smiddegree8
9、00length161848answerlength,161848evaluate_scorefunctioncost:1.171112s0.047287710.228436560.019599370.08240170.00446279#略微增加点数据量#myresults#90min(178744,24)(166144,24)all_cpufunctioncost:0.020473smiddegree809length178744answerlength,178744evaluate_scorefunctioncost:1.374818s0.042938590.22939510.025103
10、20.079094380.00599198#oldversion#84min(178744,24)(166144,24)all_cpufunctioncost:0.024985smiddegree809length178744answerlength,178744evaluate_scorefunctioncost:1.302567s0.045297810.228913980.023111950.080954840.00557914关于训练集是否一样这里做个测试验证由于是采用的random获取的随机样本那么这里测试下屡次执行的结果是一样的讲明训练集应该是一样的。【又加了一层循环结果仍旧是一样的
11、】$pythonrandom_test_.py6,34,11,52,78,13,4,48,68,42,43,7920,17,43,71,42,31,79,0,55,11,48,80,40,57,13,5,11,18,16,2,37,55,6133,60,4,39,43,66,61,26,67,40,1,50$pythonrandom_test_.py6,34,11,52,78,13,4,48,68,42,43,7920,17,43,71,42,31,79,0,55,11,48,80,40,57,13,5,11,18,16,2,37,55,6133,60,4,39,43,66,61,26,67,
12、40,1,50由于增加了attention多了计算量所以时间稍长了点。【补充0811】关于将均值视为query可能有一定的局限一般来讲应该将最后一个item的emb视为query再次尝试。效果似乎是差的因此均值还是有一定的效果。(178744,24)(166144,24)all_cpufunctioncost:0.010592smiddegree809length178744answerlength,178744evaluate_scorefunctioncost:1.271092s0.041285820.226077510.026501550.077525910.006392873-DIN中
13、Attention怎样改最近的任务是加特征啊其实我的想法以及是一直的不加特征才是真正的高手因为ID本就表示隐藏的群众智慧用户喜欢看那就讲明这个id好加上特征反而有种多此一举的感觉当然也就会陷入特征的无限组合与改良穿插啥的这种才是没有任何解释性。然而原代码是用tf1写的将其中函数直接改为tf2的不行因为有reuse这个所以要改成tf.keras.Model这种形式才可以当然tf2可以只用一个GPU。其中有BN以及Dense层反复使用而且Dense中的参数也是一样的是否可以用一样的初始化放在init我觉得可以一试但是tf1到tf2要改动placeholder及loss这个烦死了。那么本文就不再细讲
14、这局部了详见DIN分布式训练待续。回归正题增加特征啊whatthefuck!4-中的Attention怎么改【0801】参考din的做法将cate_emb拼接到item_emb只得到如下最优的效果【注意得到的emb不要进展normnorm后的结果反而差】。0.030174080.230743290.063570890.069465610.01762796位置权重改为glorot_uniform反而比全是正的效果好一点0.031578170.233358580.066077780.071148530.01890373位置权重不加效果有点差所以必需要。【0806】考虑到时间问题可能在不同时间用户的
15、爱好的类别会发生变化因此有必要固定user侧的数据。回归正题下面需要读懂和充分发挥聪明才智才能将写的代码改成Attention函数的形式。【我使用的就是ComiRec-SA另外一个效果不怎么好SA即为self-attention】【0812】将mask与item点击序列的emb相乘得到的结果就是item序列的emb这个emb经过处理attention或者dense或者mean等就得到user的emb表示用户的爱好。有的将item点击序列的emb经过一些处理比方dense再与mask相乘后再与item序列emb相乘得到user的emb不用attention看下效果如下【采用的新的数据集】0.05
16、3289590.289998860.071969550.099578010.01879087比用attention的效果如下差点但可以承受0.054718,0.2933,0.074638,0.10140117,0.0194518但这局部是是attention的全部么我感觉不是因为后面还有softmax这局部才是attention的关键点由user及item的emb相乘得到分数然后经softmax得到归一化后的结果选出分数最大的为最终的emb按照attention的思想应该是各个emb与分数的加权以及也就是均值这个emb详细是什么要参考之前的因为放入了进展训练。经查看help结果与这个emb是i
17、nputs对应的是user的embedding多兴趣中最值最大的至此即复习了旧的知识也掌握新的知识融会贯穿只在一刹那。下面要做的是将attention的结果视为最终的user_embedding结果如下此时的query为itemembeddingkeyvalue为user多兴趣的embedding。4.1将最终上述user_emb最为sample_softmax_loss的输入inputs而eval时仍旧采用user多个embedding如下0.036155320.173273680.000769640.063066740.00017446效果有点差啊。4.2将最终user_emb作为eval时的user的emb结果如下0.006070470.032112360.02144670.01116720.00549694效果更差了。我天那么这其中就是ComiRec多兴趣的一个关键点了这也是这篇文章发表的idea当然可以能是我没有正确理解代码及其中的含义下周再见。愿我们终有重逢之时而你还记得我们曾经讨论的话题。
限制150内