思考ノイズ

無い知恵を絞りだす。無理はしない。

<はじパタ> 6.1.1 超平面の方程式

はじめてのパターン認識 6.1.1 超平面の方程式に関してのメモです。

はじめてのパターン認識

はじめてのパターン認識

ここでは超境界面の数式  f(\mathbf{x}) = \mathbf{w} \mathbf{x} + w_0 を単位法線ベクトル  n と位置ベクトル P の関係に変形して、  f(\mathbf{x}) = \mathbf{n}^T (\mathbf{x} - \mathbf{P}) としている。

境界面へのベクトル P とそこからのびる、単位法線ベクトル  n を分離することにより、 n (x-P)内積の計算結果の正負を考えると、境界面のどちら側にいるかの識別が可能となる。 例題6.1の計算で  n = (\frac{2}{\sqrt{5}}, -\frac{1}{\sqrt{5}}), P = ( 1, 0) という値が計算された。

ここで、以下の3つの点について考えてみた。


a = (0, 3),
b = (2, 2),
c = (2, -1)

この三点と、ベクトル  n, P をプロットしてみる。

plt.axes().set_aspect('equal', 'datalim')

x = np.linspace(-1, 3)
y = 2*x - 2
plt.plot(x, y, "r-")

plt.plot(0, 3, "bo")
plt.text(0.2, 3, "a")

plt.plot(2, 2, "bo")
plt.text(2.2,2, "b")

plt.plot(2, -1, "bo")
plt.text(2.2,-1, "c")

plt.text(1.2,0, "P")
plt.text(2,-0.5, "n")

plt.quiver(0, 0, 1, 0, angles='xy',scale_units='xy',scale=1)
plt.quiver(1, 0, 2.0/np.sqrt(5), -1.0/np.sqrt(5), angles='xy',scale_units='xy',scale=1)

plt.grid()
plt.xlim(-2, 3)
plt.ylim(-2, 4)
plt.show()

f:id:bython-chogo:20180127235115p:plain

 \mathbf{n} (x - P)  x  a, b, c をそれぞれ代入すると以下のようになる。

 f(a) = \frac{2}{\sqrt{5}}  f(b) = 0  f(c) = \frac{-1}{\sqrt{5}}

この正負の結果は  (\mathbf{x}-\mathbf{P}) \mathbf{n} のつくる角度がそれぞれ、鋭角、直角、鈍角であるので、それぞれの結果は正、ゼロ、負となるわけである。

わかりやすくするために、 nベクトルを平行移動させて、図で表すと以下のようになる。

plt.axes().set_aspect('equal', 'datalim')

x = np.linspace(-1, 3)
y = 2*x - 2

plt.plot(0, 3, "bo")
plt.text(0.2, 3, "a")
plt.quiver(0, 3, 1, -3, angles='xy',scale_units='xy',scale=1)
plt.quiver(0, 3, 2.0/np.sqrt(5), -1.0/np.sqrt(5), angles='xy',scale_units='xy',scale=1)

plt.plot(2, 2, "bo")
plt.text(2.2,2, "b")
plt.quiver(2, 2, -1, -2, angles='xy',scale_units='xy',scale=1)
plt.quiver(2, 2, 2.0/np.sqrt(5), -1.0/np.sqrt(5), angles='xy',scale_units='xy',scale=1)

plt.plot(2, -1, "bo")
plt.text(2.2,-1, "c")
plt.quiver(2, -1, -1, 1, angles='xy',scale_units='xy',scale=1)
plt.quiver(2, -1, 2.0/np.sqrt(5), -1.0/np.sqrt(5), angles='xy',scale_units='xy',scale=1)

plt.text(1.2,0, "P")

plt.grid()
plt.xlim(-2, 3)
plt.ylim(-2, 4)
plt.show()

f:id:bython-chogo:20180127235323p:plain

お気づきかとは思いますが、正負が逆になってしまう。2クラスの識別なら正負が反転していても問題がないんだけど、気持ちが悪い。 本文の例題にもこっそり引き算を逆にして正負を反転させているような記述がみえるのだが、ごまかしているのか、私のベクトル計算の考え方がちがうのか判断がつかない。

機械学習のお勉強

久しぶりのエントリー。ドラフト版を書いては消去するのを繰り返しているうちに遠ざかってしまいました。

