神野さんに言われました。

神野さんに言われました。

AIの勉強をしています @sesenosannko

自分の声を水瀬いのりさんの声にする他対1声質変換

僕は水瀬いのりさんになりたいのですが、まずは声から水瀬いのりさんになることにしました。

まだまだ満足とは言えない結果ですが一応音がでたのでまとめておきます。以下、変換の結果です。

元の音声(僕の声です)

変換後

合成音感がかなりありますが、言われてみれば水瀬さん・・・・と思ってもらえると嬉しいなぁ。むしろさとうささらへの変換だと思ったら良さそう・・・。強調したい点としては、僕の声は学習時には全く使っていないということです。この手法では学習に使っていない人でも誰の声でも水瀬いのりさんの声に変換することができます。

仕組みは下に書いてありますが、音声認識を応用した手法です。現状では学習データ量などの問題で音声認識の精度が低いので、ゆっくりはっきり話さないといけないし苦手な音が多いです。合成の質が低い理由もほとんどはデータ量の問題だと思います。


ちなみに、声コスプレという概念は既に提案されています。この川奈さんの記事は僕が音声分析を学び始めるきっかけになったものです。


参照した論文

2016年に発表されたパラレルデータが必要ない他対1声質変換の手法を提案した論文です。

http://www1.se.cuhk.edu.hk/~lfsun/ICME2016_Lifa_Sun.pdf

内容を簡単にスライドにまとめました。


音声処理の基礎的な話

このブログにいろいろと書いてあります。検索したら直ぐに出てくるし、有名なので紹介するまでもないですがかなり参考にさせていただいているので紹介します。


使ったもの

目標音声

ラジオ番組「水瀬いのり MELODY FLAG」第1回〜第5回、水瀬いのりさん発話部(音楽などが被っているものは除いてあります・約50分)。私的に録音したものです。原論文ではPPGからMCEPの変換の学習に100文の音声を使用したと書いてありますが音源の長さが明記されていません。


言語

自分で書いた部分は基本的にPythonです。


音声分析システム

MFCC・MCEPの抽出、MCEPからの音声生成にはSPTKという音声分析システムを使いました。提案論文ではSTRAIGHTが使われており、特に音声合成の方法は異なります。STRAIGHTの方が音声合成は高質ですが、STRAIGHTが僕のPCで動かなかったのとSPTKに慣れているため使いました。

Speech Signal Processing Toolkit (SPTK)


ニューラルネットワークライブラリ

提案論文では音素認識ではKaldi、音声生成ではCURRENNTというものが使われていますが、そもそも提案論文では設定がそれほど詳しく書いてあるわけではなく合わせる必要もないのでKerasを使います。Kerasは簡単に実装できることと、Bidirectional-LSTMが標準で実装されていることも大きいです。

Layer wrappers - Keras Documentation


コーパス

音素認識(PPGを生成する場合)では音声に対して時間ごとに発せられている音素のデータが必要になります。このようなデータは日本語でも存在しますが、私が知る限りは取得に数万円かかります。そこで、音声認識システム用ツールキットJuliusの「音素セグメンテーションキット」を活用します。日本語向けに開発をされていることが非常にありがたいです。

ちなみにJuliusは公式にはMac非対応ですが、一応使えます。

これを使えば、音声ファイルと音声をひらがなで書き起こしたファイルから、時間ごとに発せられている音素のデータを生成してくれます。スペースを入れる場合はテキストで明示する必要があること、音声ファイルの長さは30秒程度が限界ということは面倒な点です。結果で出力されるlab形式はWaveSurferという音声分析アプリのファイル形式ですので、WaveSurferで結果と音声を照らし合わせることができます。

以下は結果の一例です。有名な「あらゆる現実を」の文章です。幾つかの例を見た限りでは良い精度だと思います。

f:id:sesenosannko:20170319234404p:plain

音声ファイルと書き起こしのみのデータなら無料でも入手することができます。今回は音声資源コンソーシアムより研究用に配布されている「 重点領域研究「音声対話」 対話音声コーパス (PASD)」を使わせてもらいました。この記事の内容は所属しているサークルでの研究活動の一環なので、その名目で申請・取得したものです。およそ100分の音声を使用しましたが、空白部が多いので発話時間はおよそ50分程度でしょう。原論文で用いられているTIMITは630名の各10文(計6300文・約5.4時間)によって構成されるコーパスであることを考えても、これは明らかに不足です。コーパスには6時間程度の音声が含まれているのですが、学習に都合が悪いものや会話音声で二人の音声が被っている音源を除いたことなどが原因です。

PASD - 音声資源コンソーシアム


実装

データを除いてGitHubで公開しています。あんまり丁寧に説明とかはしていなくてすいません。

音韻モデル

提案論文ではPhonetic PosteriorGrams(PPGs)のクラスとして131個のセノンを用いています。セノンという言葉自体は日本ではあまり使われないようですがHMM音声認識で良く使われるもので、簡単に言えばトライフォンをクラスタリングしたものです。Juliusで論理トライフォンと呼ばれているものと同じだと思います。通常は数百個以上にクラスタリングされるようです。下記資料の「コンテキスト依存モデル」で基礎的な説明がされています。

https://www.gavo.t.u-tokyo.ac.jp/~mine/japanese/nlp+slp/IPSJ-MGN451003.pdf

しかし、今回の実装では音素をそのまま扱っています。この理由は、Juliusの音素セグメンテーションで認識される日本語の音素は空白を含めて36種類と多く、当初は音声生成はLSTMで行われることから効果が薄いのではないかと考えていたからです。しかし、音素認識がネックだと分かった現在ではセノンを使ったほうが精度が向上するだろうと考えているので、できれば替えたい思っています。

SI-ASR(音素認識)

提案論文ではKaldiの中間層4つ、全1024ノードのDNNモデルを使用しています。何を使っているのか明記されていないので良くわかりませんが、原論文には拘らずSI-ASRもBLSTMで作ることにします。

