seq2seq应用场景:
文本生成:翻译、看图说话、生成摘要
文本理解和生成文本
encoder & decoder
encoder,根据输入序列生成语义向量 (h4 = C)
decoder 根据语义向量生成指定序列
seq2seq
encoder通常是一个RNN类模型,
decoder可以有:
1、Greedy Decoding:Greedy Decoding就是每次选择概率值最大的对应的单词(每一轮softmax最大的单词)。但这样做的缺点是,局部最优并不等于全局最好的,而且一旦选错了,后续生成的内容很可能也是错误的,具有错误的累加效果。对于此问题,更好的解决方法是每次考虑更多的可能性。
2、暴力搜索: 相比方法1,暴力搜索时间复杂度极高,一句话m个单词,会产生|V|的m次方计算。
3、beam-search: Beam Search的时间复杂度 kkT,k时beam_size, T是句子长度
k=3时,每一步我们考虑了9种可能性,但为了不让计算复杂度增加,又从9个选项里再选出最好的3个。这就意味着,每个时间的计算复杂度实际上是3的平方,也就是k的平方
时间复杂度kkT
序列得分怎么得到? decoder最后的输出,softmax ???
beam search
代码review:
一个句子,有10个单词,总共有5个备选词。
句子每个位置上,取0~4号单词的概率 用一个矩阵表示,第一维表示是第几个词,第二维表示第i个备选词。
for row in data: # 循环这个句子中的每一个词
for i in range(len(sequeces)): # 循环目前所有的备选子序列,循环次数=beam_size
1) for j in range(len(row)): # 循环每个备选词,循环次数=词表大小
# 更新每个备选子序列,比如:第一次备选序列为 [a] [c], 更新后[aa] [ab] [ac] [ca] [cb] [cc]
2) 备选子序列重新赋值,取上一步骤的 topk 个子序列
返回所有备选子序列
代码review
网友评论