大学院生が研究ネタを見つける4つの方法(具体例付き)

今年3月に博士号取得予定です。

学部4年生のころから、ずっと同じ研究室に所属し続けたおかげか、自分の研究に加え、後輩との共同研究もたくさん行うことが出来ました。その結果、博士論文提出時のジャーナル・国際会議・国内会議の論文数をすべて合計すると、主著が27本、共著は59本もあります。質の面はまだまだ精進が足りませんが、数の面だけは、自慢できるほどあるかなあと思っています。

今日は、そんな私がこれまでの経験で得た、大学院生が研究ネタを見つけるための、4つの方法を紹介したいと思います。

方法1:アプリから考える方法

まずアプリケーションやタスクを考え、それを実現するためにいろいろがんばる、というやり方です。
アプリやタスクを考える上で大事なのは、以下の2点です。

  • そのアプリができたらうれしいのか。(有益性、usefulness)
  • そのアプリは技術的に実現できるのか。(実現可能性、feasibility)

「有益性」の高いアプリを見つける能力は、あまり経験に依存しません。個人差はあるとは思いますが、学部4年生でも、博士をとった人でも、大きな差はないと思います。この意味で、研究初心者でも、いきなり素晴らしい研究が実現できる可能性を秘めています。ただし当たり前ですが、そのアプリに新規性があるかどうかのサーベイだけは、いくら初心者であろうと、きちんとやる必要があります。

もう一方の、アプリに「実現可能性」があるかどうか見極める能力ですが、これははっきりと経験が物を言います。また学術的には、「ギリギリ feasible」(簡単には実現できないけど最先端の技術を使うとどうにか実現可能なアプリ)が評価されやすい傾向にあります。簡単に実現可能なアプリは、そもそも研究対象にならないので・・・個人的には、「ギリギリ feasible」でなく簡単に feasible で、かつ useful なアプリはとっても素敵だと思うのですが、それはまた別の話。

こういった背景から、研究初心者の人の可能な研究ネタ探しアプローチの一つとして、とにかく沢山新規性があって useful なアプリを考え、それを指導教員や先輩に「ギリギリ feasible」があるかどうか相談してみる、といったことが出来ると思います。