入力は39番目までのMFCC+エネルギー、出力は36種類の音素で試行錯誤の結果4層のBSLTM[40-128-128-128-128-36]に落ち着きました。全層に0.3のDropout層を加えています。入力サイズは40×2000フレーム(10秒分)にしていますが、適切な長さが良く分からないので適当に設定しています。単純に全ての音源を連結して10000フレームごとに切り分けています。バッチサイズは32ですが適当です。

PPGsからのMCEP生成

こちらもSI-ASRと構造に大きな違いはありません。提案論文では[131-64-64-64-64-40]というBLSTMが用いられています。いろいろと試した結果、入力は音素事後確率とlogF0(平均0、分散1に標準化)、出力は0〜39番目のMCEPとして[37-64-64-64-64-40]としています。なお、変換目標のMCEPは標準化しており、僕の学習では分散が過小評価されてしまっていたので出力の分散を1に変換した上で正規化の逆操作をしています。無理やりの手法なので、ここは本質的な改善をしたいとは思っています。Dropout率は全層で0.3、バッチサイズ32です。MCEPの数を変更した点についてはSPTKの仕様上の都合で特に意味はありません。

日誌

LSTMのあたりから日誌を書いていました。ただのメモですが、詳細を知りたい方はどうぞ。


これから

もっと精度を向上したい。

水瀬声質変換の日誌

思い出したように書き始めました。実際には3月15日あたりから音声分析ライブラリ周りを実装したりしました。

3月36日

SI-ASR部分の製作を継続。BLSTMは全く学習できなかった。おそらく実装にミスがあると思う。

ひとまず一方向のLSTMで学習をしてみる。1000×576の学習データで以下の結果。実際に適用すると精度が極めて悪いが、少なくとも母音や空白の場所程度はそこそこ認識している。BLSTMは本当に全く何も学習されなくて泣いていたので、少し安心した。以下、左が教師、右が出力。良いところだけ切り出したけど、認識が全くできていないところもある。

Epoch 40/40 576/576 [==============================] - 138s - loss: 1.1735 - acc: 0.6890 - val_loss: 0.7237 - val_acc: 0.8278

BATCH_SIZE = 64
MFCC_SIZE = 40
HIDDEN_SIZE = 64
PHONEME_SIZE = 36

model = Sequential()
model.add(LSTM(HIDDEN_SIZE, input_dim=MFCC_SIZE, \
                  return_sequences=True))
model.add(Dropout(0.3))
model.add(LSTM(HIDDEN_SIZE, return_sequences=True))
model.add(Dropout(0.3))
model.add(LSTM(HIDDEN_SIZE, return_sequences=True))
model.add(Dropout(0.3))
model.add(Dense(PHONEME_SIZE))
model.add(Activation('softmax'))

es = EarlyStopping(monitor='val_loss', patience=10, verbose=0, mode='auto')
mc = ModelCheckpoint('lstm/newmodel/weights{epoch:02d}.hdf5', \
                                      monitor='val_loss', save_best_only=False, \
                                      save_weights_only=False, mode='auto')

model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=EPOCHS, batch_size=BATCH_SIZE,\
               validation_data=[x_test, y_test], callbacks=[es, mc], shuffle=True)

学習が止まったわけでは無いので学習を継続したが大きな変化はなし。

f:id:sesenosannko:20170326172403p:plain

改善できる点

  • データは50分程度しか使っていないので増やす
  • ネットワークは適当に書いたので改善の余地はある
  • データ事前処理

提案論文では音素認識の精度は70%とされる。val_accは見た目上0.8を超えているが、データの空白を除いていないので空白で精度が稼がれているらしい。なんとも言えないが、この精度だと音声生成には使えそうに無いので改善したい。

データの事前処理は平均0.5標準偏差1にしている。これに関しては何もわからないが、[0, 1]に正規化している例が多くあるので試している。

import scipy.stats as sp trainmfcc = sp.stats.zscore(trainmfcc, axis=0, ddof=1)+0.5

3月27日

昨日、いろいろと論文を読んでLSTMの構成を考えていた。あとデータを増やしていた。ということで新しいものを試す。

変更点

  • データを100分に増やした
  • 1データ2000フレーム(10秒)にした
  • 中間層を128ノードにして1層増やした
  • Dropoutを最終層のみに適用した(どっかに書いてあった)
  • 一般的な標準化(平均0、分散1)にした

元のデータを検査したら長すぎる音声について音素セグメンテーションがうまくいっていないものがあったので取り除いた。

上記のネットワークの結果としてはval_accが最高で0.901を超えた。出力結果としてもそれほど悪く無いように見える。半分空白だとしても7割くらいの正答率は出ているのでは無いだろうか。そのあとにいろいろと試した結果、Dropoutは全層に0.3かけた方が少し改善してval_accは0.909になった。まぁ誤差かもしれない。

f:id:sesenosannko:20170327131552p:plain

それなりにまともに認識された部分。「けども」と発話されている部分の一部で、左が出力で右が教師データ。子音は難しいようで、無音(sil)や似ている子音に判定される場合が非常に多い。無音と母音で正答率が稼がれているように感じられる。ただ、「do」が「無音to」と誤判定されるのは理解できる気もするので音声生成のデータとしては許容範囲なのかな。実際、話者認識も言語モデルを用いなければ使い物にならないらしいので、単純な音素認識ではある程度限界はあるのだとおもう。

水瀬いのりさんの声で試してみた。訓練データよりも明らかに早口(コーパスは比較的丁寧に話しているので)ということもあるからか、認識精度が壊滅的。音声生成に使えるとは思えないなぁ・・・

3月28日

