当前位置: 代码迷 >> 综合 >> 深度学习建模训练总结(四):梳理NLP发展里程碑——seq2seq
  详细解决方案

深度学习建模训练总结(四):梳理NLP发展里程碑——seq2seq

热度:29   发布时间:2024-02-19 16:54:45.0

因为我自己是比较希望做NLP方向的研究,之前简单回顾了一下基础的神经网络之后,接下来打算就从NLP的角度,来看看模型是怎么一步步改进发展的。

对于自然语言处理,首先想到的问题肯定是怎么把自然语言转化为向数字表示,毕竟机器没办法理解人类的语言,只能处理数字,所以人们就研究出了很多embedding模型,关于embedding我想在之后详细谈谈,这里先暂时跳过。

假设我们已经对自然语言进行了embedding,那么首先想到的自然就是使用最基本的神经网络进行处理和分析,也就是CNN和LSTM(RNN),这算是NLP引入神经网络的一个重要开始吧,CNN和LSTM其实算是各有优缺点吧,一方面,LSTM可以处理动态序列,而CNN则需要对输入序列进行截断或者padding,从而使得序列长度是固定的,另一方面,CNN可以并行训练(卷积计算不依赖历史的状态),而LSTM则必须算出历史的状态才可以继续算下去,这就导致了CNN的训练效率比LSTM高很多,除此之外,我觉得CNN和LSTM一个显著的差异应该是长期依赖问题,毕竟LSTM终究只能改善这个问题,而无法根治,但是CNN可以通过构建深层网络学习远距离特征,这是LSTM无法做到的。

RNN虽然说天生有缺陷,但是他设计很简单巧妙优雅,而且后来很多模型都是基于它发展起来的,比如seq2seq,NLP史上的又一个里程碑。

在介绍seq2seq之前,我们先回顾一下RNN的结构,网上有很多划分方法,比如1-to-n,长度为1的输入可以只在起始时刻用到,也可以每个时刻都重复输入:

在这里插入图片描述
除了1-to-n也有n-to-1或者n-to-n:

在这里插入图片描述
我们可以总结对比一下,CNN只能处理固定尺寸的输入输出,RNN可以处理变化尺寸的输入输出,但是要求输出尺寸要么为1要么等于输入,很自然的就会想到能不能发明一个模型,能够处理任意长度的输入同时生成任意长度的输出,而这就是seq2seq实现的效果。

个人觉得,seq2seq就是RNN的发展模型,首先seq2seq会接受长度为n的序列,生成一个语义向量c,这完全就是n-to-1型RNN做的事情,之后seq2seq会利用生成的语义向量,通过RNN生成长度为m的输出,其实这里就是接一个1-to-m型的RNN(每个时刻都会重复输入语义向量),所以我觉得seq2seq完全可以看成一个n-to-1型和一个1-to-m型的RNN叠加构成。

在这里插入图片描述
RNN天生自带缺陷,所以本质上由RNN构成的seq2seq也一样有长期依赖的问题,或者说生成的语义向量更多的包含了序列后端的信息,前端的信息则比较难传送到语义向量中,另一方面,通过单一的语义向量表示整个输入句子的信息也太难为人家了,所以就有人提出,在不同时刻,有目的性地计算不同的语义向量,在语义向量融入该时刻相关的信息,而不是追求一次性把所有信息都塞进语义向量中,这就是注意力机制做的事情,关于注意力机制,将在下文详细讲解。