前言:
由于在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