深度学习:第四章:循环神经网络RNN和LSTM-CSDN博客
类属关系:
RNN主要作用:语音识别,文本生成等
为什么要有RNN? 传统神经网络如CNN,BP每次的输入和输出相互独立
进行两次猫狗识别,第一次的结果不会影响第二次。但很多任务后续的输出与之前的内容是相关的。如“我是中国人,我的母语是____”
RNN引入了“记忆”的概念,
循环:时间递归,______*****
输出依赖于输入和记忆
整个RNN结构共享一组(U,W,b)(往后看就知道是啥了)
RNN的提出主要是为了处理序列数据。序列数据:前面的输入和后面的输出是有关联的。如“中国人,母语是中文”
循环神经网络的结构
Xt是时间t处的输入
St是时间t处的“记忆”,St=f(UXt+WSt− 1),f可以是tanh等
ot是时间t出的输出
双向RNN:有些情况下,当前的输出不只依赖于之前的序列元素,还可能依赖之后的序列元素
循环神经网络结构:
one-to-n:输入不是序列而输出为序列的情况
如图像生成文字
n-to-n:最经典结构,但因为此结构要求xy等长,因此适用范围小
如视频逐帧分类;输入为字符,输出为下一个字符的概率
n-to-one:输入是一个序列,输出是一个单独的值
常处理分类问题,如:输入句子,判断感情倾向
n-to-m:编码解码结构
或 如机器翻译,语音识别
EOS:标记符号,表示编码阶段输入已结束
所谓编码,就是将输入序列转化成一个固定长度的向量;解码,就是将之前生成的固定向量再转化成输出序列
缺点:编码和解码之间的唯一联系是固定长度的语义向量c;编码要把整个序列的信息压缩进c;c无法完全表达整个序列的信息;先输入的内容携带的信息,会被后输入的信息稀释/覆盖掉,输入序列越长,这样的现象越严重,解码效果会大打折扣。
于是引入注意力机制:表示接下来输出的时候要重点关注输入序列中的哪些部分
不再将整个输入序列编码为固定长度的中间向量,而是编码成一个【向量序列】。这样,在产生每一个输出的时候,都能够做到充分利用输入序列携带的信息
RNN模型在梯度下降过程中更倾向于向序列结尾处的权值的正确方向进行更新,也就是说,越远的序列输入的对权值的正确变化所能起到的“影响”越小,所以训练的结果就是往往出现偏向于新的信息,即不太能有较长的记忆功能。
长期依赖:一个输出可能需要较长一段时间之前的输入信息,RNN无法解决此问题
LSTM:有长期记忆功能
LSTM与RNN的整体结构一致,只是内部结构变了
“LSTM比RNN多了一个细胞状态,就是最上面一条线(也就是c),像一个传送带,信息可以不加改变的流动。即Ct-2可能和Ct+1存储的信息可能非常相似,所以LSTM可以解决长期依赖
h1是上一时刻的输入
决定从“细胞状态”中丢弃什么信息
黄色的那个是sigmoid函数
LSTM中所有遗忘门共享WUb
决定放什么新信息到“细胞状态”中
所有输入门共享WUb
更新“细胞状态”
基于“细胞状态”得到输出
Sigmoid函数(输出为0~1)作为激励函数,影响某个参数在输出中的影响占比
Tanh函数作为生成候选记忆C的选项
自然语言处理NLP
缺陷:首先,它是一个词袋模型,不考虑词与词之间的顺序。其次,它假设词与词相互独立(在大多数情况下,词与词是相互影响的)。最后,它得到的特征是离散稀疏的。
TF-IDF:词频: N: 文档总数, nt : 含有词t的文档数
Binary weighting:短文本相似性:
Bi-gram(2-gram)和N-gram
优点:考虑了词的顺序
缺点:词表的膨胀
语言模型:
一句话 (词组合) 出现的概率
离散表示的问题:
无法衡量词向量之间的关系:各种度量(与或非、距离) 都不合适
词表维度随着语料库增长膨胀,n-gram词序列随语料库膨胀更快
数据稀疏,很难捕捉文本的含义
分布式表示
One hot:
分布式:
共现矩阵:将共现矩阵行(列)作为词向量
window length设为1。也就是说记录与某单词距离为1的单词频率(一般设为 5~10)
使用对称的窗函数(左右window length都为1)
单词与本身是0
存在的问题
向量维数随着词典大小线性增长,空间消耗大,稀疏性,模型欠稳定