Bag of ML Words

ML = Machine Learning, Music Love, and Miscellaneous things in daily Livings

Topic modeling survey on pattern recognition perspective

トピックモデルのサーベイ講演したので貼っておきますね。

複数パターン認識応用の立場でサーベイした話はたぶんないので価値あると思います。詳細版はPRMUの2015年12月予稿を入手(購入)してください。

 

さて、これを英語論文化しないといけないわけだが。

 

www.slideshare.net

魔王様おもしろいよねぇ、ついていきます

娘が生まれて、そのお世話でほぼすべての時間を使いきっていました。

 

タイトルは、残りわずかな時間ではたらく魔王さま!を読み返して思ったこと。

アムスラムスちゃんを見る目が完全にパパ視線になっていることを自覚。

そろそろ続巻を買い揃えていかないと

 

このブログとは別に、育児日記作ろうかなぁ・・・

ブログはテクニカル&ミクな話に限定するとか

 

Gartner Hype Cycle 2015の話を読んで、10年間分まとめた

ハイプサイクル(Hype Cycle)は、Gartnerの使っている有名な技術トレンドですね。

技術に対する期待値の趨勢を

黎明期 --> 流行期 --> 幻滅期 --> 回復期 --> 安定期

に分けて絵にしたやつで、毎年公開しています。

 

今年のレポートは

www.gartner.com

にあります。

 

今日は一日かけてハイプサイクル10年分を表にまとめて可視化しました。

すごく疲れたけど、大変示唆的なものが見れたので良しとします。

これから毎年アップデートしていきます。

(2015/08/25追記)

けっこう面倒だったので10年分まるっと公開はあれかなー、と思ったので、ここ5年分の分だけ置いておきます。Field列は著者の勝手なインデックスです。

https://dl.dropboxusercontent.com/u/38783966/GartnerTehcnologyHypeCycle_Summary_public.pdf

ちなみに

  • Virtual Personal Asssitants (特にVirtual Assistantsとの違い)
  • Smart Robots
  • Digital Dexterity
  • Smart Advisors

が一体何なのか、ご存じの方はご教示していただければ嬉しいです。

下記はここ数年の動きから分かることです。

 

Big Dataが消えた(一時的かも)

2012, 2013と流行期、2014で幻滅期、そして今年消滅。もはや「当たり前」の前提になったから消えたのかもしれない。「ビッグデータ」だけではビジネスは食べていけないということ?

ただ、このHype cycle, 1年消えてまた復活ということもあるので、あえて今年書かなかっただけかもしれません。来年あたり、回復期に出てきてもおかしくありません。

 

Internet of the Things

まさに今過剰期待のピーク。2011, 2012と黎明期、2013-2015と流行期。あと1、2年は流行のピークにいそうだけど、もうピークアウトともいえる。
 

今年初めて現れたやつで、もっとも衝撃的だったこと: citizen data science, self-servide Delivery of Data Analystics

社内にそれなりに動くデータサイエンティストチームを「作る」ためのパッケージを作って売る。Intel社が2013年にこういうの出していました。

 
 

Machine Learning: 

初登場でピーク過ぎたところという厳しい扱い。これから少しは落ち着いてくるじゃろ?ということでしょうかね。

PDFのワードカウント (word counting of PDF files)

論文を英文添削に出す際など、word countで値段が決まる業者が多数あるのですが、

PDFってword countないんですよね。

かといってtexソースファイルはたくさんコマンドがあるので正しくカウントできないことは明白です。

 

じゃあどうするかなんですが、

PDFを.rtf (Rich Text Format)に吐き出してMicrosoft Wordでカウント!

これがたぶん現状の最良解です。

 

数式とかは壊れますし、真に正しい文字数にはならないと思いますが、

手でPDFテキストのコピペするよりは良いでしょう・・・

 

手順

  • 目的の論文PDFをAdobe Acrobatで開く(Adobe Readerでもできるかは不明)
  • 名前を付けて保存 --> その他のオプション --> リッチテキストフォーマットで保存
  • 生成されたRTFをMicrosoft Wordで開く
  • 画像の扱いとかが壊れすぎていないか確認
  • Microsoft Wordのワードカウント機能を利用する

 

別の手段:OCRソフトを使う

PDF、あるいは印刷したものをOCRソフトあるいはスキャナでOCRさせるという手段です。やったことはないです。