そもそも機械学習やプログラミングの勉強メモとして再開していたこのブログ、お休みの間も機械学習の勉強を続けていました。ただやっていくうちにどんどんとベーシックなほうへ向かっていき、最終的に機械学習(と統計)のための数学の本を買いだす始末。

ただこの本がとてもよかったです。統計、機械学習でつかう数学式のみを中1レベルから丁寧に教えて書いてくれていて、いかに自分が数学から離れて忘却されてしまっていたか、さらに機械学習本でわかったつもりになっていたかがよくわかりました。 またこれ以上Low Layerに向かうことはないだろう、ここからがスタートだと思うことができました。その後、一回、計算式の変換で挫折をした「はじパタ」を読み直しています。

はじめてのパターン認識

はじめてのパターン認識

Markdownで書いたメモもたまってきたので、ブログに放出をしていきたいと思います。

このほかの本も読んでいるのですが、それはまた機会があれば。

芸人のラジオ考察

またしても他人の褌で相撲を取るようなエントリーなのですが、思っちゃたんだからしょうがない。

hiko1985.hatenablog.com

芸人ラジオ大好きで主にニッポン放送TBSラジオの深夜枠はラジコを駆使しながら拾えるだけ拾うようにしていたのですが、ハライチのターンは存在を知りながらカバーしてませんでした。いわゆる食わず嫌いってやつです。しかしこの動画はそんな斜に構えた私の心を打ち砕くのに十二分なインパクトがありました。

脳内世界観強めの話芸

あぁ、ハライチのラジオは岩井さんのほうなんだなと。もちろん、澤部さんも面白いのですが、パンチがツボにクリーンヒットさせるのは岩井さんなんだと。岩井さんは独自の世界を脳内に構築するタイプの方で、それを現実世界に面白く脚色しながらアウトプットできる能力の持ち主なんでしょう。これは別名、心の闇ということもできますが。 たぶん、この手の脳内の世界っていうのは多かれ少なかれ誰しももっているもので、芸術関係の人はこの世界を音楽だったり絵画だったりに出力をするのですが、岩井さんは芸人としての話芸で話すタイプなんだと確信しました。類型でアルコアンドピースの平子さんもこうした世界観づくりは得意ですが、平子さんの場合はもっとファンタジーだったり中二病感の濃度が濃くなります。

芸人ラジオ勝手に世代分け

だんだんと自分の観測範囲内の自己研究が強めです。当然異論は認めます。

いまのTBS・ニッポン放送の芸人ラジオは世代で以下の3つに分けると考えやすいのかなと思っています。さらに代表的なラジオ番組も入れてみました。

20年戦士

10年戦士

5年戦士以内(前身番組なども含め)

新世代のラジオ芸人考察

ラジオは人気が大きくなると長寿になりやすく、安定したしゃべり手が長く番組を持つ傾向にあると思います。その中でしっかり新しい風を吹き込んでいって、それらがちょっと安定するかしないかのところが新鮮で面白い、そんな聴き時なところが5年戦士に入る番組なのかなと、思っていたりします。この人たちは同世代でもあるののでよくわかるのですが、アニメとか映画の表現が色濃くなった90年代に子供時代をすごし、かつ「大人になってもアニメを見てもいい」という新常識が生まれた境目にいた世代だとおものうので、最初に言ったような「脳内の世界観」の蓄積が充実してきている人が多いのかなと。 その脳内の世界観をデータベースとして、芸人としてのトーク力のスキルでうまく処理し、さらにラジオという特殊な場所という好条件が重なった結果、今回の岩井さんのような新しいラジオスターが生まれたのではと考えます。

今後も芸人ラジオから耳が離せませんです。

f:id:bython-chogo:20171104175934p:plain

90年代でとまった知識でホームページを作成してみた

ここ最近WPA2の脆弱性でちょっと忙しくなってしまい、やっとこさ落ち着いて、さらに久しぶりに何も予定がない週末を迎えました。そこでなにを思いついたかホームページを作ってみようと思いったってしまいました。人間、暇な時間を与えてしまっていけないという一つの証拠となります。作るのは、きれいにスタイルを整えたかっちょいいWebページとかブログとかではなく、90年代の「ホームページ」だ。このホームページも誤用がそのまま定着してしまったものなのですが、90年代のインターネットを表す言葉としてとても有用になってしまったと思います。

