zoukankan      html  css  js  c++  java
  • NLP经典模型入门-seq2seq

    前言:笔者之前是cv方向,因为工作原因需要学习NLP相关的模型,因此特意梳理一下关于NLP的几个经典模型,由于有基础,这一系列不会关注基础内容或者公式推导,而是更侧重对整体原理的理解。顺便推荐两个很不错的github项目——开箱即用的中文教程以及算法更全但是有些跑不通的英文教程

    一. 从encode和decode说起

    encode和decode是一个非常常见的结构。encode可以理解为从输入得到特征的过程,而decode可以理解为从特征得到结果的过程。同样适用https://zhuanlan.zhihu.com/p/28054589的RNN网络结构图来说明。

    实际上,我们利用RNN由输入得到h1~h4这4个状态的过程就是encode,同理包括从image经过大量cnn得到feature等。而decode则是从特征得到结果,比如在图像分类问题中,这一步骤可能是对feature map做avgpool然后经过若干个fc和softmax得到类别概率。而在之前的RNN中,decode过程则是直接取最后一个状态h4,然后经过fc和softmax得到类别概率。

    二. seq2seq与attention

    原理

    seq2seq指的是输入和输出都是序列的问题,比如翻译。在这种时候,显然是不能用之前RNN的思路的。但是实际上,两者并没有太大的差异。比如,我们完全可以使用相同的encode过程,用一个RNN来提取特征,但是我们每个(h_i)都经过fc和softmax,求出每个位置对应的最可能是什么词,这就是一个最简单的翻译网络了。当然直观上输入和输出必须是等长的,如果不等长,可以取两者最大公共长度补齐;或者也有其它方法,详情参考最上面给的博客。

    当然也有很多不同的操作,比如你可以给h1~h4做一个特征融合。然后用融合后的特征去decode,这里的c就代表从encode得到的最终用于decode的特征。这里我们可以把之前介绍的attention机制涌过来。

    decode特征也可以是多个,比如现在是一个4对3的任务,有4个状态特征h1-h4,则可以用不同的注意力机制权重得到c1-c3,这里就是之前提到的翻译例子了:

    其它

    Pytorch中,RNN和LSTM模块的输入和输出必须是等长的;意思是如果你输入是x个状态,那么输出也必然是x个状态。所以如果输入和输出是不等长的,需要自己填补到等长,Pytorch也提供了相关函数填补函数pad_sequence以及对应的解压函数。如果需要使用的可以自己了解。

  • 相关阅读:
    day26
    day 25
    java.io.IOException: java.net.ConnectException: Call From master/192.168.58.128 to master:10020 failed on connection exception: java.net.ConnectException: 拒绝连接;
    疫情可视化系统
    使用eclipse创建spring cloud的eureka客户端和eureka服务端
    连接虚拟机的hive时进程自动杀死
    在Ubuntu18.04的Docker中安装Oracle镜像及简单使用
    Ubuntu16.04 上Docker 中安装SQL Server 2017
    docker
    Docker镜像报错
  • 原文地址:https://www.cnblogs.com/lity/p/13498969.html
Copyright © 2011-2022 走看看