美文网首页NLP
seq2seq笔记

seq2seq笔记

作者: 潇萧之炎 | 来源:发表于2019-04-25 21:56 被阅读37次

    seq2seq聊天机器人中,输入上句话,下句话是什么训练出来的?
    输入上句话,转化为词向量,模型训练后,对应上句话的每个字,会从语料库中找出对应这个字出现概率最高的字,然后拼成下句话
    整个步骤:
    1.数据预处理,获取语料,xx格式,将对话分成问答train_encode.vec,创建词汇表,读到数据库中,再分桶
    2.模型框架搭建,训练,并将训练好的模型参数进行保存。
    3.加载模型,预测模型效果
    https://blog.csdn.net/a18852867035/article/details/53816030

    一、神经网络:
    DNN、RNN是帮你做特征工程,怎么去提取特征,并且帮你把原来的矩阵稀疏化。
    而不是分类,分类是全连接层的softmax

    二、DNN:
    神经网络用图像去提取特征,都是用像素去提取,像素是图像的最小单元。
    数据输入层,也可以叫feature map

    卷积过程:
    将一个55的feature map(或者input layer)用一个33的卷积核,去进行卷积操作。
    原始的卷积核的w是随机生成的(符合标准正态分布),得到一个3*3的卷积层。
    步长stride,公式 (5-3)/1+1,第一个1是步长
    如果步长取3,2/3除不尽,有两种,向上取整,或者向下。
    如果不够的还想保留,那么向上取整,超过边界的部分就补0,
    如果不想要了,就向下取整,多余的部分直接丢弃

    卷积+激励,做稀疏化。激励层之后,池化做进一步的降维。
    降维用到的感知野,一般是2*2的,因为可以降成一半。

    卷积核里面是w1-w9,但是感知野里面是没有参数的。一般取最大或平均。
    感知野一般步长=2,感知也一般取22,44,或6*6.
    公式 (3-2)/2+1,除不尽的处理方法同上

    cnn分为两个部分:
    卷积部分:卷积+池化,完成特征工程
    全连接部分:完成分类
    池化后,可以与全连接层之间加上隐层。
    如果池化后是44的,需要resize成161,因为这里只能是一维的

    上面的例子,如果用传统的神经网络,w参数会有25*9=225个,而用卷积,
    只有随机初始化的9个w参数,9个参数在一次卷积过程中是共享的。
    卷积可以降低网络的复杂度。同时解决了局部像素无关特征共同映射的问题,

    使得局部图像属性更加凸显。
    卷积核越小越好,因为:1,w参数会更少。2,不会影响图像的效果。
    当然,大的卷积核收敛快,小的收敛慢,但是小的精度可以保证,大的精度可能下降
    后面的googleNet,resNet大量使用1*1的卷积,同时网络也加深,会达到154层

    池化到全连接有个resizie,池化不会引入新的参数,只是把原来的数据砍一半

    反向传播 学习到池化这一层就够了。池化的最大值是会记住位置的额
    面试回答:全连接部分和dnn一样,唯一的区别是池化部分,梯度向之前poling最大值的标记位去传导梯度,再往前就超纲了,设计矩阵。
    用max的原因是,在反向bp的时候,max是平均值计算量的1/4

    LeNet比较灵活,CNN+softmax
    卷积神经网络的好处,输入的图像尺寸可以是任意的,全连接不是任意的

    三、RNN:
    跟记忆性有关的,都可以用递归神经网络
    有三个时刻,三套参数,但是模型只有一套。
    用softmax,输出的是 多个词对应的概率

    卷积,一个输入代表一张图,递归,一个输入代表一句话,一句话有几个词就有几个样本

    其中f可以是tanh,relu,logistic等激活函数,g通常是softmax也可以是其他。 值得注意的是,我们说递归神经网络拥有记忆能力,而这种能力就是通过W 将以往的输入状态进行总结,而作为下次输入的辅助。可以这样理解隐藏状 态:h=f(现有的输入+过去记忆总结)

    反向更新:
    DNN只会更新在网络深度方向上的w; RNN在深度d方向上的权重v、u,在时序t方向上的权重w。求导链式法则,要分开对w,u求偏导

    共享参数:
    t-1,t,t+1时刻共用一套模型。

    Relu容易产生梯度爆炸,sigmoid容易产生梯度消失。
    梯度消失原因:网络太深,在进行反向传播的时候,往前传递一次,c就变小一点,网络太深,前面的c就会变得非常小,甚至趋于零,导致前面几层网络的权重无法更新,从而减少模型预测的精度。
    LSTM的思想:就是反向传播时前面几层不需要梯度更新,就把参数停在某一层,不再向前传播
    “我是中国人,我今天要去上课”,反向跟新的时候,只需要更新到,部分就停止,bp的路径变短了,就会减少梯度消失的风险。
    而残差神经网络的方式不一样:在正向传播的过程中,把c不断地去增大,每传播两层,就增加一次feature map的值,所以一般只用来处理图像。
    如果两个词的相关性比较大,那么权重相加再加个偏置,做sigmoid激活的概率越趋近于1.
    Sigmoid(w1+u2+b),可以设计很多sigmoid或者tanh函数,来判断某两个词是不是有关。

    防止梯度爆炸:
    gradient clipping,也就 是当你计算的梯度超过阈值c的或者小于阈值−c时候,便把此时的梯度设置 成c或−c。
    F(x) = min(x,c) x>0
    F(x) = max(x,-c) x<0

    LSTM:
    长时依赖:文本的方向就是RNN的时间t方向
    A是在去隐层的路上设置的关卡。
    有两个输入,初始化为1或0,不用管。
    上面的输入,高架畅通无阻,将上面一个词的信息,传递到下面的词
    下面的一条,经过各种各样的输入,来控制上面一条。如果关系比较大,就让上面的通过,如果关系比较小,就通过一小部分,控制输入多少。(0-1)
    第一道门决定:传多少过来。第二道门:关系越近的+1,关系越小的-1,功率缩放机,强的更强,弱的更弱。第三道门,一部分直接传下去(下一个A),另一部分经过sig和tanh,直接作为输出到ht,上面输入的信息比下面多一点

    比较重要的:RNN自身特点,LSTM、GRU、双向循环
    双向循环,如图,完形填空的场景,“花鸟一床书”,
    正向的AI是A0和x1所得,先放在这里,然后等反向的A1”=f(W”A2”+U”X2)
    得到了A1和A1”,相加得到输出y1

    四、激活函数:
    激活,有0产生,相当于对矩阵稀疏化。如果是relu,则(0,+无穷大)
    如果是sigmoid/softmax,就是(0,1)

    CNN用到激活函数的两个地方,
    1.卷积之后的激活层:relu
    2.全连接层:softmax,如果中间加隐层,继续用sigmoid或relu

    五、Dropout: 只在fc全连接层使用,不在卷积网络去做。
    droupourt只能在全连接层做,也就是fc

    adam会随着时间自己去调节学习率,初始值可以给0.0001.
    深度学习不建议交叉验证去试学习率,因为运算速度慢

    网络退化:在训练集和测试集上的效果都不好。是由于梯度消失引起的。过欠拟合是由于矩阵稀疏化没有做彻底。
    (不收敛的图像比较粗糙,不平滑,不收敛也是稀疏化没做好,或者卷积核设置太大,或者学习率、惩罚因子)

    六、其他:
    正则化推导:
    加了正则相之后,本来w就是变小的,我们的目标是让他变小,这里让他在变小之前变的更小,减少的更快,加快收敛,
    收敛就变快了。如果恰好抵消掉了前面的1,就变成0了,矩阵就变稀疏划了。给的越小,收敛慢,给的大,收敛越快,
    大到一定值,就稀疏画了。l2是从一个方向让w向0去收敛,l1是从正负两个方向向0去收敛,目标都是让w变小

    预处理:
    1.去均值: x-均值
    2.归一化:有好几种方式,比如 (x-min)/(max-min)
    3.白化: (x-均值)/标准差
    4.PCA

    预处理这个部分用在哪里?
    用在输入[batch_size,224,224,3]x输入时,可以直接进行卷积,也可以预处理完再进行卷积,batch_size=一次循环输入的图片数量
    工程上一般用1.去均值,后面几种不用。
    因为像素点是0-255,如果用0-255减去均值,比如均值是150,剩下的值就是-150到105
    大的值与w相乘之后,收敛慢。
    并且可以通过加上均值,得到原始矩阵。

    PCA降维好像跟特征值和特征向量有关

    LRN局部归一化

    图像增强:叫上采样(对不严谨的可以用图像增强,但是像医学这种就不可以)
    下采样,PCA?

    七、面试的
    w梯度的公式要记住

    问卷积的优点,共享参数,笔记上两点
    三张图片
    卷积可解释,因为越到后面的点,向区分度比较大的地方收敛。这个点是当前几张图片的全局最优点

    八、GAN
    纳什均衡点
    两个神经网络,判别模型的输入是生成模型的输出
    概率=0.5,不知道是假还是在真,就是真
    G生成模型是无监督的,D判别模型是有监督的,加起来是半监督的

    训练过程:
    G先输入任意的随机变量点,随机numpy或tensorflow随机产生一个100维的数
    G生成之后出入到D中,D在真实数据里去采样,采样的数据生成一个y值,G生成一个y,只要y-y存在生误差,就更新D模型,也更新G模型。直到y-y^之间的损失小于某个值,模型停止,这个时候将随机变量带入G模型的时候,生成的值就和真实值非常相似
    需要训练D模型

    G的初始值有两种,如果是随机变量,则最后的模型和真实值差不多一样,如果是输入的本来就是一个人的脸,则是风格迁移,也就是常见的人脸互换,脸会含有这个脸的属性,但不会完全一样。
    要一样,只能输入随机变量,要不一样风格迁移(融合),就输入原来的图片
    GAN就是增强这样一个效果,自我训练,类似于强化学习,直接让他做,可能做不了

    注意:D模型不是一个二分类器,它会产生一个损失函数。因为D中的w权重也要更新的,
    W d开始的时候并没有被训练好,它也要被训练的,一个没训练好的模型还不能称之为训练器。
    马尔科夫链要生成联合概率,计算量比较大。
    机器学习(用几万个方程去解几个未知数)和深度学习中都是约等于,只有朴素贝叶斯是等于。因为等号就是过拟合
    GAN最后求的是G模型,不是D模型。D模型是帮助我们求参数的。
    损失函数:
    二分类就用交叉熵,不用softmax。
    RBF径向基,就是SVM的高斯核函数。SVM是最接近神经网络的模型
    极大极小博弈。
    面试的时候按照课件上0.5去说,工程上可以简化。
    上采样卷积。反卷积采样

    九、seq2seq
    现有的模型只能处理人文科学,在专业领域,有些名词是不能分割的(非典,急性上呼吸道感染),不能直接使用。谷歌有框架,但是不开源,细节不知道。

    垂直领域,特定的领域训练特定的机器人。

    上面一句话浓缩成一个数值,到下面一句话再解码出来。
    就是中间态c。
    timestep时序(方向为文本传播方向),下句要比上句长,差10个字
    项目的精确度不是很高的时候用字,高的时候用词。常用字2000-3000个,
    但是词是由字排列的,大约3-5万个。

    向Encoder输入一个字、词,精确的话,映射成一个向量,不精确的话映射成一个数值。
    “月 明 星 稀”上句输完之后,紧接着输出一个语义向量c,c包含了前面四个字的意思的集合。 对照ppt。
    c是中间态。将c解码出来,就是绕树三匝。至于怎么解码出来的 。
    可以将c也作为Decoder(代码中由体现)
    整个Seq2seq有两个lstm,左边右边各一个,因为这是时序上的,到某一时刻,之前的就没了。时序上到 树 的时候,绕 就没了,绕的输出其实是树,这个树被存在一个list中。,每输出一个值就把它存起来,最后一起输出来。所以下句不是四个lstm,而是一个。

    H2有三个输入: h1(上一个的隐态,hidding层的输出),鸟(y1:上一个的输出),c。解码阶段除了h1(c和h0重合),每个h都有三个输入。
    书的后面还有eos。编码阶段长度为5,解码阶段为6,始终多一个eos
    Ppt上:
    上一句应该倒序,因为是对仗的。精度可以提高不少。
    c应该与下句每一个相连;最后有eos

    英文需要两套字典。EOS也要放在字典中,映射成一个数值。
    Cxt,hXT其实就是c,隐态和c重叠了.
    4层lstm: 在deep方向。
    面试陷阱,左边没有头,右边才有。整个图,从左到右,从上到下传递。
    最后取的输出结果是上面一层。
    有三个序列:编码阶段的输入,解码阶段的输入(因为解码阶段也需要输入),解码阶段的输出

    最基础的seq2seq模型包括三部分:编码、解码、语义编码中间态(面试时说)。seq2seq最小的构成单元就是lstm和gru。
    c解码阶段为何这样准确:
    1.编码阶段除了c的解码之外,还要有它的输入序列,这个输入序列就是上一个解码解码的输出
    2.前面的隐层态
    3.每个都要输入c,三个变量来控制的,所以比较精准

    Attention(注意力机制): 在上面模型上加的一个控制因素,让模型更加精确,不是一个新的框架.Head
    在上一句话,每个h1,h2,h3,h4,h5都加一个参数a1,a2,a3,a4,a5。比如一和三是对仗的,那到了一的时候,三的系数a3就设置大一点,其他的设置很小,甚至为0。这个是“一”输入的第四个值。(如果不是对仗,每个a都要保留,对仗可以存在为0的情况)
    两种做法:上一句的a全部做,全部训练;二是随机采样,选择部分

    H2就有四个输入:上一个的输出,上一个的隐层,c,Attention机制(求和Aij * hj)

    生成模型:要算后面一个值的时候,先把联合概率算出来,根据联合概率和先验概率,来计算后验概率。(贝叶斯,马尔可夫,seq2sqe)
    判别模型:不需要计算全(联合)概率

    Seq2Seq

    一、场景

    现有的模型只能处理人文科学,在专业领域,有些名词是不能分割的(非典,急性上呼吸道感染),不能直接使用。谷歌有框架,但是不开源,细节不知道。

    垂直领域,特定的领域训练特定的机器人。

    对话机器中人:

    我们提(输入)一个问题,机器会自动生成(输出)回答。在以往的很多模型中,我们一般都说输入特征矩阵,每个样本对应矩阵中的某一行。就是说,无论是第一个样本还是

    最后一个样本,他们都有一样的特征维度。

    机器翻译英文需要两套字典。

    二、关于词的选用

    Time Step时序(方向为文本传播方向),一般下句要比上句长,差10个字。

    项目的精确度不是很高的时候用字,高的时候用词。常用字2000-3000个,但是词是由字排列的,大约3-5万个。

    三、过程

    最基础的seq2seq模型包括三部分:编码Encoder、解码 Decoder 、语义编码中间态c(面试时说,也就是语义向量)。seq2seq最小的构成单元就是LSTM和GRU。

    编码阶段:

    Encoder是一个RNN Cell(RNN ,GRU,LSTM等)结构。每个Time Step,向 Encoder 中输入表示这个字/词的一个实数向量,直到输入这个句子的最后一个字/词 XT ,然后输出整个句子的语义向量 c(c=h XT)。

    RNN 的特点就是把前面每一步的输入信息都考虑进来了,理论上这个 c 就能够把整个句子的信息都包含了,可以把c当成这个句子的一个语义表示,也就是一个句向量。

    解码阶段:

    在Encoder中得到了一个涵盖了整个句子信息的句向量c。然后一步一步的从c中抽取信息。首先给Decoder输入一个启动信号 y0,如特殊符号<START>, 然后Decoder根据h<0>,y0,c ,就能够计算出y1的概率分布,同理,根据 h<1>,y1,c 可以计算y2 的概率分布。直到预测到结束的特殊标志 <END>,才结束预测。

    【其中】

    H <1>是上一个的隐态,也就是Hiding层的输出,y1是上一个的输出,c。

    解码阶段任务是根据句子X的中间语义表示C和之前已经生成的历史信息y1,y2….yi-1来生成i时刻要生成的单词 yi:每个yi都依次这么产生,那么看起来就是整个系统根据输入句子X生成了目标句子Y。

    H2的四个输入:上一个的输出,上一个的隐层,c,Attention机制(求和Aij * hj)

    总结:

    Encoder Cell 最后 一个时刻的状态 [c XT, h XT] 就是上面说的中间语义向量 c ,它将作 为 Decoder Cell 的初始状态。然后在 Decoder Cell 中,每个时刻的 输出将会作为下一个时刻的输入。以此类推,直到 Decoder Cell某个时刻预测输出特殊符号 <END> 结束。

    LSTM: 整个Seq2seq有两个LSTM,左边右边各一个,编码和解码各一个,因为这两个LSTM参数不同。

    四、举例

    [图片上传失败...(image-7a354-1556200563492)]

    风云三尺剑,花鸟一床书:

    H2有三个输入: h1(上一个的隐态,hiding层的输出),鸟(y1:上一个的输出),c。

    解码阶段除了h1只有两个(c和h0重合,隐态和c重叠了),每个h都有三个输入。书的后面还有EOS。编码阶段长度为5,解码阶段为6,始终多一个EOS。

    C应该与下句每一个相连;最后有EOS。

    上一句应该倒序,因为是对仗的。精度可以提高不少。且这样的处理使得模型能够很好地处理长句子。

    月明星稀,绕树三匝:

    向Encoder输入一个字、词,精确的话映射成一个向量,不精确的话映射成一个数值。

    “月明星稀”上句输完之后,紧接着输出一个语义向量c,c包含了前面四个字的意思集合。

    上面一句话浓缩成一个数值,到下面一句话再解码出来。就是中间态c。将c解码出来,就是绕树三匝。至于怎么解码出来的。可以将c也作为Decoder(代码中由体现)。

    五、原理

    LSTM层次:

    整个Seq2seq有两个LSTM,左边右边各一个,编码和解码各一个,因为这两个LSTM参数不同。不是四个因为这是时序上的,到某一时刻,之前的就没了。时序上到 树 的时候,绕 就没了,绕的输出其实是树,这个树被存在一个list中。每输出一个值就把它存起来,最后一起输出来。所以下句不是四个LSTM,而是一个。

    解码阶段为何这样准确:

    主要就是因为它包含了三个输入,后面加上attention就是四个。三个变量来控制的,所以比较精准。

    1.编码阶段每个都要输入c,

    2.除了c的解码之外,还要有它的输入序列,这个输入序列就是上一个解码的输出

    3.前面的隐层态

    4.attention机制(求和Aij * hj)

    [图片上传失败...(image-aef103-1556200563491)]

    Attention(注意力机制):

    LSTM虽然具有记忆性,但是当Encoder阶段输入序列过长时,解码阶段的LSTM也无法很好地针对最早的输入序列解码,提出Attention注意力机制。

    在Decoder阶段每一步解码,都能够有一个输入,对输入序列所有隐藏层的信息h_1,h_2,…h_T x进行加权求和。打个比方就是每次在预测下一个词时都会把所有输入序列的隐藏层信息都看一遍,决定预测当前词时和输入序列的那些词最相关。

    Attention机制代表了在解码Decoder阶段,每次都会输入一个Context上下文的向量Ci, 隐藏层的新状态Si根据上一步的状态Si-1, Y i, Ci 三者的一个非线性函数得出。

    举例:

    在上面模型上加的一个控制因素,让模型更加精确,不是一个新的框架.Head

    在上一句话,每个h1,h2,h3,h4,h5都加一个参数a1,a2,a3,a4,a5。比如一和三是对仗的,那到了一的时候,三的系数a3就设置大一点,其他的设置很小,甚至为0。这个是“一”输入的第四个值。(如果不是对仗,每个a都要保留,对仗可以存在为0的情况)

    有两种做法:上一句的a全部做,全部训练;二是随机采样,选择部分。

    Soft Attention和Hard Attention

    Soft Attention:每一步都对输入序列的所有隐藏层hj(j=1….Tx) 计算权重再加权平均的方法,Hard Attention:是一种随机过程,每次以一定概率抽样,以一定概率选择某一个隐藏层 hj*。

    六、公式和其他

    1.生成模型:要算后面一个值的时候,先把联合概率算出来,根据联合概率和先验概率,来计算后验概率。(贝叶斯,马尔可夫,seq2sqe)

    判别模型:不需要计算全 (联合)概率

    2.词嵌入 降维/

    3.面试:四层LSTM: 在deep方向纵向;两个LSTM,在Time Step方向横向。

    面试陷阱,左边没有头,右边才有。整个图,从左到右,从上到下传递。

    最后取的输出结果是上面一层。

    有三个序列:编码阶段的输入,解码阶段的输入(因为解码阶段也需要输入),解码阶段的输出

    相关文章

      网友评论

        本文标题:seq2seq笔记

        本文链接:https://www.haomeiwen.com/subject/icitnqtx.html