Oriol Vinyals, Quoc Le, "A Neural Conversational Model" (arXiv:1506.05869 [cs.CL]) ざっと読んでの(非専門家の)感想

一部で話題のこの論文、

[1506.05869] A Neural Conversational Model

ざっと読んでみました。

 

なお、私は対話モデリングの専門家じゃないので、

評価は大外ししている可能性があります。そのへんは自己責任で。

 

3行でまとめ

NIPS2014で提案された「任意長シーケンス入力から任意長シーケンス出力を行うseq2seq」を用いて、大規模な対話コーパスから「発話-->応答」の文対の写像を直接学習。人力で対話ルールや特徴量を作りこむことを(ほぼ)一切せずに、対話モデル学習を実現。

 

もう少し長いまとめ

前提

著者らは、NIPS2014で話題となった「任意長シーケンス入力から任意長シーケンス出力を行うDNN(seq2seq)」

Sutskever, Vinyals, and Le, "Sequence to Sequence Learning with Neural Networks", NIPS2014. 

の著者(の一部)です。同論文は、DNNで実現できていなかった「任意長シーケンスの入出力」を実現して、機械翻訳タスクで最高精度をたたき出しました。

で、Vinyalsさんは同モデルをparsing, image captionにも適用していて

この論文は対話に使ってみたということです。

 

背景と目的

対話モデリングは、自然言語処理やマンマシンインタラクションの中でもかなり難しいタスクになります*1。何の制約もない自由対話は本当に厳しいので、通常は対話のドメインを制約(たとえばQA、カスタマーサポートなど)したうえで、専門家の知見を活用した様々な構造や特徴などをその場その場で提案して少しでも自然な対話を実現しようとします。

 

この論文は、そういう試みをあきらめます。seq2seqモデルはかなり柔軟かつ複雑なシーケンス-->シーケンス写像を表現できるポテンシャルを持っています。そこで、対話のコンテキストなどの陽なモデル化はせず、「発話文-->応答文」の写像関係を大量の対話コーパスから直接学習、seq2seqモデルに学習させる、それだけです。

 

手法

対話って、Aさんの発話-->Bさんの発話-->Aさんの発話、というように、文-->応答文が延々続いていくものです。この論文では、その制御構造やパラメータとかは一切気にせず、ある発話から応答文を直接生成する複雑な非線形写像を、seq2seqと大量の対話コーパスから手に入れます。

実際、seq2seqをクロスエントロピー最大化で使うだけなので、論文中には一切式がありません。モデルの解説も半ページくらいで終わりで、あとは使ったコーパスと生成された対話例が載っているだけです。

 

ただし、このモデルは対話をtoo simplifyしていることを著者ら自身も認めています。実際、生成される対話もまだまだ自然とは言えないものです。それでも、例示される対話のいくつかは非常に自然に見えます。

これが対話モデリングの研究にとって、どのくらい「良い」発話なのか、これは専門家の方の意見を待たないといけませんが・・・。

 

実験結果

データセットは2つです。一つはIT trouble shootingコーパスです。一度の対話は大体400単語ぐらい。30Mトークン(発話対?論文からはトークンが何か明確には読み取れませんでした。)。

もう一つはOpen Subtitleコーパス*2です。こちらはドメインの閉じていないデータです。訓練用に62Mの発話文、テスト用に26Mの発話文を投入します。

 

定量評価ですが、どんな単語を選択(発話)するかをperplexityで評価しています。で、単純なn-gramモデルに比べてどちらのデータでもperplexityが下がっているそうです。

 

定性的な評価ですが、まずプロ研究者が作りこんださまざまな工夫をほぼ利用しないで、結構それっぽい対話を実現できているから素晴らしい、と言っています。

また、提案モデルはデータコーパス中にない質問に対しても汎化して、そこそこ妥当な回答をしていると主張しています。ただのテーブルルックアップじゃないよということです。

しかし、全然完璧じゃないということも認めています。まず、ちょっと言い回しを変えるとinconsistentな回答をしてくることがあるようです。

論文中の対話例7では

人間:what is your job?

マシン: i'm a lawyer. 

人間: what do you do?

マシン: I'm a doctor 

という例を挙げていて、対話の相手としての人格の安定性がない(作りこんでいないから)ことを示しています。

また、論文の大部分を占める対話例を読んでみると結構funnyなところも多いです。

IT troubleshootの対話例2だと

