矢量化计算
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的每一行都是一个样本,存储着一个数字灰度图像的所有像素构成的矢量,这里每一行都是长为400的矢量。一共m行,代表着m 个样本,这里m=5000。另外导入的数据中还有y,包含了这5000个样本的正确映射结果。
2.1 矢量化损失函数
logistic回归的损失函数是:
J(θ)=1mm∑i=1[−y(i)log(hθ(x(i)))−(1−y(i))log(1−hθ(x(i)))]计算损失函数过程中,m是样本个数,就是说上面的函数把所有的样本都考虑在内了。为了计算求和项的每一个元素,我们需要计算hθ(x(i)),其中hθ(x(i))=g(θTx(i)) g(z)=11+e−z。对于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(θ)=1mm∑i=1[−y(i)log(hθ(x(i)))−(1−y(i))log(1−hθ(x(i)))]+α2mn∑j=1θ2j注意这个正则项不包括θ0,也就是说我们不对偏移项进行正则化。
2.2 矢量化梯度
未正则化的logistic regression的梯度函数是:
∂J∂θj=1mm∑i=1((hθ(x(i))−y(i))x(i)j)我们写出所有∂J∂θj:
[∂J∂θ0∂J∂θ1∂J∂θ2⋮∂J∂θ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)]上式右端可以矢量化为1m∑mi=1((hθ(x(i))−y(i))x(i)=1mXT(hθ(x)−y):
因为这个过程有两个地方体现了矢量化,所以稍微难理解一些。首先从式~(7)到1m∑mi=1((hθ(x(i))−y(i))x(i)) , 我们可以看到hθ(x(i))−y(i)是一个标量 , ∑mi=1((hθ(x(i))−y(i))x(i)0) 实现了 m个样本与其对应的第0个feature的点积。依次类推,我们可以得到1mXT(hθ(x)−y)
对梯度函数的正则化如下:
∂J∂θ0=1mm∑i=1((hθ(x(i))−y(i))x(i)0)∂J∂θj=1mm∑i=1((hθ(x(i))−y(i))x(i)j)+λmθjforj≥1正则化的矢量化操作比较简单,直接加上λmθ,把θ的第一项θ0赋值为0即可。