サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
アメリカ大統領選
studylog.hateblo.jp
TensorFlowをバックエンドとして使用しており、Python製DeepLearningライブラリとしては頭5つぐらい抜け出している感じのあったKerasですが、TensorFlow本体に取り込まれる?動きがあるようです。TensorFlow/Keras人気はさらに加速して他のライブラリを寄せ付けないでしょう。 自分が使いやすいライブラリを使えばいいと思いますし各ライブラリごとにいい所はあるので多様性万歳ではあるんですが、TensorFlow本体にKeras由来の使いやすいAPIが統合されちゃうと、DeepLearningライブラリのシェア争いという観点ではほぼ勝負あったかなという感じがします。 以下ソースなど。fcholletさんはKerasの開発者でGoogleにお勤めの人です。 @rbhar90 @tensorflow we will be integrating Keras (
という事を痛切に悟りました。無理・無茶です。2015に出たLSTMとかCNNの教科書的の段階ならば、自分みたいな人間でも頑張って青本読んでも何とか理解できました。でもそのレベルでは特に自然言語処理関係であまり実用的なモノは作れません。LSTMで言語モデル作って文章出力して「知性!(実際はワードサラダ)」とか言ってた牧歌的な時代はもうとうの昔に過ぎ去りました。数学的バックグラウンドが無いと最新論文見ても何がなんだかわかりません。論文を簡単に説明してくれているブログ記事を読んでも理解できなくなってきました。片手間では無理ですね。 理論を理解するのは諦めて、他の人の成果物(論文)を誰かがコード実装してくれてそれを使ってなんかやるっていう方向性に特化しないと全部中途半端になっちゃうでしょう。最低限CNNの畳み込み・フィルタとかDropoutとかそのレベルぐらいまでは理解しないと誰かが書いたコードす
今年も終わってしまいますね。今年の札幌の冬は強烈に寒そうで豪雪っぽいです。去年一昨年と生温い冬だったので久々に冬将軍炸裂って感じです。 去年(2015)の6月頃からChainerを通してDeepLearningを触りだし、このブログもわりと更新してきましたが、今年中盤以降は更新頻度がかなり落ちました。元々仕事でやってるわけではないですし、仕事とは無縁の世界ですし、何より数学的素養が無い人間が学ぶには敷居が高すぎます。まあ興味が薄れつつあります。そんな自分なりの観測範囲で今年を振り返ってみようと思います。 DNN系プログラミング和書が激増 増えましたねえ。2015年はいわゆる青本(深層学習 (機械学習プロフェッショナルシリーズ))など何冊かDNN本が出ましたが、いずれも数学的な見地から書かれた書籍なので数式多めでコードが出てこない。でも今年はゼロから作るDeep Learning ―Pyth
去年書いたサンプルコード集の2016年版です。 個人的な興味範囲のみ集めているので網羅的では無いとは思います。 基本的に上の方が新しいコードです。 QRNN(Quasi-Recurrent Neural Networks) 論文ではchainerを使って実験しており、普通のLSTMはもちろんcuDNNを使ったLSTMよりも高速らしい。 一番下にchainer実装コードが埋め込まれている。 New neural network building block allows faster and more accurate text understanding [1611.01576] Quasi-Recurrent Neural Networks Softmaxなどに要している時間を除き純粋にRNN部だけで比較すると相当速くなっているのがわかる。 このように実験でchainerが使われている研
16.0の新機能NstepLSTMはcuDNN5.0以降で最適化されたcuDNN-RNNを利用できます。速くなるらしいです。 Optimizing Recurrent Neural Networks in cuDNN 5 | Parallel Forall これの良い所は次元数が合わないデータでもミニバッチ処理が簡単にできる点です。 再掲しますが以前はこんな風にやっていました。 可変長データのミニバッチをchainerのwhereでやる - studylog/北の雲 以前のやり方 手順1(次元が合ってない) データA 1 2 データB 1 2 3 手順2(0で末尾を埋めて次元を合わせる) データA 1 2 0 0 データB 1 2 3 0 手順3(転置) A B 1 1 2 2 0 3 0 0 手順4-1(入力する) 1 1 ←最初はここが入力(x) 2 2 ←最初はここが正解データ(t)
mecabの辞書はほぼneologdに切り替えて使っているのだけど、久しぶりにCaboChaをpythonから使おうとしたら辞書の指定の仕方がわからなかったのでメモ。 #デフォルト辞書を使う時 cabocha = CaboCha.Parser("") #辞書指定する場合はこう(ディレクトリは各々の環境に変えてください) cabocha = CaboCha.Parser("-d /usr/lib/mecab/dic/mecab-ipadic-neologd") #解析 tree = cabocha.parse("北海道札幌市中央区") デフォルト辞書だと 北海道 / 札幌 / 市 / 中央 / 区 neologdだと 北海道 / 札幌市中央区 と辞書を切り替えられていたことを確認。 タイトルと関係はないけれど結果treeのパースはこちらを参考。 shogo82148.github.io おわ
低火力ディープラーニングにつきまとう問題として第一にGPUのメモリ問題がある。 個人で用意できるレベルのハードではとにかく足りない。 以下言語モデル構築の話。 wikipediaの1/50コーパスをneologdで分かち書きしたときに語彙は25万ぐらい。 これを全部語彙として採用してChainerのEmbedに投げると6G~8GクラスのGPUだとメモリ不足で学習できない。 なので低頻度語として一部を切り捨てる必要がある。 仮に10万を語彙として採用し、それ以外の15万は低頻度として切り捨ててそれらを「低頻度単語(<低頻度>)」としてEmbedに専用のIDを一つ付与して学習すると、文出力の時にこうなる。 これによって<低頻度>の<低頻度>な<低頻度>を<低頻度>、<低頻度>の<低頻度>に<低頻度>をつけた。 おぉ…。 一つ一つは低頻度でも、ちりも積もればエベレストに。 普通の名詞や動詞が全く
札幌は1桁まで最低気温が下がってきました。寒いです。 Facebookが開発したfastTextを使ってみました。word2vecっぽくword embeddingをCPU環境で高速に生成してくれます。 github.com pythonラッパーもありますが生成時に進行状況が表示されないので、生成時は元を使ってそれ以降のembedding利用時にpythonラッパーを使うといいと思います。 日本語で使う場合は分かち書きして半角スペース区切りしておけば大丈夫。 fastTextの一番の特徴としてはsubword(部分語)情報を使っている点でしょうか。 「札幌公園」という単語があったとして、これを「札幌」「幌公」「公園」「札幌公」「幌公園」に分けて、それぞれのベクトルの和を元々の「札幌公園」のベクトルとする、という概念らしい。 未知語や低頻度でもそこそこの精度が出せそう。 元論文 [1607.
ついに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は中古市場でも一気に値崩れを起こしそう。 噂通りのハイスペックで登場したP
以前にもちょこっと書いたのだけど、自然言語はたいてい次元(単語数、文字数など)が合わない。 データA 1 2 データB 1 2 3 こんな感じで次元が合っていないデータをミニバッチで学習したい。 末尾をEOSで埋めてミニバッチ 可変長のミニバッチの時に末尾をEOSで埋めてそのまま学習するとまずいのでwhereを使うといいらしい。以前から挑戦していたのだけれどもなかなかうまくいかず、先日ようやく中の人にtwitterで教えてもらって出来ました。 まず末尾を0や-1など特殊なもので埋めて次元を固定する。仮に0をEOSに該当するIDだとしたらこのように埋められる。これでAもBも4次元で揃った。 データA 1 2 0 0 データB 1 2 3 0 転置(numpyの.T)したらそのまま入力に使える形式になってくれる。 A B 1 1 2 2 0 3 0 0 実際のコードだとこう。 a = nump
ようやく北海道も雪が解けて街中を自転車で走り回れるようになりました。あと二週間ぐらいで桜も咲きます。 [1604.02910] Deep Gate Recurrent Neural Network [1603.09420] Minimal Gated Unit for Recurrent Neural Networks という二つのRNN関連の論文をGoogle翻訳で斜め読みしました。 RNNの代表格はLSTMで、二番手によりシンプルなGRUがつけていますが、上記で提案された手法はさらに構造をシンプルにする事で可視化などで結果の解釈を容易にしたり学習速度の向上を狙ってるという感じみたいです。 MGUはGRUをさらにMinimalにしてパラメータを減らしたものです。 (上記論文より 上がGRU、下が提案手法) パラメータが少ないぶん学習速度が速い。 精度はIMDBではMGUが上、Mnistは
GoogleがCloud Machine Learningというインパクトのあるものを出してきました。TensorFlowが登場したときからある程度は予想されていたサービスですが思った以上に登場が早かった。 TensorFlowの強みは2つあると思っています。 1つ目はGoogle発ということで開発者/使う人の数が他のライブラリとは桁違いな点。 使ってる人が多ければ多いほどwebに公開されるコードの数が増えて、気軽に新しいアルゴリズム/論文を試せるようになり、それがさらに呼び水となって新しく使いだす人が増えるという好循環に。自分ではスクラッチでコードを書けないので人の書いたのを弄って使いたい、という層にも嬉しい環境です。 2つ目はGPU分散学習への対応が楽な点。 元々これが売りというか目的だったんでしょうが、今回発表されたGoogleのクラウドインフラとのシームレスな結合が加わったことでさ
全国的にはそろそろ春なんでしょうか。札幌は段々と暖かくなってきましたが今日の夜は氷点下6度だそうです。北海道の冬は長い。早く自転車に乗りたいです。 LSTMでの文生成の限界 狭い分野に限られたコーパスだとそれなりの文を生成できますが、ニュースやwikipediaなど幅広い分野の単語が登場するコーパスだとほとんど文になりません。wikipediaコーパスだとこういうやつを平気で出力してきやがります。 情報化社会における織田信長のコンスタンティノープルの陥落については諸説ある。 文法は正しいけど意味がめちゃくちゃ。 ようするに名詞が駄目。accが0.35ぐらいの言語モデルを品詞ごとに調べてみると助動詞は0.5、助詞0.4、動詞0.35に対して名詞は0.05でした。登場頻度は名詞が最も高いのにaccが低すぎるために意味が通らない文になってしまう。 トピックを入れる そこで、文生成時に今生成しよう
昨日こんなプレスリリースが話題になっていました。 www.sakura.ad.jp 高火力ですって。強そう。 ちょっと前にはこんなのも話題に。 ディープラーニング専用GPUサーバファーム「紅莉栖(くりす)」を構築|ニュース|広報情報|株式会社ドワンゴ 現時点で世界最高性能となるMaxwell世代のCUDAコアを搭載したGPUサーバー100台程度で構成 凄い。強そう。 こういう記事を読んだ後に自分の足下で動いている機械をまじまじと眺めてみると、あまりの低火力に恥ずかしさすら覚えます。ワットチェッカーで測ってみると500Wにも満たないそうで、安物電子レンジレベル。まさに低火力。 低火力ディープラーニングのための自作ハード 企業や研究室にTitan4枚指し環境が整っているような人にとってはおもちゃみたいな環境かもしれませんが、私が使っている環境を晒しつつ、個人の趣味レベルで(プチ)ディープラーニ
あと数日で1.6がやってくるchainer。 1.0~1.6までのバージョンごとの差について簡単にまとめてみます。 大きく分けると3つのグループ 1.0 1.1 1.2 黎明期バージョン 1.3 1.4 CuPy導入 1.5 1.6 色々とパワーアップした現世代 特にこれからchainer始める人はこのグループ分けを覚えておいた方がいいです。グループが違うと中身がかなり違うので他の人が書いたサンプルを参考にしたりフォーラムで質問する時は注意が必要です。 同じグループ同士のアップグレードはそこそこ楽ですが、1.2→1.3や、1.4→1.5はそれなりに大変。 バージョンの見分け方 良さげなサンプルコードを見つけて使ってみたいけど対応しているバージョンがわからない、という方向けに簡単な見分け方を。 1.5、1.6 chainer.links chainer.Chain serializers.s
あけましておめでとうございます。今年もChainer中心に遊んでいきたいと思います。 過去最大のアップデート 1.5。あまりにも変わりすぎていて以前のコードを1.5対応に書き換えるが結構大変です。 正直1.4のままでいいかな…と思いましたが、最新版についていかないと損しそうなので箱根駅伝見ながら勉強しました。1.5でCuPyがだいぶ速くなったようですし。 未解決なところ、曖昧・あやふやな情報がありますがご了承下さい。一部1.4以前に既にあったものも含まれてるかもしれません。 自信が無いところはこの色で書いてます。 まずは1.5版チュートリアル和訳から、後はサンプルコードとドキュメントを見ながら試行錯誤しました。 i101330.hatenablog.com ChainとLink __call__ WeightDecay、GradientClippingはadd_hookで optimize
「プログラムが自動で文章を生成する」 昔からこれにロマンを感じてる。 やってて面白い。 暇つぶしになるし、副次的に色んなことの勉強になるし、もしかしたらいつかいいプログラムが作れてお金になるかもしれない、なんてぼーっと考えてる。 今年に入ってからNN/深層学習を少しかじり出したのでRNN/LSTMで挑戦中。楽しい。 でも実際はなかなかまともな文なんて出来やしない。 前の文字列or単語のみを素性としてRNN/LSTMに与えて学習させるだけのモデルでは、まずまともな文が出てこないという結論に至った。どんだけテキストを増やしても、どんだけ学習回数を増やしても無駄っぽい。 この場合の「まともな文」の定義だけど、 1.文法が正しい (○明日はとても暑い ×明日にが暑い) 2.意味が通る (○今日はトマトを食べた ×今日はトマトが走る) 1と2をどちらも同時に満たすのが「まともな文」だと定義づければ、
chainerを触りだした頃に一番遭遇していたエラーです。トラウマになりそうでした。 こんなやつ。 chainer.utils.type_check.InvalidType: Expect: in_types[0].ndim == 1 Actual: 2 != 1 #こういうパターンもある 不等号だったりもする Actual: (1,2) != (1,1) どういう意味か データの次元やshapeなどが正しくないという意味です。 Actual: 2 != 1の場合は、左が入力された間違った次元、右が本来入力されるべき正しい次元です。 Actual: (1,2) != (1,1)だったら本来は右の(1,1)というshapeで入力されるべきなのに(1,2)で来ちゃってますよということ。 で、この記事を書く前までは「左は自分が入力した間違い、右はchainerが求めている正しい次元」で固定されて
GoogleがTensorFlowをリリースしてちょっとした騒ぎになっています。 tensorflow/tensorflow · GitHub GitHubに付けられたStarは既に6800。 それがどのくらい凄いかというと、3ヶ月前の時点でこんな感じの情勢だったんです。 3 month later: Caffe reinforces its dominance, Torch7 and Keras move forward, Chainer appears. ping @coffeephoenix pic.twitter.com/8E3ZrJdS8j— François Chollet (@fchollet) 2015, 8月 24 左は5月、右が8月のStar数。 Caffeがダントツで5600、Kerasが2500で二番手に躍り出て、chainerもリリース二ヶ月で600台と順調に伸び
ドワンゴではニコニコ静画(イラスト)のタグを学習したChainer用のモデルを配布してます。またそれを利用したタグ推定や類似画像検索などの技術デモのほか、応用事例として画像を元に閲覧数やお気に入り数を推定する研究を紹介しています。 https://t.co/5xIfiPD3L8— Toshihiro Shimizu (@meso) 2015, 11月 2 を試してみました。 モデルファイルは上のnico-opendataより、必要なライブラリとコードはこちらから。github.com モデルファイルは申請(規約に同意するだけ)してすぐダウンロードできます。約1GB。研究目的なら誰でもOKだそうです。 chainer1.3(1.4でも動きました)、pillow、numpy、argparseが必要。これが既に入っている人は別途 sudo pip install git+http://githu
主にバグ修正、CuPy関係の機能追加のようです。 モデル構造変更、公式保存方法などの実装は一ヶ月後の1.5.0になりました。 主な変更点はこちら https://groups.google.com/forum/#!topic/chainer/bnfSQpAux7M https://github.com/pfnet/chainer/issues?q=milestone%3Av1.4.0+is%3Aclosed あまり変更点を追えていないのですが一応メモ。 Restore cuda.init() Restore cuda.init · Issue #456 · pfnet/chainer · GitHub 1.3.0でcuda.init()が必要なくなった関係で互換性が失われていました。 参考 chainerメモ10 AttributeError: 'module' object has no
このシリーズは何なのか ディープラーニングとやらに興味あるけど何から手を付けていいかわからない そもそも機械学習って何なのかわからない 数式読めない 微分積分わからない 高校卒業してから数学を学んだ事が無い chainerのサンプルを試してみたけれど中身のコードはさっぱりわからない 英語わからないのでchainerのドキュメント読めない という人向けのchainerを使ったディープラーニング入門するための入門といった位置づけです。 書いている人も似たようなレベルです。微分や積分やデルタ記号を見ると頭痛がします。ディープラーニングの数式を一行も理解できません。今英検2級受けたら落ちそうな英語力。アカデミックな情報工学どころか大学は文系でしたしプログラマですらありません。そんな人が書いています。 Mnist(手書き数字を識別する)サンプルを読んで動作が理解できる人や、大学で理系に進んだ人、情報
最近早起きした日は北海道神宮・円山公園へリスに会いに行ってます。山のリスと違って人馴れしまくってて自分から足元にやってくるエゾリス。多分エサやってる人がいるんだろうな。こんな至近距離で撮れたのは初めてなので記念にアップ。 近所を散歩してたらリスに囲まれるなんて、北海道ってやっぱりすごい。贅沢。 Variational-AutoEncoder 略してVAEとやらを最近勉強してますが論文・日本語の解説・コードを見ても何がなんだかわからない。わからないんだけど面白そう。 応用例。 http://deeplearning.jp/wp-content/uploads/2014/04/dl_hacks2015-04-21-iwasawa1.pdf http://www.slideshare.net/beam2d/semisupervised-learning-with-deep-generative-
GPUなのに学習速度があまり速くならない、あるいはCPUより遅い時ってありませんか? そういうとき自分はまず「nvidia-smi -l 1」でGPUの使用率を見て100%に近い値を維持できているかどうかチェックします。NVIDIA System Management Interfaceというものらしいです*1-lオプションに数値を指定するとn秒間隔でループしてその時のGPUの状態を出力してくれます。よく見る項目はGPU使用率、メモリ使用量、温度あたりでしょうか。 この使用率が低ければ低いほど効率的にGPU計算できていないことになります。計算以前のところがボトルネックになっている可能性が高い。 list → numpy or cupyへの変換速度で差が出る pythonのリストをchainerで使えるようにnumpy or cupyに変換する時の速度が両者でだいぶ異なるようです。後者の方が
追記)2015.10.30 互換性維持のためバージョン1.4.0でcuda.init()が復活しました。 正確にはエラーで落ちなくなりdeprecatedを出すようになりました(つまり書いても書かなくても何もしない)。 以下の記事は1.3.0~1.3.2限定の話です。 chainerでcuda.initはもう使えない - Qiita こちらの人が遭遇しているように、1.3.0でGPUのためのnumpyバックエンドがPyCuda→CuPyへと変わった関係でcuda.init()が必要なくなりました。 chainer1.3.0リリース - studylog cupy使ってみる - studylog でも書いたのですがcuda.init()があるとタイトルのエラーが出ます。初期化にcuda.init()はいりません。 再掲しておこうと思います。 GPU対応コードが変わるところ 初期化 #旧 cu
もう10時間ぐらい苦戦中で辛い。 さっきようやくPyCUDA成功してchainer動かそうとしたんだけど RuntimeError: CUDA environment is not correctly set up. The original import error said: cannot import name intern (追記 sixを1.9に上げたら解決。途中で何かのインストール時に1.5に戻されていた模様) pip install chainer-cuda-deps しなおしたら今度はimort chainerしただけでフリーズというか音沙汰がない状態に。 Ctrl+Cでも無反応。 これはもう自分には手に負えない。 追記 「chainer CUDA」の検索アクセスが結構多いのでので同じように苦戦している人のために追記しておきます。環境はUbuntu14.04です。 多分大半
github.com こちらのchainerで実装されたRNNを試してみました。 RNNやLSTMの理屈や構造はさっぱりわかりませんが、連続して与えられた文字列から次の文字を予測するというもの。サンプルを見るとシェークスピアの文字列を構文解析などせずにそのままRNNに読ませて、なんかそれっぽい英語を出力できるようになるらしい。 確かにそれっぽい英語が出てくるんですが、どのくらいそれっぽいのか英語力の無い自分にはわからなかったためにコードを少し変えてwikipediaの日本語記事を読ませてみました。 180万文字6MB。これは全wikipedia日本語記事の500分の1ぐらいの分量。 1万文字時点で生成した文。全く日本語らしくない。適当に文字を並べただけな感じ。 釉注外口経間<田果行の乗さ、通代にある自種代りなれた。る。 に時さら身のこ線人となにのこ物いっ類さ よまさと。る。 を兼を、外めど
d.hatena.ne.jp 多分これ学習の時点で失敗してる気がします。 http://d.hatena.ne.jp/shi3z/20150714/1436832305でもepochが進む度にperplexityが上がってるのはおかしいです。イマイチ中身を理解してませんがperplexityってlossみたいなものなので、本来は下のように下がって行くはず。(ptbサンプルの実行例) iter 10000 training perplexity: 981.54 (108.02 iters/sec) iter 20000 training perplexity: 405.38 (125.78 iters/sec) iter 30000 training perplexity: 298.67 (125.76 iters/sec) iter 40000 training perplexity: 2
(2016.1.21追記)最近あまりメンテナンスしてないので1.5以上のバージョンを使ってる人には役に立たなくなったかもしれません。 (2015.12.15追記)当初はサンプルコードにリンクを貼っただけの記事でしたがチュートリアル等も含めたものに加筆中。また古くなった情報は順次削除・更新してます。 バージョンごとの互換性など こっちに移しました。1.5以上を強くお勧めします。 chainerのバージョンごとの違い(2016年1月19日現在) - studylog/北の雲 1.0 1.1 1.2 黎明期バージョン 1.3 1.4 CuPy導入 1.5 1.6 色々とパワーアップした現世代 概要・チュートリアル 概要を掴むのに適したスライド 1.5以上から始めるならこちら。 Chainerチュートリアル -v1.5向け- ViEW2015 内容は重複していますが1.4以前のバージョン時代のチュ
次のページ
このページを最初にブックマークしてみませんか?
『studylog/北の雲』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く