BLSTMに再挑戦する。前回はStatefulにこだわったため実装に失敗したが、単純なものならばKerasではlayer wrapperで直ぐに作ることが出来る。そして、val_accは0.927を超えた。驚異的だ。訓練データではかなり精度が良い。しかしやはり水瀬いのりさんの声では、前回よりは改善したとはいえ難がありそう。しかしこれ以上の向上には根本的な改善(データ量など)が必要そうなので、とりあえず現状で音声生成が可能なのかを試してみる。

そういえば、KerassのBidirectionalにはバグがあるので注意しないといけない。

音声生成部についてはほぼ論文のままの構造。つまり、音素認識がまともならば可能なはず。結果は以下のようになっていた。上が出力、下が元のMCEP。

f:id:sesenosannko:20170328182925p:plain

正直、音素認識があれだけ低質だったので、一応まともな出力がされたことには驚いた。しかし、音声合成をすると全然ダメ。

これが元の音声。

以下が出力。ターゲットは水瀬いのりさん。

いのりさん以前にほとんど声になっていない。すごく頑張れば分からないでもないが、ほぼ基本周波数でもこれくらいの精度は出る気がする。ただ、音質がひどいのはsptkの問題もあると思うので他の音声分析アプリを使うことも検討したい。

3月29日

直接スペクトル包絡を出力してworldで変換するという手法も試してみたが、精度が向上しなかった。とりあえずはsptkに賭けることにする。

次に、入力にlogF0を追加してみる。logF0に適したMCEPを出力してくれるとありがたい。情報量としては大きいはず。logF0は平均と分散を水瀬いのりさんと合わせるだけなので、他の人からの変換時にももちろん入力することが出来る。logF0+PPGsで入力は37次元となる。logF0は水瀬いのりさんに平均と分散を合わせた上で、平均0標準偏差1に標準化する。

実は前回のlossが保存されていなかった。だからどれくらい改善されたのか数値ではわからない。頭が悪い。明確な改善とは言えないまでも形は良く再現されているように見られるが、平均も分散も合っていない。出力(教師データ)については良く分からなかったので標準化していないが、標準化が必要かもしれない。

f:id:sesenosannko:20170329234826p:plain

f:id:sesenosannko:20170329170333p:plain

まず、波形の再現度を確認するために平均と分散を無理やり合わせてみた。声質変換としてはあまり参考にならないが、以下のようになんとか水瀬いのりさんと判定できるような声になった。これ以上の精度は音素認識やデータ量の問題とかだと思うので、当面の目標はこれになりそう。

3月30日

出力の標準化をした。しかし、分散はやはり小さいままであった。そのため、無理やりで良くない手法ではあるが、出力結果について再度分散を1に変換した上で標準化の逆変換をすることにより分散を強制的に合わせることにした。どのような出力についても同じ変換をしている割には、波形を見るとうまくいっているように見える。

f:id:sesenosannko:20170330172950p:plain

水瀬さんの声を入力してみると、昨日の手動で合わせるものよりも良く再合成されている。これは出力の標準化によって精度が上がったと考えられる。というのも、出力(目標)を変えてしまうと誤差の値が変わってしまうので数値的には向上したのかが良く分からない。そして、子音がかなり変わってしまっているので、音素認識にも大きな問題があるということがわかってきた。後半の内容が支離滅裂。

f:id:sesenosannko:20170330171713p:plain

そして、これを使って変換した結果がこちら。上は僕の声。

合成音感や子音の精度の悪さが目立つが、言われれば水瀬いのりさんの声のようにも感じるのではないでしょうか?音声の課題では作っている人は音がそもそも出ない段階から聞いているから出力への評価が甘々になり、最終結果を他の人に聞かせると微妙な反応をされるというのはあるあるらしいので悲しいところですが。

疲れたし、学校が始まってしまうのでここで一区切りをつけることにする。

TDAの概要と入門書の紹介

こんにちは。さんこです。

情報幾何と同様に、TDA(位相的データ解析)の概要と僕が読んだ入門書を紹介します。書籍は下の方に紹介してあります。

情報幾何の記事はこちら


TDA(位相的データ解析)とは

TDAとはトポロジーを用いてデータを分析する手法です。トポロジーの中でも持続性トポロジーと呼ばれるものが主な道具となります。

厳密に定義したり、多次元一般化したり、実際に計算をするとなるとまさに代数を用いることになるので難しいですが、考え方は簡単です。様々なサイトでTDAの概要の説明が行われているのでここでは省きます。例えば、以下の記事にTDAの簡単な概要が書いてあります。


TDAは何がすごいのか

TDAトポロジーをデータ分析に応用するというだけで面白そうではありますが、どれほど有効なのかは一見すると良くわかりません。具体例を紹介しつつ見ていきましょう。

まず、 TDAには適用対象に注目して以下の二種類に分けられます。それぞれ異なる性質を持っているので別々に見ていきます。

  1. 各データ自体の幾何構造に注目するTDA
  2. データ全体の幾何構造に注目するTDA


各データ自体の幾何構造に注目するTDA

各データ自体の幾何構造に注目する場合、データ自体が幾何的な構造を持っているものが対象になります。例えば、タンパク質などの高分子化合物や画像認識への適用があります。

タンパク質への適用がわかりやすいので紹介します。タンパク質の各原子の位置とファンデルワールス半径のデータが与えられているとします。ここで、各原子をファンデルワールス半径の x倍の球として扱うと自然に持続性ホモロジーが導入されます。各原子と中心を共有する球をだんだん拡大していくと分子全体としての位相的性質が変化していくことが分かります。以下の図のようなイメージです。

簡単に言えば、半径がファンデルワールス半径のa倍からb倍のときまでは穴が10個で、b倍からc倍のときまでは穴が7個でした、といったようなことが分かります。この位相的性質の変化を特徴量として用います。

『タンパク質構造とトポロジー』によればタンパク質内部の空洞の大きさや個数はタンパク質の性質と大きく関わるらしく、トポロジーを用いることには理論的に妥当性がありそうです。実際に生物の種ごとのホモグロビンの違いを捉えるなどの例ではうまくいっています。

