seq2seq用日本語対話データセット生成スクリプト

以前、Instagramの画像から食べ物の画像のデータセットを作成という記事を書きましたが、その中で「次はseq2seq用の対話データセットをどうにかしたい」とこぼしていました。なんとかそれを形にできました。 knok/make-meidai-dialogue: Get Japanese dialogue corpus (github) seq2seqで利用可能な日本語対話データセットをダウンロードするツール (Qiita解説記事) 元データはDFSG準拠のライセンスでない点に注意してください。このツールによって生成したデータも同様の制限を受けます。 画像データセットに関しては複数種類があって、以前作った画像データセットの方にあまり需要はなかったようですが、今回はそれなりに参考にされていそうです。 できればDFSG互換なライセンスで公開できる形のデータセットが作りたいのですが、さすがに対話を一人でやるのはなかなか無理がありそうです。オープンなslackやIRCチャンネルを立てて、そういうデータを作るための雑談をしよう、という提案をしたら参加してくれる人はいますかね…?  

Published
Categorized as NLP

2016年9〜10月の活動

ここ2ヶ月ぐらいの活動を記録しておきます。 Debian関係 Namazuのbuild-arch/build-arch-indep対応 ChaSen symbolsの主要arch対応 qemu-debootstrapの利用 porterboxの利用 ChaSenに関しては前回の投稿とも関係があるのですが、とりあえずは主要(公式リリース)アーキテクチャのみ、一通りlibchasen2.symbolsの更新を行いました。 恥ずかしながら今回はじめてporterboxを使いました。これまでporterboxにログインしたことはあっても結局使い方がよくわからなくて諦めたりしていたのですが、たまたまログインしたホストのmotd(ログイン時に表示されるメッセージ)にschrootの使い方へのリンクhttps://dsa.debian.org/doc/schroot/が掲載されていて、それではじめて使い方を理解した次第です。 しかし、qemu-debootstrapでどうにかなる範囲についてはそちらで対応しました。 第12回 カーネル/VM探検隊参加 qemu-debootstrapについてそれなりに理解を深めたので、その紹介という形で発表をしてきました。   Qiitaへの投稿 MySQL 5.5でのCVE-2016-6662対応について 写経で使うツール symlinkを使わずにホームディレクトリの設定ファイル(dotfile)を管理する 写経に関する記事のストック数が多いのが以外です。 FSIJ月例会(予定) 今月10月の28日に、いつもの場所(東京体育館)、いつもの時間(18:30〜19:30)で勉強会が開催予定です。 10月の技術講座 テーマ: 特別じゃないGnuPG GnuPG 2.1のお話だそうで、期待できます。今の時点でのDebian stable(8.x/Jessie)ではまだ標準のGnuPGが1.4系なのですが、次のリリースには2.1が標準になる予定なので、大いに参考になることでしょう。

C++ template instanceのシンボルを隠す

ここ数日、C++がらみで苦労しています。自分がC++を覚えたのが学生の頃、20年以上前になるので、今時のC++についていけていません。 ChaSenのライブラリをビルドしていると、基本的にABIとしてはC言語の範囲でしか定義していないのに、一部のC++シンボルがexportされてしまいます。ざっと調べてみたところ、どうやらtemplateのインスタンスを定義した場合には有無をいわさず外部参照できてしまうようです。 GCC拡張であればvisibilityの制御でこの挙動を変えられるようなので、pragmaを使ってdartsのインスタンスシンボルを隠すことはできるようになりました(参考: Visibility – GCC Wiki)。 そもそもなぜこんなことをする必要があるかいうと、Debian packageのsymbolsの仕組みに引っかかるからです。C++のsymbol name mangling ruleはgccのメジャーバージョンが上がると微妙に変わることがあって、現在stable標準のgcc 5.xとunstable標準のgcc 6.xでまさにこれが影響しています。これまでビルドしていたライブラリのシンボル情報をdebian/<package-name>.symbols.<arch>という名前で保存していて、ビルド結果のバイナリーに含まれるシンボルがこのファイルと異なった場合、ビルドエラーとなるようになっています。これはABI互換性が壊れないことを保証するための仕組みです。 そもそも内部で使っているだけのC++シンボルが見えてしまっているのを回避して、この問題を根本から対応したかったのでした。 しかしまだ一部の標準ライブラリのC++ template instance symbol(std::ctype<char>とか)が残ってしまっているので、それをどうしたものかと苦慮しているところです。  

Published
Categorized as Debian

GNU screen tips

