• 动手学深度学习 | 序列到序列学习(seq2seq)| 62


    Seq2Seq

    seq2seq,从一个句子翻译到另外一个句子。

    封面是一个基因转录,这个也是一个seq2seq的过程。

    seq2seq最早是来做机器翻译的,不过现在基本都使用bert。(听说google的翻译和搜索都使用了bert)

    seq2seq是一个encoder-decoder的架构。

    • encoder是一个RNN,读取输入句子(可以是双向的)

    encoder就是给一个句子,比如"hello world",然后需要翻译成法语的句子。

    把最后时刻的隐藏状态传递给解码器,可以认为最后时刻的隐藏状态包含了整个句子的信息。

    encoder的RNN可以是双向的,双向的RNN可以做encoder,但是不能做decoder。encoder是不需要预测的,所以可以看到完整的句子,可以正着看,反着看,encoder经常会使用双向RNN。

    • decoder使用另外一个RNN来输出

    隐藏状态一过来,先给一个<bos>说明句子开始了,然后把上一个时刻的翻译做为下一个时刻的输入,当然隐藏状态也是向下传递。这样对长度是可以变化的,知道输出<eos>才结束预测,这样就不管源句子有多长,target句子有多长,不用关系如何让二者的长度一样,就按照时刻往前走,走到停为止。

    encoder最后一层的最后时刻的输出,将放到和decoder的input一起输入。

    训练:

    decoder在训练的时候是知道真正的目标句子的,就是正常的进行RNN的训练。(这里是没有利用上一时间刻的预测结果的

    推理:

    因为没有正确的答案,所以只能不断利用上一时刻预测的结果作为下一个时刻的输入,不断地向前预测。

    BLEU完美是1,然后越小越差。

    如果label很短,但是pred很长,这样会命中很多,所以要进行惩罚(min(0,1-frac{len_{label}}{len_{pred}} ))

    代码


    QA

    1. encoder输出和decoder输入,concat和按位相加起来有什么区别吗?

    它们可能长度不一样,所以是不能相加的,这里只要保证他们的隐藏单元数量相同(列宽相同),就可以进行拼接操作。

    1. embedding层是word2vec吗?

    不是的,而且现在也不打算将word2vec,因为现在也用的很少,现在基本都是用bert。

    而且演示代码中也没有使用预训练的embedding,这里是是随机初始化,然后重头开始训练的。

    1. vaild_length是怎么选择的?

    vaild_len不是选择,就是实际的法语句子有多长,要把vaild_len存下来,后面计算loss的时候,valid_len后面的padding的mask都是不要计算的。

    1. 现在seq2seq好像都用transformer实现了,RNN,LSTM还有什么使用场景吗?

    现在是潮流,说用transformer不用RNN了,但是可能过几个月大家又说RNN好。

    深度学习就是一波又一波...

    1. 实际句子的长度超过了设定的句子长度,是直接截掉不用了还是放到下一个句子?

    是直接截掉不用,不能放到下一个句子。

    所以要选一个差不多的长度,不要截取掉太多。

  • 相关阅读:
    c++ 从vector扩容看noexcept应用场景
    c++11-17 模板核心知识(十一)—— 编写泛型库需要的基本技术
    动态链接的PLT与GOT
    c++11-17 模板核心知识(十)—— 区分万能引用(universal references)和右值引用
    Golang性能分析与优化
    c++11-17 模板核心知识(九)—— 理解decltype与decltype(auto)
    [LuoguP4808][CCC 2018]平衡树(数论分块+记忆化搜索)(有复杂度证明)
    [NOI2016]区间(线段树+尺取法)
    [BZOJ4316]小C的独立集(仙人掌+树形DP)
    [CTSC2002]灭鼠行动(模拟)
  • 原文地址:https://www.cnblogs.com/Rowry/p/15376939.html
Copyright © 2020-2023  润新知