seq搜索引擎优化至少包括那几步?(2019独角兽企业重金招聘Python工程师标准(图))

优采云 发布时间: 2022-01-13 01:19

  seq搜索引擎优化至少包括那几步?(2019独角兽企业重金招聘Python工程师标准(图))

  2019独角兽企业招聘Python工程师标准>>>

  

  现在深度学习的各种技术、概念、模型令人眼花缭乱,每一个进步都日新月异。不过不用担心,关键点只有几个,一个是卷积的,一个是lstm/rnn的。其实改个损失函数,加几层,改个优化函数,改个训练数据集,都是不断刷论文。

  但是注意力模型不同,这个模型是有生产力的。

  最直观的解释之一,什么是注意力。想想我们在人群中,无意中看到了认识多年的老朋友,或者找到了人,我们不要扫描每张脸。或者过马路时,会不会从马路左侧扫到马路右侧,多注意红绿灯和过往车辆。这是人类观察事物注意力的分布(人类是为了节约能源)。

  

  以上是传统的seq2seq模型,encoder生成语义编码信息c(其实就是RNN生成的hidden_​​state)。然后 y 使用这个 hidden 作为输入状态。

  我们先直观的了解一下seq2seq。

  输入是单词序列,输出也是单词序列。可以是同一种语言,比如做摘要,也可以是不同的语言,也就是做翻译。所以seq2seq是一个更通用的模型框架。

  

  编码器用于对输入的 X 序列进行编码。

  C = F(X) = F(x1,x2,x3...,xn),编码存储在C中。

  然后将C传给decoder进行解码:Y=G(C,y1,y2....,yn-1)。这里我们可以看到对于每一步yi,我们用C都是一样,这显然是不合理的。翻译一个句子的时候,每个时刻需要注意的词肯定是不同的。而且rnn/lstm最终输入的权重最大,更不合理。所以google有一个模型,颠倒词序的效果会更好,其实是有这么一个道理的。

  没有attention模型,就相当于读了一个英文句子Tom Chase jerry,我们用C记录它的语义。然后我们开始翻译成中文,第一个词“Tom”,但是当第二个词是G(C, Tom),仍然使用 C 的语义。但是在翻译Jerry的时候,jerry的权重应该更高一些。

  

  也就是说,在翻译的每一步,输入的语义编码的权重都不同。

  

  

  如果使用rnn,这里f2的输出就是encoder hidden_​​state(注意不是final,是一个中间状态,其实就是每个输入的输出)。

  那么这个概率权重是怎么来的,就是注意力模型的关键。

  很多论文中都定义了这样的函数:F(hj, Hi),需要对齐单词。

  pytorch的代码实现片段如下:

  def forward(self, input, hidden, encoder_output, encoder_outputs):

embedded = self.embedding(input).view(1, 1, -1)

embedded = self.dropout(embedded)

#这里计算注意力权重,input和encode的context线性

   #把hidden和input cat之后,线性组合成softmax概率

   attn_weights = F.softmax(

self.attn(torch.cat((embedded[0], hidden[0]), 1)))

#和每个output做bmm,不广播,encoder提供的每个output中间态做加权,得到新的hidden

   attn_applied = torch.bmm(attn_weights.unsqueeze(0),

encoder_outputs.unsqueeze(0))

#这一步也是常规的,embedded+hidden之后做线性

   output = torch.cat((embedded[0], attn_applied[0]), 1)

output = self.attn_combine(output).unsqueeze(0)

  就是这样,实现了加权注意力的分布。明天继续深入这个问题,写一个从输出到输出计算的过程,会更直观一些。

  作者简介:魏家斌,北京大学光华管理学院互联网产品/技术总监(MBA),特许金融分析师(CFA),高级产品经理/程序员。偏好python,深度关注互联网趋势、人工智能、AI金融量化。致力于用最先进的认知技术来了解这个复杂的世界。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线