このTDAの使い方も面白いですが、適用例が限られるのが難点でしょう。TDAが注目されているのは個々のデータ自体の幾何構造に対する適用ではなく、主に次の節の手法だと思います。


データ全体の幾何構造に注目するTDA

データ全体の幾何構造に注目するTDAはビックデータへの応用が目的とされています。多次元でサンプル数が非常に多いデータの位相的性質に注目することで、データの分析や視覚化に適用されています。

しかし、タンパク質の例のようにデータを中心とする球を考えるのはビックデータに適用するには計算量が多すぎるだろうということは容易に想像できます。この欠点の克服のためにwikipedia(英語)にあるように様々な工夫がなされてきたようです。ここでは、Ayasdiで用いられているMAPPER(提案論文)と呼ばれる手法を紹介します。

AyasdiとはTDAの研究やTDAを用いたデータ解析を専門に行っている会社です。この節は以下の資料の内容をまとめたものです。


MAPPERによるグラフの作り方

MAPPERの概要です。混乱を招きそうですが、MAPPERは持続性ホモロジーを用いた手法ではありません*1。MAPPERでは元のデータと同じ位相構造を持つグラフを構築する手法です。データの位相構造に注目している点には変わらないので、これもTDAと呼ばれるようです。

それでは、MAPPERにおいてデータからグラフを作る方法を説明します。下図のようにデータを何らかの軸に対して切り分け、切り分けた区分ごとにデータをクラスタリングして各クラスタをノードとします。実は各区分はぴったり切り分けられているわけではなく、のりしろがあります(端っこのデータは隣接するどちらの区分にも含まれている)。そこで、のりしろを介してデータを共有しているノードがあれば繋ぎ合わせます。のりしろが大きければ1つのノードがいくつかのノードと繋がれることもあります。

切り分ける軸、区分の大きさ、のりしろの大きさは結果を左右する大きなポイントとなります。また、データ間の近さを表す計量にはユークリッド距離の他にも様々なものが使われます。これらがMAPPERにおけるパラメータと言えるでしょう。また、区分ごとのクラスタリングには単連結法などの既存のクラスタリング手法が用いられ、区分の大きさに応じてクラスタリングの打ち切り基準が決められます。


MAPPERで得られたグラフの応用

作られたグラフによってデータの幾何的構造を得ることができました。データから得られる幾何構造が既存の機械学習手法に比べて優れているの以下のような点です。

  • 機械学習では人が決めるモデルに結果に大きく影響されるが、TDAでは事前に人が決めることにが少ない
  • 機械学習では結果は得られても過程は失われるが、TDAはデータ全体の構造が保持される
  • ビックデータと相性が良い(次元削減など)
  • 視覚化が容易

この性質を生かして、グラフそのままデータの分類や分析に適用もできます。特にビックデータの視覚化は多くの適用が期待されます。次元削減という点では、PCAなどでは射影によってデータの性質が失われることは多いですが、MAPPERではデータの幾何的性質を保持すると主張されています。

また、MAPPERで得られたグラフを用いて既存の機械学習システムを分析したり改良したりする手法が提案されています。面白い適用例を2つ紹介します。

  • 分類器の実証

従来の機械学習システムで分類器を作る場合は、モデルの構築のミスや学習の予期せぬ挙動などで期待した通りの分類器ができるとは限りません。また、そのような問題が起こっていても人間が気づきにくい場合も多くあります。この問題を解決するためにMAPPERによるデータの可視化を活用します。

まず、機械学習システムに入力するデータをMAPPERでグラフ化します。そして、このグラフに対して機械学習システムの分類を適用して、分類ごとに色分けなどをします。すると、グラフ上の各ノードに対してどのように分類されたかが分かります。グラフのノードは似たデータの集まりであると期待されるため、単純に考えれば単一ノード内のデータは同じように分類されたり、グラフ上で遠いノードは異なる分類であると予想されます。分類器がこれと大きく異なるような分類をした場合は検証が必要となります。このようにデータの視覚化を用いることで機械学習システムの動作を確認することができます。

ただし、もちろん必ず分類器の誤りを検知できるわけでもありませんし、MAPPERのグラフに対して違和感があっても必ず誤っているわけではないでしょう。Ayasdiではこの手法はあくまでデータの中で注目すべき点を指摘するだけと説明しています。とはいえ、既存の機械学習システムの動作を人間が視覚的に捉えられるのは大きな利点と言えそうです。

  • 分類器の向上(モデル作成)

あるデータを分類したいときに、普通はデータ全体に対して一つの分類器を考えます。しかし、複雑な分類を行うのは当然難しいので、データの一部に対する分類器を作るのが一般的に簡単だと考えられます。つまり、同じ手法であればデータに対して複数の分類器を作った方が精度が向上すると考えられます。ここで問題となるのがデータの分割法ですが、MAPPERのグラフの各ノードごとに分類器を作るという手法が提案されています。

この2つの他にも様々な手法が提案されています。このように、MAPPERももたらす合理的なクラスタリング・次元削減・視覚化がビックデータの解析に新たな手法を生み出すことが期待されているようです。


書籍紹介

集合・位相の基礎や多様体論は前提とされていますが、下記の書籍の内容に限定すれば事前知識がなくても理解できると思います。この範囲で僕が読んだものは情報幾何の記事で紹介したものです。

トポロジー

トポロジー:柔らかい幾何学

トポロジー:柔らかい幾何学

トポロジー:柔らかい幾何学

位相幾何学の基礎的な話からホモロジー論を感覚的な理解に重点を置いて説明している書籍。特に4章以降の内容は「タンパク質構造とトポロジー」と多くの内容が被りますが、こちらの方が紙面を多く割いていることもあり具体例も多く分かりやすいと思います。

持続性ホモロジー

タンパク質構造とトポロジー

タンパク質構造とトポロジー ―パーシステントホモロジー群入門― (シリーズ・現象を解明する数学)

