Neural Network(Basic Ideas)
目录
Relations between Layer Outputs
How to pick the “best” function?
Practical Issues for neural network
Stochastic gradient descent and Mini-batch
链接:http://speech.ee.ntu.edu.tw/~tlkagk/courses/MLDS_2015_2/Lecture/DNN%20(v4).pdf
在这一课中,我们需要研究三个问题:1. What is the model (function hypothesis set)? 2. What is the “best” function? 3. How to pick the “best” function? 这三个问题也是第一课中遗留下来需要解决的问题。接下来,我们就围绕这三个问题进行研究。
在这一课中,我们主要是以分类问题为主。这里的分类有二分类和多分类。二分类一般可以应用于垃圾邮箱的识别,推荐系统,恶意软件的检测,股票涨跌的预测。多分类问题一般有手写数字的识别(0,1,2,…,9),图像识别(dog, cat, book,…)。语音识别是一个比多分类问题更复杂的问题,以后我们再进行更详细的讨论。
A layer of Neuron
这里,我们以手写数字识别来作为研究。假设,输入的x和y都是固定等长度,即每个输入x都是相同且相等的。这里,x是一个N维的vector,y是一个M维的vector。这里我们需要对y进行one-hot处理,而不是用1,2,3,…去表示。
这里,每一个神经元的**函数是sigmoid,这个函数很有意思,当z>0的时候,输出的区域绝大部分映射到靠近1的地方。当z<0的时候,输出的区域绝大部分映射到靠近0的区域。单个神经元可以解决二分类问题,但是对于多分类问题,单个神经元是无法解决的,所以需要用多个神经元才能解决,有多少类就需要用多少个神经元,即对应的多少输出。这里输出的神经元有很多,每个y表示是某个数还是不是某个数,取max(yi)的最大的角标i位置对应的结果。
Limitation of Single Layer
单个隐含层不能够解决非线性问题,这也是为啥1960s后神经网络进入冷淡期的原因。
由上图,我们可以看到,无论怎么分,都不能将红蓝两色的点分开。该怎么办?怎么办呢?我们可以借用XNOR gate的原理,将多个门并在一起。请看下图:
在第一个图中,使用了两个神经元进行划分,虽然没有将红蓝两色的点进行分开。但是我们这个结果作为输入,feed到另外一个神经元中,在feed之前,我们惊奇地发现,现在数据变得线性可分了。所以自然,第三个神经元就将其分开了。Oops~
What is the model?
公式字母统一
公式一表示第l层中第i个神经元的输出值
公式二表示第l层中的输出向量
公式三表示在第l层中第i个神经元的**函数输入值
公式四表示在第l层中的**函数输入向量
公式五表示从第l-1层的第j个神经元到第l层的第i个神经元的权值
公式六表示从第l-1层到第l层的神经元权值矩阵
公式七表示在第l层的第i个神经元偏置
公式八表示在第l层的神经元偏置向量
Relations between Layer Outputs
最终,我们把上一个神经网络层的输出作为输入,代入**函数中得到新的输出,这样构成了一个function set。在正常的编程中,其实并不会这么算,而是把偏置加入权值矩阵中,在输入的矩阵的前面加入一个1向量,进行矩阵的乘法,同样可以得到以上的效果。
What is the “best” function?
从paramaters set里面选择最适应验证集的W, b。那么怎么去衡量这个function的好坏呢?我们可以用损失函数去衡量这个函数到底有多差,通常我们希望这个值越小越好,常用的损失函数有均方误差、交叉熵。与之相反的是目标函数,我们希望越大越好,越大则越接近这个目标。
How to pick the “best” function?
通常参数的选择,我们一般使用梯度下降法。首先对参数进行随机初始值,然后求损失函数关于参数的偏导,最后将偏导后的结果与原来的参数值进行更新。依次重复…这里,求某个参数的偏导,即求斜率,当斜率<0的时候,如图向右移动,当斜率>0的时候,向左移动。梯度下降法是求一个局部最优(下面会继续展开讨论)。
Gradient Descent的研究
假设只有两个参数,随机初始化参数值,在“可视范围”内,向损失值最小的地方移动,到了新的点,再在“可视范围”内,向损失值更小的地方移动,以此类推。
对于损失函数,可以由泰勒公式展开,假设这个红色的“可视区域”最够小,小到只剩一个点,我们可以消去后面的二次项。最后求偏导整理后,可以发现损失函数其实是与参数成一次关系。即上一个损失函数到下一个损失函数的关系就是线性地加减。这也解释了为啥求偏导,以及为啥更新公式长这样。在实际中,这样计算参数计算量会特别大,所以我们一般采用反向传播。
思考:这里,我们消去了二次项,但是加上二次项,可能对结果会更有帮助,但是这样会增加计算量。这是一个待解决的问题。
因为梯度下降法是求局部最优解,而SVM是求全局最优解,它是一个convex function,这也是为啥SVM火了一段时间的原因。梯度下降法的权值无论从何地起始,都可能到最后会卡在local minima。但是后面人们研究发现,local minima并没有想象的那么多,主要的问题还是saddle point(鞍点),所以现在我们主要解决的是怎么跳出鞍点。
Practical Issues for neural network
Parameter Initialization
不要让所有的参数都相等,因为在下次更新的时候还可能在一个地方。所以随机初始化参数。这很重要。
Learning Rate
对于学习率的设置,一直是一个叩待解决的问题。当学习率太大的时候,参数更新每一步都特别大,从而导致损失值一直都进入不了局部最优的区域。于是,我们将学习率调小,发现损失值一直在峰谷口徘徊,不能进去。所以,我们还需要继续调小学习值。总的来说,学习值的调试也需要随之迭代次数而不断地减少。
Stochastic gradient descent and Mini-batch
训练数据一共有r个。Gradient Descent是将其全部代入训练,因为计算矩阵变大,所以需要花费更多的时间。Stochastic Gradient Descent是每次去一个样本去更新权值,这样效果比较快。Mini-batch是将size(Mini-batch)个数全部绑定在一个去更新权值,它是Gradient Descent和Stochastic Gradient Descent的一种折中方法。虽然计算量和Stochastic Gradient Descent差不多,但是效果却有很大多的差别。
从实验结果图可以看出,Gradient Descent将数据全部参数训练和迭代更新,不但耗时多,而且效果低。Stochastic Gradient Descent每次代入一个数据更新,虽然时间上式提高了,但是一次性处理一个样本,在数据量比较多多的情况下,耗时就会增加,不过正确率还是比较好的。Mini-batch效果最好,不但耗时低,而且正确率也很高。
Recipe for Learning
首先对数据集分成训练集,验证集(知道真实标签),测试集(直到deadline才知道真实标签)。然后,我们需要确保训练集上效果比较好的情况下,才去看验证集的效果(往往验证集的效果低于训练集的效果)。如果训练集上效果不好,可能是由以下几点原因造成:程序有bug;**函数不好(局部最小,鞍点问题,改变训练策略);模型本身就不好(function set假设得不好,需要一个更大的网络)。当训练集效果比较好的时候,我们再看验证集。如果效果好,我们可以done。如果不好,可能是他由于过拟合造成的。造成过拟合的原始是训练集和测试集的分布往往不同,比如在手写识别的例子中,“2”在训练集中没有圈,而在测试集中有圈。解决过拟合的原因一般是研究和寻找解决过拟合的算法和方法,比如加正则项。但是最简单的是寻找更多的训练数据集。