传送门:
part2–从零开始学RNN,从入门到入土—反向传播,语言模型
part3–从零开始学RNN,从入门到入土—GRU,LSTM
0.前言
当你点进这篇博客就已经默认你已经学习和了解的普通神经网络的构造和运算原理,如果不知道,建议先学习普通神经网络的构造和原理再来学习。这样可以让你更快的上手RNN
食用事项:
- 本博客对符号的命名规则为: x:输入,y:输出, g():激活函数,a:输出的激活量,b为偏置,w为权重
- 本博客将从理论,概念出发,所以基本没有代码(顶多一些伪代码),这样可以方便不同框架和不同语言的人进行学习
- 博主对神经网络了解也不是特别深,这篇博客基本上属于笔记类型,如有错误,请联系我纠正
本博客图片,教程理论来自:deeplearning.ai
1.什么是RNN?
你每天使用的搜索引擎用了RNN,翻译软件使用了RNN,语音助手也是使用RNN
这下子你对RNN在哪些场合使用有了初步的了解
同时你也可能有些疑问
- 但为什么是RNN?
- 传统神经网络办不到吗?
- RNN是怎么办到输出不同长度的输出结果?
- 什么是RNN
抱着这些疑问来开始RNN的学习吧
首先我们要弄清楚RNN的四个种类
传统神经网络:输入一个,输出一个
RNN:
- sequence-to-sequence(序列到序列):输入n个x就输出n个y
- sequence-to-vector(序列到向量):输入很多x但只返回一个y
- vector-to-sequence(向量到序列):输入一个x,但返回很多y
- Encoder-Decoder(加密到解码):输入一个sequence-to-vector,输出vector-to-sequence,先喂给神经网络n个x,返回一个中间值k,这是sequence-to-vector(也就是encode),再将这个k通过vector-to-sequence将会返回很多y值,这是decode。
事实上Encoder-Decoder这也是个输入一段序列返回一段序列的方法,但和sequence-to-sequence,相比有个中间环节,这个中间环节可以起到会比sequence-to-sequence更灵活的作用。比如我要翻译一段话,但是如果每种语言到另外一种语言,如果使用sequence-to-sequence,那要训练的神经网络可是非常多的,而使用Encoder-Decoder,可以先将输入语句encode成一种语言意思,再通过你想翻译成的语言的decode神经网络翻译出来,开销和运算量会小很多。
Encoder-Decoder和sequence-to-sequence最明显的区别就是:sequence-to-sequence输入输出长度一样,Encoder-Decoder输入和输出可以不一样.
如果对上面的RNN类型的介绍感到有点蒙,可以看下面的例子
- 语音识别–Encoder-Decoder,输入一段音频,返回一段文字
- 音乐生成–vector-to-sequence,输入一个字母,返回一段音乐(之前见到过有个网站可以将你输入的单词转化成音乐,哪天有空找找就放到这里)
- 打分–sequence-to-vector,输入一段评语,返回评语所代表的评价分数
- DNA分析–sequence-to-sequence
- 翻译–Encoder-Decoder
- 视频动作分析–sequence-to-vector,输入一系列图片,返回图片中的信息
- 人名提取–sequence-to-sequence
2.RNN的数据集标注是什么样的?
举个例子
这是一段人名识别的数据集标注(等长形式:输入和输出长度相同)
其中
X为输入单词,Y为输出
Y的标注:
在相同位置上Y将反映出X位置上的单词是否为人名单词,并用1,0标注
X的标注:
建立一个单词表(可大可小,大单词表可以使识别面向的场景更多,小单词表可以通过多收集一些常用单词来提升面向的识别场景
)
再给X做对应建立单词表(大小为10000
)的one-hot
标注,比如harry
在单词表的位置为4075
位,则生成一个长度为10000
,在4075
位上为1,其他位置为0的数组。
3.循环神经网络(recurrent neural network)
为什么不使用普通的神经网络?
普通的神经网络不能
输出不同长度的输出
普通神经网络不能
让相同的输入在不同的位置上得到相同的特征学习:
比如一个名字识别的网络
,输入一段话,我的数据集只有让神经网络在位置1
上学习到了harry
这个单词,但如果给神经网络输入harry
不在这个位置上,比如100位置
上输入harry
,则可能神经网络并不能准确返回100位置
上是否是个人名,因为神经网络只学习到了1位置
上有harry
这个人名。
4.一个简单的RNN
正如其名,RNN是一个反复循环使用的神经网络,正如上图左侧所示,这个神经网络将先a0
(一个全为0的向量)和x1
,然后返回a1
到下一次循环和输出y1
,接下来再下一次循环里输入a1
,x2
返回a2
,y2