NMF经典论文:Algorithms for Non-negative Matrix Factorization(NIPS, 2001),此文主讲算法细节偏理论。
(话说怎么去掉图片默认水印,有点影响视觉效果。)
1.引言
NMF要做的,就是给定一个非负矩阵 V∈Rd×n+ V ∈ R + d × n ,要找两个非负矩阵因子 W∈Rd×c+ W ∈ R + d × c 和 H∈Rc×n+ H ∈ R + c × n ,使得:
V≈WH(1) (1) V ≈ W H
V V 看作数据矩阵,其中每一列是一个
d d 维的样例(sample),
c c 经常选取为比
d,n d , n 都要小的一个数,事实上,NMF有很好的聚类特性,
c c 可以看作是数据的聚类簇数。由于
W W 和
H H 都比原始数据矩阵
V V 要小,所以NMF也顺道实现了数据的压缩表示。
继续来看式(1),现在我们仅仅关注一个样例,即 V V 中的一列,用 v v 表示,对应的 H H 中的一列用 h h 表示,则有:
v≈Wh v ≈ W h
这个表述有什么意思呢?它表示呀,
W W 的列可以看作是
d d 维空间的
c c 个基,
h h 指明了原始数据
v v 用这c个基可以如何表示—–
v v 由W的列线性组合而成,组合系数就是
h h 中元素。
h h 其实也就可以看作是原始数据
v v 的一种低维表达(d—>c)。因为所有的数据都要由这c个基来表达,所以要想式(1)或式(2)有更低的近似误差,这组基必须能很好的发现数据的隐含结构。
矩阵分解问题,在数值线性代数中,已经研究得很广泛,由于NMF是带有非负约束的矩阵分解,所以以前的一些方法并不能直接很好的运用。于是也有了这篇文章的工作。
2.损失函数
评估 V V 和 WH W H 间的近似程度,根据采用的不同误差度量准则,文章提出了两种损失函数。一个是平方欧式距离,一个是散度(divergence)。

如上图中最后一句话所述,当A,B矩阵满足元素和为1时,D(A||B)就是KL散度/相对熵。对应的,NMF的目标式就可以定义为如下两个:
minW≥0,H≥0∥V−WH∥2FminW≥0,H≥0D(V||WH) min W ≥ 0 , H ≥ 0 ‖ V − W H ‖ F 2 min W ≥ 0 , H ≥ 0 D ( V | | W H )
上面两个目标式,对W或者H中一者而言是凸的(即固定一个变量,优化另一个变量时是凸的),但是对W和H两者同时而言是非凸的。
3.乘法更新准则
求解上一节中带约束的优化问题,梯度下降法可能是最简单的方法,它容易实现,但是呢,收敛也比较慢。其它的方法,比如共轭梯度法收敛快,但是不易实现。此外,这些基于梯度的方法,都需要确定一个参数,即步长,而调整这个步长参数也是比较麻烦的。为此,在收敛速度和算法实现难易之间折中一下,就是文章中提出的乘法更新准则了。

这里都说要W和H在距离函数的驻点上(函数的一阶导为0是驻点,另,二阶导为0是拐点),应该是指函数对W和H要可导(因下一节中要求偏导,此处仍存疑)。
4.乘法更新准则Vs.加法更新准则
这一节是说,乘法更新准则其实可以由加法更新准则得到,算得上是加法更新准则的一种特殊情况,这里的加法更新准则,就是传统的梯度下降。下面,以平方欧式距离为例,我们用梯度下降来更新H。首先,求一下梯度:
∂J∂H=−WT(V−WH) ∂ J ∂ H = − W T ( V − W H )
所以,元素
Hij H i j 可以这样更新(论文中的下标是
aμ a μ ,这个无所谓):
Hij:=Hij−ηij∂J∂Hij=Hij+ηij((WTV)ij−(WTWH)ij)(6) (6) H i j := H i j − η i j ∂ J ∂ H i j = H i j + η i j ( ( W T V ) i j − ( W T W H ) i j )
这里步长
ηij η i j 只要设置得足够小(大于0),式(6)的加法更新准则就可以保证目标函数值减小。
接下来,我们给步长取一个很特殊的值:
ηij=Hij(WTWH)ij(7) (7) η i j = H i j ( W T W H ) i j
代入式(6),即可得到上一节式(4)中关于H的更新准则。
关于散度准则的目标式,就直接贴图了。

