sp5.1 Recurrent Neural Networks

时间序列数据是指在不同时间点上收集到的数据,这类数据反映某一事物现象等随时间的变化状态或程度。
序列模型可用于序列数据sequence data 都算监督学习
比如语音识别 输入输出都是序列。对于音乐生成,输出是序列 而输入是整数比如音乐类型甚至空集
也可以视频物体运动识别 输入是序列模型 输出是个整数
 
Named entity recognition 识别一句话中名字在哪
输入的时间序列模型 用x^t表示位置 在句子里就是第几个单词 输出也一样
Tx和Ty表示总长度 可以相同可以不相同 看你要什么 这里识别一句话每个单词 所以两者长度相同
这样表示不太好
X^<I>表示这个序列的第几个单词
 
X^i表示第几个训练样本
 
 
 
x^i t 表示第i个样本的第t个单词
 
第i个样本的序列长度
 
 
怎样表示单词?
首先建立字典 一般长度为30-50000 商业3万-5万 也许百万
用在字典里的位置表示序列里单个单词
one-hot方式编码 不再词表中的单词用unk表示 unknow
整个x就是一个很大的稀疏矩阵了
对于不在词表中的用个unk表示
 
为什么不用以前标准的神经网络?
对于人名判断举例:为什么不用以前的DNN?
使用标准神经网络表现不好:比如每个单词看成一个特征属性 输入进去
1 每个样本比如句子长度不一样 虽然可以设个最大长度 不够的用0啥的填充 但是仍然不好
2 并不共享文本在不同位置上学到的特征
3 特别大啊 比如用的是几万长度的字典 每个特征值不就是几万了 再乘以一句话的单词数量 很大
比如每个one-hot是 一万 然后每句话 10个单词 这一下子就是 10W了输入进去
这里的最后输出是判断这t个单词哪个是人名
 
RNN
每层只是一个单词x<1> 每个单词对应一个输出Y 一个循环使用的是相同的w权数
第二个单词 就用了前一个单词传过来的参数 这样子一句话单词数不管多少 都可以了
缺点是只用了前面的信息 没用后面的 比如第二例子泰迪熊 就不是人名
waa、wax都是相同的
最后一个循环图相当于前面展开的,有些论文这样画
用相同的W_ax 水平激活值W_aa 输出Y是 W_ya
BRNN双向传播神经网络
向前传播:
g(上一步的a0 * Waa + 当前x * Wxx+b)
 
Waa 就是对应隐藏层的啊 这里假设他是100维的 Wax是对应one-hot的 这里假设一万维
原本是隐藏层Waa100*100 * a 100*1=100*1 + Wax 100*10000 * X 10000*1的=100*1 + b
 
上面两个合成一个矩阵运算 左右划线公式是一样的啊
把Waa Wax 水平放在一起 就是Wa
两者一个100*100 一个100*10000 水平放在一起 这样是100* 10100
 
把a和X垂直放在一起啊
两者一个100*1 一个 10000*1 这样是10100*1
 
Wax(100,10000) * Xt(10000,m)=100*m 同时处理m个样本的 一步
Waa(100 , 100)* at(100,m)=100 *m
两者相加+ba
Wya(?,100) * 1 00*1
 
waa wax矩阵水平放置 【,】矩阵竖着放
a1不是一个数字啊 假设设置a是100维的隐藏层
x1这里设每个单词one-hot是10000维的
 
反向传播:从最最右上角的损失函数最终值来反向回来
Wax往前传吧 Waa Wya都一样往前传的
这里第一行loss是单个单词的 其实就是交叉熵 这是个二分类问题啊 要不0要不1 真实标签
 
 
 
 
 
不同类型的RNN:
多对多(输入输出长度一样 比如识别人名) 多对一(整个句子对应一个输出 比如识别情感)
 
一对多(给个类型 音乐生成)前一个输出也给下个 另外一种多对多(输入输出长度不同 翻译 )
 
 
 
 
 
——————————————————————————
 
 
序列生成:比如语音识别/机器翻译 两句话很相似 判断哪个概率大
利用语言模型来判断 相当于用概率打分了 在整个语境下 接下来每个句子的概率
这里每个单词以Y表示
 
1 建立语言模型
1 需要一个语料库corpus 数量很大的英语句子
2 将一个样本(句子)里的单词onehot 句子结尾可以加EOS标记 词不在里面还用UNK
 
3构建RNN,让xt=y(t-1) 就是把上一步的真实值传进来 当做当前步骤的x
其实这里y就是监督学习里 签值 下面算出来都是y^ 实际算出来值
这里y1 y2都指的是单词 都是one-hot
有时候会产生unk 要是避免的话 若是出现就继续进行采样直到不出现
 
 
2采样:对于训练好的 模型进行采样 看他学到了什么
这里每个Y就是个softmax过得10000维 每个单词概率 根据这些概率大小随机选一个
作为下一个输入 原本是真实单词 这样子就随机生成了一个句子
 
