studylog/北の雲

chainer/python/nlp

Chainer1.14以上へのアップグレードで詰まる

久しぶりにchainerをアップグレードしようとしたらうまくいかなかった。

chainer1.8.0→15.0.1
(CUDA7.5、CuDNNv4、Ubuntu14.04、python3.4)

cupy/cuda/cudnn.cpp:8962:675: error: cannot convert ‘void*’ to ‘double’ for argument ‘15’ to ‘cudnnStatus_t cudnnBatchNormalizationBackward(cudnnHandle_t, cudnnBatchNormMode_t, const void*, const void*, cudnnTensorDescriptor_t, const void*, cudnnTensorDescriptor_t, const void*, cudnnTensorDescriptor_t, void*, cudnnTensorDescriptor_t, const void*, void*, void*, double, const void*, const void*)’

13.0まではインストールできるけど14.0以上で上記エラーが出る。
CuDNNのV4を使っていたので最新版のV5.1に上げたらインストールできた。

これで最新のリポジトリに上がってるCuDNN対応RNNが試せる!おしまい。

fastTextのsubword(部分語)の弊害

札幌は1桁まで最低気温が下がってきました。寒いです。

Facebookが開発したfastTextを使ってみました。word2vecっぽくword embeddingをCPU環境で高速に生成してくれます。
github.com

pythonラッパーもありますが生成時に進行状況が表示されないので、生成時は元を使ってそれ以降のembedding利用時にpythonラッパーを使うといいと思います。
日本語で使う場合は分かち書きして半角スペース区切りしておけば大丈夫。

fastTextの一番の特徴としてはsubword(部分語)情報を使っている点でしょうか。

「札幌公園」という単語があったとして、これを「札幌」「幌公」「公園」「札幌公」「幌公園」に分けて、それぞれのベクトルの和を元々の「札幌公園」のベクトルとする、という概念らしい。
未知語や低頻度でもそこそこの精度が出せそう。

元論文
[1607.04606] Enriching Word Vectors with Subword Information
日本語解説
Enriching Word Vectors with Subword Information

低〜中頻度カタカナ語があんまりイケてない

ただ、これだと日本語の場合は主にカタカナ語で問題が生じるっぽい。

■の単語にコサイン類似度で近い意味ベクトルを持つ単語を並べてみました。右側の数字は比較対象の単語との距離(小さい方が近い=意味が似ている)。処理対象はwikipedia日本語版の全記事ページ(2.5GBくらい)、形態素解析mecabデフォルトのmecab-ipadicです。

■ラーニア
グラーニア 0.110071759251
ラーウィーニア 0.199205000797
イオーニア 0.202326828422
マムーニア 0.206659963828
チコーニア 0.207524586709
ゲレーニア 0.208745609686
ポローニア 0.213838900663
ラコーニア 0.217503489063
ラウィーニア 0.217740708759

■オートハイトコントロール
ハイトコントロール 0.0286428025034
アダプティブシフトコントロール 0.0788315688305
クライメートコントロール 0.0833289249448
オートスピードコントロール 0.0900023123386
シンクロレブコントロール 0.0981465376821
レーダークルーズコントロール 0.10443453429
パークディスタンスコントロール 0.107318457674
アクティブスタビリティコントロール 0.108806201904
オーディオリモートコントロールスイッチ 0.109451593292

■ムアンパンガー
ムアンパッタルン 0.109422108154
ムアンラノーン 0.109676683584
ムアンコーンケン 0.111267026516
ムアンサラブリー 0.115317254754
ムアンラムプーン 0.116075613423
ムアンクラビー 0.124810032323
パンガー 0.128222390266
ムアンサムットサーコーン 0.13747850807
ムアンサトゥーン 0.137808885017

なんとなく語感が似ている単語がリストアップされているだけに見える…。
もっとわかりやすい例はティッシュ

