読者です 読者をやめる 読者になる 読者になる

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

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

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

音声分析アプリを作った

こんにちは。

先週の金曜日に音声分析アプリを作って、昨日今日でtkinterのアプリにしました。
そこまではよかったのですが、sptk等を使っていたことを完全に失念していたので、アプリ化するのが非常に面倒になったので諦めました。
今回で懲りたのと、神野さんが毎日のようにWEBアプリを勧めてくるので、次何かを作るときはWEBアプリで作ることになると思います。

作ったアプリはこんな感じです。
仕組みはお遊びなので非常に単純です。

動画の説明欄にある通りですが、僕の主観で6種類に分けたサンプル音声群に対してそれぞれ平均的な混合ガウス分布を学習して、録音した音声に対してそれぞれの分布との尤度を元にスコアをつけています。
平均の分布を用いることに関しては微妙な点ですが、一人ずつそれぞれの分布を学習して尤度を平均した結果と大きな差はなかった(と判断した)ので速度の観点から平均分布を用いることにしました。

ここまではそこまでは悪く無いのですが、良い録音環境で録音されたプロの声に対しては妥当と思える値を出すのに対して、違う録音環境の一般人の声に対しては桁が違うレベルで小さい値が出てしまいました。
録音環境の問題が大きいのか、声質の問題なのか、この結果も研究素材としては面白いんですが、三田祭が近くてそうも言っていられなかったので、0〜5点の間で良い感じの値になるように事後処理を加えています。

Tkinterで関数内でcanvasを変更するときの問題について

Tkinter

こんにちは。

Tkinterでボタンを押した時にcanvas等を変更したいときは、buttonのcommandに与える関数内で操作するのが定石だと思うのですが、アプリを作っている中で期待する挙動をしてくれないことがありました。
Tk自体やTkinterとTkの関係を全く知らないので、もしかしたら当たり前のことを言っているのかもしれないですが、

import time

def change(canvas):
    canvas.create_text(100, 100, text='スタート')
    
    time.sleep(5)
    
    canvas.delete('all')
    canvas.create_text(100, 100, text='ストップ')

このような関数に対して

button = tkinter.Button(root, text="5秒", command=lambda:change(canvas))
button.pack()

ありきたりなボタンを作ります。
期待する挙動は、ボタンを押したら「スタート」と表示され、5秒後に「ストップ」と表示されることですね。

しかし、実際には何も表示されないまま5秒が経過して「ストップ」と表示されます。
この問題についての情報は見つけられなかったのですが、どうやら関数が終了するまでcanvasは更新されないようです。

ここで、バインドを使用することにしました。
バインドはクリックや特定のキーの入力などに対してアクションを起こすことができる機能らしいです。
でクリックした時、でクリックをやめた時のアクションを指定することができます。
つまり、自然にボタンをクリックしてもらえれば、単純に2つの独立したアクションをほぼ同時に起こすことができます。

def before(canvas):
    canvas.create_text(100, 100, text='スタート')

def after(canvas):
    time.sleep(5)
    
    canvas.delete('all')
    canvas.create_text(100, 100, text='ストップ')

このように二つの関数を準備して、

button = Button(root, text="5秒")
button.bind('<Button-1>', lambda e:change(canvas))
button.bind('<ButtonRelease-1>', lambda e:after(canvas))
button.pack()

このように指定すれば、ボタンをクリックしたときに「スタート」と表示され、直ぐにボタンを離してくれれば5秒後に「ストップ」と表示されます。
bindでは指定した関数にevent objectが与えられ、クリックした位置などの情報を扱うことができますが、今回は必要無いのでlamba式に「e」として与えて、それ以降は使いません。