表示学习
特征工程中对数据的表示就是表示学习
对用户信息的表示也是表示学习
图像分类中,每一神经层都是一个表示学习,当然最有用的是最后输出层的表示
所以说机器学习最重要的就是表示学习
好的表示具备哪些特点,然后根据这些特点会延伸出不同的模型,比如PCA、ICA、LDA
重点!!
如果你对每一种表示方法有一个很深入的了解,知道每种表示的优缺点,那我对于任何一个模型都可以沿着这个思路进行拓展,然后就对一个模型进行了创新,如果效果优于原来的模型,这就是创新点,可以将原来模型作为baseline,进而发出你的论文
怎么去找到更好的表示?那首先我要知道什么是好的表示,进而我再去找更好的 表示
好的表示的特点
1、smothness平滑的
任何一个模型都有一个针对的目标函数,有了目标函数才能谈优化的问题
目标函数可以分为平滑的和不平滑的。平滑的函数我们使用常见的优化算法即可优化
不平滑的目标函数在优化上存在问题,需要用不同的方式去优化。
2、(一个更好的表示通常在一个更低维的空间的)
比如PCA、word2vec也是采样降维方式
原来one-hot表示的词的表示长度是词典的长度,采样词向量的表示方法,在300维范围内就可以表示,其实就是在降维中找到了更好的表示方法
降维肯定胡丢失信息并且去掉噪声,好的降维去噪想效果要好于丢失信息程度
理解深度学习
深度学习是一个框架,它结合不同模型会出现新的模型,也就是深度学习的模型
越深的模型,表达能力越强
过拟合
解决过拟合问题:
1、正则
2、early stopping
3、增加noise:比如dropout
机器翻译
传统的机器翻译,比如中文翻译为英文,需要一套语法和词典,而中译日时又需要新的素材
基于深度学习的翻译,不需要知道中文语法或者英语语法,也不需要知道两者的对应关系,我们只要有中文和英文语料库就可以
这种方法我们叫端到端的方法。
我们知道RNN/LSTM可以表示一句话 ,我们通过搭建两个RNN,两个RNN拼接起来,一端输入英文,一端输入中文,这样就可以搭建一个翻译系统,端到端的翻译
本质上这种方法属于多模态学习,multimodal learning
multimodal learning
多模态应用场景广泛
我们知道,RNN可以表示文本、语音这种时序性数据
CNN可以处理图片数据
可以存在以下场景:
1、CNN 到RNN/LSTM:由图片生成文本,如:看图说话
2、RNN到CNN:有文本到图片
3、RNN 到RNN:
1、机器翻译
2、代码生成
3、代码到文本:比如说上传代码自动生成总结
4、语音到文本:语音识别
5、文本到信号:自动生成音乐
Seq2Seq model
之所以可以实现中英端到端的翻译,是因为在两个模型之间,存在一个meaning vector,
左侧LSTM表示的中文,转换成meaning vector,右侧具有相同意义的英文文本,也产生一个meaning vector,两个vector都映射到相同的meaning space中,这样就经过训练,实现端到端的翻译。其他场景也类似
结合中译英的过程,模型流程:
首先是中文句子,每一个词经过Embedding处理,得到一个隐式的表示h,最终“今天天气很好”这个句子的表示其实都是集中在h4上的,
所以我们将h4这个向量就当作meaning vector放到meaning space中。
以上是一个编码的流程,接下来是解码
得到的h4要作为翻译的一个桥梁来存在的。
在解码阶段:
根据h4这个向量,开始进行翻译,依次预测产生每个单词“today weather is good”
每产生一个单词,都是根据h4,以及前边已生成的英文单词作为条件的。
比如:如果weather后边预测了good,那么这个损失值会很大,就会不断降低损失,知道预测is,得到正确的预测翻译结果。
这是在测试时的过程。
当在训练模型时,肯定是中文英文已经知道有meaning vector这个向量,
这种经典的模型,是2014年NIPS上的论文,谷歌团队发表的。
在这之前还有提出RNN模型的作者发表的论文,参考
Seq2Seq训练数据
中译英的训练数据是以中文及对应英文翻译的样式出现,然后经过损失函数,以及基于时序的BPTT进行梯度下降来更新模型参数。
注意:深度学习中训练模型一般是以minibatch的方式训练,当我们的向量是相同长度时,可以进行更快速的训练。所以我们要将中文和英文都进行长度的统一,中文部分选最长的那个文本长度,然后其他中文文本都以一种符号去补齐成相同长度,英文部分也采样同样的操作。
TensorFlow中有dynamicRNN这种工具,来对不同长度的文本进行处理
Decoding
decoding是说,当模型已经训练好,也就是参数已经确定的时候,使用模型进行翻译。
首先是输入中文句子,在“好”这个向量中,就表示了整个中文句子的意思。
接着进行翻译,开始标志,然后集合中文的向量,得到一个概率的统计,取概率最大的结果作为英文翻译结果,依次进行每个单词 的翻译。
预测出的英文翻译如何评估预测的好坏呢?
因为生成的这个句子是不一定有语法的,所以在测试中,将预测部分和实际正确的翻译部分使用Unigram、Bigram、Trigram等语言模型进行评估,综合看预测和实际的一个相似度,使用这个相似度来评估准确率,
评估标准:blue score
存在的问题
上面Decoding的翻译过程,其实是一个贪心算法,每次都是只考虑他周围单词去翻译下一个单词,只保留了最好的一个预测结果。得到的是局部最优解
如何优化呢?
1、exhaustic search:每个时间点的可能结果都考虑进来,时间复杂度太高,放弃
2、Beam search:每次保留topN的预测结果,虽然找不到全局最优解,但是优于上边的贪心算法
Beam search应用场景很多,不只机器翻译
Beam Search
从标志开始进行预测,取k=3,也就是beam size的长度。
每次选择预测的前三个单词作为候选词,概率取对数,转换成做加法。
那么第一个单词选出三个候选词的基础上,每个单词继续预测,得到九个单词,
计算概率两个单词的概率之和,取概率和最大的三个,继续进行预测,
同样是每个单词预测取前三个,计算概率和,直到出现end标志为止。
为了避免不同时刻出现的影响,一般概率再除以当前预测单词的时序位置。
beam search同样是一个贪心算法,因为它考虑的是前几个最大的情况。
它的时间复杂度与K和时序T有关,每个时序预测的是K^2个单词,所以最终的时间复杂度是O(T )
做Decoding的算法:
1、viterb:计算全局最优,但是省略了没必要的计算
2、exhaustic search:计算所有结果,穷举
3、beam search:取最好的几个结果