ティッシュ
ブリ 0.257772973497
ブリティッシュロック 0.308858462262
ブリティッシュヒルズ 0.312396743261
ブリティッシュ・アンセムズ 0.331879744703
ブリティッシュ・アンビション 0.346499619236
ブリティッシュ・トラッド 0.347967017107
ブリティッシュ・サウンズ 0.348785485835
ブリティッシュビート 0.350252572815
ストーン 0.352235959714

ティッシュとブリティッシュがカタカナだと似すぎているので意味も近くなっちゃってる。
これが英単語だとtissueとBritishだから全然似てない。
でもカタカナにしちゃうとそっくりになるせいで、subword情報を使ったfastTextだと意味ベクトルが近くなる。

これもそう。「〜メモリ」シリーズ。仮面ライダーとITが混在してる。

■ギジメモリ 仮面ライダー
ルナメモリ 仮面ライダー
オンメモリ IT
ファングメモリ 仮面ライダー
メモリバリア IT
バッファメモリ IT
ナスカメモリ 仮面ライダー
メモリ IT
デジメモリ ゲーム?
レジスタードメモリ IT

いずれもそんなに頻繁に登場しない単語だから精度が出ないだけでもっと高頻度単語なら問題は出ないのかもしれないし、wikipediaよりも遥かに大規模なコーパスなら大丈夫なのかもしれません。

手軽に使える

ちなみに500MBコーパスで5年前の4コア8スレッドCPUでも10分かかりません。メモリは1.5GBぐらい確保。
2.5GBコーパスで25分程度で処理終了します。メモリは2~3GBぐらいだったかな。
活用語を落とすなどの前処理をすればもっと高速に終わるはず。
もしメモリが足らなくなる場合は、

  • dim size of word vectors [100]

オプションでdim(意味ベクトルの次元数)を下げてみてください。デフォルトは100です。

おわり。

『Chainerによる実践深層学習』が出版されます

9月9日にChainer本が出るようです。

Chainerによる実践深層学習
新納浩幸
オーム社
売り上げランキング: 2,884

出版社の目次はこちら
Chainerによる実践深層学習 | 理工学専門書,情報科学,知識科学・人工知能 | Ohmsha


目次を簡単にまとめたものはこちら。
1〜2章 Chainerを使う以前の基礎(Numpy、ニューラルネットについて)
3章 Chainerの基礎(Variable・links・optimizersなどの解説)
4章~5章 サンプルやAutoEncoderを実装してChainerを使って動かしてみるとこまで

6章 word2vecを通し、自然言語にNNがどのように使われているかの導入
7章 RNN、LSTM、GRUを使った自然言語への利用(言語モデル=LMも)
8章 Encoder-Decoderで翻訳モデルを構築 Attentionも

9章 画像系に強い他のフレームワークCaffeの学習済みモデルをChainerで使う
10章 GPUの利用(多分インストールするところまでで効率的な使い方の解説とかは無い?)

現在の深層NNの花形であるCNN系への言及が見当たりませんが、そのぶん6〜8章と自然言語まわりにページ数を割いてくれています。
Kerasが日本語ドキュメントを完備した一方でChainerはそういう話が全く無かったので、この本をきっかけにChainer使う人が増えると嬉しいですね。

次期GPUのGTX 1080正式発表(再追記:半精度アクセラレーション対応してなかった)

ついにPascalが正式に発表されました。

単精度8.5〜9TFOPS・メモリ8GB・180Wで価格は$599、北米発売は5/27です。
980Ti(5.6)はもちろんTitanX(6.2)よりもTFLOPS上回ってきました。しかも省電力。

これで$599は安いですね。
日本での実売は85,000〜90,000円ぐらいからでしょうか。
最近の円高を反映してもっと安くしてくれると嬉しいです。

ただ、一番気になっていた半精度のアクセラレーションについての発表は無い模様。
もしこれがついてて半精度18TLOPSとかだったら家にある全GPUを処分して買い替えたんですが…(対応していた模様 下に追記あり)。