ŽvlƒmƒCƒY H.P.

f:id:bython-chogo:20171029005427p:plain

タイトル文字化けてらぁ。 意外とタグを覚えているなぁと思いました。ほとんどHTMLタグを確認をしなくてもできました。体が覚えている。というか結局ここまでのレベルまでで、ここから先のかっちょいい、スタイルシートやらJavaScriptやらCGIには行けずに飽きてしまいました。つまみ食いしてはほかに行くスピリッツはこの時代から変わってないです。

90年代にGeoCitiesのWebサーバサービスを使ってこんな感じのホムペを作成して、見知らぬ人とちょっとした交流をしていました。Yahooに買われたとはいえ、いまだにGeoCitiesでできるのは感慨深いです。90年代掲示板といえばBBSだろとおもって検索したら teacup の掲示板を発見!当時も使ってたよ。これもGMOが運営しているようです。カウンタは当時はGeoCitiesで提供していたと思うのですが、今はやっていないようです。そこで、こちらも老舗のNinjaツールでカウンタを作成しました。

いままで書いたPythonスクリプトをまとめてみようかな、とも思うのですが、まあGitHubの使い方覚えてそこに入れろよ、と私の中のLittleホンダがささやいていて、どうしたもんかなと思ってます。たぶん、更新をしていくこともないと思いますが(ぉい)、もう少しパワーアップをしてみようかとも思ってます。久しぶりにフレームを使いたい気もします。

Chainerをつかった助詞の学習システムを作る (2)

続き

bython-chogo.hatenablog.com

前回は助詞を学習して、正しい助詞をSuggestするシステムを作りました。ただ、テストをしてみたところ正答率が50%超とちょっと微妙な正解率。はじめてにしてはよかったと思うけど、でも実用的には使えないです。目標としては90%越え、できれば95%といったところでしょうか。

とりあえずいろいろ試してみる

せっかくなので以下のように学習方法を変えてみて検証結果に変化が出るか確認をしてみることにしました。

  • 学習する記事の量を増やす (Double)
    前回は1日分の記事でしたが、とりあえず2日分入れてみるとどうなるでしょうか
  • 学習する前後の単語を増やす (15Words)
    前回は前後の10ワードずつ入れていましたが、15ワードに増やしてみるとどうなるでしょうか
  • 学習するモデルを変える (GRU)
    前回は本に書いてあるがまま、LSTMで試してみましたが、さらに本に書いてあるままにGRUモデルで変化がでるのかを試してみます。

基準として前回の学習内容を (Single) というラベルを張っています。

結果をどん

f:id:bython-chogo:20171011183315p:plain

  • Double: 最高で70%程度の正解率、やはり上がってますね
  • 15Words: こちらも同じく70%程度に上がっていて、効果がみられます
  • GRU: 正解率は Single と同程度ですが、学習を繰り返すとしり上がりによくなっている?
  • 全体を通して、学習は10~15 epoch内で終わってしまっていて、50までは不必要そうだが、微妙な変動で正解率に差がでている?

次は欲張って、全部組み合わせて正解率がどれくらい上がるのかみてみます。 学習する記事は4日分、前後15wordで、なんとなくGRUモデルで学習した検証結果が次のようになりました。

f:id:bython-chogo:20171011183323p:plain

比較はGRUの1日分の記事、10Wordです。最初の方の学習はすごくよく、80%弱ぐらいの正解率までいきます。が、繰り返すをするたびに、だんだんと正解率は低下、ついには GRU にも負けてしまうようになります。学習に1日半ついやしたのに。こりつが過学習というやつなのでしょうか。

以下がまとめたテーブルです。時間とかの数値は裏でいろいろ動かしていたので正確ではないのですが、ご参考までに。また、今回は Chainerに付属するCudaの計算機能を使ってみたのですが、比較として、CPU Onlyの時間も最後に入れています。条件は Single 相当です。

f:id:bython-chogo:20171011184756p:plain

まとめ

