ここのところ、画像処理関連をやってみています。 以前pix2pixをいじっていましたが、そこでも使われているGANs(Generative Adverarial Networks)という技術を、なにかしら自分の趣味の範囲で利用できないかなあと試してみています。 初期に提案されたDCGANは非常に衝撃的だったのですが、いかんせんハイパーパラメータのチューニングがシビアでした。学習がうまくいかないとmode collapseという現象を起こし、まったく意味不明な画像しか生成できなくなります。 この辺りの数理的理解が進んできて、mode collapseを起こしにくい新しい手法が提案されています。 chainer-gan-libという、Chainer開発元であるPreferred Networkが複数種類のGANsを実装、公開しています。主にこちらを使って画像生成を試してみています。 https://github.com/pfnet-research/chainer-gan-lib フレンズ画像を生成させてみたい-画像収集編+DCGAN フレンズ画像を生成させてみたい-画像収集編(2) wiki, twitter ただ、やはり少ない画像数でこれを行うことは難しいなあというのが実際やってみての感触です。 GANsでは生成器と識別器、2つのネットワークを交互に学習します。生成器はある分布に従う潜在変数の存在を仮定し、そこからサンプリングした乱数から画像を生成します。識別器は、生成器が生成した画像群を負例、訓練用に用意した画像を正例としてそれらを正しく分類するようなネットワークです。 生成器と識別器を交互に学習させることで、生成器は識別器の正例群が持つ画像の特徴を捉えた画像を生成できるようになる、というのがGANsの大まかな仕組みです。生成器と識別器はそれぞれ反対方向の目的関数に向かって最適化されるので、最終的にお互いの訓練誤差が均衡した状態が理想となります。 正例の画像があまりに少ないと、識別器の損失(誤差)がかなり小さな値にとどまってしまい、生成器は正例の画像をほぼそのまま覚えてしまうようです。つまるところ、「十分な数のデータがないと特徴を正しく捉えられない」というある種当たり前の結論に至りました。 人間だったら少ないサンプルからそれっぽいことが学習できるんですけどねえ…と思ったところでGANsの転移学習はできないのか、ということをこれを書きながら思いました。 何かしらの画像をうまく生成できるだけのモデルを予め学習させておき、それをベースにfine tuningすればもう少しマシな結果が出るのでは、という予想です。 これは一度試して見る価値はあるかもしれませんね…そのモデルを学習させるためのデータをどうやって用意するか、という課題はありますけど。
uim 1:1.8.6+gh20161003.0.d63dadd-6
unstableのuimを更新しました。以下の2つのRC bugを修正してあります。 #877476 – libuim-dev: copyright file missing after upgrade (policy 12.5) #877632 – uim: /var/lib/uim/ directory has been deleted after apt-get upgrade with –purge option 前者の問題は、いくつかのパッケージ統合作業を行った時に、libuim-devのドキュメントをsymlinkに変えたことがトリガで発生した問題です。postinstで以下の処理を追加しました。これにより、symlinkが必要に応じて生成されます。 後者の問題は 、uimバイナリパッケージに/var/lib/uimのみを所属させていたのがトリガです。パッケージ統合作業の時にlibuim-dataを廃止したのですが、このパッケージのpostrmではpurge時に”rmdir –ignore-fail-on-non-empty”を呼び出して/var/lib/uimを削除しようとします。uimパッケージに所属しているのはディレクトリのみなので、ここで削除されてしまうというわけです。 こちらの対処としては、/var/lib/uim/READMEを用意してディレクトリを空にしないという方向で解決しました。同様の処置をしているパッケージは他にもあるので、対処としては間違ってないと思います。多分。
テキスト分類をDNNでやってみて思うところ
以前このような記事を書きました。 Recurrent Convolutional Neural Networks for Text Classificationを実装した 複数の単語から構成される文章を、Bag-of-Wordsと対応する単語分散ベクトルで表現し、特徴ベクトルの最大値のみを抽出する、という感じの手法です。 これの実装を書いた時はまだあんまり機械学習のことがよくわかっていなく(今もよくわかっていませんが)、それでも実験的、感覚的に「この手法は特に単語が増えると精度でないだろうな」と思っていました。 なので、その後畳み込みネットワークベースの手法を試しています。他の人が書いたChainer実装は既にあったので、自分はそれの最上層をSPP-Netに置き換えただけのものを試しています。 ichiroex/chainer-cnn: convolutional neural network for sentence classification by Chainer (オリジナル実装) https://github.com/knok/chainer-cnn (そのfork) 畳み込み(CNN)とSpatial Pyramid Pooling(SPP-net)を使ってテキスト分類 – Qiita (解説記事) 基本的に、こちらのほうが特徴量をより多く捉えているはず(層の数とか種類とかから類推)なので、きっと性能は高いと思います(未検証)。そこは同じテータセットを使ってちゃんと試したいところですが、GPUの空き時間ができたらということで… そんなわけでRecurrent CNN(RCNNはRegions with CNNと混同しやすい略称なのでこう記述します)は「自分も論文だけ見て実装することはできたので満足。だけど手法としてはいまいちっぽいよね」という気分でいました。 ふと先日この記事が目に飛び込んできました。 AIで2chに悪口書いてる人を特定してみた。 – ちょいちょいブログ ちょっと過大に扱われてしまったのではないかと思い、この記事を書いています。 分類結果の出力 自分の実装では評価時に最終出力として、全層結合層(Fully Connection layer)の値を生のまま出しています。実際にはこれにソフトマックス関数をかませて0〜1の確率値に整えるべきなのですが、そこをちょっとさぼっています。 ともかく、ソフトマックス関数で計算される分類タスクの出力は、全ラベルそれぞれの確率の合計が1になるよう調整されます。 Recurrent CNNでは分散表現の実数をそのまま加算するため、全体としては大きな値になりがちでです。その辺りの正規化が皆無なので、おそらく文章が長くなるほどあやしい挙動を示すでしょう。 分散表現獲得 また、分散表現の獲得もあまりよろしくない作りになっていると思います。乱数を初期値とし、逆誤差伝搬で各文字の分散表現を獲得しています。 十分なデータ量がないと、適切な分散表現は獲得できないと思います。代わりに、例えば一般的な表現が多数出現するデータ量の多いコーパス(Wikipediaの記事、新聞記事など)から、word2vec等で獲得した分散表現を初期値に設定してやる、といったことで性能が向上する可能性があります。 2017/8/30 追記: 今回のケースだとWikipediaよりも2chの各種書き込み、Twitterのツイートから分散表現を事前訓練したほうが良い気がしてきました。 「その他」というラベルの扱いの難しさ MNIST, ImageNet, CIFAR10等誰もが入手できるデータセットは非常に限られた分類のデータしかありません。それらを識別するモデルを用意したとして、まったく関係ないデータを与えると、識別器は無理やり何かしらの値を出力します。運が良ければ何かしらの要素が似ているものへの確率が高く出ますが、最悪まったく関係ないラベルだと推論してしまいます。 これを回避するために、たとえば雑多なデータをたくさん用意して「その他」ラベルを作るという解決方法がありますが、これも一筋縄ではいきません。… Continue reading テキスト分類をDNNでやってみて思うところ
猫の線画を着色させたい
ちょっと前に「猫の線画を書くと自動着色できる」というWeb上のデモが話題になりました。 Image-to-Image Demo – Affine Layer (web) [1611.07004] Image-to-Image Translation with Conditional Adversarial Networks (元論文) phillipi/pix2pix: Image-to-image translation with conditional adversarial nets (著者によるTorch実装) affinelayer/pix2pix-tensorflow: Tensorflow port of Image-to-Image Translation with Conditional Adversarial Nets 他複数のフレームワークによる実装あり ニュース記事 線画の猫をリアルにしてくれるWebツールが登場 夢に出てきそうな猫ちゃんが生み出される – ねとらぼ 手書きの「絵」から本物そっくりの「写真」を作るアプリがすごい―でも失敗すると… [インターネットコム] 他いろいろ 著者は、このデモに関するデータセットをいくつか公開してくれていますが、この妙に話題になった「猫画像の変換」に必要なデータセットのみ配布をしていません。 なんとか自分でも再現したいと思い、いろいろとトライしてようやく結果を出せそうなところまできました。 データ収集 まず猫画像の収集をやりました。最初はWikipediaからの取得を考えていたのですが、現在Wikipediaが用意しているダンプに画像ファイルは含まれておらず、そもそも画像に関してはWikipedia標準のライセンスであるとは限らないと公式に書かれていました。 しかたなく、Google画像検索でライセンスを「商用を含めた二次利用許可」に絞って探していたら、やたらPixabayというサイトの画像が出てくるのでよくよく調べてみると、なんとこのサイトはすべてCC0(public domain)ということなので、ここから画像を集めました。画像URLのリストをgithubで公開しています。 https://github.com/knok/pixabay-cat-images データ分類 Pixabayの検索結果には実際には猫ではない画像も割と混じっているので、ChainerCVの事前学習モデルを使ってある程度自動分類してから、手動でpix2pixに使えそうな画像を選別しました。 ChainerCVを用いて猫画像を分類する – Qiita 猫部分の抽出 集めた画像には背景が含まれています。これを除去する作業を最初はgimpやAndroidアプリを使って手動でやっていたのですが、なかなか大変なので自動で行うアプローチを模索し、セマンティックセグメンテーションを用いておおよそ望みの結果が得られました。 猫画像から猫部分のみを抽出する(matting/semantig segmentation) –… Continue reading 猫の線画を着色させたい
pdnsdからdnsmasqに移行
最近自宅の光回線が非常に遅い状況だったので、改善を試みました。そのついでに、ローカルのキャッシュDNSサーバーをpdnsdからdnsmasqに変更しました。 単にIPoEでnative IPv6を導入し、DS-Liteの設定をしただけなのですが、ローカルのDNSキャッシュサーバーのフォワード先をIPv6にしたかったのです。それでいてなおかつ、/etc/hostsの内容もみてくれるものを、ということでdnsmasqにしました。 apt-getでパッケージを入れて、/etc/dnsmasq.d/local.confというファイルを新規作成して、内容を以下のようにしました。 localhostとローカル側のIPでlistenするようにし、フォワード先の設定が書かれたファイルを記述しているだけです。 自分が使っているISPはv4のDNSキャッシュサーバーだとAAAAフィルタがかかっているので、それをv6に変えたことでnative v6も扱えるようになりました。 一点注意が必要だったのは、apt-get install dnsmasqだけしても他のdnsサーバーパッケージはremoveされないというところです。おかげでport 53を他のサーバーが掴んだままでdnsmasqが起動できない、という状態に陥りました。 一応今はPPPoEも併用して、IPv4側のglobal addressから接続できる状態を意地できるよう、ポリシールーティングを設定しています。DS-Liteだけだとv4で繋げるすべがないので… DS-Liteのおかげで、通信速度は17Mbps前後だったものが70Mbps程度でるようになりました。
gnu.org日本語翻訳ミーティング参加
先日、「www.gnu.orgの日本語訳について」のミーティングに参加してきました。最近のFSIJ月例会はMumbleを用いたリモート開催を増やしているので、リアルミーティングは久しぶりです。 当日の配布資料はhttp://git.savannah.gnu.org/cgit/www-ja.git/tree/doc/meeting-2017-01.txtにあります。そちらにもgnu.org翻訳作業への参加方法が書かれていますが、興味のある方はSavannahのwww-jaプロジェクトのメーリングリスト(閲覧は要登録)や、gitリポジトリの参照(こちらはanonymous clone可能 git://git.savannah.gnu.org/www-ja.git)も見てみてください。 個人的な活動 – 機械翻訳 私はこの1年ろくな活動ができていなくて申し訳なかったのですが、以前から考えていた「www-jaをコーパスとして機械学習による翻訳モデルを構築する」という活動に手をつけ始めました。TensorFlowのseq2seqサンプルを若干修正してWMTの代わりに任意のテキストファイルを与えられるようにしたコードは以前作成した(https://github.com/knok/tf-seq2seq-mod)ので、あとはデータセットを作成するだけです。 まずは以下のようなPython scriptを作ってみました。Python2, polib, natto-pyで動きます。 以下のような感じで実行しています。 残念ながら利用可能なGPUを持っていないので、CPU演算のみで処理しています。今のところDebianで深層学習フレームワークがtesting(stretch)入りしているのはCaffe, Theanoの2つだけで、TensorFlowや自分がよく使っているChainerは入っていません。まあこのあたりはupstreamの更新も頻繁なので、あえてパッケージを使わなくともvirtualenv+pipで適時入れるほうが良い気もします。 とはいえ、GPUを使って深層学習を行うということは、ほとんどの場合プロプライエタリなソフトウェアに依存することと等価なので、「gnu.orgの翻訳」ということに限ればむしろCPUのみでの処理の方が望ましいのかもしれません。 自由なコンピューティング 実際、ミーティング当日も自由なコンピューティング環境がより一層損なわれているという話がありました。gniibeさんはChromebookにLibrebootを苦労して入れているようです。 自分もここ数日いろいろとひどい目にあいました。Xbox 360のSmartGlassを使ってみようとしたのですが、Windows 8.1の場合Xbox 360で利用しているLiveアカウントとの関連付けをWindows自身のログインアカウントと紐付けないと利用できないのです。Windows 8以降、Microsoftは極力Liveアカウントでのログインをさせるよう誘導しているのですが、8.1(とおそらく8)でそれが強制されるというのは厳しく、利用を諦めました。ただ、Windows 10ではこの点は改善されているようで、SmartGlassを含むストアアプリはアプリ単位で個別に利用するLiveアカウントを設定したり、そもそもLiveアカウントの必要ないアプリは普通にローカルアカウントのまま利用できるようになっていました。なので、Windows 10マシンでSmartGlassを利用しています。 iPhone, Android端末なども実質iCloud, googleアカウントが必須に近い状態ですが、Windowsも同様の仕組みに倒しているわけで、自由からより通い方向に進んでいるなあと痛感しました。 メンテナ不在問題 現在メンテナが不在なGNU Projectのソフトウェアについていくつか名前が挙げられました。 一つはGNU bisonです。これは割と致命的な気がしたのですが、GCCは4以降独自パーサ(gniibeさんによると、そもそもC++が自由文脈文法でないため)を採用しているとのことなので、案外問題は少ないのかもしれません。メジャーな言語処理系でもbison(yacc)必須なものがぱっと浮かびませんし。 もうひとつはGNUbikだそうです。うーん、これは重要でもないですかね。
GPD Winを購入
ゲーム向け小型PCという触れ込みのGPD Winを購入しました。実際には昨年末頃に届いていたのですが、あまり設定が完了していません。この手の小型PCを購入するのは、VAIO Type U以来です。 今回購入するにあたり、Amazon, AliExpressなど選択肢は複数あったのですが、geekbyingを利用しました。Amazonよりは安かったことと、実際にgeekbyingで購入した人のblog記事を見かけたのが選択の理由です。 購入時の入力フォームが日本語だったため、「住所も日本語で書いたほうがいいのかな?」と思い日本語で一通り書いてフォームを送信したところ、数日してgeekbyingから「英語での住所を教えてくれ」というメールがきました。幸いにしてSPF, DKIMが適切だったので、フィッシングではなかろうという判断をして返信を行い、最終的には無事製品が届きました。タイムラインは以下のような感じです。 2016/11/29 webからオーダーを実施 2016/11/29 $329.00 USDの決済がPayPalで発生 2016/11/30 住所の英語表記を求めるメール受信 2016/12/01 メールの返信 2016/12/10 発送の連絡メール受信 (到着に15~30営業日必要と記載) 2016/12/24 自宅に不在連絡票が届く 2016/12/27 再配達の手配をし受領 現状Windows10のまま使っていますが、USBメモリにDebianを入れてそちらからも起動できるようにしようと思っています。少なくともmulti-arch(i386/amd64) stretch alpha8の起動はできたのでインストールも問題はないと思われます。個々のデバイス認識に関しては調査が必要そうですが。 ゲーム機としての利用を考えていたので、Steamクライアントもインストールした状態です。少なくとも、以下のゲームは普通にプレイできています。 DoDonPachi Resurrection (怒首領蜂 大復活) DARIUSBURST Chronicle Saviours Skyrim (Special Editionではない方) Skyrim Special Editionは実行バイナリが64bit化された点と、GPU用のメモリをメインメモリ4GBから割り当てる点が厳しいようで、自分の手元では正常に動作しませんでした。 Native Debianを動かした時にどれぐらいのパフォーマンスが出るのかは気になるところなので、その環境の整備を進めたいと思っています。
Mini Debian Conference Japan 2016参加
2016/12/10に開催されたMini Debian Conference Japan 2016に参加してきました。場所は日本橋のサイボウズオフィス内で、LibreOffice Kaigi 2016と同時開催でした。自分も一応両方に参加するつもりで申し込みも両方にしたのですが、結果としてDebian側の話ばかり聞いていました。 その時の様子はハッシュタグ#debianjpでツイッターを検索するとある程度様子が伺えると思います。自分が参加しているセッションについてはある程度ツイートしています。せっかくなのでMomentsを使ってみようかと思ったのですが、全部のツイートが出てこない上に時系列に並んでいない、並び替えはすべて手動という使い勝手の悪いインターフェースで断念しました。 個人的には音響モデルを含めて自由ソフトウェア実装として作ったバーチャルシンガー徵音梅林(ちおんメイリン)に最もインパクトを受けました。発表は台湾の張正一(Chou Shouichi)さんでした。 発表資料の中でも触れられていましたが、クリプトン・フィーチャーの商用ソフトウェアであるVOCALOIDは作成できる内容に制限があります。初音ミクのEULA(PDF)にありますが、公序良俗に反するなどの歌詞を含めることを禁止しています。現実にはそういった内容のものが作成、公開されているのですが、規約レベルではアウトです。張さんは、ギターを燃やすパフォーマンスの写真などを交えて「音楽活動は自由であるべきだ」と主張されていました。これには強く同意します。 ソフトウェアのベースはWORLD(修正BSDライセンス)というパテントフリーなものを使っているとのことでした。音響モデルもマスコットキャラクターもCC-BY 3.0で配布しています。 残念ながら、まだフロントエンドについては実装がこなれていないようです。デモではWineでVOCALOIDのエディタを利用されていました。まだ日本で利用している例はほとんどなさそうですが、頑張って欲しいと思います。
自作辞書のブートストラップを考える
かな漢字変換や形態素解析といった処理を行うにあたって、辞書は必要不可欠な存在です。これを一から自作することを考えています。 適切な単語のリストの作成 単語に対する読み、品詞の追加 単語に対するコスト値の算出 データソースはWikipediaを使う こんな感じでおそらくはできるでしょう。時間はかかると思うので、ゆっくり考えていくつもりです。 今はまず教師なし機械学習による単語分割を使って、単語リストを作ることを試みています。これについては階層Pitman-Yor過程に基づく可変長n-gram言語モデル(VPYLM)の実装が複数あり、それを使うことである程度下処理ができます。 latticelm C++/OpenFSTによる実装 vpylml-python C++/Pythonによる実装 (解説記事) Wikipediaの記事はhttps://dumps.wikimedia.org/jawiki/からダウンロードできます。本文のダンプはjawiki-latest-pages-articles.xml.bz2というファイル名です。これをWikipedia ExtractorというPythonスクリプトでプレーンテキストに変換できます。変換時に警告が出ますが、それはたいてい自己参照に関するものなので、放っておいても大丈夫そうです。 さしあたって、展開ディレクトリ/AA/wiki_00を対象にlatticelmをデフォルトパラメータで実施したところ、以下のような感じになりました。 ちょっと分割されすぎですね…ハイパーパラメータはいろいろとあるので、チューニングはいろいろと必要そうではあります。他に試された人の解説によると、初期状態がすべて分割されている点が大きいとのことです。 以前の記事で紹介した「続・わかりやすいパターン認識 教師なし学習入門」には通常のPitman-Yor過程までは解説されており、VPYMLに関してはなんとなくでしか理解出来ていません。もう少し自分の理解も深めたいところです。 単語分割自体は系列ラベル問題とみなしてRecurrent Neural Networkベースで処理することも出来るそうですが、教師あり学習なのできちんとしたデータセットを作る必要があります。そこにたどり着くまでのところを、教師なし学習との組み合わせでなんとか実現したいところです。
IIJmioファミリーシェアプランに追加する形でDoCoMo SIMから転入
個人的にIIJmioタイプDファミリーシェアプランを一人で使っていたのですが、音声用に長年DoCoMoの契約を続けていました。ちょうど更新月に入ったのでこの機会にMNP転出することにしました。ファミリーシェアプランが追加のSIMを頼めるようになっていたので、MNPの転出先としてそちらを選んでみました。この時どのメニューから選択すると正しく申し込めるのかが分かりづらかったので記録しておきます。 会員専用ページ(https://www.iijmio.jp/member/)の「SIMカード追加」(https://www.iijmio.jp/service/setup/hdd/addsim/confirm.do)を選択 遷移したページでサービスコードがファミリーシェアプランになっていることを確認 SIMカードの追加を選択 機能から「音声通話機能つき」を選択 「MNP転入」という項目が選べるようになるので選択 MNP転入に必要な情報を入力 会員トップページの「ご購入お申し込み」から選択してしまうと新規プラン追加になってしまうので、気をつける必要がありました。 今後MNPする機会はそうそう無いとは思いますが、忘れないよう記録しておきます。 そもそもDoCoMo FOMA以前はNTTパーソナルのPHSをずっと使っていたのですが、2004年あたりで「端末料金3万円OFF」と引き換えに乗り換えを行いました。当時5万円程度したモトローラM1000を2万円程度で購入できたのですが、電話番号を変える作業は結構大変でした。今思えば、もっと粘ればPHSからのMNPができたのでそのほうが楽だったかもしれません。