ちなみに1070も同時に発表されて6.5TLOPSで$379と、これですらTitanXを上回っています。
現世代のGPUは中古市場でも一気に値崩れを起こしそう。

噂通りのハイスペックで登場したPascal世代。
ディープラーニング用途では一択となりそうです。

再追記(5/23)

残念ながらFP32:FP16の演算性能比は全世代と同じく1:1が確定したようです
一応残しておきますが以下の追記は間違いです。FP16への特別な対応はGP100のみでGP104を採用したGTX1080では未対応。いつか出るかもしれないGTX1080tiとTitanに期待します。

追記(5/8ぐらいに書いたの)

pc.watch.impress.co.jp
Pascalで導入された、FP16の2-way SIMD(Single Instruction, Multiple Data)仕様は、GP104でも引き継がれるだろう。

やった!対応してるっぽい。現世代まではFP32(単精度)でもFP16(半精度)でも計算スループットは同じだったのでFP16で計算するメリットはメモリの帯域以外は無かったはずですが、これが本当ならばFP16はFP32の2倍のスループットになるのでTFLOPSも単純に2倍になってくれるはずです。

FP16の2-way SIMDについてはこっちが少し詳しい。「各ブロック毎に16ユニット相当のFP64性能」の見出しの後からです。

【後藤弘茂のWeekly海外ニュース】倍精度浮動小数点演算性能を引き上げた新GPUアーキテクチャ「Pascal」 - PC Watch

また、Pascalでは、パックドFP16がサポートされた。従来は半精度(FP16)浮動小数点演算は、FP32 CUDAコアで実行され、FP32と同じスループットだった。Maxwell世代なら、1プロセッシングブロック当たり、FP32とFP16ともに、32エレメント/サイクルだった。しかし、Pascalでは、2-wayのSIMD(Single Instruction, Multiple Data)型のFP16がサポートされた。そのため、32個のCUDAコアで、各サイクル32エレメントのFP16演算が可能となっている。
(中略)
FP16は、GPUにとって新しくて古いフォーマットだ。グラフィックスで、整数から浮動小数点に移行する際に、データ量を抑えるためにFP16が導入され、盛んに使われた。グラフィックスでは現在も使われているが、同じくデータ量を抑える目的でディープラーニングにも採用が進んだことから、急に脚光を浴びている。FP16性能は、GPUアーキテクチャの新しい焦点となっている。NVIDIAPascal(パスカル)をディープラーニングに向けて作ったと主張する根拠の大きな部分は、このFP16のサポートにある。

FP32とFP16の学習結果の違い そもともFPって何か

自分はそこまで丁寧に調べた訳じゃないので間違った認識だったらすみません。

3.14159265358979323846264338327950288
こんな風な長い浮動小数点数をどこで打ち切るか。FPが低ければ低いほど桁数短いところで打ち切ります

3.14 (こっちの方がFPが低い)
3.141592653 (こっちの方が高い)

前者より後者の方が精度が高いです。だから半精度(FP16)、単精度(FP32)、倍精度(FP64)と呼ばれている。数字はbit数です。
倍精度は主にスパコンレベルで使われていてディープラーニングでは長らく単精度が主流でしたが、段々と「半精度で十分」という考えが主流になってきているようです。そこまで小数の精度を追求しなくても学習結果に影響は無く、半精度なぶん学習が早く進むのなら長い目で見れば結果的に単精度よりも学習精度は高まるというわけです。

しかし現世代の一般向けのGPUは半精度も単精度も計算速度が同じという致命的な構造のせいで半精度で学習するメリットが薄かったのです。それを次期Pascalさんが解決してくれて、半精度は単精度の2倍の速度で計算可能に。このアーキテクチャスパコン/ガチ向けのTeslaというGPUには既に実装済みでしたが一般向けのGTXには搭載されないんじゃないかと心配していたので一安心。今回発表された1080ではスルーしておそらく半年後ぐらいに出るであろう1080tiとTitanにしか搭載されないのかなあなんて失望してただけにめちゃくちゃ嬉しいです。