学習するサンプルを増やすことは成果はあるようですが、モデルとか回数とかのバランスが難しそうです。この学習に関していえば、正解か不正解かがすぐわかるので、ループさせれば半永久的に学習の追加ができます。 なので現在は新着の記事を読みに行って、間違ったサンプルのセットを自動的に再学習させる、ということを試みています。またまとまったらここに追記したいと思います。 なお、ソースコードの公開もしたいのですが、いかんせんぐちゃぐちゃになってしまっているので、まとめてからだしたいと思います。

f:id:bython-chogo:20171011185613p:plain:w300 かわいいフリー素材集 いらすとや

<ネタバレ有り> スイス・アーミー・マン

この映画を最初に知ったのは芸人「アルコ・アンド・ピース」のラジオで取り上げられていたことです。

f:id:bython-chogo:20171009175031j:plain

ある島で遭難した主人公がその島で遭遇した死体。その死体はサバイバルに必要な「死体のおならでジェットスキーのように海を渡る」などの便利な機能をもっていた。この時点ですでにぶっとんだ設定ですが、ダメ押しとして、その死体を演じるのがあのハリーポッターダニエル・ラドクリフということです。これはあれだ、「打ち上げ花火ー」に続く、俺がみなくてはならない案件だ。流行りでいうならばにゃんこスターの「おいらが見なけりゃ、だれがみるってんだい」案件です。

祝日の昼間の映画館で人入りはまあまあ。カップル、女子通し、一人もの、の割合は 3:3:4 といったところでしょうか。 設定がぶっとんでいて、下品なネタも多いので、低俗な笑いで受けを狙う映画、として捉われてしまいそうですが、個人的にはいろいろ思うところがある映画でしたので、すべてを書かせてもらおうと思っています。そのため、ネタバレも含まれます。これから見に行く予定の方はご注意のほどをお願いいたします。

なお、映画を見てすぐに書いてますが、記憶があいまいなところが多く、会話の詳細が間違っている可能性が大きいですが、ニュアンスでとらえていただければと思います。

感想 - ネタバレ有

遭難した主人公はさえない人生をおくっていたさえない若者で、偶然バスで出会った女性に声をかけられずにスマホのカメラで隠し撮りをおこなって待ち受けにするという小心者。家庭環境もあまり恵まれてなく、偏屈な父親と、若くして亡くなった母親へのコンプレックスというのも背景としてかかれています。 遭難したときに偶然遭遇した「死体」の便利な機能に気づき、その機能を使いながら困難を乗り越えていきます。また一方でその死体はしゃべることもでき、ただ生前の記憶はない状態のようで、主人公は死体に言葉、感情、一般的な常識的行動などを教えながらコミュニケーションをとっていきます。

先ほどいったように、「死体のおならでジェットスキーのように海を渡る」「死体の口から飲み水がでてくる」「死体の勃起したイチモツがコンパスのように方向を示す」といった一見すると下品なネタで笑いを取っているだけにもみえてしまいます。実際、映画終わりでそのような感想を言っている声もきいたのですが、私としては下ネタだけで興味を持続させている映画ではないと思っています。

遭難しているという主人公の過酷な環境は言わば、「非常識・非現実」な世界に置かれています。それに加えて、道具として使え、しゃべる死体がいるという状況が非常識に拍車をかけており、その死体とのコミュニケーションのなかで、いままでの自分の生き方、常識と非常識、理想と現実、について自然と問いかけるようになっていきます。そもそもこの非常識な死体には、常識は通用しません。「人前でおならをしないのが常識なんだ」と教わると「わあ、なんて最悪な世界なんだ」(おならを道具として海を渡ったのに、という背景がある。)、などの純粋な感想を投げかけます。さらに終盤でも「そんなに常識にしばられているのに故郷に帰る必要があるのかい?」と主人公に問いかけをします。 また、ほかのポイントとして、主人公はその死体にうそをつくというシーケンスがあります。主人公がバスで隠し撮りした女性の写真に一目ぼれしてした死体は、その女性に会うことをモチベーションとして主人公を手伝うようになります。遭難中の森の中、バスを模した即席のセットを作成し、さらに主人公を女装させ、女性とバスで出会い、声をかけるシチュエーションを演出をしながら2人は絆を深めていくようになります。しかし、バスで出会った女性はすでに結婚していて子供もいるので、なんにせよかなわない恋となります。主人公はそのことを隠しながら死体を盛り上げる趣向を繰り返します。これは遭難、しゃべる死体、という非現実的な状況下でこそ積み上げられる、「現実ではない世界」の中に「理想の世界」を2人で作り上げていることにほかなりません。いわばこの妄想的な世界感においては、こんな非現実な世界でもとがめる人は出てきません。そこはだれも見ていない、自由な空間だからです。これは映画を見ている我々観客もその妄想の世界を一緒に楽しんでいくようになります。

