SVRG在逻辑二分类模型上的应用

1.随机方差缩减梯度(SVRG)

在实际问题中为了保证SGD收敛,须将步长逐渐缩短到0,这使得SGD收敛速度很慢。小步长的需求是来自于SGD随机取样造成的方差,但是存在下面描述的修复。每轮都使用SVRG在逻辑二分类模型上的应用来估计SVRG在逻辑二分类模型上的应用,并用来接近最优参数SVRG在逻辑二分类模型上的应用SVRG在逻辑二分类模型上的应用称为的“快照”。比如每经过m次SDG迭代,就抓拍一个SVRG在逻辑二分类模型上的应用,记为本轮的SVRG在逻辑二分类模型上的应用。此外还要计算下每轮的平均梯度  

                                                                                         SVRG在逻辑二分类模型上的应用

这里的SVRG在逻辑二分类模型上的应用表示:对第i个样本在SVRG在逻辑二分类模型上的应用下的损失函数求梯度。注意SVRG在逻辑二分类模型上的应用,因此有以下更新规则,我们称为SVRG,此更新亦可看正则后的SGD.随机从样本序列SVRG在逻辑二分类模型上的应用中抽取SVRG在逻辑二分类模型上的应用

                                                                    SVRG在逻辑二分类模型上的应用

由于SVRG在逻辑二分类模型上的应用SVRG在逻辑二分类模型上的应用同时收敛至,且SVRG在逻辑二分类模型上的应用,故上式中的方差是递减的。因此,若SVRG在逻辑二分类模型上的应用则有

                                                               SVRG在逻辑二分类模型上的应用

SVRG有效 减了S GD 方差,  使用递减的步长序列,而是可以使用大步长,以取得更快的收敛速度[1]。伪代码为

                                         SVRG在逻辑二分类模型上的应用

[1] R. Johnson and T. Zhang, “Accelerating stochastic gradient descent using predictive variance reduction,” in Proc. Adv. Neural Inf. Process. Syst., 2013, pp. 315–323.

2.编程时发现的问题

之前编写的“多种梯度算法下的逻辑二分类”程序包里有一些错误。虽然从损失函数效果图来看确实与论文及算法质量相符,但是我这周忽然发现,分类结果不对啊!之前只注意到了损失函数,但是模型最终是为了训练最优参数进行分类。还有模型的一些核心思想也出了问题。以下我将一一指出我之前程序所犯的错误。

2.1考察算法的角度太单一

对于“多种梯度算法下的逻辑二分类”这个模型而言,起码应该从三个角度考虑:最终训练出的模型参数SVRG在逻辑二分类模型上的应用,最终(平均)损失函数值SVRG在逻辑二分类模型上的应用以及分类精度SVRG在逻辑二分类模型上的应用。之前只考察了损失函数,后来我发现上一版程序中损失函数下降只是某种计算结果以及数据值造成的巧合。先不考虑过拟合的问题,起码训练集最终的分类精度应该很高,不然这个训练结果就太差了。不能只看损失函数!

2.2算法理论必须结合具体模型

在我之前的笔记中标准梯度下降法的更新公式是:

                                                   SVRG在逻辑二分类模型上的应用

其中h是预测值,y是真实值。在上一版程序中几种算法的核心更新思想就用的这个公式,但其实并不适用。这个公式只是用于线性回归问题!对于二分类问题,(h-y)非0即1,这显然是不合理的。而逻辑二分类的核心梯度公式应该是下面这个(具体推导过程见我之前的“Logistic Regression总结”)。

                                                                  SVRG在逻辑二分类模型上的应用

更新公式根本上取决于损失函数的形式,同一个问题损失函数形式不同(对数损失,平方损失,指数损失,Hinge损失,绝对值损失等),具体更新公式也就不同。因为更新公式的更新对象就是使得损失函数最小化的最有参数。

2.3分类标签的设置错误

我之前的分类标签贴是{1,-1},认为和{0,1}本质上是一样的,都是二分类,这是不对的。所谓“0-1分类”,这样叫是绝对有道理的。注意到逻辑回归的对数似然函数之所以能巧妙的写成下面这个样子,完全是因为标签为{0,1},如果换一组标签,下面这个式子就不成立。而我建立的分类模型的损失函数正是:负的对数似然函数。目标函数错了,梯度也就错。

                                                                     SVRG在逻辑二分类模型上的应用

2.4为什么我的损失函数值没能非常接近于0