手持ちのGPUを全部売る準備を始めたいと思います。長い追記終わり。

シンプルなRNN - MGUとSGU(DSGU)

ようやく北海道も雪が解けて街中を自転車で走り回れるようになりました。あと二週間ぐらいで桜も咲きます。

[1604.02910] Deep Gate Recurrent Neural Network
[1603.09420] Minimal Gated Unit for Recurrent Neural Networks
という二つのRNN関連の論文をGoogle翻訳で斜め読みしました。

RNNの代表格はLSTMで、二番手によりシンプルなGRUがつけていますが、上記で提案された手法はさらに構造をシンプルにする事で可視化などで結果の解釈を容易にしたり学習速度の向上を狙ってるという感じみたいです。

MGUはGRUをさらにMinimalにしてパラメータを減らしたものです。
f:id:kitanokumo:20160415004918p:plain
(上記論文より 上がGRU、下が提案手法)
パラメータが少ないぶん学習速度が速い。
精度はIMDBではMGUが上、Mnistは同等、PTBはGRUが上。PTBだけはハッキリとGRUよりも悪くパラメータの差のわりに実行速度もあまりアドバンテージ無しな模様。


SGU(DSGU)の方の論文を眺めるとSGUが凄いっていうよりも、LSTMがあまりにもイケてない子になってしまっています。以下はIMDBタスク。
f:id:kitanokumo:20160415005416p:plain
(上記論文より)
精度0.75に達するのにLSTMはGRUと比べても10倍近くかかっています。これ本当なのかな。あまりにも悪すぎてちょっと信じがたいです。


MGUは先月、SGUは先日の論文にも関わらずchainer実装は既に作られつつあるようです(会社チャットに論文が流れた65分後にそれを実装したPRがとぶ)。

[WIP] SGU and DSGU by unnonouno · Pull Request #1115 · pfnet/chainer · GitHub
[WIP] Implement MGU by unnonouno · Pull Request #1101 · pfnet/chainer · GitHub

おしまい。

TensorFlow強い

GoogleがCloud Machine Learningというインパクトのあるものを出してきました。TensorFlowが登場したときからある程度は予想されていたサービスですが思った以上に登場が早かった。

TensorFlowの強みは2つあると思っています。

1つ目はGoogle発ということで開発者/使う人の数が他のライブラリとは桁違いな点。
使ってる人が多ければ多いほどwebに公開されるコードの数が増えて、気軽に新しいアルゴリズム/論文を試せるようになり、それがさらに呼び水となって新しく使いだす人が増えるという好循環に。自分ではスクラッチでコードを書けないので人の書いたのを弄って使いたい、という層にも嬉しい環境です。

2つ目はGPU分散学習への対応が楽な点。
元々これが売りというか目的だったんでしょうが、今回発表されたGoogleクラウドインフラとのシームレスな結合が加わったことでさらに強くなった気がします。ビッグデータ/Hadoopブームで一気にクラウド活用が進んだように、機械学習・ディープラーニングも手元のローカルマシンのGPUではなくてクラウド上にある大量のGPUで学習するのが当たり前になっていくんでしょうか。

今後DLライブラリはどうなっていくんでしょう。一つ強いライブラリがあって、他のがそれを補完するような関係がベストかなと個人的には思います。3強みたいな状態になって人的リソースや(ライブラリの)学習コストが分散しちゃうのはもったいない。TensorFlowが中心で次にChainerみたくなって欲しいところですが、KerasのようにバックエンドにTensorFlowを使いだした(元々はTheano)ライブラリの動向も気になります。

自分としてはもう他のライブラリの使い方を勉強したくないのでChainerを使い続ける予定です。

次期GPUのPascalの詳細な情報が出てきた