「普段使っているGNU screenのtips」という記事をQiitaに投稿しました。簡単にまとめると multi attach (-xオプション) fit コマンドによる画面のリサイズ -Xオプションの応用 C-a ” (windowlist -b)カーソルキーでのウィンドウ選択 number コマンドでウィンドウ番号入れ替え title, setenv という感じです。 これ以外に、screen上のすべてのウィンドウでgpg-agentにパスワードをキャッシュさせるpinentry-cursesを特定のウィンドウで待機させる、ということをやっているのですが、使っているスクリプトがgniibeさん作なので書きませんでした。というかあのスクリプトはそこそこ問題なく動いている感じなので公開してもらえたらなあ、と思っています。  

Baum-Welchアルゴリズムの実装

機械学習についての理解を進めてゆこうとする過程で、ニューラルネットワーク以外の手法の重要性に改めて気づき、「続・わかりやすいパターン認識 教師なし学習入門」を読み進めています。 途中で困ったのが、Baum-Welchアルゴリズムの実装です。その手前のViterbiアルゴリズムは書籍の記述をそのままコード化すれば同じ結果が得られたのですが、Baum-Welchについては解説が少なく、思ったように動作しませんでした。 いろいろとネットを探しまわった結果、コロラド州立大学のCS教材のページがかなりナイーブな実装で参考になりました。ただし、完全にナイーブではなくスケーリングが施してあります。これがないと、条件によっては値が小さくなりすぎてNaNになってしまうような状況が発生します。 より複雑な実装としては、hmmlearnがありました。元はscikit-learnの一部だったようですが、独立したモジュールになったようです。その他、Wikipediaの記事、朱鷺の杜Wikiの記事が参考になりました。

Google認証システムに端末を追加した

最近新しいスマートフォンを購入しました。モバイル回線としてIIJmioのファミリーシェアプランを契約しているので、SIMは3枚あります。USBドングル用に使っているSIMをとりあえず差し替えて使ってみることにしました。 自分のスマートフォン利用の一つにGoogle Authenticator(Google認証システム)があります。これは外部のWebサービス(github等)での2要素認証に利用できます。RFC 6238に準拠しているサービスであれば何でも利用できるようです。 自分のスマホ運用は基本2台(音声通話用・データ通信用)なのですが、この機会に2台でGoogle Authenticatorを使いたいため、別途端末を追加する方法を探したのですが、「あとからの追加」というのはできないようです。新規登録であれば同時に複数台登録は可能なようなので、以下の手順をとりました。 github側の2段階認証停止 personal settings ->security 念の為recovery codesを記録しておく Two-factor authenticationをOffにする 旧端末側がらgithubの認証情報を削除 github上で再度2段階認証を有効化する 画面に表示されたQRコードを新旧端末で確認、登録 同程度のタイミングで両端末にgithub上の認証コードを入力 時間切れに注意。切れそうになったら次のコードが出るまで待つ 完了 基本的に常に身に着けているデバイスではありますが、これ以外にも重要なデータ(Chromeのパスワードマネージャー情報など)が入っているものですから紛失などには気をつけましょう。 なお、新しく購入したデバイスはnextbitのrobinです。+Styleで購入しました。

Nexus5の電源周りで故障っぽい挙動と復旧まで

先週末、Google Play版Nexus5が使用不能に陥りました。最終的に復旧できたので、記録を残しておきます。 問題が発生する前の状況 バッテリー残量50%程度 AnkerのUSB充電器に接続して充電マークがついたことを確認 そのまま就寝 不具合の症状 電源が入らない 10〜20秒電源ボタンを長押ししても何も起きない ボリュームボタン両方+電源ボタン長押しも同様 USBケーブルを指しても充電マークが出ない 他の機材に挿して給電できることは確認 対処 Google公式の手順にしたがってみる 純正アダプタ・ケーブルはもはやどれかわからない状態なので、Kindle Fireのものを使って数分充電+電源ボタン長押し→改善せず 充電をPCのUSB端子から10分程度充電、一度ケーブルを抜いたあと1秒ほど待って再度接続→バッテリーアイコンは表示されず 20〜30秒ほど電源ボタンを押して見る、ボリュームボタン+電源ボタンを押して見る→反応なし 再度AnkerからUSBケーブルで充電してみる→ここでなぜかバッテリーアイコンが出現 電源ボタンを長押し→無事起動、この時点でバッテリー残量は60%程度 考察 何がなんだかよくわかりませんでした。問題発生の前後のバッテリー残量を見る限り、完全放電状態になったわけではなさそうです。ブートローダー画面を拝むことは一度もなかったので、その状態に入れたわけでもないです。 特定のバージョンのファームウェアで問題が起きることはあるようですが、これに当たったわけでもないようです。とにかく電源周りをいじりつつ給電したりしなかったりしたらなんとなく復旧したという感じです。 復旧後、速やかにバックアップをとりました。以前はrsync backup for Androidというdropbear+rsyncが動くツールがあったのですが、今はストアから姿をけしているようです。仕方がないのでRoot Explorerでデータフォルダをsmb経由でコピーするという手法をとりました。 追記(2016/08/24) 最近再発して、今度は以下の状況と手順で復帰しました。 状態: 電源が入らない、充電されない 電源ボタン長押し→動作せず PCに接続→動作せず ボリュームボタン+電源ボタン長押し 充電器より充電→充電表示が出る 電源ボタン長押し→起動、この時のバッテリー残量10%程度