但是这样给 η η 取值,好像并不妥当,因为式(7)或者式(9)中的步长取值可能比较大,所以好像并不能保证由此得到的乘法更新准则一定能降低目标函数值。所以,在下一节,就是来证明这个问题的,我们将会看到,这样得到的乘法更新准则是能保证收敛的。
5.收敛性证明
收敛性证明是文章的一个重点,比较理论,但也正是最精妙处所在,证明过程将数学中的构造思想发挥得淋漓尽致。但是估计受nips篇幅限制,内容写的比较简洁,所以读起来也比较晦涩。下面边贴图,边补充论文中省略的推导过程。
我们还是以平方欧式距离为例进行说明,即下面对定理1进行证明,我们将会用到辅助函数,类似于EM算法中用到的,首先给出辅助函数的定义:

关于 G G ,简单理解为,给定变量 h′ h ′ , G(h,h′) G ( h , h ′ ) 是关于变量 h h 的函数。接下来是一个引理:
这个引理是说,给定 ht h t (迭代第t次时的变量值),我在最小化 G(h,ht) G ( h , h t ) 时,其实也实现了降低目标函数值F之目的。从下图,可以很清晰的看懂这个引理的证明过程。(proof中第一个小于等于是由于式(10)的左式,第三个等号是由于式(10)的右式,中间的小于等于是因为式(11).)

自自然然地,我们现在就想,NMF的目标式子,存不存在这样的辅助函数呢,如果存在,是什么?因为一旦能确定辅助函数,我们根据上面的定义和引理,就能证明前面定理的收敛性了。
文章很强势而直接地给出了辅助函数的表达式。贴图感受一下:
有时候,可以根据需要达到的目标,倒着推导我们达到目标需要哪些条件,我们可以怎样去构造,有时候,纯粹就是天才般的灵感,加上知识积累形成的直觉,直接就知道怎么做了。这里为什么要这么构造、能这么构造,关键还有这个K为什么这么取值,我目前能想到的只有,式(14)的形式是在跟目标式的二阶泰勒展开靠拢,而K跟步长的取值有关(倒数)。
下面,我们来证明引理2。在看论文中给出的证明过程前,我们先来对目标函数进行一些变换,注意我们将用 Xi⋅ X i ⋅ 和 X⋅j X ⋅ j 分别表示矩阵 X X 的第i行和第j列, Xij X i j 是第i行j列元素。
F(H)=12∥V−WH∥2F=12∑j=1n∥V⋅j−WH⋅j∥22(按列展开)=12∑j=1n∑i=1d(Vij−Wi⋅H⋅j)2=12∑j=1n∑i=1d(Vij−∑a=1cWiaHaj)2(逐元素展开)(11)(12)(13)(14) (11) F ( H ) = 1 2 ‖ V − W H ‖ F 2 (12) = 1 2 ∑ j = 1 n ‖ V ⋅ j − W H ⋅ j ‖ 2 2 ( 按 列 展 开 ) (13) = 1 2 ∑ j = 1 n ∑ i = 1 d ( V i j − W i ⋅ H ⋅ j ) 2 (14) = 1 2 ∑ j = 1 n ∑ i = 1 d ( V i j − ∑ a = 1 c W i a H a j ) 2 ( 逐 元 素 展 开 )
注意,这里F(H)是关于H的函数,在更新H时,变量W是固定不变的。上面推导的第二行是将矩阵范数按列展开写,这n个子式(对应n列)可以被解耦(是无关的),所以最小化F(H),就等价于分别最小化这n个子式,我们以第j个子式为例写出新目标式:
F(H⋅j)=12∑i=1d(Vij−∑a=1cWiaHaj)2 F ( H ⋅ j ) = 1 2 ∑ i = 1 d ( V i j − ∑ a = 1 c W i a H a j ) 2
将V和H的第j列分别记为
v v 和
h h ,则
Vij=vi,Haj=ha V i j = v i , H a j = h a ,上式可以简写为:
F(h)=12∑i=1d(vi−∑a=1cWiaha)2 F ( h ) = 1 2 ∑ i = 1 d ( v i − ∑ a = 1 c W i a h a ) 2
至此,我们得到了引理2中的式(15)。我们对这个式子顺便求一下导吧:
∇F(h)=∂F(h)∂h=−WTv+WTWh(对向量求一阶导,对按列展开的式子求比较简洁) ∇ F ( h ) = ∂ F ( h ) ∂ h = − W T v + W T W h ( 对 向 量 求 一 阶 导 , 对 按 列 展 开 的 式 子 求 比 较 简 洁 )
∂F(h)∂h∂h=WTW(对向量求二阶导,得到的即是Hessian矩阵) ∂ F ( h ) ∂ h ∂ h = W T W ( 对 向 量 求 二 阶 导 , 得 到 的 即 是 H e s s i a n 矩 阵 )
函数对向量/矩阵直接求导,是比较简洁明了的,如果不熟悉,也可以对各元素求偏导,然后把各元素求得的结果按顺序排放成向量/矩阵即可。
∂F(h)∂ha=∑i=1d−Wia(vi−∑a=1cWiaha)=−WT⋅av+WT⋅aWh=−(WTv)a+(WTWh)a(对元素求一阶偏导,对式(15)求)∂F(h)∂ha∂hb=∑i=1dWiaWib=WT⋅aW⋅b(对元素求二阶偏导,a,b∈[1,c]) ∂ F ( h ) ∂ h a = ∑ i = 1 d − W i a ( v i − ∑ a = 1 c W i a h a ) = − W ⋅ a T v + W ⋅ a T W h = − ( W T v ) a + ( W T W h ) a ( 对 元 素 求 一 阶 偏 导 , 对 式 ( 15 ) 求 ) ∂ F ( h ) ∂ h a ∂ h b = ∑ i = 1 d W i a W i b = W ⋅ a T W ⋅ b ( 对 元 素 求 二 阶 偏 导 , a , b ∈ [ 1 , c ] )
接下来,我们就可以写出目标式F(h)的二阶泰勒展开:
再次把辅助函数表达式贴过来,对比着看:

