如何矢量化方程?

时间:2012-02-21 16:31:18

标签: math machine-learning regression glm

我正在尝试实施Softmax回归算法,以便在观看Andrew Ng教授关于GLM的讲座后解决K分类器问题。我想到我理解他所说的一切,直到它最终编写代码来实现Softmax回归的成本函数,如下所示:

Cost function for Softmax Regression with Weight Decay

我遇到的问题是试图想出一种方法来对此进行矢量化。再一次,我思考我理解如何对这样的方程进行矢量化,因为我能够进行线性和逻辑回归,但看了那个公式之后我就陷入了困境。

虽然我很想找到一个矢量化的解决方案(我意识到已经发布了一个类似的问题:Vectorized Implementation of Softmax Regression),我更感兴趣的是你们中是否有人可以告诉我一个方法(你的方式)有条不紊地将这样的方程式转换为矢量化形式。例如,对于那些在ML中是专家或经验丰富的退伍军人的人来说,当你第一次阅读文献中的新算法时,看到它们用与上面的等式相似的符号编写时,你如何将它们转换为矢量化形式?

我意识到我可能会像要问莫扎特的学生那样离开,“你怎么这么好地弹钢琴?”但我的问题仅仅是出于对这种材料变得更好的渴望,并假设不是每个人都知道如何对方程进行矢量化,所以有人必须设计出自己的系统,如果有,请分享!非常感谢提前!

干杯

2 个答案:

答案 0 :(得分:2)

Octave附带的帮助文件包含以下内容:

19.1基本矢量化

对于非常好的第一近似,矢量化的目标是 编写避免循环并使用整数组操作的代码。作为一个 琐碎的例子,考虑

 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)的计算结果。

一般来说,根据我的经验,矢量化的方法首先是使非矢量化实现工作。然后尝试向量化计算中最明显的部分。在每一步都很少调整你的函数,并总是检查你是否得到与非向量化计算相同的结果。此外,拥有多个测试用例非常有用。