今回は非負値行列因子分解(NMF)についてまとめていく。
非負値行列因子分解は、音声の音源分離や、多次元のデータの次元削減のために使われる手法である。
音声の音源分離について調べてたときにちょうど出てきたのでまとめてみたいと思う。
Pythonでの実装は以下の記事で行った。
– NMFの実装(Python, NumPy)
以下の書籍の内容を自分なりにまとめていく。
Source Separation and Machine Learning 1st Edition
目次
0.概要
NMFは非負の行列
があるとして、非負基底行列(もしくは初めから決めていた行列)の
と非負の重み行列
の2つの内積に分解する手法である。
(1) ![]()
これは様々な学習システムに応用されてきた。(文書分類、computer vision、信号処理、レコメンドシステムなど)
分解の対象となる値は 非負である必要がある。非負としたのは、自然界に存在する様々な信号の性質を反映するため。
実際、画像の画素値や音声スペクトログラムの値などは非負となっている。
0.1 音源分離の文脈で
今回は、音源分離の文脈でまとめていきたいと思う。
音源分離だと、 NMFは単音源の音源分離によく使われる。
(複数音源だとICAなどがよく使われる)
はスペクトログラム値とすると
個の周波数分の値が
フレーム分格納されていることになる。

https://dsp.stackovernet.com/ja/q/10887 より
横軸が
個分あり、縦軸が
個分存在する。
基底行列
は
個の基底ベクトルが並んでいると解釈できる。
そのため、これらの基底ベクトルに対して重みをつけて足し合わせると、元の信号に再現できることで
を用意する。
を違った見方をすると、
の1行1行が分解された信号に対応する重みになる。
(2) ![]()
このように
を1つ1つの行の重みベクトルで構成されていると考えると
は以下のように書き換えることができる。
(3) ![]()
(
は直積を意味し、前半部分が行、後半部分が列に相当し、それぞれの行、列の位置を変えながら総当たり的に積を求めていく操作である)

1.学習過程
1.1 教師あり
欲しい音源
と、その背景音に当たる
がそれぞれ強度スペクトログラムで得られるとする。
この時、各々のスペクトログラムの和が実際に得られる信号 で、あらかじめ分離されたものが教師データとして持っている場合を考えてみる。
この時、
、
と分解ができ、分解する次元数
が、
を満たす時、新たに与えられた信号
は以下のように表現することができる。
(4) ![]()
ここで、
に含まれる音源と背景音のスペクトログラムの推定値を推定重み行列
で表すと、
(5) ![]()
(6) ![]()
これに加えて、Wienerゲインに基づくsoft mask functionにより、分離スペクトログラムの精度がより高まるらしい。
(7) ![]()
(8) ![]()
ここで、
は要素ごとの積を表している。
(時間によって変化しない畳み込みフィルタによって得られる周波数領域でのゲインのこと)
Wienerゲインについては、以下のスライドの13ページ目に該当すると思われる。
音声音響信号処理 第10回(WienerフィルタとKalmanフィルタ)
そして、これらによって得られた
をオーバーラップさせながら足し合わせていく逆短時間フーリエ変換を行えば分離された音声を再構成することができる。
1.2 教師なし
今度は分離された教師信号が存在しない場合を考えてみる。
これがかなり現実で多い問題設定になるだろう。
分離したい音源の基底行列
、背景音の基底行列
とすると、これらを直接得られないため、推定値
を計算する必要がある。
ここで、元信号
を分解して得られた基底行列
をk-meansなどのクラスタリングアルゴリズムを用いて任意のクラスに分離することができる。
この分離方法にはいくつか存在しており、ベイズ推定によって得る手法も提案されている。(Yang εt al. 2014)
2. 学習手順(Learning Objective)
2.1 概要
の非負行列が与えられているとする。NMFで、2つの非負行列
に分解するのが目的。
この時、各要素は以下のような対応関係となっている。
(9) ![]()
ここで、
の位置
の要素の値は
の第
行の
次元ベクトルと第
列の
次元ベクトルとの内積の値に該当する。
この時、学習対象となるパラメータ集合
は以下の条件を満たすように調整されていく。
(10) ![]()
は2つの値
、
との間にある情報量(Divergence)もしくは距離(Distance)を示しており、この値が最小となるような
の値を求めていくのが目標となる。
要は、
をよりよく近似できる
の組を何らかの指標を使いながら求めていこうということになる。
得られた勾配などから値を更新していく。
勾配の正のパートと負のパートとに分けて考えると、
(11) ![]()
(12) ![]()
これらを使ったパラメータ更新式は以下のようになる。
(13) ![]()
は要素積で、
は要素ごとの商を示す。
以下では、
の種類によってどのように更新式が変化するかを具体的に見ていく。
2.2 二乗ユークリッド距離(Squared Euclidean Distance)
直接的に距離を求めた指標。
(14) ![]()
それぞれの要素間の距離の二乗を単純に足し合わせたものとなる。
上記の損失関数
を最小化するために以下の更新式にしたがってパラメータを更新していく。
(15) ![]()
(16) ![]()
更新前の
が非負であれば更新後の値も正になる。
和ベースでの更新式に変えると、
の更新式は以下のように書くこともできる。
(17) ![]()
ここで、
とおくと分数の更新式と同じ形を得ることができる。
更新式は以下のように変形することで結果を得ることができる。
![]()
![]()
![]()
![]()
![]()
(18) ![]()
前半部分が
,後半部分が
に相当するので、式(13)に当てはめて計算すれば(16)が導き出される。
2.3 Kullback-Leibler Divergence
今度は2つの行列の間にある情報量を測る手法について見ていく。
Kullback-Leibler(KL) Divergence は以下のようなエントロピーを求めることで得られる。
![]()
(19) ![]()
KL Divergenceを最小化していくためのパラメータの更新式は以下のようになる。
(20) ![]()
(21) ![]()
また、
とすれば、
(22) ![]()
2.4 板倉・斎藤 Divergence
板倉・斎藤(IS) Divergence はNMFで使われる損失としてよく使われるものの1つである。
![]()
(23) ![]()
の更新式は以下のようになる。
(24) ![]()
(25) ![]()
2.5
Divergence
より一般的に
Divergenceが使われることがある。
![]()
(26) ![]()
二乗ユークリッド距離(
)、KL Divergence(
), IS Divergence(
) にそれぞれ
の値が相当する。
更新式は以下のようになる。
(27) ![]()
(28) ![]()
3. スパース性の確保
基底表現にスパース性を確保することで、実際のノイズ混じりの信号からシンプルな基底だけを確保できるようになる。
スパース性を確保するために、損失に正則化項が加わる。
(29) ![]()
はモデル正則化のための罰則関数。
L1正則化かL2正則化がよく使われる。
L1正則化
にすると、KL Divergenceの更新式は以下のように変化する。
(30) ![]()
(31) ![]()
4. まとめ
今回は、NMFについて書籍に書いてある内容を一通りなぞってみた。
NMFは自然界の信号の性質を加味して非負性を意図的に確保しつつさらにスパース性も加えている基底分解の方法の1つだということがわかった。
手順そのものもICAなどよりかはかなり直接的に求められるのでわかりやすいものになっている。
英語ではあるものの、式などが丁寧に乗っているのでとても読みやすいものになっている。
音源分離について色々知っていきたい。