很容易看出,G(h,h)=F(h)这个条件是满足的,下面我们只需要证明 G(h,ht)≥F(h) G ( h , h t ) ≥ F ( h ) ,也即是要证明下式成立:

那么我们现在就是要证明矩阵 (K(ht)−WTW) ( K ( h t ) − W T W ) 半正定,文章中用到了一个技巧,不是直接证它,而是考虑下面这个矩阵:

Mab M a b 是对矩阵 (K(ht)−WTW) ( K ( h t ) − W T W ) 中对应元素的一个缩放,故当且仅当M是半正定阵时, (K(ht)−WTW) ( K ( h t ) − W T W ) 也是。(关于这部分没有深究,还需要查资料多了解一下)
然后就是证明M半正定:

这里补充一下如何从式(19)到式(20),把式(13)中的分子展开写:
(WTWht)a=(WTW)a⋅ht=∑b(WTW)abhtb ( W T W h t ) a = ( W T W ) a ⋅ h t = ∑ b ( W T W ) a b h b t
并注意有:
∑a,b,a=b=∑a ∑ a , b , a = b = ∑ a
(19)=∑abνahtaKab(ht)htbνb−∑abνahta(WTW)abhtbνb=∑a,b,a=bνahta(WTWht)ahtahtaνa−∑abνahta(WTW)abhtbνb=∑aνa∑b(WTW)abhtbhtaνa−∑abνahta(WTW)abhtbνb=(20)(15)(16)(17)(18) (15) ( 19 ) = ∑ a b ν a h a t K a b ( h t ) h b t ν b − ∑ a b ν a h a t ( W T W ) a b h b t ν b (16) = ∑ a , b , a = b ν a h a t ( W T W h t ) a h a t h a t ν a − ∑ a b ν a h a t ( W T W ) a b h b t ν b (17) = ∑ a ν a ∑ b ( W T W ) a b h b t h a t ν a − ∑ a b ν a h a t ( W T W ) a b h b t ν b (18) = ( 20 )
现在,我们已经证明了 G(h,ht) G ( h , h t ) 就是 F(h) F ( h ) 的辅助函数,所以我们可以通过最小化G(),来降低F()的值。令G对h的梯度(这里导数是向量,所以叫梯度)为0:
∂G(h,ht)∂h=∇F(ht)+K(ht)(h−ht)=0 ∂ G ( h , h t ) ∂ h = ∇ F ( h t ) + K ( h t ) ( h − h t ) = 0
ht+1←h=ht−K(ht)−1∇F(ht)(24) (24) h t + 1 ← h = h t − K ( h t ) − 1 ∇ F ( h t )
对每个元素,则有如下更新法则:
ht+1a=hta−Kaa(ht)−1∂F(h)∂ha=hta−hta(WTWht)a(−(WTv)a+(WTWht)a)=hta(WTv)a(WTWht)a(19)(20)(25) (19) h a t + 1 = h a t − K a a ( h t ) − 1 ∂ F ( h ) ∂ h a (20) = h a t − h a t ( W T W h t ) a ( − ( W T v ) a + ( W T W h t ) a ) (25) = h a t ( W T v ) a ( W T W h t ) a
于是,我们推证了前面给出的关于H乘法更新准则,关于W的可以类似推证,此时目标式就应该是F(W),具体过程以后有需要再推导。
关于散度目标函数情形,直接贴图了。
