Deep learning:二十七(Sparse coding中关于矩阵的范数求导)

 

  前言:

  由于在sparse coding模型中求系统代价函数偏导数时需要用到矩阵的范数求导,这在其它模型中应该也很常见,比如说对一个矩阵内的元素值进行惩罚,使其值不能过大,则可以使用F范数(下面将介绍)约束,查阅了下矩阵范数求导的相关资料,本节就简单介绍下。

  首先,网络上有大把的人把2范数和F=2时的范数混为一谈,或者说把矩阵p范数和诱导p范数混淆了(也有可能是因为各个版本书所定义的不同吧)。下面我还是以矩阵中权威教材the matrix cookbook和matlab内嵌函数所用的定义来解释。话说the matrix cookbook是一本非常不错的参考书,查找矩阵相关的公式就像查字典一样,很方便。

  矩阵的诱导2范数我们常说的2范数,其定义如下:

   

  而矩阵的F=2时的范数,却在实际优化领域经常用到的范数,也称为Frobenius范数,其定义为:

   

  由此可见,在前面博文Deep learning:二十六(Sparse coding简单理解)中,Ng教授给出关于Sparse coding的代价公式如下:

   

  并且Ng教授称公式中比如第一项是l2范数,按照我现在这种定义其实这种讲法是错的,严格的说应该是Frobenius范数(不过也有可能是他自己的定义不同吧,反正最终能解决问题就行)。毕竟,在matlab中如果按照Ng关于l2范数定义来求的话,其结果就错了。

  为了证明上面的观点,下面在matlab下做一个简单的实验,实验code如下:

%% 使用原始定义求,即a中各元素平方和,然后开根号
a = magic(3);
b = a.^2;
c = sum(b(:));
d = sqrt(c)

%% 直接使用matlab中2规范函数求
e = norm(a,2)

%% 使用矩阵a'*a最大特征值开根号的方法求
f = a'*a;
g = eig(f);
h = max(g);
i = sqrt(h)

%% 使用Frobenius范数公式来求(其中F=2)
j = sqrt(trace(a*a'))

%% 使用matlab自带的Frobenius公式来求
k = norm(a,'fro')

  运行后其输出结果为:

  d =

     16.8819

  e =

     15.0000

  i =

     15.0000

  j =

     16.8819

  k =

     16.8819

  从上面结果可以看出,矩阵的2范数定义所求出的结果和matlab中2范数所求出的结果都是一样的,都为15。而按照Frobenius范数公式的定义, matlab中求Frobenius的函数,以及Frobenius最初始的定义这3种方法来求,其结果也是一样,为16.8819。这个实验和上面的介绍是一致的。

  下面就来看看Sparse coding代价函数第一项中如果要对矩阵A和s求导,该怎么求呢?很明显这是一个矩阵Frobenius求导问题,且求A导数时假设s和X都是常量,求s的时类似,参考了网上论坛http://www.mathchina.net/dvbbs/dispbbs.asp?boardid=4&Id=3673上的教材后就可以得到相应的答案。其中对矩阵s求导可以参考下面一个例题:

   

  而对矩阵A求导可以参考:

   

 

   总结:

   现在比较能够区分2范数和F=2时的范数了,另外需要熟悉矩阵求导的方法。不过到目前为止,还没有找到矩阵2范数求导的公式,也不知道该怎么推导。

 

  参考资料:

     矩阵范数- 维基百科,自由的百科全书 - 维基百科- Wikipedia

  the matrix cookbook

     Deep learning:二十六(Sparse coding简单理解)

     http://www.mathworks.com/matlabcentral/newsreader/view_thread/287712

     http://www.mathchina.net/dvbbs/dispbbs.asp?boardid=4&Id=3673

 

 

 

 

posted on 2013-04-14 10:21  tornadomeet  阅读(23626)  评论(5编辑  收藏  举报

阿萨德发斯蒂芬