Machine Learning
前言:
深度学习话题十分火热,网上的资料也非常多,这的确很头疼,太容易迷失。个人认为寻找大牛的授课ppt作为入门方式就可以,跟随大牛的脚步先画出一条直线,再补充骨肉。Anyway,这篇文章十分适合机器学习初学者迅速了解深度学习,了解清楚什么是深度学习,如何做及现在最火的卷积神经网络。
教材链接:李宏毅
Let us rock!
1.什么是机器学习
机器学习就是寻找一个函数。函数的输入是现实世界的信息,输出是一个抽象结果。
插入个人理解,可以跳过:每个函数的定义域、值域就确定了一个空间(猫 or 狗)。空间中的点都是同一个类别,不同的点表示他们的表现形式不同(黑猫和白猫),即他们的基相同(处于同一空间),权值不同。不同点之间可以通过线性变化相互得到。 试想一下:每个类别都是一个小空间,每个小空间都分布在大空间的不同位置,他们之间相互独立,每个小空间有自己的基。
Anyway,只要记住一句:机器学习非常简单,就是寻找一个函数而已。如何寻找这个函数呢? 这个是选择题。只要从备胎函数中选择一个就好了。如下图,我们有一个函数集合,而我们现在想要的函数是:给这个函数一个猫的图片,得到一个函数输出:“cat”。我们用每个函数试一下,发现f1函数可以得到我们想要的,就选这个函数了。
我们需要再考虑点细节。
这些备胎函数从何而来?
为什么f1函数是好的?
备胎函数稍后解释,但是一个函数是好的比较容易想明白,就是这个函数的输出需要是合理的,简单来说给函数一个猫咪图像,函数结果就应该告诉我们这个是猫咪。我们可以看到f1函数能够正确识别出各种图片,所以是一个好的函数。而f2这种不负责任的态度,也真的只能当个备胎了。而具体这个函数的好坏是训练数据通过监督学习得到的。
所以,机器学习的具体过程也就分为3步,简单的就像把大象放冰箱里分几步一样。这3个过程就叫做训练。通过训练我们找到了最好的函数,就可以使用这个函数判断世间所有的猫咪了。
1.选择一系列备胎函数。
2.定义函数的评判标准。
3.选择最好的函数。
上回书说到,机器学习分3步走。来看看第一步:定义一大堆备胎函数。
先上结论:人工神经网络可以拟合任何函数,神经网络由神经元Neuron构成。Amazing,我们有一个神经网络可以表示任何备胎函数,也就是这一个东西就够了!!
更加神的是,神经元的结构非常简单的结构(如下)。可以认为两个向量的内积,累加和,权值平均等各种说法。注意方程后面有个偏移量b。关于Neuron的理解请看:这里。
Neuron 这个结构中的主要部分为:输入的加权平均(带偏置)的结果Z;对Z进行转换(到0~1之间,为什么要这么做?)。
答:这个neuron的值域范围太大,大到你也不知道他的边界在哪里。所以,大牛就找来了一个函数sigma将他的值域转换到了0到1之间。Amazing!这个函数太厉害了。函数是一一对应的关系,
可以将delta z的值推回到z。
同时,这个函数sigma的导数很简单。
同时,这个函数的导数很简单。好处看这里。
有了很多很多神经元(neuron),我们就可以构建神经网络了。神经网络可以拟合任何函数,Amazing!具体原因请看:这里。
以下为全链接神经网络示意图:
一个神经网络结构确定了一系列备胎函数,其参数变化就是指备胎函数的变化,例如上下两例子:函数是指输入各为向量,输出也各为向量。
深度学习中的深度,就是指多层神经网络中的隐层非常深,非常深,非常深.输入层表示现实中的世界信息。
到此总结一下:
1.为了寻找一系列备胎函数,我们找到了人工神经网络,这个复杂的网络可以拟合任何函数!!!
2.神经元是构成这个网络的基本结构。
3.网络还有另外两个结构:输入层(现实世界的信息)和输出层(我们需要的输出,包含:推断和决策。)
4.中间层叫做隐层:隐层就是由神经元构成的层,包含权值,偏置,**函数。
5.这个网络中的未知数,就是我们需要得到的信息,通过训练得到。
输出层为了达到“识别”的目的,需要定义一个稍微特殊的函数,常用的就是Softmax函数。就是通过Softmax函数给每种判断一个概率。关于Softmax函数看这里。
Softmax函数就是指每种判断一个概率,并且保证所有概率的和为1. 对**函数进行标准化过程即可。
举个例子:通过机器学习识别手写字体。输入为含有手写字体的图片,我们可以看到输出中为2的概率最大。
那么问题来了,这个函数是如何得到的,即神经网络中的权值系数是如何得到的?我们需要知道如何选择一个好的函数。
进入第二步之前,回答几个问题:
总结:
至此,我们已经定义好了第1步: 找到了一系列的备胎函数集合。实际上,万事开头难,这一步非常非常非常困难,难道至今没有证明这种神经网络的有效性和合理性(我的理解,不对请指正).
但是,定性地看,这种结构与人大脑的认知类似,多层结构并且向上不断抽象的认知过程,即通过每一层提取信息的一些基本特征,不断向上提出更加具体的抽象概念,有点绕口,请看下图。
上回说到,我们解决了3步走的第1步,如何定义一大堆备胎函数。下面来看第2步:什么是好的函数。
前面已经进行简单说明,好的函数就是可以得到正确预期结果的函数。起码,在训练数据集上,我们的结果是与预期最接近的。例如我们输入1,就应该得到该图片是1的概率最大。
不知不觉到了第3步:如何选取最好的函数
寻找最好的函数,就是为神经网络选取一组最好的系数theta使得损失函数最小。但,显然我们不能通过遍历的方式进行寻找系数。例如含有1000个neuron的两层神经网络结构中,第一层的输出为1000个值,对应第二层的每个neuron就有1000个weights,所以需要的参数就是1000*1000+1000(偏置)。
梯度下降。把它列出来,是因为这个方法太过神奇,但是大家已经清楚,直接列出ppt。
每次沿着负梯度方向移动:
总结:
此致,为了求得最小的损失函数,我们找到了梯度下降算法。但是,网络那么深,结构那么复杂,如何计算梯度呢? 答案是反向传播算法。反向传播算法不是特别的算法,就是为了更有效地计算梯度,必须跟正向传播算法结合使用。
为了得到神经网络的全部系数,还需要了解反向传播算法,请看这里(补充神经网络的训练过程)。
深度学习(很多很多层的人工神经网络)中有两个子问题:网络需要多深? 神经元还可以是什么样子?
深度学习领域的人的研究工作也就是集中在这两个部分啦。第一个问题是:越深越好么? 参数越多当然越好了,但这里的前提是“对参数的控制性”不会下降。简单来说,参数越少,
我们对参数的控制越简单,所以得到的参数往往较好;而参数较多的情况下,模型比较复杂,我们得到的参数较差,此时得到的结果较差。DL中的参数是通过学习得到的,如果梯度传播有效性得到
保证,那么应该是网络越深越好。想想一下,如果网络的复杂程度达到大脑级别,那就是真正的AI了。 第二个问题也是研究方向之一,例如RNN,LSTM这种不同的神经元模型。
网络是越深越好么?
越深越好么? 参数越多当然越好了,但这里的前提是“对参数的控制性”不会下降。简单来说,参数越少,我们对参数的控制越简单,所以得到的参数往往较好;而参数较多的情况下,模型比较复杂,我们得到的参数较差,此时得到的结果较差。DL中的参数是通过学习得到的,如果梯度传播有效性得到保证,那么应该是网络越深越好。想想一下,如果网络的复杂程度达到大脑级别,那就是真正的AI了。
但是,很早就有证明,如果有足够的神经元,一个隐层就可以拟合任何连续函数,为什么不是一个含有多个神经元的胖网络,而是多层的瘦高网络?
通过实验得到瘦高的网络好啊~~
从分析的角度看,同样的训练样本,多层的神经网络使得每一层都训练的更加充分(训练数据更多)。Amazing!例如,下面例子中,个别类别的训练数据中只有一个样本。
但是,多层的结构中,样本被反复利用,训练更充分。
深度就是不断的模块化。
从最基本的模块开始,每层都是一个模块。越往上得到的结果越具体。
训练深度神经网络(Tips for Training DNN)
1. 首先,关注训练集和测试集的结果,根据反馈结果进行调整。
结果不好,不一定是过拟合,也可能一开始就没训练好。
具体排查过程如下:
不同的损失函数,得到的结果差别很大。
当使用softmax的时候,选择cross entropy作为损失函数。
使用mini-batch
只是每次使用一个小的训练集,但是所有训练集都要经过训练,总的损失函数并不减少。mini-batch为100,时代为20.
mini-batch的缺点是不稳定。这个地方没看懂。
mini-batch执行快,同样执行了全部样本,mini-batch得到的结果好得多。
其他的**函数:
上回书说到,越深越好,但实际情况是,深度太深,参数控制不好,结果变得不好。
这个原因是梯度的消散,传到后面跟随机差不多了!!!
Relu函数,在z小于0的时候,丢弃这个神经元的输出。
使用后,网络中很多的神经元不参与计算,网络变得更瘦。
但是,网络的结果变得更好。
Relu的变形
Maxout是深度学习网络中的一层网络,就像池化层、卷积层一样等,我们可以把maxout 看成是网络的**函数层。
(1)以前MLP的方法。我们要计算第i+1层,那个神经元的**值的时候,传统的MLP计算公式如下。其中f就是我们所谓的**函数,比如Sigmod、Relu、Tanh等。
(2)Maxout 的方法。如果我们设置maxout的参数k=5,maxout层就如下所示:
相当于在每个输出神经元前面又多了一层。这一层有5个神经元,此时maxout网络的输出计算公式为:
所以这就是为什么采用maxout的时候,参数个数成k倍增加的原因。本来我们只需要一组参数就够了,采用maxout后,就需要有k组参数。
下图就是将原来的Relu换成了Maxout结构,其中含有两个元素,即需要2组参数。
maxout的拟合能力是非常强的,它可以拟合任意的的凸函数。最直观的解释就是任意的凸函数都可以由分段线性函数以任意精度拟合(学过高等数学应该能明白)。
每个elements(piece)都是一个线性函数,由于取了最大,所以变成了线性分段函数。
总结:
**函数的不同对网络影响巨大,例如Relu可以使得梯度消失问题得到缓解,Maxout有很好的拟合能力。
自适应的学习速率:
太大,太小都不行:
卷积神经网络
卷积神经网络是深度学习网络的变形,是目前处理图像和声音最出色的算法。那么为什么不直接使用深度学习网络呢? 答案是:不好用。因为网络的参数太多,假设只有100*100像素的RGB图像,一个隐层只有1000个神经元。那么网络的参数达到:100*100*3*1000=3*10000000的数量级。
那么第二个问题来了,为什么CNN适合图像的处理。这就要说到图像本身的性质:
1. 图像的特征具有局部性。所以每个神经元只需要链接图像的一部分。
2. 图像进行下采样之后,图像中目标的变化不大。
鸟嘴作为鸟的局部特征,只需要部分区域就可以进行表达,另外,不同图像中的鸟嘴虽然出现在不同的位置,但是他们可以使用同样的参数(卷积核或权值系数)对该特征进行表达。
另外,图像经过下采样之后,图像中的目标和基本性质保持不变。所以,将大图像进行下采样可以减少网络中的参数。
什么时CNN?仍然是三步走:
简单来讲,就是对传统的深度神经网络的输入层进行优化。卷积和池化交替进行,目的就是保留图像的性质并减少网络参数的个数。
什么是卷积操作?
就是传统的图像卷积,但是有两个点需要注意:卷积核是训练得到的;步长(stride)不同,得到的卷积结果不同。
出现在不同位置的同一图像特征,也可以被有效的检测到。
得到的卷积结果叫做Feature map
彩色图像是三个图层同时进行处理,含有3个feature map。
CNN的另外一个操作:池化
池化就是利用图像下采样后性质保持不变的特性对图像进行下采样,只不过是将卷积结果作为图像进行下采样。深入思考:图像变小,但是性质:边缘,嘴角等依然存在,
而他们的性质已经保存在feature map中,池化相当于选择邻域内最明显的性质作为特征。
将最终的结果作为新的图像,同时排列成一列,输入给神经网络下一层。
将经过多次卷积和池化后的图像进行向量排列,并且作为人工神经网络的输入。
整个CNN的过程如下:
1.卷积和只对图像局部进行操作,每次计算都是卷积核大小的链接个数,而不是全连接,极大地减少了参数的个数。
2.卷积核相当于神经元的权值系数,所以每一种卷积核(鸟嘴)的权值系数相同,所以神经网络的参数与图像的特征数量有关系,大大减少了神经网络的参数个数。
共享权值,进一步减少系数
所以在CNN中,参数个数不再是输入与下一层神经元的乘积。而是仅仅表示卷积核的个数。Amazing!!!。
CNN第二步和第三步:与传统的神经网络并无差别。
总结
1. 深度神经网络每一层都是图像的特征,从下向上不断抽象,下层是最基本、最通用的表达,到最上面的具体分类。从空间的角度理解就是,每一层的神经元都是空间的基,该空间中的不同类别通过权值系数进行区别。
从下向上,空间的维度不断缩小和具体。 训练得到的最好的网络就是:基是正交的,完备的。有时为了效率,可以是稀疏的。从信号处理的角度理解就是,每个神经元的下层的权值都表示一个滤波器,即某个特征的模板,而下层神经元与对应权值系数的内积表示了下层神经元与模板的相似程度,就得到属于不同特征的可能性。就是下层的神经元作为上层的输入,表示将一个向量输入一个系统,就可以得到向量在这个系统所代表的空间的基上的投影,向量与哪个基(特征)更接近。
进入RNN
Slot Filling。 槽填充则可以看做是序列标注问题,即对于给定的句子中的每个词分别打上相应的标签。
输入是一个向量(每个词用向量表示),输出也是一个向量(标签也用向量表示)。
如何用向量表示词? 1-of-N encoding的含义? 猜测是N=所有词的和,同时表示编码后的向量长度,每个词所在的位置为1,其他的位置为0.
超越上述编码还有啥编码? 在词库中不存在的词叫做other。另外可以使用哈希表进行表示,可以表示的词汇量更大,但是其向量的长度也更大。例如下面长度为26^3,根据规则每个词的字母由三个连续的字母按顺序确定下来。所以,单词的的长度就是向量中1的个数。
最后,输入为向量(一个单词),输出为这个单词属于各个槽的概率。
问题是: 此时的Taibei,我们无法判断是目的地还是出发地(出现了歧义)?所以,需要根据句子中其他部分的信息,对槽进行更加具体的判断:给神经网络增加记忆功能。
循环神经网络
隐层的输出进行保存,作为后续隐层的输入。循环网络与普通的神经网络区别是:这种方法是相当于把上文的信息也利用起来,网络的训练过程中利用了更多的信息。
之前的算法是:那个词的概率大就利用哪个,但是循环网络是可以综合考虑上下文信息的共同概率,这样理解对么?
具体是t时刻的隐层输出作为t+1时刻的隐层的另一个输入!!! 同一个神经网络被使用多次,每次赋予时间含义。横向展开只是为了好理解。
通过预料的训练,到达与出发输出的概率不一样,所以同一个Taipei表示不同的含义。(到达或出发)
这个双向是什么意思?把上下文倒序输入到网络中进行训练!!!
训练过程:
以股票预测为例,我们取出某股的一个月涨跌记录,并且以10天为一个时间段,1天为滑动步伐。输出为第11天的股票预测结果。损失函数就是预测值与真实值的MSE.
所以,第一次输入为1-10天的数据,第二次输入为2-11天的数据,...然后一直输入21-30的数据,经过多次训练之后,我们就能得到较好的模型了。
同样,我们可以一每一天的数据作为训练数据。第一次输入第一天的,第二次输入第二天的,...然后输入第10天的。模型的每次输入都是第二天的预测结果,而且与之前的输入息息相关。这是个动态的,例如只输入一天的涨跌,就是根据第一天的涨跌预测第二天的涨跌。输入第一天的和第二天的涨跌作为训练,输出就是根据第一天和第二天的涨跌预测第三天的涨跌,以此类推...,这个就是NLP中的slot filling
所以,RNN网络的层数理论上跟需要记忆前序信息的长短有关系。RNN中因为记忆太长,梯度消失,所以出现了LSTM。
理解长短期记忆网络:
Neron的结构不太一样,4个输入,一个输出。
如下图,f,h,g都是**函数,f一般是sigmoid函数。c为上一时刻的细胞值。a是neuron的输出。
如下两个例子:
c表示cell,即细胞的值,下图为含有多个LSTM block结构的神经网络,ct-1存储了上一时刻的结果,当前时刻为t,输入为xt
例如:
x是输入向量(单词),a是LSTM block的输出,整个学习目标如下:
剩下的就是选择最好的函数了,遗憾的是梯度下降也不太好用了。
导致这个产生的原因是w有个连乘的关系。
更多的例子:
怎么加结束标志的?
强化学习:
通过利用一个场景的反馈,使得机器学习是否好或者坏。
代理通过行动,寻找最大的回报期望。
上一篇: python练习册(000)
下一篇: git 配置 命令行别名
推荐阅读
-
Docker Machine
-
Shuffling Machine
-
Docker Machine
-
Machine Learning
-
《Hands-On Machine Learning with Scikit-Learn & TensorFlow》读书笔记 第三章 分类
-
《Hands-On Machine Learning with Scikit-Learn & TensorFlow》读书笔记 第十四章 循环神经网络
-
Machine Learning With Spark--读书笔记
-
《Hands-On Machine Learning with Scikit-Learn & TensorFlow》读书笔记 第二章 机器学习项目
-
Machine Learning In Action 学习笔记之 KNN算法
-
KNN算法 第二章 Pandas & sklearn 机器学习实战 Machine Learning in action