矢量化计算

目录

1 简介

吴恩达cosera上机器学习前三次课程作业本身难度不大,很顺利完成,每次作业submit之后都是100points。值得注意的是作业特别强调计算的矢量化。这本身是一件很有意义的事情,因为以 for 或者 while 实现的矢量计算,效率远远不及以矢量本身为操作对象的计算。毕竟 for 或者 while 每次循环执行的是一个矢量元素的计算,而以矢量为操作对象的计算一次就执行了对所有元素的计算。另外,以矢量为操作对象的计算实现起来代码更简短。

这里以第三次作业为例,记录matlab实现矢量化操作的过程。

2 multi-class classification

由于本文着重强调计算的矢量化,关于什么是 multi-class classification 在这里就不在重述,请参考 这里 在作业中我们以5000个手写数字为训练样本,得到一个多类分类器。这5000个样本都是20×20的灰度图像,每一个像素都用一个浮点数表示其灰度。这样一个图像可以用长为400的矢量来表示。在本例中每一个样本是X的一行。

% Load saved matrices from file
load('ex3data1.mat');
% The matrices X and y will now be in your Octave environment

通过 load 导入训练样本X

X=[(x(1))T(x(2))T(x(m))T]

其中X的每一行都是一个样本,存储着一个数字灰度图像的所有像素构成的矢量,这里每一行都是长为400的矢量。一共m行,代表着m 个样本,这里m=5000。另外导入的数据中还有y,包含了这5000个样本的正确映射结果。

2.1 矢量化损失函数

logistic回归的损失函数是:

J(θ)=1mmi=1[y(i)log(hθ(x(i)))(1y(i))log(1hθ(x(i)))]

计算损失函数过程中,m是样本个数,就是说上面的函数把所有的样本都考虑在内了。为了计算求和项的每一个元素,我们需要计算hθ(x(i)),其中hθ(x(i))=g(θTx(i)) g(z)=11+ez。对于hθ(x(i))的计算我们可以利用

X=[(x(1))T(x(2))T(x(m))T]θ=[θ0θ1θn]

其中X的维度是5000×400, θ的维度是400×1,通过计算:

Xθ=[(x(1))Tθ(x(2))Tθ(x(m))Tθ]

Xθ的维度是5000×1,然后根据~(2) 计算损失函数。

为了防止出现overfitting现象,我们通常需要对损失函数进行正则化:

J(θ)=1mmi=1[y(i)log(hθ(x(i)))(1y(i))log(1hθ(x(i)))]+α2mnj=1θ2j

注意这个正则项不包括θ0,也就是说我们不对偏移项进行正则化。

2.2 矢量化梯度

未正则化的logistic regression的梯度函数是:

Jθj=1mmi=1((hθ(x(i))y(i))x(i)j)

我们写出所有Jθj:

[Jθ0Jθ1Jθ2Jθn]=1m[mi=1((hθ(x(i))y(i))x(i)0)mi=1((hθ(x(i))y(i))x(i)1)mi=1((hθ(x(i))y(i))x(i)2)mi=1((hθ(x(i))y(i))x(i)n)]

上式右端可以矢量化为1mmi=1((hθ(x(i))y(i))xi)=1mXT(hθ(x)y)

因为这个过程有两个地方体现了矢量化,所以稍微难理解一些。首先从式~(7)到1mmi=1((hθ(x(i))y(i))xi)) , 我们可以看到hθ(x(i))y(i)是一个标量 , mi=1((hθ(x(i))y(i))x(i)0) 实现了 m个样本与其对应的第0个feature的点积。依次类推,我们可以得到1mXT(hθ(x)y)

对梯度函数的正则化如下:

Jθ0=1mmi=1((hθ(x(i))y(i))xi)0)Jθj=1mmi=1((hθ(x(i))y(i))xi)j)+λmθjforj1

正则化的矢量化操作比较简单,直接加上λmθ,把θ的第一项θ0赋值为0即可。