タンパク質構造とトポロジー ―パーシステントホモロジー群入門― (シリーズ・現象を解明する数学)

現状では日本語でほぼ唯一のTDA入門書だと思います。良著だと思いますが、120ページ程度で基礎的な部分から説明されているのでそれぞれの内容が懇切丁寧に説明されているわけではありません。また、ここで説明されているのは各データ自体の幾何構造に注目するTDAです。データ全体の幾何構造に注目したTDAは上で紹介したAyasdiの記事などを参照するのが良いと思います。

最後の Z_2[x]加群のあたりが重要なところですがあまり理解できていないので、 そのうち群論の基礎から学び直したいと思います。

*1:提案論文等を読む限り正しいですが、wikipediaには持続性ホモロジーを用いた手法と書いてあります。見かけ上は違いますが、実際には持続性ホモロジーを扱っているということなのでしょうか。ご存知の方がいらっしゃればご指摘いただけると助かります。

情報幾何の概要と入門書の紹介

こんにちは。さんこです。

大学1年目があっという間に終わりました。この春休みは情報幾何とTDAをやることにしていて、情報幾何が一段楽したのでまとめておきます。一段楽と言っても下に紹介した本すら読みきっておらず、疲れたので一区切りをつけたいだけですが。

大学1年生の数学知識しか持ち合わせていない状態から読んだ基礎数学書から紹介するので、大学1年生もしくは非数学科でこの分野に興味のある方の参考になればと思います。TDAに関しては、また別に記事を書こうと思っています。

微分幾何を含めて完全な初学者なので、内容はあまり信じないでください。また、誤りがあればご指摘いただけるとありがたいです。


情報幾何とは

情報幾何の基本的なアイディアと、なぜ微分幾何が必要なのかという点について少し書いておきます。主に「情報幾何学の新展開」10.1の内容などを曖昧にさせたものです。用語を含めて厳密ではないので、雰囲気を感じる程度だと思ってください。

情報幾何とは、確率理論を幾何的に捉える学問です。データから(一変量)ガウス分布を推定する問題を例に取って、幾何的に捉えるという考え方を紹介します。

まず、ガウス分布

N\left( x | \mu, \sigma ^2 \right) = \frac{1}{\left( 2 \pi \sigma ^2 \right) ^{1 / 2} }exp\{ \frac{1}{2 \sigma ^2} \left( x- \mu \right) ^2 \}

と表されるので平均 \muと分散 \sigma ^2が決まれば一つに定まります。ここで、平均 \muと分散 \sigma ^2の座標を考えると、この座標上の1点\left( \mu , \sigma ^2 \right)は平均 \mu・分散 \sigma ^2ガウス分布を表しており、この座標は全てのガウス分布を表すと考えることができます*1。また、ある面上にこの座標を与えると、その面上の1点も同様に1つのガウス分布を表すと考えることができます。これで、ガウス分布を面という幾何の道具で表したことになります。

面上の点がガウス分布を表すと考えると、あるデータからガウス分布(平均 \muと分散 \sigma ^2)を推定する問題は、あるデータに対してその面上の1つの点を決める問題と考えることができます。ここで、データは幾何的にどのように表せるかを考えます。データがガウス分布から生成されていたとしても、近似をしない、データのそのままの確率分布はガウス分布とぴったり一致するわけではありません。データのそのままの確率分布とはヒストグラムのようなもののことです。データ数が多ければ細かく分割したヒストグラムガウス分布に近づきますが、完全にガウス分布になるわけでありません。つまり、データのそのままの確率分布は、上で考えた全てのガウス分布を表す面上の点ではないということです。

ここで、全てのガウス分布を表す面と同じように、あらゆる確率分布を表す空間が存在すると考えてみます。どのような空間なのかという点は置いておいて、どんな確率分布でもこの空間のある1点として表されると考えます。このとき、データのそのままの確率分布もこの空間内のある1点になります。また、全てのガウス分布を表す面も当然あらゆる確率分布を表す空間に含まれます。

ここまでで、データの分布と全てのガウス分布を点と面として幾何的に表すことができました。次に推定を考えましょう。直感的には、データのそのままの分布を表す点に最も近いガウス分布が良い推定と言えそうです。ガウス分布は全てのガウス分布を表す面上の点なので、(この面が平らであれば)下図のようにデータの分布を表す点から直線を垂直に下ろした面上の点が推定されるガウス分布を表す点と考えられます。


f:id:sesenosannko:20170218214808j:plain


なんとなく納得できるような気がしてもらえると嬉しいですが、全ての確率分布を表す空間とは何なのか、そしてその空間における距離や直線や直角とは何なのかが良く分かりません。例えば、全てのガウス分布を表す座標だけを考えたとしても、 \sqrt{ \left( \mu' - \mu \right) ^2 - \left( \sigma' ^2 - \sigma ^2 \right) ^2 } という値は距離のように見えますが、この値は2点の確率分布の関係を良く表しているとは言えません。確率分布を表す空間の距離や直線や直角といったような値を考えるために、情報幾何は微分幾何学の考え方を借りることになります。

情報幾何では、微分幾何学の中でもリーマン幾何学を応用します。リーマン幾何学の説明は上手くできないのでしませんが、高校までの幾何で扱ってきたユークリッド空間ではない空間でも距離や微分などを定義しようという試みがなされています。情報幾何では確率分布を表す空間にリーマン幾何学の考え方を利用するということです。

面白い点としては、一般的に距離や微分などは一つに定まるとは限りません。考えている空間の特徴と、距離は対称で正であるべき、微分ライプニッツ則に従うべきなどの制限に従っており、それぞれの定義同士の整合性が取れている範囲の中で自由に定義することができます。情報幾何では、確率理論を説明するのに適した定義をすることで幾何学と確率理論が繋げられています。


書籍紹介