(事前に人間はlinuxを使っていると答えている)

マシン:is it a window machine?

マシン: we have linux on your machine. 

マシン: is it windos xp or windows 7?

人間: i am using linux

とか。マシンの応答、完全に混乱していますね

 

まとめ

結局、「対話モデリングの良さ」が定義できていないのは同じなので、どうあっても良い対話目指してまっすぐ学習することができない。したがって、これだけで「完ぺきな対話を実現するエージェント*3」モデルは作れないと思います。ですが、とにかくデータを突っ込むというDeepなアプローチを対話モデルの一つのbuilding blockとして使える可能性を示したところがエライと思いました。

 

*1:私は専門家ではないのですが、周囲に「対話の闇」の中で戦い続ける研究者の方が何人かいるので、難しいということは理解しています。

*2:Tiedemann, J. News from OPUS - A collection of multilingual
parallel corpora with tools and interfaces. In Nicolov,
N., Bontcheva, K., Angelova, G., and Mitkov, R.
(eds.), Recent Advances in Natural Language Processing,
volume V, pp. 237–248. John Benjamins, Amsterdam/
Philadelphia, Borovets, Bulgaria, 2009. ISBN 978
90 272 4825 1.

*3:SAOのユイちゃんとか、ツインシグナルのエモーションとか

ユニットテストについて(情報まとめるだけ)

記事のスペースで集めておくのも申し訳ない気がしますが。

 

職業プログラマではないので、テストを「強制」される機会がなくてなあなあにしていたのですが、どうもそうも言っていられないような感じがしてきた(気のせい)。

ということで、少し役立ちそうな記事をまとめておいて、後日の勉強の足がかりにします。

 

第6回 UnitTestをする理由 - テスト講座

ユニットテストを学ぶための推薦図書 | Knowledge Note | Developers AppKitBox

http://dev.classmethod.jp/testing/10_errors_about_unit_testing/

python: ソート(sort)

いつもソートのやり方で迷うので,まとめておくことにしましょう。

 

基本の挙動

リストでもndarrayでascendします。

>>> a = np.random.rand(10)
>>> a
array([ 0.32496596, 0.74999976, 0.77499606, 0.20691008, 0.307734 ,
0.72823673, 0.28689177, 0.40670341, 0.19758518, 0.85783996])
>>> b = [1, 2, 3, 4, 5, -5, -4, -3, -2, -1]
>>> a_sorted = np.sort(a)
>>> a_sorted
array([ 0.19758518, 0.20691008, 0.28689177, 0.307734 , 0.32496596,
0.40670341, 0.72823673, 0.74999976, 0.77499606, 0.85783996])
>>> a       # 非破壊
array([ 0.32496596, 0.74999976, 0.77499606, 0.20691008, 0.307734 ,
0.72823673, 0.28689177, 0.40670341, 0.19758518, 0.85783996])

>>> b.sort()
>>> b   # 破壊される
[-5, -4, -3, -2, -1, 1, 2, 3, 4, 5]

descendさせたいときはひっくり返す定番処理が必要です。reverseはやはり破壊的です。

>>> a_sorted_reverse = a[::-1]
>>> a_sorted_reverse
array([ 0.85783996,  0.19758518,  0.40670341,  0.28689177,  0.72823673,
        0.307734  ,  0.20691008,  0.77499606,  0.74999976,  0.32496596])
>>> c = b[::-1]
>>> c
[5, 4, 3, 2, 1, -1, -2, -3, -4, -5]
>>> b
[-5, -4, -3, -2, -1, 1, 2, 3, 4, 5]
>>> b.reverse()
>>> b
[5, 4, 3, 2, 1, -1, -2, -3, -4, -5]

インデックスをとる

インデックスが欲しいときにはnp.argsortですね。ただのリストのメソッドにはないのかなぁ?

>>> idx = np.argsort(a)
>>> idx
array([8, 3, 6, 4, 0, 7, 5, 1, 2, 9])
>>> e = a[idx]
>>> e
array([ 0.19758518, 0.20691008, 0.28689177, 0.307734 , 0.32496596,
0.40670341, 0.72823673, 0.74999976, 0.77499606, 0.85783996])

>>> b = [1, 2, 3, 4, 5, -5, -4, -3, -2, -1]
>>> idx2 = np.argsort(b)
>>> idx2
array([5, 6, 7, 8, 9, 0, 1, 2, 3, 4])