chatBot

0x00 RNN & LSTM & GRU

​ 标准RNN结构如下图所示:

image-20230114135743631

​ 其中输入为x,隐藏层为s,输出层为o,U是输入层到隐藏层的权重矩阵,V是隐藏层到输出层的权重矩阵,还有一个自循环矩阵W。上图展开可得到下图:

image-20230114135912148

​ 隐藏层s可以细化为:

image-20230114140004724

​ 根据上述结构,对RNN进行深度化,就可以得到深层循环神经网络

image-20230114140154818

​ 但是RNN有一个问题,即容易造成梯度消失或梯度爆炸问题,这就说明RNN不具备长期记忆,仅仅有短期记忆功能。因此LSTM应运而生。网络结构如下:

image-20230114140418292

​ LSTM每一个时刻t都增加一个隐藏状态C(细胞状态),并用两个门来控制它的内容:

  1. 遗忘门(Forget Gate),决定上一时刻的细胞状态C_{t-1}有多少保留到当前时刻细胞状态C_t。
  2. 输入门(Input Gate),决定当前时刻网络的输入x有多少保存到细胞状态C_t。然后再用输出门(Output Gate)来控制当前细胞状态C_t有多少输出到当前输出值h。

​ 但是,LSTM复杂度较高,由此又有了GRU,其是LSTM的v2版本。

​ 上述所说的RNN、LSTM与GRU都是处理序列数据,但是利用的一般是前文信息,但是实际上很多场景都需要结合上下文才能综合判断,因此提出了双向循环神经网络。

image-20230114141418228

​ 左边的是正向序列信息,LSTM模型利用上文信息;右边的是反向序列信息,LSTM模型利用下文信息。接着将两个模型输出合并,得到整个模型的输出。

​ 循环神经网络可以实现语言翻译、问答系统等,基于此网络构建的典型模型是Encoder-Decoder模型。

image-20230114141651422

​ 对于自编码模型可以理解为:从左到右,看作由一个句子(文章,段落等)生成另外一个句子(文章或段落)的通用处理模型。对于输入与输出都是序列的自编码模型,称之为Seq2Seq模型

0x01 注意力机制(AM)

​ 引用:https://blog.csdn.net/qq_27388259/article/details/120878477

​ 0x00所说的Seq2Seq模型,无法应对句子很长的情况,于是注意力机制模型应运而生。注意力机制本质就是:输出句子中某个单词和输入句子中每个单词的相关性。如下图所示:

image-20230114142141001

​ 上图中,key就是输入的每一个单词,value是这些单词对应的取值,称之为数据对,query是输出的某一个单词。

​ 给定一个query,计算其与各个key的相似度,得到权重系数,最后得到attention value值。对上述过程进行细分,可以分为:计算相似度、归一化处理、计算注意力3个部分。

0x01.1 计算相似度

​ 三种度量相似度的方式:闵可夫斯基距离、余弦相似度和核函数,当然也可以自己构造相似度。

0x01.2 归一化处理

​ 得到了相似度s_i,之后进行归一化处理(一般使用softmax函数):

image-20230114143019882

0x01.3 计算注意力

image-20230114143145075

​ 对比一下,不带注意力机制的Encoder-Decoder是这样的:

image-20230114143459261

​ 其中,C代表输入X放入Encoder之后编码成的中间向量,y代表输出的值,g代表Decoder。

​ 带注意力机制的Encoder-Decoder是这样的:

image-20230114143725368

image-20230114143734647

​ 但是每句话输入长度不一样啊,这个矩阵的T不是固定的,那么模型是如何确定权重系数矩阵的呢?它是通过对齐函数F来获得目标单词和每个输入单词对应得对齐可能性,然后经过softmax函数进行归一化得到注意力分配概率分布数值。

image-20230114144126388

image-20230114144245439

​ 再加入双向循环网络结构,最终结构如下:

image-20230114144458500

0x02 最终项目

https://github.com/WD-2711/chatbot

留言

2023-01-14

© 2024 wd-z711

⬆︎TOP