下記のように現代幾何等の基礎知識がない人に向けた情報幾何の入門書も出版されており、 「微分幾何学の基礎」は微分幾何の基礎から書かれているので、 丁寧に読んでいけば微分幾何を知らなくてもこの本だけで理解ができるかもしれないです。

しかし、 1月の僕にはそれだけでは基礎の微分幾何の部分がそもそも理解できませんでした。 2月初頭より位相空間論の基礎から勉強しなおしたので、僕が読んだ本をまとめておきます。

この記事の目標は下記書籍です。 これらは微分幾何の基礎から書かれている入門書ですが、両方とも機械学習への適用についても触れられています。

情報幾何学の基礎 (数理情報科学シリーズ)

情報幾何学の基礎 (数理情報科学シリーズ)


集合と位相

集合・位相入門

集合・位相入門

集合・位相入門

集合と位相の入門教科書的な書籍です。 類書が多数出版されていますが、同様の書籍ならどれでも良いと思います。

僕は面倒だったので4章と5章を軽く読み流した程度です。 その程度でも大きく困ることはありませんでしたが、 以降の書籍で定義などが気になった際に参照することが多々ありました。


多様体

多様体の基礎

多様体の基礎 (基礎数学5)

多様体の基礎 (基礎数学5)

多様体の入門書として有名な書籍らしいです。

当初はどこが必要な知識なのか分からなかったので3章まで読んで終えてしまいましたが、 この書籍の内容は全て微分幾何と直接的に関わっているので完読すべきでした。 但し、 「曲線と曲面の微分幾何」と内容が被るところが多くあり、 「曲線と曲面の微分幾何」の方が初めて読むにはとっつきやすい印象がありました。 「多様体の基礎」の方が数学書然とした書籍なので、 「曲線と曲面の微分幾何」を先に読んだ上で全て読むというのも良いと思います。


微分幾何

曲線と曲面の微分幾何

曲線と曲面の微分幾何

曲線と曲面の微分幾何

タイトルの通り、曲線及び曲面の微分幾何を取り扱った書籍です。 高校数学の感覚で読めるので導入として良い本だと思います。 n次元多様体への一般化はされていないので、 あくまで入門書という位置付けなのでしょう。

情報幾何で使用されるのは主に「3. 曲面上の幾何」に記されている内容です。 3章以降は読み流しました。

内容としては情報幾何への適用に限定して考えても明らかに不足ですが、 この書籍の内容を理解すれば「情報幾何学の基礎」を読み進めることができると思います。


情報幾何

冒頭で紹介した2冊の情報幾何の入門書です。

情報幾何学の基礎

情報幾何学の基礎 (数理情報科学シリーズ)

情報幾何学の基礎 (数理情報科学シリーズ)

こちらを先に読むことをお勧めします。 こちらの方が数学書らしく定理と証明を積み重ねていって情報幾何学にたどり着くという書き方がされています。 適用については統計物理や統計推論について書かれてはいますが、 内容自体が少ないですし説明も駆け足の印象です。 適用については「情報幾何学の新展開」の方が分かりやすいと思います。

はじめてこの書籍を読んだときには意味が分からない部分が多くありましたが、 基礎的な微分幾何を学んだ後に読んで非常にわかりやすい書籍だということが分かりました。 前書きに「大学1年時に学ぶ数学以上の予備知識をできるだけ仮定しない」と書いてあり、 確かにこの書籍だけで理解できる人もいるだろうと思います。 とはいえ基本的な部分はかなりコンパクトに書かれているので、 僕としては入門書を経ることをお勧めします。

情報幾何学の新展開

機械学習への応用が豊富です。 基礎の部分は一冊目としては読みづらいだろうと思いますが、 常に情報幾何への適用が意識されている印象を受けるので「情報幾何学の基礎」の後に読むとより理解が深まると思います。 こちらの方が良い説明だと感じる部分も多くありました。

正直に言うと、応用の部分は僕には難しくてまだあまり読めていません。いずれ時間をかけて理解していきたいと思います。


おわりに

とりあえず情報幾何が何なのかということを知りたかったので、基礎を蔑ろにして駆け足で学んでみました。理解できずに読み飛ばした部分もかなり多かったですが、面白さを垣間見ることはできたかなと思います。特に、双対接続の微分幾何はとても美しいので是非読んでみてほしいです。情報幾何によって機械学習の理論が大きく進んだという訳ではないようですが、全く関係ないように見える幾何学によって説明がされるというのは興味深いですね。僕は疲れたのでしばらく幾何学はやりたくないです。

*1:実際には別の座標を取って議論されますが、分かりやすさのためここでは平均 \muと分散 \sigma ^2の座標を考えます

スライド作成ツールMarpで僕が使っているCSS

こんにちは。さんこです。

なんとなくスマートだなと思ったので、最近はMarpというmarkdownのスライド作成ツールを使っています。 開発コンセプトにもある通り、環境構築がほぼ全く必要ないのも良いところです。

technica-blog.jp

Marpに限らずmarkdown自体が気軽に書けるということをテーマとして持っていると思うので、少なくともデフォルトでは表現出来ることが乏しいと感じることもあります。 markdownにはhtmlを埋め込むことができるので、僕はCSSをかなり追加して使っています。 markdownのコンセプトからは外れていそうですが。 そこで、僕がMarpで使っているCSSを少しまとめておきます。 CSS自体も普段あまり使わないので、もっと良い書き方があれば教えてください。


基本

markdownにはhtmlタグを書けますが、htmlタグ内にはmarkdown記法が使えないので少し不便です。 そこで、弟要素を指定するという方法が使われるようです。

下の例は中央揃えをする例です。 このように「.centerize + *」と指定すると、pillarクラスの直後にある全要素にcssを適用することができます。 htmlタグの後は1行空けないといけないようなので注意してください。

markdownの記法がhtmlでどのように表現されるかは以下のサイトが参考になります。

md2pdf.higty.xyz

markdown

<div class="centerize"></div>

中央に揃えたい文章