SAMPLE采样
 
D 是以概率分布随机采样的 不是采样最高概率那个
 
 
y也可以是基于字符的(字母) 优点 :不会产生unk 但是这样子会产生太长 依赖关系也不如基于单词的好。但可能随着计算机性能变好可能会用基于字母的
 
 
——————————————————————
 
 
其实梯度消失一直存在 之前的标准网络什么的都有这个问题 不过在这里比较突出
不管你用sigmoid 还是tanh都容易 出现这个问题 两者图像几乎一样啊 一个是0-1 一个是-1到1
梯度消失 比较难解决vanishing gradients:缺点存在梯度消失 就会很难影响前面的层
比如前面是cats 后面应该是were 但是RNN其实不太擅长这件事 距离比较远的依赖关系
更多受到最近距离几个层的影响
 
 
梯度爆炸指数级的用梯度修剪gradient clipping:缩放梯度向量 设个阀值 让其不溢出 不爆炸
这里直接让10 -10作为上下边界了
梯度消失比较麻烦 用下面的网络 可以有更远的依赖
 
梯度消失解决方法
利用下面模型方法:
GRU Gated Recurrent Unit门控制循环单元
改变了RNN的隐藏层来应对RNN梯度消失的问题 使前后依赖关系大了)
原本RNN是这样的
 
现在有个新变量C作为记忆单元,把a的值赋予它 在GRU中 两者相等 在LSTMS中不同
C^t在每一步骤更新Ct 而用γ门来决定是否更新
γ门代表更新门(0-1之间) 用sigmoid激活 根据图像知道 一般要不接近0 要不接近1
 
假设记忆细胞被记为0或1表示 这个单词是单数或者复数 假设单数1 如下文的cat 会一直记着Ct
则一直记到was那里。 门的作用就是什么时候更新Ct的值,在was那里 就变回了不用再记着了
 
γ不更新时候是接近0的 所以Ct约等于=ct-1的 一直都大致相等
 
 
 
 
这里只是个例子让ct=1 其实c可以是任意设置的维度啊!!!!γ门和a相同维度
 
再看图理解 就是前一步有a^t-1 c^t-1传进来
用当前步X^t 输进去 算一个Chat^t 和 门 然后门和他相乘决定是否更新C 紫色部分
紫色部分C也传下 一步 而且softmax来算yhat
门一般非常接近0 (是个sigmoid) 有利于保持记忆细胞C 这里Ct是个任意维的 比如100维的 门也一样 其实这里一百维直觉可以理解为 每一个数 可能都记忆不同的关系 比如有的单复数 有的时态等
 
 
全GRU多了个r门 来算计Ct-1和下一项CT多大相关性
尼玛第一个式子变了 没注意看
 
 
 
LSTM长短时记忆网络 有了单独的记忆们和遗忘门
可能比GRU更有效和通用:其实GRU是最新提出的 像简化版LSTM 能用于更大的网络
 
让很多偏导连乘起来不会太大也不会太小 解决了爆炸或者T梯度消失的问题
 
多了 遗忘门 和 输出门
这样关于记忆细胞C 就成更新门*当前算出的C + 遗忘门*上一步C
at不直接等于ct 而是 输出门 * 上面算出来的Ct
 
其实就是之前y=wa+b 激活传给下一个 现在编程把用遗忘和更新门 变成了C
a原本也是直接传给下一个 现在用了输出门
 
 
 
 
 
 
最常用的版本 输出门里多了个00000000000000000000000000000000000000000000000.
 
 
 
。。//。//。0/'“?
 
”000000000000000000000000000000000000000
 
y=softmax(w*a+b)000000
 
 
 
Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves进行了改良和推广。在很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。
LSTM 通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为,而非需要付出很大代价才能获得的能力!
所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。
 
 
 
模型3
 
之前单向的 对于人名识别就容易出问题
 
双向神经网络:不仅可以获取以前信息也可获得未来信息 前面几种都是单向的
 
 
 
增加了反向循环 变成了无向图
缺点是 需要完整的数据序列 语音识别系统 的话 需要用户把一句话说完才可以 而不是边说边出
 
 
 
这里还可以用GRU LSTM
 
模型4
深层循环神经网络:多个RNN叠起来
一般没多少层 不像卷积啥的 几层一般
a【】横着算一层 a等于X传进去算 加上 横向同层穿过来的
 
a可能就两三层, 上面又多加了几层 是为了算Y 他们之间横向不连接

猜你喜欢

转载自www.cnblogs.com/hellodantong/p/9965265.html