2012-02-21 75 views
8

我试图在观看Andrew Ng教授关于GLM的讲座后,实施Softmax回归算法来解决K分类器问题。我以为我明白了一切,他说,直到它终于来到了编写代码来实现对使用SoftMax回归成本函数,这是如下:如何矢量化方程?

Cost function for Softmax Regression with Weight Decay

我遇到的问题是试图以图找出一种方法来实现这一点。再次,我想到我明白如何去向量化这样的方程式,因为我能够做到线性和逻辑回归,但看了那个公式后,我被卡住了。虽然我很想弄清楚这个矢量化解决方案(我意识到已经发布了类似的问题:Vectorized Implementation of Softmax Regression),但我更感兴趣的是你们中的任何一个人是否可以告诉我一种方式(你的方式)有条件地将这样的方程式转换成矢量化的形式。例如,对于那些ML专家或经验丰富的退伍军人来说,当你第一次阅读文献中的新算法,并看到他们使用与上述等式相似的符号时,如何将它们转换为矢量化的形式?

我意识到我可能会像学生一样问莫扎特,“你怎么弹得这么好?”但是,我的问题只是出于想要更好地利用这种材料的动机,并且假设并非所有人都知道如何对方程进行矢量化,所以有人在那里必须设计出自己的系统,如果有的话,请分享!提前谢谢了!

干杯

+0

你能提供一个链接到上GLM讲座? – justis 2012-02-21 19:57:23

+1

致谢Andrew Ng在斯坦福大学的ML课程:http://cs229.stanford.edu/materials.html - GLM和Softmax回归材料可在第1讲结尾处找到 – oort 2012-02-21 23:32:54

回答

1

这个看起来相当困难的,因为矢量化你在做你的求和内指数。我假定你正在提高任意权力。你可以矢量化的第二项是表达式\ sum \ sum theta^2的第二项,只要确保在matlab中使用。*运算符enter link description here到computer \ theta^2

同样用于内部条件的比率进入对数。 \ theta'x ^(i)是可矢量化的表达。

你也可以从记忆或动态编程技术中受益,并尝试重新使用e^\ theta'x ^(i)的计算结果。

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

2

附带倍频的帮助文件有这个条目:

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; 

其中利用了 '> 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. 

还利用在这些的elementwise运营商既 避免循环和不必要的中间存储器分配广播。
广播。

如果可能,请使用内置和库函数。内置和 编译功能非常快。即使使用m文件库函数, 很可能已经被优化,或者将在未来的发行版中更多地优化 。

举例来说,甚至比

a = b(2:n) - b(1:n-1); 

更好的是

a = diff (b); 

大多数倍频功能与矢量和阵列参数在 记写的。如果你发现自己用一个非常简单的操作编写了一个循环, 可能就是这样一个函数已经存在了。经常出现在量化代码以下 功能:

  • 指数操纵

    * find 
    
    * sub2ind 
    
    * ind2sub 
    
    * sort 
    
    * unique 
    
    * lookup 
    
    * ifelse/merge 
    
  • 重复

    * repmat 
    
    * repelems 
    
  • 矢量化运算

    * sum 
    
    * prod 
    
    * cumsum 
    
    * cumprod 
    
    * sumsq 
    
    * diff 
    
    * dot 
    
    * cummax 
    
    * cummin 
    
  • 形状更高维数组

    * reshape 
    
    * resize 
    
    * permute 
    
    * squeeze 
    
    * deal 
    

也期待在从斯坦福ML维基上的例子多一些指导这些页面。

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