css

.centerize + * {
  text-align: center;
  }


右上の見出し

スライドの右上に見出しがあると便利なことが多いです。 Marpではスライドの内容ごとに親要素のサイズが決定されており、スライド領域内で絶対指定をする方法が僕はわかりませんでした。 ということで、cssのcals関数を用いて無理矢理右上に配置されるように指定しています。

markdown

<div class="pillar"></div>

見出し

CSS

.pillar + p {
  color: #1A3353;
  position: absolute;
  top: calc(50% - 360px);
  right: -40px;
  float: right;
  }


画像のフロート

スライドで縦長の画像を右に寄せて、その左に文章を書きたいということが良くあります。 その際にはfloatを使うことで文章を回り込ませることができます。

markdown

<div class="img-left"></div>

![サンプル画像](image/image1.png)

CSS

.img-left + p img {
  padding-right: 50px;
  float: left;
  }

.img-right + p img {
  padding-left: 50px;
  float: right;
  }


表のスタイル

表のスタイルは非常に悩ましい問題の一つです。 正直、他のサービスで使った表を画像で貼り付けるのが最善手だと思います。 表のボーダーを消したかったんですが、なぜか色々と試してもできませんでした。 方法を知っている方は教えてください。

今回は格好悪い1行ごとの色分けを無くしたのと、一番上の見出しの行を無くしただけです。

CSS

table, th, td {
  background-color: #ffffff;
  }

th {
  display: none;
  }


おわり

その他にもセンタリングや、画像のサイズ変更などに同様の手法を使っています。 正直面倒なので、Marpは僕に向いていないかなと思います。 他のスライド作成アプリも試してみる予定です。

texでグラフィカルモデルを描写するライブラリを使った

メモです。

github.com

丁寧な説明書が無いですが、簡単な図ならこんな感じで直感的に描けます。

\node[オプション](名前){表示テキスト}
\edge{インプット}{アウトプット}
\plate{名前}{(要素1)(要素2)}{表示テキスト}

配置も細かく指定できるようです。

LDAのグラフィカルモデルです。

f:id:sesenosannko:20170110095552p:plain

\usepackage{tikz}
\usetikzlibrary{bayesnet}

\begin{tikzpicture}[x=1cm,y=1cm]

  % Nodes
  \node[obs] (w){$w$} ;
  \node[latent, right=of w](phi){$\phi$} ;
  \node[const, right=of phi](beta){$\beta$};

  \node[latent, left=of w](z){$z$} ;
  \node[latent, left=of z](theta){$\theta$} ;
  \node[const, left=of theta](alpha){$\alpha$} ;

  % Edge
  \edge {phi} {w} ;
  \edge {beta}{phi} ;
  
  \edge {z} {w} ;
  \edge {theta}{z} ;
  \edge {alpha}{theta} ;
  
  % Plates
  \plate {N}{(z)(w)}{$N$}
  \plate {D}{(theta)(N)}{$D$}
  
  \plate {K}{(phi)}{$K$}

\end{tikzpicture}

Show and Tell: A Neural Image Caption Generatorを読んだ

https://arxiv.org/abs/1411.4555

画像に注釈をつけるという有名な課題の2015年4月のGoogleの論文。 画像をCNNに入力し、中間層の出力をそのままRNNLMに入力するという半ば強引な手法で精度が向上した。

NLPを勉強するにあたって、文章に性格(人格?)を付与するというのを目標に考えようと思ったんですが、end-to-endの画像注釈問題は文章への文章以外による情報付与ということで参考になるかなと思いました。 この手法では画像と文章が同じ空間のベクトルに表されることが前提とされているので、性格をどのように落としこむかというのが大きな問題ですね。

まぁ、できる予定は全くないです。 単純に論文として面白いので読んでいきます。 括弧内は僕のコメントです。


Abstract

教師データの画像脚注のみで正確な情報と言語モデルを持った画像脚注を生成。 訓練画像に関する脚注の最尤推定を行う。


1. Introduction

物体認識だけでなく、物体間の関係性も学習しないといけないので難しい。 もちろん、言語モデルも学習しないといけない。

従来は画像処理、言語モデルに関して既存の技術を用いて画像注釈にアプローチしていた。 しかし、提案手法では画像を入力して文章を出力するひとつながりのモデルが使われている。

RNNを用いた機械翻訳に着想を得ている。

CNNによって領域検出や物体検出などの画像認識タスクに使える固定長ベクトル表現が得られることが知られている。

提案手法の特徴は以下のとおり。

  1. SGDで訓練可能なend-to-endシステムによる手法
  2. 画像と言語モデルに関する最新のNN構造を融合させた
    • 事前学習や追加データの利用が可能
  3. 精度が高い


2. Related Work

物体検出技術の向上などにより多くの脚注付け手法が提案されたが、その多くは文章生成の段階は人の手に頼っており柔軟性に欠けていた。

画像検索の順位付けに関する研究は大規模に行われており、これは画像と文章が同じベクトル空間に埋め込めるという前提に立脚している。 ただし、長文の生成を目指したものではない。 これらの手法はそれぞれの物体を学習していたとしても、未知の物体構成を描写することはできない。 また、精度評価が行われていない。

MaoらもRNNを画像注釈課題に用いたが、提案手法は以下の点が優れている。 大きな違いには見えないかもしれないが、大幅な精度向上に成功している。

  • より効果的なRNNのモデルを用いてる
  • CNNの出力をRNNに直接入力している


3. Model

画像入力を「翻訳」することで注釈を得るという発想。

画像に対する文章の尤度を最大化するにあたり、LSTMを用いたRNNを使用する。

また、画像の特徴抽出にCNNを用いたが、ILSVRC2014において分類問題で最良のモデル*1を用いる。 このモデルは場面認識などの転移学習においても用いられている。


3.1. LSTM-baesd Sentence Generator