私の身の回りで、アプリから考える研究が成功した例としては、研究室の先輩の研究になりますが、「手の動きからの音声合成」に関する研究があります。福祉の応用で、健常者が口を動かして話すように、構音障がい者の方も手を動かして話せるようなアプリを実現した研究です。Usefulness の方はそういったアプリを求めていらっしゃる障がい者の方がいらっしゃるという点で、最初からクリアしていました。ギリギリ feasibility の方は、基礎技術としては声質変換で用いられている技術をそのまま転用出来そうな点で feasible だが、どういった手の動きをどの声に割り当てればよいのか、声の高さはどう制御するのか、などといった問題も沢山ありそうだぞ、とういうことでギリギリ feasiblity もクリアしています。結果この先輩は、この研究を続けて博士号までとっておられます。私はほとんどこの研究に絡んでいなかったのですが、途中少しだけお手伝いをさせていただいたことがあり、こっそり第三著者にいれてもらった論文があったりします(http://www.gavo.t.u-tokyo.ac.jp/~mine/paper/PDF/2008/SP2008-78_p45-50_t2008-11.pdf)。

方法2:既存の有望そうな技術を、別の応用に適用する方法

この方法で研究をはじめる場合、以下の点を考えることになります。

  • どの既存技術が有望そうか?
  • どんな応用ならば、その手法が useful になるか?

まず、既存の有望そうな技術を見つける必要がありますが、これに関してはトップカンファレンスに参加するなどして、情報を仕入れてくる必要があります。有望そうな技術を見極める能力は、経験を重ねるしか無いので、初心者にはなかなか難しいかもしれません。一段メタな研究、私の専門の音声工学でいえば機械学習のトップカンファレンスで発表されている技術なども、調べる必要があるかもしれません。

別の切り口として、研究室の先生・先輩が研究している技術を別の応用に適用する、ということも出来ます。先生・先輩は、自分が有望と思うからその技術を研究しているわけですし、さらに実装を貰うこともできますしサポートもしてもらえますし、いいことづくめです。ただ、これをやりすぎると、研究室全体としての diversity が失われますので、ほどほどにしておく必要がありますが・・・

使う技術を決めたら、既に feasible であることは明白なので、それをどんな応用に用いたら useful かを考えます。まず一番簡単なのは、技術はそのままデータベースだけを変更する、というものです。音声工学でいえば、英語データベースでやっていたものを日本語データベースでもやってみるなどといった感じです。例えば、私は修士論文の頃に音声の構造的表象を用いた日本人英語の発音評価(http://www.gavo.t.u-tokyo.ac.jp/~mine/paper/PDF/2011/IPSJ-JNL_v52_n5_p1899-1909_t2011-5.pdf)をやっていたのですが、この技術を、中国人留学生が日本人中国語の発音評価に適用する研究をしてくれました(http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=6424270)。技術的な新規性はそれほど高くはありませんが、研究を進めるうちに技術を工夫すべき点も見えてきていろいろ技術の改良もできましたし、またデータベースの構築そのものにも、学術的価値があると思います。

また別のやり方として、技術をまったく別の応用分野に適用する、ということもできると思います。私の最近の研究で、雑音に頑健な音声認識を実現するために【雑音ののった音声→クリーンな音声】を行う技術を提案したのですが、この技術自体は、任意のパラレルな特徴量の変換を実現することができます。そこで研究室の後輩を中心に、私は共同研究者として、いくつか別応用の研究を行なっています。【電話帯域の音声→高帯域の音声】や【Aさんの音声→Bさんの音声】に適用した研究は、次の3月の音響学会にて発表予定です。

方法3:既存の有望そうな技術を、さらに改良する方法

先の方法に似ていますが、今度は応用を変えるのではなく、改良して精度を向上させることを狙うものです。

簡単には、有望そうな手法を組み合わせる、ということが考えられます。例えば後輩との共同研究で、雑音抑圧手法としてよく知られている SPLICE に、声質変換技術でよく用いられる eigenvoice conversion に関する技術を導入した、eigen-SPLICE を提案しました(http://www.gavo.t.u-tokyo.ac.jp/~mine/paper/PDF/2012/ICASSP_p4289-4292_t2012-3.pdf)。その後輩が、この研究に関する発表で音響学会で学生賞を受賞したりもしましたので、想い出深い研究の一つです。

手法を組み合わせるだけでなく、独自の工夫を加えてもよいと思います。これには、どのような工夫を行えば精度があがりそうなのか、を見抜く力が必要になります。この能力は、音声工学でいえば、音声の一般的な性質に関する理解、それぞれの機械学習手法に関する理解などを深めていくことで、力がついていくと思います。経験と、センスと、様々なものが問われます。

ちなみにですが、これまで誰もやっていなかったような新技術が提案できれば、それに越したことはないです。例えば私の指導教員である峯松先生の音声の構造的表象(http://www.gavo.t.u-tokyo.ac.jp/~mine/paper/PDF/2004/ICASSP_p585-588_t2004-5.pdf)は、誰もやっていない新技術でした。ただし、音声工学は、音声に関する様々な学問に関する知見をルール化したり機械学習技術に載せて実装していく、という面が強いですので、まったく新しい技術を使う必要性は、かなり低めだと思っています。もちろん他の分野であれば、新技術の提案が、最も重要になることもあるかと思います。しかし残念ながら、私はまだ新技術を効率的に見つけていく力を身につけていないので、ここではこれ以上深入りしません。

方法4:研究所にインターンに行く

研究ネタを考える方法ではないですが、研究ネタを見つける方法としては、非常に効率的です。

他力本願にはなってしまいますが、研究所インターンに行けば、受け入れ側の方が、企業としてのニーズがあってかつそれなりに短期間で成果が出そうな研究テーマを与えてくれます。こんなチャンス、学生にしかありません!私は、NTT CS研と、IBM Research - Tokyo(×2)でインターンさせて頂く機会に恵まれました。

NTT CS 研のインターンでは、SPLICE に関する研究テーマを頂きました。インターンが終わった後も、メールベースでご指導を頂け、研究の成果は http://www.gavo.t.u-tokyo.ac.jp/~mine/paper/PDF/2012/ICASSP_p4109-4112_t2012-3.pdf で発表し、ICASSP の学生賞まで頂けました。

IBM Research - Tokyo のインターンでは、音声の構造的表象を用いた大語彙音声認識に関する研究テーマを頂き、研究を行いました(http://www.gavo.t.u-tokyo.ac.jp/~mine/paper/PDF/2012/INTERSPEECH_876_t2012-9.pdf)。二回にわたってインターンをさせていただき、一回目の成果は音響学会の学生賞を、二回目の成果は粟屋賞まで頂いてしまいました。(さらにインターンとは直接関係ないですが、来年からは IBM Research - Tokyo に就職することになりました。)

またインターンは、研究テーマを頂くだけでなく、研究の進め方も参考になることばかりでした。インターンに行く前までは、研究は論理的であることが一番大事!としか思っていませんでしたが、論理的であることに加え、一貫性(consistency)が実は非常に重要である、ということを、実感として学ぶことができました。また、おこがましい話ですが、後輩を指導するときに、どのような研究テーマを与えるべきか、またどういった点に気をつけて指導するべきか、といった視点を得ることもできました。

うれしいことだらけのインターンですので、研究室の後輩にもインターンに行くようおすすめしています。実際に私の後輩も NTT CS 研や NICT などのインターンに参加させていただいており、よい研究成果をたくさんあげている最中です。

まとめ

以上、大学院性が研究ネタを見つけるための4つの方法を紹介しました。

学部4年生や修士1年生の人は、方法1で研究ネタを見つけるか、研究室の先生や先輩から方法2や方法3で見つけた研究ネタを貰う、というのが主になると思います。研究に慣れてきた先輩側の人は、方法2や方法3で研究ネタを見つけて自分研究したり、また見つけた研究ネタで後輩と共同研究するのもよいと思います。また、将来博士にいったり、研究者になったりしてみたいな〜なんて思っている人には、方法4がものすごくオススメです。

よく聞く話ではありますが、研究は、ほとんど研究ネタを決めた時点で勝負が決まっています。良い研究ネタを見つけて、ハッピー院生ライフを送りましょう!研究楽しいよ。

正規分布の周辺分布

ノイズ  n正規分布  p(n)=\mathcal{N}(n; \mu_n, \Sigma_n) としてモデル化されていて,
さらにノイズが分かった上で観測信号 x が出力される確率が
ノイズの線形変換を平均とする正規分布  p(x|n)=\mathcal{N}(x; An+b, \Sigma_x) としてモデル化されている.


こんなとき, x n の同時確率を  n で周辺化したい,というのはよくある状況かと思います.
丁寧に書くと,
p(x) = \int p(x,n) dn = \int p(x|n)p(n) dn = \int \mathcal{N}(n; \mu_n, \Sigma_n)\mathcal{N}(x; An+b, \Sigma_x) dn
を計算したいということです.


結論としては,解析的に計算できて,以下の正規分布になります.
\int \mathcal{N}(n; \mu_n, \Sigma_n)\mathcal{N}(x; An+b, \Sigma_x) dn = \mathcal{N}(x;A\mu_n+b,\Sigma_x + A\Sigma_nA^\top)


導出は PRML などに載っています.平方完成を使います.
VTS などモデルベースの特徴量強調技術を勉強するときには超頻出なので,
もはや公式として覚えておく必要があるかと思い,ここにメモしておきます.

fMMI,fMPE,fBMMI

今日は,特徴量変換の識別学習について述べます.


特徴量スペースの識別学習の話に入る前に,
音声認識の音響モデルの研究が,この 10 年どのように発展してきたかについて,
(間違っているかも知れないですが)簡単に復習したいと思います.


まず,HMM を MMI 基準で識別学習する話が,大語彙タスクでも動作することが確認されました.
次に,認識誤り率を少なくするような基準の方がよいだろうということで,MPE がでてきました.
このとき同時に,識別学習による過学習を防ぐため,I-smoothing という技術がでてきました.
これは,パラメタ更新時に,過学習してない(ML などの)パラメタに,データ量に応じて back-off させるという技術です.
これのおかげて,パラメタ更新が安定し,率の向上に大幅に貢献しています.
次に,MMI や MPE 基準を使って,特徴量変換を識別学習しようという話(fMMI,fMPE)がでてきました.
これは,単体だけでもなんと HMM の識別学習と同じくらい効果があり, HMM の識別学習と組み合わせると,さらに率が向上するようです.
次は,マージンを大きくするような学習の方がよいだろうということで,MPE 基準に変わる BMMI 基準がでてきました.
BMMI は,HMM の識別学習でも,fBMMI としても使えて,それぞれ MPE,fMPE をこえる効果があるようです.


以上すべて世界的スーパー研究員 D.Povey の成果です.すごすぎ (>_<)
https://sites.google.com/site/dpovey/my-publications
(D.Povey 以外の人からも,他に様々な素晴らしい手法が提案されていますが,今回は省略させていただきました)


BMMI 以降は,HMM を識別学習する話はどうやら一段落?したようで,
HCRF のように,モデルそのものを識別モデルにしよう,という研究が増えているようです.
ただ,私のサーベイ不足なだけかもしれませんが,今のところ
識別モデルを使って,大語彙音声認識で十分な improve が達成された論文はあまりないような気がします.
(気がしているだけかもしれないので,今後一人勉強会で音響モデルに識別モデルを使う話も取り上げたいです
特に,deep berief network を使った ANN-HMM とか.)


さて,本題に戻ります.今日は,特徴量変換を識別学習する話(fMMI,fMPE,fBMMI)をします.
先にも書きましたが,これは単独でも HMM の識別学習と同じくらいの効果がある,すごい技術です.


観測した音声の特徴量(MFCCなど)を y とおきます.これはクリーン音声です.
これを,音声認識により適切な特徴量 x に変換することを考えます.


fMMI,fMPE,fBMMI では,以下のように yx に変換します.
x=y + Mh
M は横にながーい長方形の行列です.
h は,ガウス分布をものすごくたくさん(700,000個くらい!)用意して,
y がそのガウス分布から出力される尤度を並べた,700,000次元くらいの縦ベクトルです.
M は,例えば y が 39 次元として,39x700,000 の行列です.
この M を,MMI/MPE/BMMI 基準で学習することで,適切な x を求めます.


この定式化は,SPLICE と非常によく似た定式化となっています.
というか,もし y の GMM の混合数が 700,000 で,
変換はバイアス項 b_k のみを考慮する SPLICE であれば,定式化自体はまったく同じです.


もちろん,SPLICE では y は劣化音声特徴量を使っていますし,
GMM の混合数はもっと少なくしていること,変換に A_k を使う場合もあること,
uncertainty decoding や NMN (や私の提案している手法)などへの発展があることなど,
まったくすべて同じというわけではないです.
なおこの関係性は,以下の論文で詳しく議論されています.
http://research.microsoft.com/pubs/58992/2005-deng-spl.pdf


さて,この M をどう最適化するか?という話ですが,
実は MMI-SPLICE に関する一人勉強会でやった方法と基本的には同じです.
すなわち,MMI/MPE/BMMI 基準を M偏微分して,最急降下法で最適化します.


ただし,MMI-SPLICE では,MMI 基準を使っていましたが,
これが MPE や BMMI 基準になったりもしています.
また,最急降下法で最適化するにあたり,様々な工夫が導入されます.


ここでは,http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=1415275
を参考に,fMPE で M がどのように更新されるのか見てみます.


と思いましたが,全部詳しく読み込んで日本語で説明しなおすとなると
時間がなくなってしまいそうなので,今日はやめときます.
一人勉強会なので,許してください… 時間があれば後日書きます.


しょぼい内容になってしまいましたが,とりあえず今日はここまで.

Uncertainty decoding

耐雑音音声認識において,モデルベースの手法と特徴量ベースの手法では,
一般的に性能面はモデルベースの勝ち,計算量は特徴量ベースの勝ちです.
今日は,特徴量ベースの手法を計算量はそのままモデルベースの性能に近づけることができる, uncertainty decoding(UD)を紹介します.


クリーン音声特徴量を x,雑音で劣化した音声特徴量を y とします.
まずは通常通り,音響モデルとしてクリーン音声の GMM-HMM を学習しておきます.
すると,以下のようなガウス分布が沢山学習されることになります.
 p(x|m) = \mathcal{N}(x; \mu_m, \Sigma_m)
 m はある音響イベントに対応する GMM に含まれる一つのガウス分布のインデックスです.
この他に,GMM の重みと HMM の遷移確率も学習されます.
HTK とかで学習した hmmdefs ファイルをみると,実際沢山の正規分布,GMM の重み,遷移確率が並んでいることが分かると思います.


今我々は,y のみしか観測できないので, p(y|m) を計算しなくてはなりません.
GMM の重みと HMM の遷移確率は,雑音が重畳しても変わらないとすれば,
p(y|m) さえ求まれば,あとは普通に音声認識のデコーディングを行うことができます.
ただ,p(y|m) の計算は大量にでてくるので,計算コストが低いことも重要です.
そのため現実的には,p(y|m)正規分布として近似することになります.
以下,この p(y|m) をどうやって計算するか,というお話になります.


我々は既に p(x|m) を学習して持っているので,p(y|m)p(x|m) を含むように展開します.
 p(y|m) = \int p(y,x|m) dx = \int p(y|x,m) p(x|m) dx


突然ですが,ここで,あるある式展開を紹介します.以下の式は恒等的に成り立ちます.
 \mathcal{N}(a;b,\Sigma) = \mathcal{N}(b;a,\Sigma)
ガウス分布の変数と平均を入れ替えても式自体は変わらない.ガウス分布の定義より,明らか.
 \int \mathcal{N}(x;a,\Sigma_a) \mathcal{N}(x;b,\Sigma_b) dx =  \mathcal{N}(a;b,\Sigma_a+\Sigma_b)
→証明するには,exp の肩の部分を平方完成して「ガウス分布の全積分は1」を使えばよい


この「あるある式展開」を考慮してもう一度先の式に戻ると,p(x|m)正規分布だったので,
もし  p(y|x,m)x を変数or平均とする正規分布として表現されていれば,
p(y|m)正規分布として計算できることになります.
以下,p(y|x,m)x を変数or平均とする正規分布としてどう計算するか,という話になります.


Uncertainty decoding では,まず最初に,以下の重要な近似を使います.
p(y|x,m) \simeq p(y|x)
すなわち,x にノイズがのって y になる過程は,音響モデルに依存しない!という仮定です.
この近似を導入することにより,計算量は劇的に減ります.
m は音響モデルに含まれるガウス分布の数分あるので,
例えば 2000 状態 16 混合の GMM-HMM なら,単純に考えても 1/32000 に計算量が減らせます.
以下,p(y|x)x を変数or平均とする正規分布としてどう計算するか,という話になります.


p(y|x) の計算方法には,いろいろやり方があります.
昨日 SPLICE について書いたので,まずは SPLICE を使った UD について述べます.
論文はこちら.UD が初めて提案されたのも,この論文です.
http://research.microsoft.com/pubs/63614/2002-droppo-icassp.pdf


UD with SPLICE では,p(y|x) を以下のように展開します.
p(y|x) = \frac{ p(x|y) p(y)}{ p(x) }
これで,p(x|y)p(y)p(x) を計算すればよくなりました.
以下,それぞれの計算について述べます.


まず,p(x|y) について.
SPLICE なので,区分線形変換で yx に変換する以下の式を使います.
p(x|y) = \sum_k p(x|y,k) p(k)
通常の SPLICE の枠組みで,ステレオデータ使えば,
p(x|y,k)正規分布とした場合の平均値を学習することができます.
p(x|y,k) の分散については,平均値と同様,重み付き最小二乗誤差基準で学習できます.
論文でいうと,式 (5) です.
(論文は例によってバイアス項 b_k のみを使う場合しか書いていないです.A_k を使う場合は…後日.)


次に,p(y) について.
これは,p(y) = \sum_k p(y|k) p(k) なので,
SPLICE で利用する y の GMM から簡単に計算できます.


最後に,p(x) について.これが,厄介です.単純には計算できません.
今回,p(y|x)ガウス分布でないといけなかったので,
p(x)ガウス分布である!と仮定します.(本当は GMM などで近似されるものなので,この仮定はおかしい.)


計算は,以下のように進みます.
 p(x) \simeq \sum_k p(x|k) p(k) = \sum_k \int p(x,y|k) p(k) dy = \sum_k \int p(x|y,k) p(y|k) p(k) dy
ここで p(x|y,k), p(y|k), p(k) はすべて既知なので,計算可能で,
それらは y を変数とする正規分布なので,積分もできます.
しかし,\sum_k が残ってしまうので,GMM となってしまいます.
そこで,この GMM の平均/分散を,p(k) をつかって重み付け平均のような形で無理やり近似します.
このきちゃない近似は論文を参照してください.


ここまでできれば,p(y|x),ひいては最終的に欲しかった p(y|m) が,ガウス分布として計算できることになります.
しかも,p(y|x,m) を音響モデルに依存させない近似のおかげで,計算量は通常の SPLICE からほとんど変わりません.
ただし,p(x) を無理やりガウス分布で近似するせいで,不整合がおこる部分もあります.


気になる UD with SPLICE の精度は,普通に SPLICE から良くなっています.
論文では,AURORA2 の set A の平均で,
単語正答率 SPLICE:88.21% から UD w/ SPLICE:90.63% となっています.
結構いい認識率です.
また論文では,noise mean normalization- (NMN-) SPLICE や CMN を使っても,
同様に UD ができる,としています(この結果は NMN も CMN もしていない).
これらを考慮すると,さらに率を改善する余地が残されているように思います.


さて,ここまで UD with SPLICE を紹介しましたが,
p(x) を無理やり正規分布で近似するという強引な近似が含まれていました.
別の方法を用いると,実は UD with SPLICE よりましな近似で p(y|x) を計算することができます.
これが,joint uncertainty decoding (JUD) です.
http://www.sciencedirect.com/science/article/pii/S0167639307001720


JUD でも,p(y|x) を使う部分までの式展開は同じです.
JUD では,p(y|x) を以下のように近似します.
p(y|x) \simeq \sum_k p(y,k|x) = \sum_k p(y|x,k) p(k|x)
この近似は,x の GMM と y の GMM のインデックスは共通であるといった近似です.


p(y|x,k) 及び p(k|x) は,
xy の結合ベクトルの GMM を予め学習しておき,そのパラメタをもとに計算します.
これは,声質変換(Voice Conversion; VC)の研究でも広く用いられている手法です.
式は疲れてきたので省略します…


(追記)
JUD では,p(k|x) がある k で 1,それ以外は 0 であると近似します.
これにより, \sum_k p(y|x,k) p(k|x) が GMM ではなくガウシアンになります.
また,argmax_k p(k|x) は計算できませんが,これは argmax_k p(k|y) で近似します.
このあたりの近似の「雑さ」が,UD w/ SPLICE の近似より良いかどうか,,がポイントです.



気になる JUD の性能ですが,論文によると UD with SPLICE よりも性能が高いそうです.
AURORA2 ではないデータベースなので単純には比較できませんが…


さらに,JUD には model-based JUD という亜種があります.
Model-based JUD では,p(y|x,m) \simeq p(y|x) という近似を,
もうちょっとよい近似として,m より大幅に少ないクラス c を用意して,
p(y|x,m) \simeq p(y|x,c) とするものです.
これにより計算量は,c のクラス数倍になりますが,精度もいくらか向上するようです.


精度ですが,論文によると,クラス数を 16 まであげれば,
クリーン音声から学習した GMM-HMM を使っているのにもかかわらず,
同じ雑音環境下で劣化した音声から学習した GMM-HMM を使った場合とほぼ同等の精度がでるようです.
素晴らしい.


UD を実装するためには,デコーダを書き換える必要があります.
HTK の future plans のところに,JUD の実装が含まれていますが,待ってるのもなんですし,
機会を見つけて自分で書いてしまいたいなーと思っています.実装自体はそんなに難しくなさそうだし.
今日の一人勉強会はこれでおしまいです.

MMI-SPLICE

音声強調法としてよく知られる SPLICE を MMI 基準で学習する話を紹介します.


MMI-SPLICE の前に,まず SPLICE を紹介します.SPLICE は http://research.microsoft.com/pubs/63610/2002-droppo-icslpa.pdf が詳しいです.


SPLICE は,以下の式で劣化音声特徴量 y からクリーン音声特徴量の推定値 \hat{x} を求めます.
\hat{x}=\sum_k p(k|y) A_k [1;y]
簡単にいえば,区分的線形変換で y\hat{x} の関係をモデル化しています.


通常の SPLICE では,A_k を学習する際, y とクリーン音声特徴量 x のステレオデータ(時間的に同期したデータ)を用い,重み付き最小二乗誤差基準で推定しています.具体的には,
 argmax_{A_k} \sum_{t} p(k|y_t) || A_k [1;y_t] - x_t ||^2
を解いています.ここで t はデータの時間インデックスです.この目的関数は convex で,解析的に厳密解が求まります.
SPLICE の学習を matlab-like な擬似コードで以下に示します.

for ii = 1:nfile
    % データを読む
    input = readhtk( inputfiles{ii} );
    output = readhtk( outputfiles{ii} );

    [ndim nframe] = size(input); % = size(output)

    for kk = 1:nframe
        
        % p(k|y) を計算.gmmmean/gmmvar/gmmweight は予め学習しておく
        w = sum( -0.5 * (gmmmean-input(:,kk)*ones(1,nmix)).^2 ./ gmmvar)';
        w = exp( w ) .* gmmweight ./ sqrt(prod( gmmvar ))';
        w = w ./ sum(w);

        x = output(:,kk);
        z = [1; input(:,kk)];
        
        xz = x * z';
        zz = z * z';
        for ll = 1:nmix
            % 高速化可能(後述)
            Rk_xz(:,:,ll) = Rk_xz(:,:,ll) + w(ll) * xz;
            Rk_zz(:,:,ll) = Rk_zz(:,:,ll) + w(ll) * zz;
        end
    end
end

for ii = 1:nmix
    A(:,:,ii) = Rk_xz(:,:,ii) / Rk_zz(:,:,ii);
end

A_k が学習できれば,\hat{x} を推定するのは以下のような感じでできます.

for kk = 1:nframe
    % p(k|y) を計算
    w = sum( -0.5 * (gmmmean-input(:,kk)*ones(1,nmix)).^2 ./ gmmvar)';
    w = exp( w ) .* gmmweight ./ sqrt(prod( gmmvar ))';
    w = w ./ sum(w);

    z = [1; input(:,kk)];

    for ll = 1:nmix
        % 高速化可能(後述)
        enhanced(:,kk) = enhanced(:,kk) + w(ll) * ( A(:,:,ll) * z );
    end
end

上のコードで「高速化可能」と書いた部分は,適当な閾値などを設けて w(ll) が十分小さい場合に計算を飛ばすようにすると,高速化できます.
一般的に GMM を使って w を計算すると,w はかなりスパースになるので,この高速化は非常に有効です.
SPLICE は,計算量が比較的小さく,かつ精度が高いことが知られています.


SPLICE は,他の音声強調法と比較して2つの大きな特徴があります.
一つは,音声強調時に雑音の推定値が必要ないこと.(逆にいうとせっかく雑音を推定しても使えない.)
もう一つは,学習に yx のステレオデータが必要になるということです.


前者に関しては,手前味噌ですが,雑音の推定値を利用する SPLICE を提案しているので,
もしよろしければ私のHP http://www.gavo.t.u-tokyo.ac.jp/~suzuki/ に書いている論文など御覧ください.


後者に関して,実は,ステレオデータが必要ない A_k の学習法が提案されています.
前置きが長くなってしまいましたが,これが MMI-SPLICE です.
論文はこちら.
http://research.microsoft.com/pubs/57607/2005-jdroppo-eurospeech.pdf


MMI-SPLICE は,通常の SPLICE と,音声強調ステップは完全に共通です.なので,音声強調時の計算量は SPLICE から変化しません.
違いは, A_k の学習に,MMI 基準を用いることだけです.
通常の SPLICE では, A_k を推定する基準は,以下に再掲する重み付き最小二乗誤差基準でした.
 argmax_{A_k} \sum_{t} p(k|y_t) || A_k [1;y_t] - x_t ||^2
MMI-SPLICE では,これを HMM の識別学習などでお馴染みの,MMI (Maximum Mutual Information,相互情報量最大化) 基準で推定します.
 argmax_{A_k} \sum_{r} \ln{\frac{p(\hat{X}_r, w_r)}{ \sum_w p(\hat{X}_r, w) } }
ここで, r は utterance ごとの ID です.\hat{X}_r は SPLICE を使って音声強調された utterance の特徴系列,w_r は utterance r に対する正解単語系列です.
このような基準を使うことで,A_k音声認識率が高くなるように学習されます.
しかも,学習には  y と対応する単語系列があればよく, yx のステレオデータは必要なくなります.


MMI 基準の目的関数は,通常の SPLICE の目的関数と違い,解析解は求まりません.
最適化には最急降下法を用います.
そのためには,A_k で目的関数を偏微分する必要があります.
論文(http://research.microsoft.com/pubs/57607/2005-jdroppo-eurospeech.pdf)には,
A_k の代わりに,そのバイアス成分である b_k のみを用いた場合の偏微分の計算が述べられています.
(個人的には論文の (6) 式の展開が,確かに当たり前のように見えつつも,イマイチ確信をもって説明できません…
詳しい方いらっしゃいましたら,教えて下さい…もっと勉強しなくては…)


A_k偏微分する場合は,最終的な目的関数の微分(論文でいう (9) 式)は以下のような感じになります.
 \frac{ \partial \mathcal{F} }{ \partial A_k } = \sum_{r,t,s^r_t} p(k|y^r_t) (\gamma^{num}_{s^r_t} - \gamma^{den}_{s^r_t}) \Sigma^{-1}_{s^r_t} (\mu_{s^r_t} - x^r_t) [1;y^r_t]^T
各文字の意味については,論文を参照ください.
 \gamma^{num}_{s^r_t}, \gamma^{den}_{s^r_t} は HMM を識別学習するときにでてくる項と同じものです.
(日本語で HMM を識別学習する方法の説明をあまり見ないので,いつかしっかり書いてみたいが,今日はひとまず省略)


気になる MMI-SPLICE の性能ですが,論文によると,通常の SPLICE より,特にノイズ環境のミスマッチが少ない場合良くなるようです.
ノイズ環境のミスマッチがある場合は,ある程度はよくなりますが,すぐに過学習の問題が発生するようです.
MMI-SPLICE は,通常の SPLICE と違って学習にステレオデータが必要無いという大きな利点があるので,この結果は十分うれしい結果です.


なお,MMI 基準ではなく,MCE 基準を使う SPLICE http://hub.hku.hk/bitstream/10722/47081/1/121754.pdf も提案されていますが,
(論文によると)MMI-SPLICE の方が少しだけ性能が良いとのことです.


このブログでは,バイアス成分  b_k だけでなく  A_k を使う場合の式を紹介しましたが,
もしかしたら, A_k を使うと過学習の問題はより顕著になってしまうのかもしれません.
このへんは,MMI-SPLICE を実装していないので今のところわかりません.


本来なら MMI-SPLICE を実装してコードも載せたいところですが,
そこまでは手が回っていないので,今日の一人勉強会はこれでおしまいです.


追記
http://research.microsoft.com/pubs/63600/2005-droppo-asru.pdf
こっちの論文の方が,詳しく書いてあることに今更気づきました.
 A_k で目的関数偏微分する式も,こちらの論文には載っています.

実声と裏声

母音というものは,声帯の振動が音源となり,それが声道で共振することで生まれます.そのため基本的には,声帯が音の高さ(何Hzか),声道が音色(母音の違いなど)を決定します.(声帯と声道は物理的に繋がっているので,両者の制御を完全に切り離すことはできないけど,近似的にはこうなります.音源と共振特性を切り離して考えるモデルを音声工学では「ソースフィルタモデル」といいます.)

実声と裏声(ファルセット)の違いは,ソースフィルタモデル的にいえば,音源(声帯)の制御方法の違いです.声帯そのものが縮む筋肉を使って出すのが実声.声帯につながっている筋肉(輪状甲状筋)を使って声帯を引っ張って出すのが裏声です.

歌を歌うときには,実声と裏声の切り替え部分を上手くやらないと,そこで断絶が起こってしまいます.実声だけで高い音を出せる,強靭な声帯を持つ人も中にはいるかもしれないけど,一般的には(少なくとも僕には)実声で高い音を出すのは難しいです.

実声と裏声をスムーズに切り替えるためには,「実声と裏声を混ぜる」ことが有効です.声帯の制御方法としては簡単な事で,輪状甲状筋で声帯を引っ張りながら,同時に声帯を伸縮させればいいわけです.言うは易しですが,僕には今のところできません.僕の場合,自分の感覚として,実声と裏声が完全に二分されてしまっています.

でも,実際に実声と裏声が混ざる人はいて,例えば「歌う筋肉」というCDをだしている弓場先生とかは,実声と裏声のミックスボイスを実現しています.僕が初めて完全なミックスボイスを聞いたのは,高校の後輩のIくんでした.生まれつきできたらしい.羨ましい.

ちょうどそのころ,OCMの当間先生が「ヴォーチェ・ディ・フィンテ」という実声と裏声を混ぜる発声法についてウェブ上で書いておられて,全部印刷して読み込んでました.
OCM - 合唱講座 http://www.collegium.or.jp/~sagitta/ocm_homepage/html/kouza.html
ただ,ずっと憧れて練習はしていたけれど,今のところまだできてません.

高校をでて大学に来てからも,ときどき,ミックスボイスを実現している人を見かけました.ただ,ほとんどの人が生まれつきできたようで,僕みたいに実声と裏声が二分してしまって悩んでいたけど,ミックスボイスができるようになって高音なんて怖くなりました,,みたいな人には会っていません.

続きを読む

情報爆発するなど

  • 今日のお昼は電気系の懇親会
  • 昼からビールを飲んでしまう
  • @mahimahi 先生の研究室は,ミーティングの遅刻は許されないらしい
  • うちの研究室もちゃっきりしないとなあ
  • まずは自分から.そうゆう空気を作ることが大事だと思う
  • 昼から情報爆発
  • 情報爆発科研の報告会でデモを発表してきた
  • 今やってる発音診断のデモを,ちゃんとwebアプリにして実装しようと本気で思い始めた
  • twitterでつぶやける形式のwebアプリにしたい
  • 実はちょっと前に,mixiアプリに実装しようかと考えていたけど,いつの間にか立ち消えていた
  • こんどこそちゃんとやろう
  • 自分にプレッシャーをかけるためにこのブログに書いておく
  • せっかくの研究成果なので,多くの人につかってもらいたい
  • INTERSPEECHの原稿はやく書かねば
  • 髪の毛切りたい
  • 最近変身願望が強いので,カラーにするかパーマかけるかしたいと思っている
  • 今週か来週には美容院に行こう