Published
Categorized as Android

Recurrent Convolutional Neural Networks for Text Classificationを実装した

RNN/LSTMでテキスト分類をしたいと思い、まず自分でネットワーク構造を考えてみました。word embeddingとLSTMを組み合わせて、単純な和を文章全体のベクトルとして扱うことを考えてみたのですが、これは思うように動きませんでした。さっぱり学習する気配がありません。 そこで既に提案されている手法を探してみると、word embeddingの配列をx軸固定の畳み込み演算するという手法がひとつありました(CNNによるテキスト分類)。TensorFlowでの実装もあったのですが、chainerでできないかと思いmax_poolingでstride=(0, 1)といった感じで指定してみたのですが、chainerではstrideの値が0より大きいことを想定しているため0除算が発生して動かせませんでした。 仕方がないので、もうひとつの手法「Recurrent Convolutional Neural Networks for Text Classification」を試してみました(参考: 研究開発:RNNで文書分類(Text Classification) )。 構造としては、いわゆる双方向RNNで単語の出現順、その逆順の2つの方向からRNN(実際にはLSTM)を使って、それらを結合し単語ごとに一つのベクトルを生成します。そして、すべての単語についてベクトル各要素の中の最大の値を取り出したベクトルを生成します。最大プーリングに相当する処理ですが、chainerのmax_pooling_2dは今回の用途には使えませんでした。代わりに、function.maximumが使えたのでそちらを使っています。 結果として、おおよそ望むような挙動を得られました。目視で分類したネガティブな文章とポシティブな文章とを分類することができました。 ソースコードは https://github.com/knok/rcnn-text-classification にあります。Qiitaにも解説記事を書きました(Recurrent Convolutional NNでテキスト分類)。  

Instagramの画像から食べ物の画像のデータセットを作成

過去の記事で予告した、「画像分類タスクのテストのために作ったデータセット」を公開しました。 https://github.com/knok/instagram-food-images 画像そのものではなく、InstagramのURLへのリンク集という形で公開しています。各自でダウンロードしてご利用ください。再配布可能な画像のみをチョイスするのがより良い方法だったのですが、今回はそこまで手が回りませんでした。 Qiitaにも「画像判別タスク向けの自前データセットを作ってみた」という記事を書いています。そちらにも書きましたが、実際に自分で用意したデータセットをChainerで処理する手順の詳細な記事「PFN発のディープラーニングフレームワークchainerで画像分類をするよ(chainerでニューラルネット1) 」があるので、実際の手順はそちらを参考にするとよいでしょう。 最近はseq2seqをやってみているのですが、これも対話文のデータ収集に苦労しています。togetterを起点に、そこから拾えるスレッドをデータ化するといった作業をしています。 これもある程度自動化できないかと試してみています。公開可能な形にできると良いのですが。

感想「深層強化学習による東方AI」