(peepholeは使われていないようだ。peepholeについては効果が薄いという検証もあり、chainerのLSTMも標準ではpeepholeを含んでいないらしい。)


Training

t番目の単語S_tの確率は画像Iとt個の単語列S_0, \cdots , S_{t-1}の条件付き確率でp \left( S_t | I, S_0, \cdots , S_{t-1} \right)と定義される。

LSTMへの時刻tの入力をx_tとすると、 x_{-1} = \rm{CNN} (I) そして x_t = W_e S_t, t \in \left\{0 \cdots N-1 \right\}となる。

S_tは辞書データと同じサイズのone-hotベクトルであり、S_0は開始記号、S_tは文末記号となる。

ここで、IからCNNによって写像されたx_{-1}S_tから W_eによって写像されたx_tは同じ空間に写像されたベクトルとなる。 なお、画像は全時間で入力するよりもt=-1でのみ入力した方がノイズの影響を受けづらく、過学習しづらいことが分かった。

誤差関数はp_{t+1}=\rm{LSTM}\left(x_t \right), t\in \left\{0\cdots N-1\right\}を用いた各時間における正解単語による負の対数尤度関数の合計である。LSTM、CNN、そして入力時に単語を写像するW_eの全てのパラメータについて最小化する。

L\left(I, S\right) = - \sum_{t=1}^{N}\log p_t \left( S_t \right)


Inference

画像から脚注を生成するには幾つかの方法がある。

  • Sampling
    • 単純に最初のp_1を次の時間の入力としてp_2を得て、以下同様に文末記号まで進める。
  • BeamSearch
    • 各時間tにおいてスコア上位k個の文章を候補として保持し、t+1の文章を生成して改めて上位k個のみを残す。提案手法ではk=20を用いた。


4. Experiments

4.1 Evaluation Metrics

画像脚注の評価手法は多数存在する。

  • Amazon Mechanical Turk
    • 客観的な人間による評価が最も正確であると考えられる
  • BLEUスコアである。
    • 最も有名な自動評価手法で、n-gramによって正確性を測る。明らかに問題が有る手法だが、人間の評価との相関がある。
  • perplexity
    • 文章の複雑さを評価するもので、言語モデルの評価に一般的に使われる指標らしい。詳しくは調べてください。モデル分布やハイパーパラメーターの調整に使われた。
  • ランキング
    • 検索のランキング付け問題として評価する。注釈の評価としては不十分であるが、既存の評価手法が活用できる。


4.2. Datasets

多くのデータセットは1枚の画像につき5文の注釈がつけられている。


4.3. Results

4.3.1 Training Details

過学習は大きな問題であった。 高質なデータは100000枚程度であり、物体認識よりも難しい注釈付与に対しては不足していると考えられる。 今後の訓練データの増加によって精度は向上されるだろう。

過学習を解決するために様々な手法を検討した。

  • CNNの事前学習は最も効果があった
  • 単語を入力する際の重み W_eの事前学習も試みたが、改善は見られなかった
  • ドロップアウトとアンサンブル学習によりBLEUスコアに多少の向上が見られた

すべての重みにおいて学習率を固定し、モメンタムを用いずにSGDで学習した。 CNN以外の重みはランダムに決定された。 また、CNNの重みは更新しない。 LSTMの入力とメモリは512次元である。

訓練データに5回以上出現するすべての単語を保持する。


4.3.2. Generation Result

BLEU等の評価手法では従来手法よりも精度が高く、人間とも大差がないように見える。 但し、人間による評価では依然として大きな差が見られた。


4.3.3 Trasfer Learning, Data Size and Label Quality

複数のデータセットを用いたので転移学習について考察する。

Flickr8kについて、Flickr30kは同じ手法で作られたデータ数4倍のデータセットであるため、Flickr30kを用いると精度向上が見られる。 単純にデータ量の増加により過学習が防がれたと考えられる。 しかし、MSCOCOはデータ量はFlickr30kより5倍多いが、収集手法が異なるため語彙の不一致により精度は落ちた。

また、PASCALをFlickr30kとMSCOCOのモデルで評価すると、Flickr30kはMSCOCOよりも悪い結果であった。

訓練データの質が低いSBUをMSCOCOモデルで評価すると、結果は悪化した。

(結論は書かれていないが、このタスクではデータ間の類似度が転移学習の精度に大きく関わるということだろう)


4.3.4 Generation Diversity Discussion

BeamSearchによる上位文を見ると、同じ画像を異なる観点から描写していることがわかる。 たとえば、以下はある画像に対する生成文の一部である。

  1. 男性がフリスビーを投げている。
  2. 男性がフリスビーを手に持っている。
  3. 男性がフリスビーを持って芝生に立っている。

最もスコアの高い文章は80%の確率で訓練群に含まれていた。 訓練データの小ささを鑑みれば自然な結果である(確かにそうだが、それで良いのかは疑問ではある)。


4.3.5 Ranking Results

ランキングの評価方法でも提案手法は良い結果を残した。


4.3.6 Human Evaluation

上述の通り、人間による評価では提案手法も人間の付ける注釈に大きく劣る。 BLEUでは差が小さかったので、この評価手法にも依然として問題があることを示唆している。


4.3.7 Analysis of Embeddings

単語を入力する際にMikolovらが考案したword embedding vectors*2を用いたが、これは辞書サイズに依存しないという利点がある。 また、埋め込み部分の重み(W_e)を残りの部分と独立して訓練できるのも利点である。 そのうえ、学習された特徴のうちの幾つかは意味の近い単語を近い値で表現していた。


5. Conclusion

画像から良い脚注が自動で生成できました。


読み終わった

とりあえずMikolovさんの論文を読まないといけないけれど、ChainerとかでシンプルなRNNLMを実装してみたいですね。

*1:https://arxiv.org/pdf/1502.03167v3.pdf

*2:まだ読んでいないが、Skip gramやCBOWの話のようだ https://arxiv.org/pdf/1301.3781.pdf