その楽しい非現実世界にも終わりが来ます。現実世界にもどってしまうと妄想を繰り広げる自由はありません。やっと人里におりてきた2人を待ち受けるのは現実世界の人の目です。ボロボロの服をきた主人公、その携帯のカメラにはバスで隠し撮りした女性の画像、森の中には手作りされたバスのセットという妄想の亡骸、そしてしゃべっていた死体は、一般的な常識通りにしゃべらなくなってしまいます。一緒に非現実世界を楽しんでいた観客も、我に返りざるを得ません。私たちが楽しんでいたこの妄想の世界は、一般社会的には超異常な変態的な世界なのだと気づかされるからです。 この現実に戻る直前、死体がしゃべらなくなく前に死体は主人公にこういうのです。「人前で大きな声で歌をうたうことも、おならをすることも、誰かが少しづつ認めてくれれば、変わっていくんじゃないか」。 そして常識の目をもった人たちのまえで、狂人としてとらわれている主人公、そんな主人公はある「一般社会的に非常識的な行動」をします。この行動は常識をうちやぶる奇跡をおこすこととなります。

常識に「自由な発想」をつぶさせない

常識というのは社会生活では必要な規範となる一方、自由な発想を妨げる制約になります。せめて人目が届かないところでは、常識に問われることなく、自由な発想で、自分のやりたいことを突き通してもいいのではという提案にも感じ取れました。もしその発想に共感する人が一人あらわれ、さらに理解者の輪が広がっていけば、いつか常識を覆す新しいパラダイムシフトが生み出される、そんな励ましを勝手ながら感じ取ってしまいました。

そしてラドクリフがすごい!

この映画の見どころはやっぱり死体役のラドクリフとなってきます。便利な道具をおこなう死体、というなんのこっちゃわからない役を怪演しきっていたと思います。ほんと見事な死体っぷりでした。子役時代、ハリーポッターで華々しくデビューした彼ですが、実はこうした怪役のほうが性に合っているのではないかと思いました。日本のドラマでいう高嶋政伸のように、非常識的なキャラクターがぴったりくる印象をもってしまいました。願わくば、この路線を突き進んでほしいものです。

まとめ

このようにぶっとんだ設定や下ネタで笑いを起こして楽しいのですが、実はその裏には社会生活の常識と、それに自然と縛られている私たちの発想、というテーマを垣間見ることができました。入口はただただぶっとんだ映画ですが、持って帰るものも多かった一作、怪作となったのは間違いないと思います。

Chainerをつかった助詞の学習システムを作る

久しぶりにPythonでちょっとおおネタ。複数回にまたがりそうなうえ、個別項目の備忘録も必要になってくるかもしれないですが、見切り発車でGoです。

モチベーション

Chainerによる実践深層学習

Chainerによる実践深層学習

この本のお勉強の続きで、7章Recurrent Neural Network, 8章で実用のケースとして翻訳モデルの実装方法について記載しています。せっかく得たこの知識を使ってなにか作れないか探していたところ、以下の記事を見つけました。

www.atmarkit.co.jp

助詞の訂正かー、これ実装できたら面白うだし、課題としてはちょうどよいかもしれない。ということでコーディングを始めてみました。ちなみにですが、コーディングにつきましては以下のエントリをがっつり参照させてもらっています。この方も助詞検出を機械学習してコードを公開していらっしゃいます。こちらのコードをだいぶお手本として参照させていただきました。

catindog.hatenablog.com

今回作るものはChainer本とこちらのエントリのミクスチャーとなります。id:catindog さんはKarasというPythonライブラリでの実装を行っていますが、私が持っている武器は現在本に記載されているChainerだけなので、Chainerでの実装をめざしてみようと思います。

助詞の検出のための学習

学習のアイデア id:catindog さんの方法を丸々使わせてもらいました。*1

今回の助詞の検出モデルを作成するにあたり、何を学習させる必要があるのかを考えてみます。