这个问题真的太让人痛苦,之前的那一版损失函数值掉到了数量级,显得太过完美,最终也证明了它是错的。但是论文里的图损失函数都是很小很小的数,这让我很费解。后来我发现有2个原因:(1).数据集本身的问题,所以我在这一版程序中使用了两个不同的二分类数据集,一个是自然科学类的生物数据集,一个是社会调查类的数据集。显然后者的干扰因素更多,模糊性和噪声更大。我使用同一个模型对两个数据集训练参数并分类,100次迭代后,前者损失函数达0.25,后者则未0.55.这是因为自然科学数据集得分类界限本身就很清晰。所谓损失函数小就意味着:所训练出的参数能够把数据集分的很“开”,划分的很“清晰”。(2)损失函数形式的问题。有许多作者为了使算法精度更高,将损失函数设置为SVRG在逻辑二分类模型上的应用,也就是将当前损失与最终损失做比较,但这个差值小于某个设定好的阈值后,迭代停止,而不是设置固定的迭代次数。他们在叙述核心算法的时候都描述的是,但出图的时候却用这个差值。总之损失函数是考察模型最有参数的重要指标,但模型最终要做的是分类,故只要分类结果好,不用一个劲跟损失函数过不去。

3.程序效果图

3.1图组1

主函数main_irises.py

数据:鸢尾花数据集

步长:除SAG,SG为0.05外其余均为0.1  固定步长

迭代次数:100

功能:在逻辑二分类模型的基础上,从迭代效率和时间效率两个角度考察FG,SG,SAG, mini_batch,SVRG五种算法性能(快速减少损失函数并训练出最优参数的能力)

初步结论:五种算法中,SVRG最优

图1:  0-100次迭代 损失函数&迭代次数

图2:0-30次迭代 损失函数&迭代次数图3:0-30次迭代 损失函数&迭代次数

图3:70-100次迭代 损失函数&迭代次数

图4:损失函数分别到达0.7,0.65,0.6,0.55,0.5,0.45,0.4,0.35,0.3的运行时间

损失函数&运行时间

SVRG在逻辑二分类模型上的应用SVRG在逻辑二分类模型上的应用SVRG在逻辑二分类模型上的应用SVRG在逻辑二分类模型上的应用

 

3.2图组2

主函数main_Adult.py

数据:Adult数据集

步长:均为0.1  固定步长

迭代次数:150

功能:与“图组1”的功能相同,换了一组数据集,以证明其结论并非偶然

初步结论:五种算法中,SVRG最优

图1: 0-150次迭代 损失函数&迭代次数

图2:0-30次迭代 损失函数&迭代次数

图3:130-150次迭代 损失函数&迭代次数

图4:损失函数分别到达0.7,0.68,0.66,0.64,0.62,0.6,0.58的运行时间

损失函数&运行时间

SVRG在逻辑二分类模型上的应用SVRG在逻辑二分类模型上的应用SVRG在逻辑二分类模型上的应用SVRG在逻辑二分类模型上的应用

3.3图组3

主函数main3.py

数据:鸢尾花数据集

迭代次数:100次

功能:SG在固定步长和递减步长下的性能对比图,其中固定步长分别取0.05和0.035,递减步长序列为:{0.05,0.045,0.04,0.035} ,分别在第0,25,50,75次迭代时更换步长。

初步结论:递减步长序列更利于SG的性能表现

图1:0-100次迭代 损失函数&迭代次数

图2:损失函数分别到达0.7,0.65,0.6,0.55,0.5,0.45,0.4,0.35,0.3的运行时间 

损失函数&迭代次数

SVRG在逻辑二分类模型上的应用SVRG在逻辑二分类模型上的应用

3.4图组4

主函数main3.py

数据:鸢尾花数据集

迭代次数:100次

功能:对比了SVRG在Option1和Option2两种子模式下的性能表现;考量了不同步长下SVRG的表现。

初步结论:大步长下Option2优于Option1;对于SVRG的Option2,步长越大效果越好(Option2尤其明显)而不像其他几种算法一样出现“损失震荡”,这正是SVRG的核心创意“方差缩减”带来的效果。

图1:步长为1时 Option1 & Option2 性能对比图

图1:步长为0.1时 Option1 & Option2 性能对比图

图3:不同步长下SVRG_option2的性能表现

图4:不同步长下SVRG_option1的性能表现

SVRG在逻辑二分类模型上的应用SVRG在逻辑二分类模型上的应用

SVRG在逻辑二分类模型上的应用SVRG在逻辑二分类模型上的应用