Chainerをつかった助詞の学習システムを作る
久しぶりにPythonでちょっとおおネタ。複数回にまたがりそうなうえ、個別項目の備忘録も必要になってくるかもしれないですが、見切り発車でGoです。
モチベーション
- 作者: 新納浩幸
- 出版社/メーカー: オーム社
- 発売日: 2016/09/09
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
この本のお勉強の続きで、7章Recurrent Neural Network, 8章で実用のケースとして翻訳モデルの実装方法について記載しています。せっかく得たこの知識を使ってなにか作れないか探していたところ、以下の記事を見つけました。
助詞の訂正かー、これ実装できたら面白うだし、課題としてはちょうどよいかもしれない。ということでコーディングを始めてみました。ちなみにですが、コーディングにつきましては以下のエントリをがっつり参照させてもらっています。この方も助詞検出を機械学習してコードを公開していらっしゃいます。こちらのコードをだいぶお手本として参照させていただきました。
今回作るものはChainer本とこちらのエントリのミクスチャーとなります。id:catindog さんはKarasというPythonライブラリでの実装を行っていますが、私が持っている武器は現在本に記載されているChainerだけなので、Chainerでの実装をめざしてみようと思います。
助詞の検出のための学習
学習のアイデア id:catindog さんの方法を丸々使わせてもらいました。*1
今回の助詞の検出モデルを作成するにあたり、何を学習させる必要があるのかを考えてみます。
助詞は前後の文節の流れで決まります。上の例で、私は/野球、に続く助詞を考えたときに、この後にくる助詞は、「が」、「を」、「も」など、一意に決まりません。しかし後に続く、好き、です、により「が」が適していることが分かります。つまり学習のプロセスは、1. 学習(検出)する文章の助詞をさがす。2.その助詞の前後の文章を入力値、助詞自身が正解の出力値として複数の文章を学習させる。 となります。
学習文章のサンプル取得方法
某地上波のWeb記事を抽出しました。その文章を文節ごとにスペースを空ける「分かち書き」をおこない、その文章の中で助詞にあたる文字を抽出して、その前後の文節を一定数、入力値として登録します。お手本に習い、助詞の前後10ワードずつとしました。
文章の抜き出し方法はそのまま公開するといろいろ問題がありそうなのでしませんが、Beautiful Soupを使っています。また分かち書きは MeCab のPythonモジュールを使いました。正直、ここの分かち書きが難所だと思ったのですが、こんなライブラリが用意されているとはほんとにインターネット時代様様です。
ちなみに、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
正解率と損失率
今回の学習と検証では以下のような結果となりました。横軸は損失数を減らすようにアジャストした学習の反復回数です。
いえることとして、 - およそ 0.55 ~ 0.60 の正解率。微妙w - 10回の反復で損失数はほぼ0に張り付いてます。この学習では50も繰り返す必要はなさそうですね。
次のステップ
さて、今回のパターンでは微妙な正解率となってしまいました。次回からはこの学習率を高めるにはどうするかを実験してみたいと思います。あと、コードはぐちゃぐちゃになってしまったので、整理してからきちんと公開したいと思います。
追記
最初に間違ったスペルでIDコールを飛ばしてしまいました。お詫びして訂正いたします。
Rhymester Live 公開リハーサル・ゲネプロにいってきた話
10月5日に行われたRhymester Liveのゲネプロに行ってきました。いやー最高だったのですが、どうまとめたもんかと考えているうちに週末に入り、記憶が定かなうちに書きはじめてます。考えが全然まとまってねぇw
Rhymester
Rhymesterとは2MC(宇多丸/Mummy-D)と1DJ(DJ Jin)からなる日本のヒップホップグループで日本のHIPHOPシーンの創世記をささえてきたグループなのです。
Rhymesterの公開リハーサルライブ
で、そのRhymesterのツアー名は、「KING OF STAGE」といい、今回のライブは「KING OF STAGE VOL. 13 ダンサブル Release Tour 2017」の公開リハーサルとなっています。
9月6日に発売されたアルバム「ダンサブル」のリリースLiveツアーを始めるのですが、Rhymesterはここ最近「公開リハーサル・ゲネプロ」というのを最初に行っています。通常のライブチケットより安くして客を入れてリハーサルを見てもらい、そのフィードバックをもって本番のツアーをブラシュアップさせるという試み。
リハーサルといっても、本番さながらのセットでもちろん楽曲も本番と同じクオリティで行われます。一部、映像が間に合ってなかったり、予定のEvent (a.k.a 余興) をスキップしていたようですが内容的には本番とそん色ないQualityで行われます。
感想箇条書き
セットリストやサプライズの内容はネタバレになってしまうので抑えながら箇条書き。
- もちろん今回は新作アルバム・ダンサブルがメインでの構成。今回のアルバムはタイトル通りにノリやすく非常に自分好みでうれしい。
- 始まる前のクラブチッタ松井さんの始まりの言葉。「リハーサルであるため、一部演出、映像が間に合っておりません。ご容赦ください。また2人のリリック等も間に合っておりません。」のエクスキューズに爆笑。
- しょっぱなの3曲はマジあがる。たまらない。
- 新作曲から「テーマつながり」で旧作曲の流れが一つあったが最高だった。昔のライブでいうとアルバムPOP LIFEツアーでの「敗者復活戦」からの「Born to Lose」のような。歴史のあるRhymesterの旧名(迷)曲がフックされるととても気持ちいい。
- 旧作のつなぎで盛り上がる「鉄板」ネタも健在。上がりまくる流れにひと工夫加えてまじヤヴぁい。
- J-HIPHOP リスペクトのカバー曲が登場。そんな昔の曲とは思えないほどやばすぎのカバーだった。全然新曲としてもいける。
- さらに昔のJ曲のカバーもリクエストに登場。J-PopではなくJ歌謡曲の域。さすがの私もカバーしきれないほど古いw なぜそのチョイスw かっこよいんだけどそのチョイスに至った理由がききたいくらいぶっ飛んだ方向(笑) かっこよかったけど。そのあとのMCでハモリを披露する三人のおっさんHIPHOPレジェンドw
- MCは相変わらず面白い。2MCの掛け合いが最高すぎる。個人的には「俺の緩さは半端ないよー」とお決まりのフロウで観客に語りかけるDさんに大笑いしてしまった。
- 通常チケット5500円で、公開リハは3000円。宇多丸「2500円分を差し引いてパフォーマンスしますから。そうしないと割が合わないから!」。Mummy-D「それか2500円分、みなさんにはイヤーな思いをしてもらいます。」
- Mummy-Dさんが髪切ったあと初めてみたけど、似合ってた。マネしたいけど似合わないだろうな。
- 休憩の合間の偽CMはまだ間に合わず過去の迷作選でした。いいね。ひどいね。
- 舞台セットもアルバムのイメージにとてもあっていると思います。
すべてが終わって、クラブチッタの松井さんが「いつも出待ちをしていただいている方がいらっしゃいますが、今日はこのあと深夜までここでミーティングをする予定なのでお控えいただきますようお願いいたします。」楽しく愉快にパフォーマンスるようにみせて、きっちり反省会をその日のうちにおこないまじめにブラシュアップを練っているようです。レジェンドになっても決して手を緩めぬ姿勢にリスペクトで、好きなものを仕事にしている人たちはこうした地道な積み重ねをおこなっているんだと思い知らされました。
お台場にも行く予定なので、「本番」も楽しみにしています。
10年後に1998年を振り返る記事をみてからもう9年
Webクロール中にたまたまBuzzFeedさんの以下のエントリを見つけました。
あれ、これデジャブだなーと思って探したらそうそう、このまとめサイトを見てた記憶だ。
そうか、このまとめ見てからもう9年も経つんだ。というかBuzzfeedさんの19年前を振り返るのって中途半端じゃね? でもなんとなくわかるのですが、感覚的に「1997年が20年前」よりも「1998年が20年前」というほうがちょっと心に刺さるものがあります。それが2007年と2008年でも同じ。下一桁の8は大台にのる直前感を醸し出すマジックナンバーなのかもしれませんね。
ちょっと9年前の痛ニューのコメントについて、9年後の自分がコメントを入れてみます。
55 名前: グラドル(アラバマ州) 投稿日:2008/01/01(火) 00:58:38.53 ID:4teCgfiA0
MXとか2chとかなにやってたんだおれ
9年後、5chになるって言ってもだれも信じないだろうな。MXとかWinnyとかYouTubeなどなどでなくなっちゃいましたね。
64 名前: 建設作業員(埼玉県)[sage] 投稿日:2008/01/01(火) 00:59:35.81 id:oVqD1qdQ0
時のオカリナも10年前の作品に。
さらに9年。ゼルダも新ゲーム機で健在
120 名前: 日本語教師(北海道)[sage] 投稿日:2008/01/01(火) 01:07:06.72 id:zPUln/+60
宇多田ってどんだけ若いんだよw
20年近くたっても35ですからねー
383 名前: 留学生(長野県) 投稿日:2008/01/01(火) 01:46:23.75 ID:E+hBCPSk0
10年間何してきたか? 違うよ、これから10年何をするかが大切なんだよ
2028年を見据えて頑張ります
415 名前: 人気者(東京都)[sage] 投稿日:2008/01/01(火) 01:51:29.71 ID:6AOQYFO+0
人の人生で一番重要な時期って10歳~30くらいだろ この10年が2回くらい過ぎたら人間の人生なんて終わったようなもんだ 30歳からなんて老いていくだけだろ
30半ばを過ぎてきましたが、まだまだこれからのつもりです。
868 名前: 山伏(dion軍) 投稿日:2008/01/01(火) 08:06:11.75 ID:wBQoO+020
未だにスマップや宇多田が人気とか文化停滞しすぎだろw
解散、3人がジャニーズ脱退=>New(s) Mapへ いろいろありますがいまだに活躍中。
423 名前: あらし(アラバマ州) 投稿日:2008/01/01(火) 01:55:23.84 id:fzVGd+k50
ニコ動って10年後にも存在してんのかな? 2ch以上に廃人を生み出すだろ・・・
角川と合併も、課金ユーザの減少がニュースになっています。
442 名前: 人気者(東京都)[sage] 投稿日:2008/01/01(火) 01:58:57.00 ID:6AOQYFO+0
ネットが普及してからおかしくなった ネットで得たものもたくさんあったが失ったもののほうが大きいだろう 10年後はもっとネットが進化してるからどうなるのかな・・・
ネットの中心はPCからスマホへ。You Tuberなるものが職業に。
443 名前: 朝日新聞記者(東京都) 投稿日:2008/01/01(火) 01:59:05.63 ID:3L3hY0id0
オレが1998年に購入したVAIO505 ソニータイマー故障で現在も現役。
584 名前: ダンパ(アラバマ州) 投稿日:2008/01/01(火) 02:36:55.43 ID:1Y0Vdh3+P
10年前のこち亀 <こち亀モンスターPCマシンのキャプチャ・自重> そういやこち亀1000話って96年なのか・・・
こち亀がついに終わりました。このキャプチャは後になってみれば見るほど趣がでてきますね。
682 名前: ボーカル(コネチカット州) 投稿日:2008/01/01(火) 03:24:48.86 ID:+E7EmGMuO
この十年で国の借金がとんでもない額になりました
あっ。。。
829 名前: 愛のVIP戦士(アラバマ州) 投稿日:2008/01/01(火) 07:02:25.80 id:px9pfaj40
平成になってからもう20年も経つのが驚き
平成も30年(31年?)までということになりました。
844 名前: 自衛官(福岡県)[] 投稿日:2008/01/01(火) 07:20:36.47 id:p6cvu58s0
10年後2ちゃんがあるかどうか知らんが、日本はどうなっているのだろうか・・・・
2chは名前を変えましたが、日本は問題を抱えながらまだそれなりにやっていってます。これからの10年もがんばりましょう。
それでは、2028年にまた!
備忘録 - Python/WIn10 64bit でMeCabを導入
最近 Chainer本をやっているのは、ぼんやりと言語系の機械学習をいっちょかみしたいなと考えているからなのですが、そろそろ必要な環境についてもPCへの導入を始めました。その過程のお話し。
日本語の文章を学習させるにあたって必要になるのが「わかち書き」ってやつで、ようは機械に日本語を学習させるにあたり、意味で区切った文節の間に英語のようにスペースなどの記号を入れる必要が出てきます。これって結構難儀だよなって思っていたのですが、あっさりとMeCabというフリーの形態解析エンジンがでてきました。。
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
MeCabは 京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所 共同研究ユニットプロジェクトを通じて開発されたオープンソース 形態素解析エンジンです。 言語, 辞書,コーパスに依存しない汎用的な設計を 基本方針としています。 パラメータの推定に Conditional Random Fields (CRF) を用 いており, ChaSenが採用している 隠れマルコフモデルに比べ性能が向上しています。また、平均的に ChaSen, Juman, KAKASIより高速に動作します。 ちなみに和布蕪(めかぶ)は, 作者の好物です。
これぞ情報の海の産物。めかぶだけに。この時代に生まれてよかったと感じざるを得ませんでした。 これを自分の開発の環境に合わせなくてはいけません。Windows10 64bitのPC上で、Python 2.7を使って動かしています。Pythonも活発な言語なのでこのあたり導入したライブラリの情報がいくらでもあるだろうとたかをくくっていたのですが、実際に導入する方法はちょっとトリッキーでした。ただそのトリッキーな方法もわかりやすく記載したエントリーがでてきます。
hassiweb-programming.blogspot.jp
Mecab 32bitをインストールする。ただ動かしたいのは64bit版なので、そのソースコードをダウンロードして少し情報を書き換えたうえでコンパイル。Pythonモジュールのビルドをしてようやく導入が完了します。
おおむね参照させていただいたページのプロセスで進んだのですが、どうしてもPython モジュールのコンパイルの場所でエラーが発生してしまいます。 曰く、"Unable to find vcvarsall.bat" とのこと。実はこれも先のページのトラブルシュートで記載があったのですが、解決に至りませんでした。*1
なんのこっちゃよくわからず、ぐるぐると検索して回った結果、以下のページで解決しました。
例えば、Python本体がMSC v.1500、つまりVC++9.0(2008)でコンパイルされていてインストールされているVC++が11.0(2012)の場合、 set VS90COMNTOOLS=%VS110COMNTOOLS% と環境変数をセットしてやるとVC++11.0を使ってコンパイルしてくれます。
私の環境だと、Visual Stdio 2015を導入していて、これだとVCのバージョンは14になるようです。一方で、Microsoftから提供されているPython2.7用のコンパイラはVC9となり、Visula Stdioでいうと2008と相当古いものになってしまうのです。VC9のコンパイラがVisual Studio 2008のライブラリを探しに行くのですが、システム上にないためのこのエラーがでてきたということでしょうか。そこで上の環境変数のセットで存在するバージョンのライブラリのパスを設定する必要があったようです。私の環境の場合Visual Studio2015はVC14となるので、以下の設定になりました。
set VS90COMNTOOLS=%VS140COMNTOOLS%
これで、MeCabのPython2.7 (on 64bit) での導入は成功したようです。次のステップは日本語データの収集かな。
以下のサイトでも勉強させていただきました。
*1:よくよく確認すると、正しい対処法が書かれていたようです。解決できなかったのは理解不足が原因ですね。。。
「自然界の黄金比」をプロットしてみる
話題になった黄金率の話にうすーく乗っかってみたくなりました。
モチベーション
正直、連分数に関してちゃんと理解できていないのですが、とにかく、
(略)これは、黄金比の有理数による近似は常に精度が最も悪くなることを意味するのである。 これまでと同様の手順で、100枚の葉をつけた状態が、下図である。有理数による近似の精度が悪い=腕が見えづらい=葉の重なりが少ないってことで、葉の重なりが最も少なくなる配置が得られた。
というところに素直に感動してしまいました。自然界、まじやべぇ。*1
というわけで、これは matplotlib を使って動画化してみてみるしかないと奮い立ちました。先に言ってしまうと、自分の理解が薄かったせいで最初に考えていたよりも作業は大変でした。
課題のおさらい
幹から1枚目の葉を出したら、1枚目の葉からθの角度で2枚目の葉を出す。3枚目の葉は2枚目の葉からやはりθの角度で出す。以下n枚目の葉まで、同様に繰り返す。 幹からn枚目の葉の中心までの長さは、√nとする。
こうして幹の周りから同じ角度でずらしながらで直径1の葉っぱを配置していきます。中心からのきょりも順番の数の平方根で遠ざかっていって、全体に効率よく太陽の光をあびることのできる配置を考えるんですね。そうすると黄金比を使ったやつが一番となるらしいです。今回は元エントリーの例に倣って 無理数の代表 θ = π×π も作って比較してみます。
プロット結果
とっとと実行結果からお見せします。葉っぱの枚数は300枚としました。 まずは π×π
そして 黄金比を使った場合。
きちんと前の円の群れで欠けたるところにすっぽりはまっていくように見えますね。不思議。
コード
jupyterで書いていますが、plt.show()使えば、jupyter以外でもできると思います。未確認。
import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as patches from matplotlib import animation from IPython.display import HTML T = 360 * 1.0 / (1 + (1+math.sqrt(5))/2) #T = 360 * 1.0 / (math.pi * math.pi) fig = plt.figure() ax = plt.gca() ax.set_xlim(-20, 20) ax.set_ylim(-20, 20) def ccl_plt(n, d): r = n * d * math.pi / 180 x = math.sqrt(n) * math.cos(r) y = math.sqrt(n) * math.sin(r) return x, y def init(): return [] def animate(j): plt.cla() patches = [] for i in range(j): if i == 0: continue patches.append(ax.add_patch(plt.Circle(ccl_plt(i, T), 1.0, alpha=0.1, color='g'))) return patches anim = animation.FuncAnimation(fig, animate, init_func=init, frames=300, interval=80, blit=True) #plt.show() HTML(anim.to_html5_video())
もう一つ、簡単な静止画バージョン。
import math import matplotlib.pyplot as plt %matplotlib inline def ccl_plt(n, d): r = n * d * math.pi / 180 x = math.sqrt(n) * math.cos(r) y = math.sqrt(n) * math.sin(r) return x, y fig = plt.figure() ax = fig.add_subplot(111) plt.xlim(-20, 20) plt.ylim(-20, 20) for i in range(300): if i == 0: continue t = 360 * 1.0 / (1 + (1+math.sqrt(5))/2) #t = 360 * 1.0 / (math.pi * math.pi) x, y = ccl_plt(i, t) ax.add_patch(plt.Circle((x, y), 1.0, alpha=0.1, color='g')) plt.show()
蛇足
今回の課題は簡単かなとたかをくくっていたのですが、いざやってみると黄金比の角度をどう設定すればいいのかわからず苦労しました。検索して見つけたのですが、黄金角っちゅうのがあるのですね。入力が度数である場合は以下の計算で黄金角を導き出されるようです。
t = 360 * 1.0 / (1 + (1+math.sqrt(5))/2)
参考:http://gakuen.gifu-net.ed.jp/~contents/museum/golden/page62.html
分母の部分が黄金比の式になってますね。
いやはや、時間がかかりすぎてしまった。眠い。
*1:というかこうしたネタを華麗に持ち出してくるwattoさん、しゅごい。
Chainer - ミニバッチベースの各モデルの学習結果を比較してみる
昨日に続き、Chainerのお勉強。第4章のIris識別方法を比較してみたものの備忘録です。
- 作者: 新納浩幸
- 出版社/メーカー: オーム社
- 発売日: 2016/09/09
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
第4章ではChainerの例としてアヤメの花びらのデータから種類を判別するスクリプトがかかれているのですが、いくつかのモデルを紹介して、コードが以下のようにアップデートされていきます。
- 通常のミニバッチ (4.4)
- 誤差の累積 (4.5)
- Softmax Cross Entropy (4.7)
- ロジスティック回帰 (4.8)
これらのミニバッチをベースにした学習精度を比較します。バッチするファイルの選択はランダムに行っているため、実行ごとのデータの取り方によって結果は毎回変わってしまいます。正しい比較のため、同じデータをとって3000回学習した場合にこの4つのモデルで正解率と損失係数を並べて比べ、判別効率がどの程度変わるのかグラフで視覚化してみたいと思います。
では結果をどん。上にも書きましたが、毎回選ばれるランダム値によって結果が違ってくるので、3パターンを並べてみます。
正解率の良い順としては、ロジステック回帰>誤差の累積=Softmax Cross Entropy>(通常の)ミニバッチでしょうか。今回はロジスティック回帰が相性が良いみたいです。大体は1000~1500ぐらいで上に張り付くようですが、通常のミニバッチは学習が少し遅いようです。また、損失率は別のモデルに対してそのまま比較することには意味がないこともわかります。なるほど。
Irisデータサンプルプログラムのグラフプロット
現在、以下の本でお勉強中。個人的な備忘録です。
- 作者: 新納浩幸
- 出版社/メーカー: オーム社
- 発売日: 2016/09/09
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
オライリーのDeep Learning本も一通りやったうえで、言語の学習をやりたくてこちらに手を出してみました。現在4章を実行中。
ここではChainerの利用例として、ディープラーニングでおなじみのアヤメの花びら分類問題をやる例のやつが出てきます。iris0.py のサンプルを走らせたのですが、学習の繰り返しごとにどの程度の正解率・損失率になるのか気になったのでプロットしてみました。それが以下のグラフ。
10000回の学習を繰り返していくなかで正解率の変化(上)と、損失率の変化(下)を表しています。損失率は4000回目以降大きな変化はないように見えますが、正解率は少しずつ上がっているようです。