現行のMaxwell世代から今年登場するPascal世代へとパワーアップするNvidiaGPUの詳細な(噂)情報が出てきました。低火力ディープラーニング愛好家にとっては気になるところです。

スペック表

Nvidia GeForce X80 and X80 Ti Pascal Specs?

表の左2つのモデルは既に発売されているMaxwell世代のもの、そして右の3つがこれから登場するであろうPascal世代の「予測」スペックです。演算性能を一番端的に表す「単精度TFLOPS(表だと水色で強調されてる)」を見ても分かる通り現行最強のTitanを、次世代のラインナップではハイエンドではないX80が上回っています。

X80は現行品でいえば980というモデル(表には無い)に該当するんですが今の価格は6万円台です。

MSI GTX 980 GAMING 4G グラフィックスボード VD5504 GTX 980 GAMING 4G
MSI COMPUTER (2014-10-14)
売り上げランキング: 4,132
現行のハイエンドモデルTitanXは15万円近くすることを考えると980の位置づけがどんなもんかわかってもらえると思います。その980と同じ位置づけに該当するX80がいくらぐらいで登場するのか楽しみですね。

また注目点すべき点として次期Titanのメモリ性能が他のモデルと比べてもダントツです。メモリの規格が従来のGDDR5ではなくHBM2という新規格を採用しているためで、これのおかげでディープラーニング演算性能がさらに底上げされることが期待されています。お高いんでしょうねえ…。

半精度のアクセラレーション

さらに個人的に期待しているのはこちらの記事に書かれているように半精度専用のアクセラレーションが搭載されるのではないかという点。chainer使ってるとnumpyでデータ作るときにdtype=float32と指定しないといけないですよね。この32ってのは32bit精度という意味で、

  • 64=倍精度
  • 32=単精度(これが一般的にGPU演算性能を測る指標になっている)
  • 16=半精度

と呼ばれています。64bitの倍精度はスパコンなどで主に使われるのでしょうか。ディープラーニングには倍精度は必要無くて単精度で十分らしいですが、さらに精度を落として半精度でも問題ないんじゃないかという考え方もあるようです。

精度を落とせばそれだけ小数の桁数が深くなればなるほどいい加減になるので演算結果に悪影響を及ぼしますが、ディープラーニングの場合はそこまで詳細な精度が無くても致命的な悪影響とはならず、精度を落とす事で演算速度が上がればそれだけ学習回数を増やせるので結果的にお得なんじゃないか、と自分は理解しています。

とはいえ、現行のMaxwell世代の一般的なGPUでは半精度だろうが単精度だろうが単精度の演算器を使うので、どちらも計算速度は変わらないらしいです。そこで期待されるのがPascal世代に搭載される事が期待されている半精度専用のアクセラレーションです。大雑把に言うと一つの単精度の演算器で半精度の計算を同時に二つこなせる、みたいな感じ。これなら半精度でやれば2倍の速度で計算できることになります。メモリの帯域も削減できますし、いいことづくめのように思われます。

X80の発売時期は6月頃か、その後X80TiとTitan

5~6月が予想されていますがここはあんまりあてにしてません。今年2月の台湾地震によって製造元が多少ダメージを受けたようで全体的にスケジュールが遅れ気味だそうです。で、最初に発売されるのはX80が有力視されています。スペックを考えると現行970以下はそこまで価格の影響を受けませんが、980~980Tiあたりは一気に値下がりしちゃうような気がします、特に980Ti。現行TitanXはメモリが12GBと巨大なので次期ハイエンドが出るまではそこまで下がらないか。手持ち中古を売って買い替える場合はこのあたりに留意する必要がありそうです。自分のは980Tiなので早めに売っちゃう事を検討してます。

上位モデルのX80TiとTitanはさらに遅くなりそうな気配です。もしかしたら一般的なモデルは今年中に店頭に並ばないんじゃないかという観測もあるようなので当分はX80で遊ぶ事になりそうです。