f:id:bython-chogo:20171008031513p:plain

助詞は前後の文節の流れで決まります。上の例で、私は/野球、に続く助詞を考えたときに、この後にくる助詞は、「が」、「を」、「も」など、一意に決まりません。しかし後に続く、好き、です、により「が」が適していることが分かります。つまり学習のプロセスは、1. 学習(検出)する文章の助詞をさがす。2.その助詞の前後の文章を入力値、助詞自身が正解の出力値として複数の文章を学習させる。 となります。

学習文章のサンプル取得方法

某地上波のWeb記事を抽出しました。その文章を文節ごとにスペースを空ける「分かち書き」をおこない、その文章の中で助詞にあたる文字を抽出して、その前後の文節を一定数、入力値として登録します。お手本に習い、助詞の前後10ワードずつとしました。

文章の抜き出し方法はそのまま公開するといろいろ問題がありそうなのでしませんが、Beautiful Soupを使っています。また分かち書きMeCabPythonモジュールを使いました。正直、ここの分かち書きが難所だと思ったのですが、こんなライブラリが用意されているとはほんとにインターネット時代様様です。

ちなみに、Mecabを使うと以下のような変換が行われます。(わかりやすく間に / を入れています。通常はスペース。)

せっかく得たこの知識を使ってなにか作れないか探していたところ、以下の記事を見つけました。
せっかく/得/た/この/知識/を/使っ/て/なにか/作れ/ない/か/探し/て/い/た/ところ/、/以下/の/記事/を/見つけ/まし/た/。 

素敵。これをそのまま別の文節として学習できちゃう。 この例の場合、今回の学習の入力値と出力値は次のようになります。

  • 入力1:/得/た/この/知識/を/使っ/て/なにか/作れ/ない//探し/て/い/た/ところ/、/以下/の/記事/を/
  • 出力1:か
  • 入力2:/この/知識/を/使っ/て/なにか/作れ/ない/か/探し//い/た/ところ/、/以下/の/記事/を/見つけ/まし/
  • 出力2:て

学習文章と検証文章について

先ほどのWeb記事の10月1日の記事を学習サンプルとして、10月6日の記事を検証サンプルとしてみました。10月1日のデータ数は以下になりました。*2 学習の繰り返し回数は50にしてみました。根拠なくChainer本の値をそのまま入れただけです。

  • 学習するUnit: 7154
  • 学習において出てきた単語数: 5241

ちなみに検証の記事については2つ以上の助詞があっても1文章につき、1サンプルとしました。類似の検証用記事が偏ること避けるためなのですが、意味があるかはわかりません。

成功例と失敗例

今回のテストで学習させた結果、以下の例のように助詞を提案してくれます。正解の例と、失敗の例を示します。

正解例

ことし 7月 1 日 から 9月 1 0 日 まで  [ の ]  夏山 シーズン の 登山 者 は 合わせ て 2 
    の 0.999983
    に 1.62042e-05
    と 4.91623e-07
    や 9.80575e-08
    で 8.98966e-08

失敗例

 の 繁華 街 で は 悪質 な 客引き 行為 など  [ が ]  相次ぎ 、 日本語 が わから ない 外国 人 観光 
    は 0.804192
    の 0.0810047
    を 0.0239791
    が 0.0194065
    に 0.00046254

正解率と損失率

今回の学習と検証では以下のような結果となりました。横軸は損失数を減らすようにアジャストした学習の反復回数です。 f:id:bython-chogo:20171008205752p:plain

いえることとして、 - およそ 0.55 ~ 0.60 の正解率。微妙w - 10回の反復で損失数はほぼ0に張り付いてます。この学習では50も繰り返す必要はなさそうですね。

次のステップ

さて、今回のパターンでは微妙な正解率となってしまいました。次回からはこの学習率を高めるにはどうするかを実験してみたいと思います。あと、コードはぐちゃぐちゃになってしまったので、整理してからきちんと公開したいと思います。

追記

最初に間違ったスペルでIDコールを飛ばしてしまいました。お詫びして訂正いたします。

*1:すいません、例題分もまるまる同じものを使って説明しております。

*2:ちなみに、Web記事は記事の抽出コードを実行したときにWebに掲載されている新着記事となります。同じ日でも別の時間に実行すると抽出する記事は変わります。