能登さんが発行された技術系同人誌、「深層強化学習による東方AI」のダウンロード版を入手したので読みました。BoothとGumroadで販売されているおり、特に理由はありませんがGumroadで購入しました。   第13回 博麗神社例大祭で頒布した『深層強化学習による東方AI』のダウンロード版をBooth https://t.co/ZysBlu7LY4 およびGumroad https://t.co/HtgRa44sr6 にて販売しています. pic.twitter.com/7rDT2qG9uq — 何もわからん (@ntddk) 2016年5月8日 東方紺珠伝というシューティングゲームを、深層機械学習によってクリアさせようというものです。 この種の話でまず思い浮かぶのが、八重樫さんによるvArashiです。Linux Conference 2002にて発表された資料(PDF)もあります。今になって資料を見ていると、既に10年以上前の話となってしまって当時とはずいぶん状況が変わっているなあと思います。ビデオ入力はBT848でNTSC出力をキャプチャしていますし、捜査対象は初代Playstationなのでコントローラー操作は単純な電気信号です。 自分自身もこの領域については興味を持っていて、REVIVE USBを組み立てたのもその一環だったりします。今欲しいものはLinuxでも動く、できるだけ遅延の少ないHDMIキャプチャーです。USBカメラでOpenCVをちょこっと触ったりもしました。 しかしながら、近年のゲーミング環境をみると、このような仕組みがあまり歓迎されない状況になってきています。対人要素の強いソーシャルゲームやBOT、RMTといった要素があるので、ある程度は理解できるのですが… この著者のアプローチは画像を入力としている点ではvArashiと同じです。大きく異なるのは、深層強化学習を用いている点です。とはいえ、vArashiも通常のアルゴリズムで記述した部分を深層強化学習での実装にお聞かることは可能ではありそうです。 実際に深層強化学習でゲームをクリアさせるという試みはDeepMindが実現しています(Kotaku Japanの記事)。技術的にはその延長です。この書籍では基礎となるQ学習とニューラルネットワークの要素技術である逆誤差伝搬法、畳込みニューラルネットワーク、LSTMのざっくりとした解説がなされています。 また、東方Project作品をクリアする他の既存実装の紹介もされていまする。中にはDLLインジェクションを行い、ゲーム内の情報を直接参照しているものもあります。5種類紹介されていますが、そのうちの一つは深層学習を用いているそうです(東方ProjectをDeepLearningで攻略した…かった。)。ただ、残念ながら最高難度での1面クリアは達成できなかったとのことでした。 この書籍での手法は、難易度Normalの1面をクリアできたことがツイートで示されています。また、戦果の中で「弾幕ごっこのためだけに生みだされたというのに,並の人間に劣るとはいただけな い.」と書かれています。DeepMindが取り組んでいたもっとシンプルなゲーム郡(スペースインベーダーなど)と比較すれば、東方プロジェクトのゲームは敵弾の数が桁違いに多く、個人的にはそこまで行けることは十分な偉業だと思います。 今後の展望のなかに、人間のプレイヤーの行動を元に学習できないか、という提案があります。「視線追跡デバイスを併用してみるのもよさそうだ.」ともありますが、このアプローチについて大昔のログインで実際にシューティングプレイヤーへアイトラッキングデバイスを装着させた記事があったことを思い出します。 詳細は覚えていないのですが、「不慣れなプレイヤーは主に自機を中心に見ているが、上級プレイヤーは自機の少し先を見ている傾向がある」といった内容だった気がします。1980年台頃の話だったので、さすがにWebなどにその記録は残っていないようです。確か横スクロールのシューティングゲーム(グラディウス?)だったような… 当時は「そんなものか」としか思いませんでしたが、今となってはこの傾向は私個人の経験にはかなり適合しているように思います。特に攻撃を中心とした動きをする場合には視線は主に出現した(あるいはこれから出現する)敵の方向にあります。その場合、自機の位置は感覚的に覚えていて、敵弾については意識はするものの、その移動先が極端に自機に向かない場合を除いて無視します。この心の内部モデルにある自機と敵弾との位置関係にズレがあると、被弾するケースがよくあります。そして「あれ、なんで今死んだんだ?」という感想をいだきます。上手い人ほど、このズレがないのだろうと個人的に思っています。 しかし、比較的速度の遅い敵弾が大量に降ってくる状況、いわゆる弾幕を避けるという場面についてはこの限りではありません。この時は、視点が自機よりになります。ただし完全に自機を見るわけではなく、自機に向かってくる方向の敵弾郡を見ます。そして、一定時間後に敵弾が移動したあとを想像し、その時により広い空間になるであろう場所とそこへの経路を考えます。そして実際に移動しながら同じように次の場面ではどこの空間が広くなるか、ということを考え得るという繰り返しです。 これ以外のケースで行う避け方に、「ちょん避け」と呼ばれるものがあります。これは、高速かつ正確に自機を狙ってくる敵弾が出現する場合に用いる方法で、敵弾が発射されるタイミングにあわせてちょっとだけ移動する、という動きを繰り返すものです。近代のシューティングだと、正確な自機狙いの敵弾と正確な自機の隣を狙った敵弾を交互におり混ぜてくることがあり、両方を避けるためにこのような動きをします。また、完全に画面端まで追い詰められにくくする目的もあります。追い詰められてしまった場合、うまく敵弾を避けられるタイミングで入力を反転させる「切り返し」という操作が必要になります。 このように、 局面によって戦略を変えるという行為はシューティングに限らず、様々な競技で見られます。囲碁もおそらくそうでしょう。AlphaGoの仕組みの話を見聞きした限りでは、単純に現在の局面と、予想される読み手の局面評価を単純に有利・不利で区別しているように感じました。囲碁とシューティングゲームではゲームとしての前提がいろいろ違いますが、アプローチ自体はそう変わりないのかもしれません。 ところで怒首領蜂最大往生の陰蜂は、未だノーコンティニュークリアが出ていないようですね。その存在が明らかになってから、トップシューターレベルの人たちが「これは無理だ」と感じているようなので、7年超でクリア者の出た緋蜂とは違い、本当に人類には攻略不可能かもしれません。これを機械学習でクリア出来たらすごいでしょうね。 最後に、この本はビデオゲームを機械学習でクリアさせてみたい、という人には良い本だと思います。ただし、深層学習については別途専門書を購入する、あるいはAndrew Ng先生のオンラン講座を受ける(日本語字幕付き)のがよいでしょう。