我正在尝试实施Softmax回归算法,以便在观看Andrew Ng教授关于GLM的讲座后解决K分类器问题。我想到我理解他所说的一切,直到它最终编写代码来实现Softmax回归的成本函数,如下所示:
我遇到的问题是试图想出一种方法来对此进行矢量化。再一次,我思考我理解如何对这样的方程进行矢量化,因为我能够进行线性和逻辑回归,但看了那个公式之后我就陷入了困境。
虽然我很想找到一个矢量化的解决方案(我意识到已经发布了一个类似的问题:Vectorized Implementation of Softmax Regression),我更感兴趣的是你们中是否有人可以告诉我一个方法(你的方式)有条不紊地将这样的方程式转换为矢量化形式。例如,对于那些在ML中是专家或经验丰富的退伍军人的人来说,当你第一次阅读文献中的新算法时,看到它们用与上面的等式相似的符号编写时,你如何将它们转换为矢量化形式?
我意识到我可能会像要问莫扎特的学生那样离开,“你怎么这么好地弹钢琴?”但我的问题仅仅是出于对这种材料变得更好的渴望,并假设不是每个人都知道如何对方程进行矢量化,所以有人必须设计出自己的系统,如果有,请分享!非常感谢提前!
干杯
答案 0 :(得分:2)
Octave附带的帮助文件包含以下内容:
对于非常好的第一近似,矢量化的目标是 编写避免循环并使用整数组操作的代码。作为一个 琐碎的例子,考虑
for i = 1:n
for j = 1:m
c(i,j) = a(i,j) + b(i,j);
endfor
endfor
与更简单的
相比 c = a + b;
这不仅更容易写;它内部也更容易 优化。 Octave将此操作委托给底层证券 除其他优化之外,可以使用特殊向量的实现 硬件指令或可以想象甚至执行添加 平行。一般来说,如果代码是矢量化的,那么底层的 实现对它可以做出的假设有更多的自由 为了更快地执行。
这对于具有“廉价”身体的循环尤为重要。通常它 足以将最内层的循环矢量化以获得可接受的效果 性能。一般的经验法则是“秩序” 矢量化的身体应该大于或等于“秩序” 封闭循环。
作为一个不那么简单的例子,而不是
for i = 1:n-1
a(i) = b(i+1) - b(i);
endfor
写
a = b(2:n) - b(1:n-1);
这显示了关于使用数组的重要一般概念 索引而不是循环索引变量。 索引表达式。 也慷慨地使用布尔索引。如果有条件 需要测试,这个条件也可以写成布尔值 指数。例如,而不是
for i = 1:n
if (a(i) > 5)
a(i) -= 20
endif
endfor
写
a(a>5) -= 20;
利用'a>的事实5'产生一个布尔索引。
尽可能使用元素向量运算符以避免循环 (像'。*'和'。^'这样的运营商)。 算术运算。简单来说 内联函数,'vectorize'函数可以自动执行此操作。
- 内置功能:矢量化(FUN) 通过替换创建内联函数FUN的矢量化版本 所有出现的'','/'等,带有'。','。/'等。
This may be useful, for example, when using inline functions with
numerical integration or optimization where a vector-valued
function is expected.
fcn = vectorize (inline ("x^2 - 1"))
=> fcn = f(x) = x.^2 - 1
quadv (fcn, 0, 3)
=> 6
See also:  inline,  formula,
 argnames.
还在这些元素运算符中利用广播 避免循环和不必要的中间内存分配 广播。
尽可能使用内置和库函数。内置和 编译功能非常快。即使有m文件库功能, 它已经优化或者将进行更多优化的机会很大 在将来的版本中。
例如,甚至比
更好 a = b(2:n) - b(1:n-1);
是
a = diff (b);
大多数Octave函数都是使用向量和数组参数编写的 心神。如果你发现自己编写一个操作非常简单的循环, 很有可能这种功能已经存在。下列 函数在向量化代码中经常出现:
索引操作
* find
* sub2ind
* ind2sub
* sort
* unique
* lookup
* ifelse / merge
重复
* repmat
* repelems
矢量化算术
* sum
* prod
* cumsum
* cumprod
* sumsq
* diff
* dot
* cummax
* cummin
高维数组的形状
* reshape
* resize
* permute
* squeeze
* deal
另请参阅斯坦福大学维基百科的这些页面,以获得更多的示例指导。
http://ufldl.stanford.edu/wiki/index.php/Vectorization
http://ufldl.stanford.edu/wiki/index.php/Logistic_Regression_Vectorization_Example
http://ufldl.stanford.edu/wiki/index.php/Neural_Network_Vectorization
答案 1 :(得分:1)
这个看起来非常难以矢量化,因为你在你的求和中做了指数。我假设你把e提升到任意权力。你可以矢量化的是表达式的第二项\ sum \ sum theta ^ 2只需确保在matlab enter link description here中使用。*运算符到计算机\ theta ^ 2
对于进入对数的比率的内部项也是如此。 \ theta'x ^(i)是可矢量化的表达式。
您可能也会受益于memoization或动态编程技术,并尝试重用e ^ \ theta'x ^(i)的计算结果。
一般来说,根据我的经验,矢量化的方法首先是使非矢量化实现工作。然后尝试向量化计算中最明显的部分。在每一步都很少调整你的函数,并总是检查你是否得到与非向量化计算相同的结果。此外,拥有多个测试用例非常有用。