语音识别一定想到RNN,就像图片识别想到CNN一样。
英汉翻译有两种方法:一是语音识别,一是英汉对照直接training
1.RNN的learning
1.1loss function
- cross entropy是怎么算的呢:对每个输入xi, 其输出的yi 与相应的reference vector
- cross entropy之和就是loss function
- 注意:sequence不能打散,要先用x1 得到y1, 再用x2 得到y2.
1.2 training
-
用gradient descent做training,gradient descent的算法从BP(Backpropagation)进阶为BPTT(Backpropagation through time)
-
但是:很遗憾的,RNN的训练是比较困难,error surface要么很平缓要么很陡峭
-
解决办法是clipping:当gradient>某个阈值时,让gradient = 阈值
蓝色是好,绿色也是经常出现的。
RNN的性质就是陡峭:很大的gradient*很大的learning rate就会飞出去。
1.3 为什呢RNN会有rough的error surface?
和sigmoid没关系啊,因为实验证明换成ReLU效果往往更差
所以原因是time sequence,同样的weight在不同时刻被多次使用
(gradient在w=1处很大,在w=0.99处很小
丢进去1,输出就是w的n次方,绿色地方,w有很小的变化(跳崖原因,同一个weight在不同地方使用),输出变化就很大,这种情况,把gradient设大,学习率设小
黄色地方刚好相反,
1.4 怎么解决RNN的跳崖行为呢:
把一般的RNN换成 LSTM呀
为嘛LSTM就可以解决呢?
- 因为LSTM可以处理gradient vanishing的问题:LSTM可以让error surface不那么崎岖,把平坦的部分拿掉
为什么把LSTM换成RNN:
- 那gradient explosion的问题呢?不知道
1.41 先说LSTM怎么处理gradient vanishing的问题
- 在一般的RNN中,每个时刻neuron的output都会被放到memory中去,所以在每个时刻memory中的值都会被洗掉。
- 但在LSTM中,是把memory中原来的值乘上一个数再加上一个数,即memory和input是相加的关系。
- 所以LSTM中如果weight影响了memory中的值,那么这个影响会永远都存在
- 若使用LSTM出现了过拟合,找GRU(参数量很小啊),GRU的精神是“旧的不去,新的不来”:input gate 开,forget gate 关(进来时,不洗) 不进来时,洗,也就是说,把存在memory里面的值洗掉之后,才会有新的值进来
1.42其它处理gradient descent的技巧
clockwise RNN, SCRN
[Quoc V. Le, arXiv’15]提出,如果用单位矩阵初始化一般RNN的weight,那么用ReLU的效果要比用LSTM的效果好。(random初始化一般RNN的weight,那么用ReLU的效果要比用sigmoid的效果差。)
2.RNN偏应用的东西
2.1 More Applications
传统,输入输出一样:
2.11 Many to one
指的是:RNN也可以做到,输入是vector sequence,而输出只有一个vector
输入一个句子到RNN中,最后输出这个句子包含的情感
爬虫爬的就是这个东西,爬影评
2.12 Many to Many (Output is shorter):语音辨识
每一小段时间就用一个vector表示:0.01秒
时间太短所以可能多个vector对应同一个字
- 1 输入是一个sequence(比较长),输出也是一个sequence(比较短)
- 2.使用Trimming操作去除掉重复的东西,最后输出这段语音的意思
但这种情况有时候会存在问题,就是去的多了,比如我想表达的时好棒棒呢?
怎么办呢?
用Connectionist Temporal Classification (CTC)。
简单看一下他的过程:
这个方法会输出一个 $ 代表 “null” 的意思。解决叠字的问题
CTC怎么做训练呢?:
因为不知道,好对应哪几个$,所以就穷举所有可能
但可能性太多了,是有方法的,这里不细讲
现在谷歌的语音辨识,都已经换成CTC了,即便有从未出现过的词汇,CTC也可能是把他辨识出来的。
- 3.输出正确结果后它不会停下来。
文字接龙:
怎么办?
给它加一个“===”的符号,代表任务结束。 - 4.Google的一片论文,它实现了输入声音讯号(比如英语),不经过语音辨识,然后直接输出翻译后的句子(比如翻译成中文)
就是收集一堆英文的语音讯号,对应标注中文,直接training,modle标识的结果。这样就方便把方言转换出来。 - 5.用于生成 Syntactic parsing tree 。非常surprise
让机器看一段句子,然后机器就会输出这个句子的语法的结构树。
-
6使用bag-of-word方法把一段文字转成word vector的话,是没有考虑顺序的:听不懂廖
两个单词相同但不同意思句子,在bag-of-word看来就是一样的。
Sequence-to-sequence Auto-encoder - Text就能在考虑顺序的情况下,把一段文字转成word vector。
chat-bot
收集how are you 对应 i am fine的data去train
阅读理解:把问的问题丢到中央处理器里面,去看,哪个和这个问题相关,可以换位置,得到最终答案
这是自己学的
问题:这是什么水果 回答:这是香蕉
丢给RNN之后,会到中央处理器里面看看哪个位置和他相关;
句子拿进来-语义分析-转成文字-再把文字语义分析 Attention是看哪些部分画的重点和回答问题有关
3.RNN vs Structured Learning
3.1 Structured Learning考虑整个语句,cost和error相关,完胜
但RNN的Deep有优势
但必须有Deep,所以RNN完胜
3.2 两个结合:
3.3在语音识别里的结合:
怎么work的呢?