Stimulator

機械学習とか好きな技術話とかエンジニア的な話とかを書く

SIGIR 2017に参加した

- はじめに -

先月、4日間に渡って東京の京王プラザホテルで開催されたSIGIR 2017に会社員として参加した。

SIGIR2017 – The 40th International ACM SIGIR Conference on Research and Development in Information Retrieval

参加に10万程必要な高額な学会であるが、弊社からは3人参加。

後の社内勉強会で情報もシェアしたので、個人的に気になったものを少ないけどいくつか出しておく。
(書くのが遅くなってしまい忘れた部分が多いので普段より少なめです…)


 

- Session -

大まかに見ると「Embbeding」と「Deep Learning」のお祭りという感じだった。
TF-IDFやword2vecは “Classical method” になっていた。

GloVe、Seq2Seq、Attention、CNN、End-2-End、Encoder-Decoder辺りがやっぱりホットワード。機械学習カンファレンスかというくらい機械学習の話を聞いた気がする。

あとはちらほらSolrの話を聞いた
 

Deep Learning for Extreme Multi-label Text Classification

Deep Learning for Extreme Multi-label Text Classification

Targetは巨大なラベルコレクションからクラスにラベルサブセットを割当るタスク
(例えばWikipediaなら「ポテト」に対して
「ナス属」「根菜」「南米産の作物」…)

こういったタスクは、ラベルコレクションが巨大になると所謂分類では難しいので、ラベル間の相関とかを利用しながらラベル付けしていく手法が良いのではという発表。


Extreme Multi-label Text Classificationでは、現状以下のような手法がある。

  • target-embeddingとtree-based ensemble
  • Deep Learning
  • max-margin method

SLEEC[K Bhatia, NIPS 2015] のようにラベルを線型部分空間投影で有効数削減して、減らしたラベルをmainラベルとしてラベル付け、それらに付随するtailラベルをpairwise distancesで求める方法(target-embedding)。

MSのFastXML [MSR, Y Prabhu, KDD 2014] のように木構造(RF)でginiなどを使わずnDCG(normalized discounted cumulative gain)を直接最適化していく方法(tree-based ensemble)。
Github: https://github.com/Refefer/fastxml, https://github.com/fastxml/fastxml

DeepNetを工夫したFastText [Facebook, 2016]、Kim-CNN [Y Kim, EMNLP2014]、Bow-CNN [Rie Johnson, ACL2015]辺りの手法(この辺はググると解説記事が出てくる)。

PD-Sparse [IEH Yen, 2016]などにおける、ラベルごとに重み行列を設定し線形分類器を回してmax-marginを出していく方法(この辺: http://www.cs.utexas.edu/~xrhuang/PDSparse/)。


既存の中でもword2vecで生成したベクトルをCNNに突っ込むCNN-Kimを工夫した「XML-CNN」を提案しますという内容だった。図で示すと以下。

f:id:vaaaaaanquish:20170917125344p:plain:w350:h400
社内勉強会で使ったプレゼン、各論文から引用

やっていたことは以下

  • Dynamic max pooling
  • sigmoid output layer
  • Hidden Bottleneck Layer

普通のMax poolingだと長い文章列にはあまり良くないので、レイヤーをさらにチャンクに分割して動的にMaxPooling。
OutputにSoftmax使うのは重いし学習に良くない(最近割と話題になりつつある)。
隠れ層を追加して圧縮すれば精度も上がって出力のsigmoidの計算も早い。


ResultはWiki-500KとかAmazon-670Kで挑戦しているが、どの既存手法よりも精度良く出ており割と効果はありそうだった。

シンプルな改善なので、機械学習実務レベルだと既にやられていそうだなあと思いつつ、今後こういった「ビックデータにおける自然言語における自動ラベル付け」というのはビジネスにおいても非常に重要になりそうだし聞いてよかった。

 

Max-Margin Based Embeddings for Entity Retrieval

MEmbER

エンティティ検索において、SemanticWebのような構造表現(Structured ER)も語彙表現(Document-centric ER)もどちらも大事だし使いたいという内容。

A Three-Way Model for Collective Learning on Multi-Relational Data [Nickel ,ICML11]でいうところのknowledge graphベースなRESCAL。その拡張のTransE [Antoine Bordes, NIPS, 2013]。(yamaguchi先生記事: TransE [NIPS'13] を実装(と実験再現)した - でかいチーズをベーグルする)
あと古典的なINEXやTREXをDocument-centric ERとして紹介。

word2vecやGloVeといったWord Embeddingの紹介をして、TransEとGloVeを合わせたEECSモデル [S Jameel, 2016]の拡張を提案。

f:id:vaaaaaanquish:20170917132217p:plain:h250f:id:vaaaaaanquish:20170917132340p:plain:h250
社内勉強会資料、各論文から引用

数式を見て分かるようにkernelを使っており、分離平面ごとに検証。
計算時間が増加してもquadなkernelを使ったほうが大体結果が良いという内容だった。

また、エンティティ検索結果として見栄えの良いものが出ていただけでなく、ある程度短めな文章で検索した場合にも結果が得られている所が印象的だった。


 

- Poster -

ポスターセッションは大体見た
ここでもDeepNetとベクトル化の手法が多々あった

Cross-Device User Linking: URL, Session, Visiting Time, and Device-log Embedding

Cross-Device User Linking

タスクとしては、ユーザが複数デバイスから見たWebページ情報から同一人物化どうか判定するというもの。

f:id:vaaaaaanquish:20170917135710p:plain
論文から引用

Embeddingの方法としてURL Embeddingを使っていてちょっと面白いなと思った。
Graph EmbeddingやらNode Embeddingやら本当にIR系だと有益そうだしブーム。

 

SogouT-16: A New Web Corpus to Embrace IR Research

https://www.thuir.cn/group/~yqliu/publications/sigir2017Luo-SogouT.pdf

中国でWebページのデータセット(HTMLやCSS)を公開しているよというポスター

f:id:vaaaaaanquish:20170917140204p:plain:w300:h300

セッションでも「中国の複数の動画サイトをまとめたWebサービスがあってそこからデータ集めたよ」みたいなのがあって、中国スゲーってなった。

分析屋としてというよりは、個人でスクレイピングの色々をやっているので、スクレイピング周りの研究が進むためにもこういったデータセットの普及が進んでほしいなと思った。


 

- おわりに -

ニューラルネットなら色んな特徴量投げ込める上、分類からRankNetのようなモデルもあるので研究の幅は広がっていそうだが、実際に「Deep」とタイトルにあるセッションを聞きに行くと「実は4層のネットワークでより深いのはこれから〜」みたいなのが多々あり、フレームワークによって誰でも触れられるものになったとは言えDeep Learningを持て余してる人の方が多いというのが現状っぽいなと思った。

CNNで特徴量生成器を作ろうというのは実務だとマシンリソースから総合的にマイナスになったりするし、入力に自由が効くというのは別にNNじゃなくても〜とちょっと思う場面もあった。Cross-Convolutionは確かに便利だけど。

あとアウトプットにおけるワードクラウドの多さがすごかった。それっぽさ。


日本開催である事と機械学習ブームもあってか参加者は882人(前年比53%UP)らしく、Yahoo!楽天KDDI、スマートニュース、Cookpadといった機械学習系でも割と尽力している企業の日本人と沢山話す機会があった。後は中国を筆頭にアジア系の方々。

Banquetでは、寿司職人がその場で握るブースがあったり、開幕は鏡開きでスタート、かき氷、綿あめのブースといった和意識な内容でなかなか楽しかった。しましま先生にも挨拶することができた。
いつもの:しましまのSIGIR2017まとめ - Togetterまとめ

パっとググった感じだと、ちゃんと技術踏まえて行ってきた感想記事を上げてるのは以下くらいだった。

 
プレゼンはまだ聞けたけど、ポスターで質問したいという時に英語力が低すぎて「オーイェーアハーン」くらいしか言えないのでつらかった。
せめて自分の疑問を言語化できるくらいにはなろう…
 
あとカンファレンスの感想をブログに書くならその週のうちに書かないと死ぬ。
はっきりわかった。来週はWebDBに参加、登壇するので頑張ろう。

検索とMLのブームにおいていかれないように努力したい
f:id:vaaaaaanquish:20000101090031j:plain:w400:h300


 

PyCon JP 2017に参加しました - 後半 #pyconjp

- はじめに -

PyCon JP 2017の2日目(正確にはtutorial含め3日目)を聴講してきた

https://www.pycon.jp/


1日目は昨日PyCon reject Conference含めて投稿した



 

- Keynote -

https://pycon.jp/2017/ja/talks/keynote/

Pandasのコミッタの堀越真映さんの登壇

Pandasの概要と、Pandasコミッタになるにはという話
OSSと一緒でプロダクトの方向性を決められたり、issueを解決できたり、ユーザビリティを気にかけられると推薦でコアメンバーになれるとの事(1年は活動必要らしい)
また、コミュニティの品質なども気にかけられると良い

Pythonの話というよりOSSという概念やコミュニティの説明という感じだった
もっと気軽にOSSやっていこうよというのは本当だし良いセッションだった


 

- Reactive Programming on AWS Lambda in Python -

https://pycon.jp/2017/ja/schedule/presentation/6/


Lambdaに関するデプロイやapexを使ったデプロイまで
https://github.com/apex/apex

boto3は流石に知ってたけど、ログ用のalogとかデプロイのZappaとかは知らず、Lambda力もうちょっと上げれるなってなった
https://github.com/keitheis/alog
https://github.com/Miserlou/Zappa
仕事の方でも自動デプロイ進めたいなあ…

あとcoconutsとPythonクイックソートの比較とかやっていて、大胆なcoconuts宣伝だな…ってなった


 

- The theory of Serverless development by Python -

https://pycon.jp/2017/ja/schedule/presentation/30/

よくあるサーバーレスの大まかな説明(FaasとSaaS)
結局サーバーレスもオンデマンドなコンテナが動いてる訳だからオーバーヘッド気にしましょうとか、イベント駆動便利よとか。あとはAWSの説明
 
会社に入ってからAWSでマイクロサービス(ピタゴラスイッチ)してたけど、本来1つのサーバとMySQLで完結していたものが分散するわけで、やっぱり監視の問題とか運用コストがそれなりにあって、どっちが良いのかぶっちゃけみんな悩んでるんじゃないのという感想だった。単純計算で評価しにくいしTPO


 

- 機械学習におけるデータの再現性について -

https://pycon.jp/2017/ja/schedule/presentation/34/

資料はアレされている


機械学習のデータを再現性を保ってどうやって保存するか、そのためのフレームワーク公開してますという話

akagiというらしくクックパッドでも使われているとか
GitHub - ayemos/akagi: Codenize your datasources.
先行だとGit LFSとかData Version Controlとかがあるとの事で、どれも使ってみたい


僕はbohemiaサンの以下の記事が今年随一好きで、データの取り扱いってすごく大事なんだよと声を大にして言いたい
あなたの会社は本当に機械学習を導入すべきなのか? - bohemia日記
これもうちょっと広まってえらいひとまで認知されて欲しいし、akagiに期待というアレ

再現性を重視しすぎると時系列でどんどんデータの入力分布が変化していく場合につらくなってくるので、この辺は色んなパターンがあると良さ


僕はAWSのRDSのスナップショットやEC2のAMI取っておいたり、Jupyterにコツコツ残していくオタクなのでツール作りはすげえなと思います


  

- ディープニューラルネット確率的プログラミングライブラリEdward -

https://pycon.jp/2017/ja/schedule/presentation/36/

機械学習界隈Twitterで見ない日はない@yutakashinoサンの話


Edwardの話だったはずが大半が基本的なNNとベイズと、Deep LearningとBayesian Deep Learningの大まかな概要みたいな話だった気がする。一番基本的なNNの更新式とかベイズ則の式から、各ベイズ推定のアルゴリズムが出てきて、PyConというより機械学習勉強会みたいな感じだった

Edwardが出てきたのは終了前5分だった

マジでPythonの話は出てこなかったけれど、30分で全部話した(話しきったとは言っていない)とは思えないくらいスライドが充実しているので、機械学習屋は復習がてら見ると良さげ

ベイズ推定周辺を5分で説明で説明してて笑った

そういえばだけど、NIPS 2016のやつ http://bayesiandeeplearning.org/ は結構話題になったけど後続が出てきてるのか気になる
後で暇があれば調べて追記したい


 

- Pythonをとりまく並行/非同期の話 -

https://pycon.jp/2017/ja/schedule/presentation/35/


いわゆる並行は並列を包含しているイメージで、どっちとりましょうかという話

Python3.2から追加のfutures便利でthreadinf, multiprocessingより使いやすいらしい
じゃあ幾つか例を示して行きましょうという感じで、スライドがとても良いので必見
非同期ライブラリの紹介も丁寧で、futuersからasyncioの解説も分かりやすかった
ここ最近聞いた非同期の話では随一丁寧でステキ

個人的にも非同期処理の取り扱いに悩んでおり非常に良かった
思わずトークアワード投票しました


 

- 早稲田大学グローバルソフトウェアエンジニアリング研究所 -

せっかくなので大学のトークセッション聞いた
Pythonと教育、Pythonプログラミング初学者における環境と特徴分析しました」という内容
プログラミングは教育効果の定量的な評価が乏しいからそういう研究を進めたいとの事

6属性に分類していて

  • ゲーム感覚に遊んで覚えるソフトウェアタイプ
  • Scratchみたいなビジュアル言語・環境
  • 電源不要のアンプラグなツール
  • ボドゲみたいなタンジブルツール
  • マインドストームみたいな物理ロボット
  • その他

でそれぞれ評価して、評価軸も扱いやすさやどういう所を重視しているかみたいな基軸で丁寧に取っていた
研究が進むとプログラミング教育も進むかも

Blockly とか コードガールこれくしょん とかが紹介されててあ〜ってなった

Pythonは傾向として「Webでできる」「協力、連携が意識されている」「問題解決型かつ自由度が高い」ものがおおいらしい

逆にクリエイティビティ系(ゲームを作って動かすまでやってみようみたいなアレ)がソフトウェアとして固まっているものは少ないと言っていた
う〜ん、確かに思いつかない。大体クリエイティブになるともうMinecraftの自動化するとか、GUIゲーム作るとかに一気に飛んでるイメージはありますね

今後の論文発表等に期待


 

- おわりに -

今回はまさかのshima__shima先生のツイートを偶然見て、チケットを譲って頂く形に。深く感謝
来年は登壇で参加できるといいなあ

 
あと前年度はモノタロウ社がPython2系を盛り上げましたが今年は…
エンジニア一同衝撃 Python子ども向けワークショップにやってきた小2開発者のさりげない一言 #pyconjp - Togetterまとめ

 



( ;∀;) イイハナシダナー

 
個人的にはReject Conferenceの方が実務寄りというか現場感あって面白かったように感じたけど、広く聴講してもらうというのは難しいんだなあと。
というかRejectよりPythonの話をしない発表も幾つかあったし、全然採用基準わからんってなった。

ご飯も美味しく非常に良い2日間でした

 
厚さで人も○せる犬
 

ベイズ統計モデリング: R,JAGS, Stanによるチュートリアル 原著第2版

ベイズ統計モデリング: R,JAGS, Stanによるチュートリアル 原著第2版



 

PyCon JP 2017に参加しました - 前半 #pyconjp

- はじめに -

PyCon JP 2017の1日目(正確にはtutorial含めると2日目)を聴講してきた

https://www.pycon.jp/

2日目も出るけど話長くなりそうなので分割

先日、PyCon JP Reject Conferenceなるものにも参加してきたので冒頭で少しだけ触れておく


  

- PyCon JP Reject Conference -

PyCon JPにリジェクトされた内容を飲みながら発表しようという会(非公式)

https://techplay.jp/event/630686

倍率高かったもののリジェクトの理由を当人に聞いていくと大体以下のどれかだった

  • Proposalを適当に書く
  • Pythonの話をしない
  • ニッチすぎる内容にした

中でも「Proposalを書いてる時がやる気の頂点」みたいな話が「わかる」ってなった
あと「みなさんモチロン○○使ってますよね!」と聞いてシーンとなるやつはリジェクトされるんだなあって感じだった(いや、PyConJPも十分ニッチな発表あったけど…)

ニッチな分、今後使うか分からないけど面白い知見が得られてよかった
Recruitの機械学習の話とかErrbotの話は今後も使えそう

あと、登壇者が私の会社の後輩と同じ研究室という現象があって、世間狭いし下手な事言わないようにしないとなって思った
私も来年PyCon出たいと思っているけど、来年もリジェクト沢山出そうだしまたやってほしい

詳しくはTogetter
PyCon JP Reject Conference 2017 - Togetterまとめ


 

- 野球を科学する技術 -

https://pycon.jp/2017/ja/schedule/presentation/15/

なんかもう界隈では有名人らしい人っぽかった

bradfordなる分析基盤をDockerにして公開したという話
(マネー・ボールのチャド・ブラッドフォードから命名したらしい)

中身はscrapyやそれらを回すためのAirflow、MySQLやらの紹介で、スクレイピングの話沢山聞けるかなと思ったけどscrapyのいつもの図が出て終わったのでちょっと残念だった

scrapyのデフォルト設定は攻撃レベルなので危険という話をしていたのは良かった
これもうちょっと広まって欲しい

scrapyならべつにAirflow使わずScrapy Cloudにモデルアップロードして回すのとコスト変わらないのではと思いつつ、自前のSQLとかお手製の色々を使いたい部分もあるだろうし、この辺はTPOだなって感じだった。Reject Conferenceでもluigiの話があって、「luigiのユニットテストつらくない?」って思ったんだけど、やっぱ結論AirflowやluigiはTPOだなって。金に余裕があるならAWS


wOBAやwRAAなる野球の分析のための指標の紹介もあって、これは理にかなっていそうだし知見にはなったけど、人生で使うことはn…

割とWikipediaが丁寧だった
https://ja.wikipedia.org/wiki/WOBA_(野球)

アメリカ野球学会(SABR)が色々やっているらしく、歴史も長いので参考になりそう
https://ja.wikipedia.org/wiki/セイバーメトリクス


 

- Using machine learning to try and predict taxi availability -

https://pycon.jp/2017/ja/schedule/presentation/55/

シンガポールは政府がタクシーの位置スナップショット情報や空席情報をAPIとして公開してるらしく、それらを使って分析しましたという話。
シンガポールスゲー…(日本はなかなかこういうの発展しない感)

ここで見れる
data.gov.sg


色々はGithubで公開されていたので気になれば
GitHub - hari-allamraju/pycon-talk-taxidata: Repo for my talk on machine learning with taxi data at PyCon APAC 2017 and PyCon JP 2017
script等へのリンクもある

実分析する中でのRDDとDataFrameでやった比較をしていて「JVM上ならDF早いよ!」という主張だった。好み〜


 

- Kivyによるアプリケーション開発のすすめ -

https://pycon.jp/2017/ja/schedule/presentation/20/

スライド:PyconJP2017 Kivyによるアプリケーション開発のすすめ

私は機械学習で画像の学習データ見る基盤程度にGUIアプリ作ってたレベルで、PyQtしか使ったことなく気になって見た

色んなGUIが紹介されてて、iOSもPython3系対応中らしい

一通り聞いたけど、まあPyQtで良いかなあという感じ…
ライトユーザだからKV languageがネックだけど、ちゃんとアプリとして動かしてくとなるとファイルが分割されてる方が嬉しい事あるだろうなと思う

KV languageはCSSみたいなもんでビュー画面作る色々って紹介されていて、動的なコーディングツールもあるらしい
kviewer:kivy/kviewer.py at master · kivy/kivy · GitHub
(kviewerでググるサイボウズのkintone連携サービスが出てきて、命名も大変だなって…)


最後にちょっとデモがあったけど、アニメーションはカッコよかった!(手前味噌)


 

- Why you should do text analysis with Python -

https://pycon.jp/2017/ja/schedule/presentation/5/

まとめると、「自然言語正規表現、パースから生成、機械学習まで全部Pythonでやりたい!機械学習の発展もあるしチャットボット作ったりできて人の仕事も減るから自然言語処理やろうぜ!APIとかフレームワークのおかげで機械学習使うだけならSuper Easyになったし!」みたいな感じ(わかる)

データはどっから取ってくる?オープンデータ、APIスクレイピング、アプリのフィードバック、ebooks…色んな所にあるよね。テキストデータは時に「garbage in garbage out」だから前処理しないとダメだよね。MLならこんなライブラリ使うと良いよね。
という話が展開されていた


 

- Pythonによる文章自動生成入門 -

https://pycon.jp/2017/ja/schedule/presentation/21/

スライド:Pycon jp2017 20170908_doc_ota

登壇者曰く、論文読みながら聞いてくれみたいな感じだった


後ろは立ち見、通路に座って聞く人まで出る程の盛況さ
最近話題だしタイトルがキャッチーだったからなという印象

スライドの最初辺りで「GANとかで出た結果の著作権に関する議論はあまり出ていない」と出ていたけど、「機械学習 著作権」みたいなレベルの日本語でもググったら沢山資料出て来るし、色んな学会で議論されている内容なので機械学習屋としてはそこだけ修正したかった
権利周りはナイーブだし、真面目にやってる人達が居てちゃんと議論を進めていますよい


発表自体はほぼ学会発表で、オリジナリティのある文章を生成するためにn-gramで”文章の言い換え”を色々検証して評価してもらったという話だった
”言い換え”は「品詞の変換」「能動態、受動態の変換」「2つ以上の単語を1つにまとめる」の3種類と定義していた

何となくだけど、日本語の言い換えって「比喩」とか「描写」とかのレイヤーもあってワンパンとはいかなそう
(Pythonの話はほぼ0だったし、同日にテキストアナリティクスシンポジウムあったのでそちらの方が活発に議論できて良かったのでは…)

最後の文章自動生成のためのGANというのはすごい気になったので、研究的な意味では今後の進展をウォッチしていきたい


  

- 健康診断と懇親会 -

4時から病院に行く用事があって一度渋谷に行ったので4時台のプレゼンは聞けず

LTワンチャンあるかなと思ったけど、帰ってきたらクロージングで懇親会の時間に

- おわりに -

最近機械学習の話ばっかり聞いてたし、Pythonの話聞きたいなと思ってたけど結局データ分析とか機械学習の話を聞いてた。明日はもうちょっとPythonの話を聞ければいいな

「お久しぶりです〜」みたいな会話が所々でなされていたり、登壇者が界隈で有名とかだと称えるツイートが見られたけど、コミュ障には無理ってなった。もう少し顔を広げる努力をしたい…

 
あとモノタロウのPython2系話についてはみんなこれ読んで欲しい
エンジニア一同衝撃 Python子ども向けワークショップにやってきた小2開発者のさりげない一言 #pyconjp - Togetterまとめ

 
最後にまだこれ金曜の平日なのに結構会場混み混みで電源も厳しく「明日一体どうなるんだ…」という気持ちでいっpy


 

Deep Learning Acceleration勉強会に参加 #DLAccel

- はじめに -

こちらに行ってきたので簡単に感想など

connpass.com


別に日常ブログでも良い気がしたけど一応技術なのでここに記録しておく


 

- 所感 -

モデルアーキテクチャ観点からの高速化

Yusuke Uchida (@yu4u) | Twitter
https://t.co/4t9EEdI19b

CNNのモデル上での高速化の話
Deep CompressionとかPruningを幅広く浅く紹介

多分本当に上位レイヤ的な工夫等の話をしたのはyu4uだけだった
Deep Compressionに関しては前の人工知能学会以来コツコツ調べてたので大体把握していて、個人的な所感としては本当に浅く広くという感じ(他の登壇者との兼ね合いかな…)

個人的には符号化を上手く進める方法が気になるのでまた調べたい

 

Convolutionの数理とアルゴリズム

Koichi Nakamura (@9_ties) | Twitter
Convolutionの数理とアルゴリズム // Speaker Deck

Nakamura先生のいつものだなあという感じ
後半の同じ界隈の人の登壇のための布石感

ツイートもしたけど、質疑ではWinograd空間でReLUとか処理すれば良くない?みたいなのがあって、ICLRのこれを思い出した。
https://openreview.net/forum?id=r1rqJyHKg


この発表のFast Convolutionの話で数式が増えた辺りから、比例して会場の空気が重くなってTwitterの実況が減ったのがちょっと面白かった。

Keshab大先生のCook-ToomとWinogradのスライドは見ましょう
http://www.win.tue.nl/~wsinmak/Education/2IN35/Parhi/chap8.pdf

あとTwitterでこの辺のwinograd関連情報が得られてよかった
https://www.intelnervana.com/winograd/

 

ウェブブラウザ向け深層学習モデル高速実行フレームワーク「WebDNN」

きくらげ (@Kiikurage) | Twitter
https://t.co/PiG6hjnmBS

MakeGirls.moeでも話題になったWebDNNの中の話
Webassenmblyを使っているらしいので早く、細かい最適化もgraphの最適化から丁寧にやっているなあという印象


質疑でもあったけど、DLは細かな浮動小数点数を切っても最悪精度が出るのでもっと削いで早くするみたいな方向性はありそう
あとやっぱり、この辺のWeb系の開発スピードはDL界隈並に早いので「実装が追いついてない」「WebGL2系に対応できてない」というのは仕方ないよなあという気持ち

個人的にはWebブラウザでユーザの計算リソースを食うよりバックエンド用意するのが好みだけど、今日の話を聞いてフロントで処理するのもまあ良い点が多くなってきたなあと素直に思った。
今後の発展を応援したい

 

Using Raspberry Pi GPU for DNN

Noriyuki OHKAWA (@notogawa) | Twitter
https://www.slideshare.net/notogawa/using-raspberry-pi-gpu-for-dnn

前半はラズパイのアーキテクチャの話
リファレンスの100倍くらい図が分かりやすかった

後半はCNN系の行列計算でim2colやWinogradだと転送コストがすごいのでDirectアルゴリズムをtransposeして使ったという話
そのためのAssembly Golfのコツとか

この発表辺りからだけど完全に上位レイヤな話が無くなって、3割くらいが切り落とされた(空気感として)。

 

TensorFlow XLAの可能性

無限ゲームのなか (@Vengineer) | Twitter
https://www.slideshare.net/ssuser479fa3/tensorflow-xla-78874656

TensorFlow XLAのプラグインで色々なハードウェアへ適応できてすごいんじゃいという話

JITの話はvengineerサンのブログで見たやつってなった
https://blogs.yahoo.co.jp/verification_engineer/71268241.html
(この人だいぶ界隈違うけど自分のTLにも流れてくるので相当過激な人なんだろうと勝手に思っている)

TFやMXNetの中間表現の最適化の現状みたいな話は面白く、Wave ComputingだBrainWaveだといったDPUの話もあって、広くLSIの話を知れて良かった。

 

Googleが開発したニューラルネット専用LSITensor Processing Unit」

Kazunori Sato (@kazunori_279) | Twitter
多分slideはない

大体Googleの記事の要約のようなアレ
Google Cloud Platform Japan 公式ブログ: Google の Tensor Processing Unit (TPU) で機械学習が 30 倍速くなるメカニズム

「まだ、実例できゅうり認識とかすぎゃーん顔識別をアピールしてるんだGoogle…」と思った。

Googleの中の話もあって、「ハードウェアチームずっとあったけど2013年にリソース足りなくなることに気付いて慌てて15ヶ月で作って一発でTPU動かしました」みたいなドヤ話や、TPUをproductionで色々使ってる会社もあるという話もあって「ほえ〜」って感じだった

TPUの第二世台も既に考えていて「学習もできる」らしい
ユーザの用途に合わせて提供していくんだろう

もう全てFPGAでごにょごにょみたいになると、量子化されたNN専用プロセッサと数の暴力でGoogleに勝てる気が全くしなくなったが、一応「Google内でもAssembly直乗せとかじゃなくTensorFlow XLAつかってるよ!」という質疑が見られたので、Googleに乗っかっとけばあるいは…みないな希望がアレした

そしてこの発表で完全にDeep Learning Acceleration勉強会から(NN向け)組み込み最適化勉強会に変貌した

 

ChainerMN による分散深層学習

Takuya Akiba (@iwiwi) | Twitter
多分slideはない

iwiwi「分散深層学習するならGPUだけじゃなくインターコネクトにもお金を使って!」
わかりみが深かった

後スライドが分かりやすくて禿げた。
スライドの中身もそうだけど、一辺倒に「それは○○です」ではなく「○○というのが僕らの主張です」という言い方をしていて、なるほど流石だなあと思った。

TFが分散GPUだと若干遅くて…という話を聞いて「GoogleはもうGPUで〜とかはあんまり注力してないのかもね」と思った

用途と速度と環境を兼ね合いながらChainerもTF使っていきたいですね


 

おわりに

DL系の勉強会にしてはハードの人(というか組み込み屋だと思われる人)の割合が多くて、ハードウェア界隈身内ウケでの笑いみたいなのがちらほらあった
登壇者で明らかだけど、懇親会の感じでもハード屋割合多かったっぽく「これDeep Learning (Hardware) Acceleration勉強会だ…」ってなった

connpass概要の様々な段階とは一体…

Deep Neural Network Modelを用いた訓練や推論の高速化をテーマとした勉強会です。モデリングからハードウェアまで様々な段階での高速化アプローチについて勉強できる場にしたいと思います。


まあでも、入門的な内容はやらないと言い切ってあり、かつ日曜半日使っただけあって知見は多かった
DLは毎日やってるけど、ラズパイとかは高専以来触ってないのでまたやろうかなと思った

あとまとめるとまさにこれ

ハードウェアの気持ちオプティマイザの気持ちコンパイラの気持ちDeepNetモデルの気持ちになってコードを書く時代…できれば来てほしくなかった


開催中にブログを投げるみたいなロックな人も居たのでライブ感はその人のブログの方が良さ
cocodrips.hateblo.jp

あとκeen (@blackenedgold) | TwitterサンがTogetterしてくれたみたいです
togetter.com


最後にかなり個人的な事だけど今この記事を書きながらSIGIR 2017行ったブログが今更下書きから見つかって過去の自分にキレた
あとDeNA今週2回行ったけど、あの会場素敵だしご飯美味しいし良いですね…羨ましい


追記:

Vengineerサンは本人曰く「過激ではない」らしいです!失礼しました!



 

Firefox headlessモードをUbuntuとPythonとSelenium環境で動かす

- はじめに -

headless Chromeが来た頃、Firefoxのheadless対応の噂がありました。


そしてheadlessモードが正式に搭載されました。

developer.mozilla.org


この記事は、PythonSelenium.webdriverを使ってFirefoxのheadlessモードを触ろうという導入記事です。

今までCUIFirefox操作するとなると、xvfbとかVirtual Xを利用してスクリーンを作った上でのFirefox起動が一般的でしたがこれで少し簡単になりますね。

headless Chromeの記事と同じく設定周りについてはいつか追記するかも

環境は以下の通り
//------
Ubuntu 16.04 LTS
Python 3.6.1
pip install selenium (既)
//------

 

- UbuntuFirefoxを入れる -

aptにFirefoxリポジトリを追加

sudo apt-add-repository ppa:mozillateam/firefox-next
sudo apt-get update

途中以下のように聞かれるのでEnter

Press [ENTER] to continue or ctrl-c to cancel adding it

こんな感じの出力が出る

取得: http://ppa.launchpad.net/mozillateam/firefox-next/ubuntu xenial InRelease [17.6 kB]
取得: http://ppa.launchpad.net/mozillateam/firefox-next/ubuntu xenial/main amd64 Packages [12.5 kB]
取得: http://ppa.launchpad.net/mozillateam/firefox-next/ubuntu xenial/main i386 Packages [12.5 kB]
取得: http://ppa.launchpad.net/mozillateam/firefox-next/ubuntu xenial/main Translation-en [3,716 B]


 
インストールする

sudo apt-get install firefox

バージョンは56.0が入る

firefox -v
 Mozilla Firefox 56.0

試しにheadlessモードを使ってみると以下のような表記が出る。ctrl+cで抜ける。

firefox -headless
*** You are running in headless mode.


 

- PythonSeleniumから使う -

Seleniumから使うにはFirefox用のgeckdriverをインストールしておく必要がある。
geckdriverのバージョンはよしなに。

wget https://github.com/mozilla/geckodriver/releases/download/v0.18.0/geckodriver-v0.18.0-linux64.tar.gz
tar -zxvf geckodriver-v0.18.0-linux64.tar.gz
sudo cp ./geckodriver /usr/local/bin

geckdriverをインストールしてないと以下のようなエラーが出る。

~~~
raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'geckodriver'
During handling of the above exception, another exception occurred:
~~~
os.path.basename(self.path), self.start_error_message)
selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.


 
wbdriverの引数に "-headless" を付けて起動させる。
特に何もしてないと以下のように "/usr/bin/firefox" に配置されているはず。

which firefox
/usr/bin/firefox

FirefoxBinaryにpathを指定して、 "add_command_line_options" でheadlessを指定する。

# -*- coding: utf_8 -*-
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

binary = FirefoxBinary('/usr/bin/firefox')
binary.add_command_line_options('-headless')
driver = webdriver.Firefox(firefox_binary=binary)
driver.get('http://www.google.com')
print(driver.page_source)
driver.quit()


HTMLが表示されたら優勝。

ちなみに "-headless" をつけないで "webdriver.Firefox()" で起動させようとすると以下のようになる

~~~
raise WebDriverException(
   "The browser appears to have exited "
   "before we could connect. If you specified a log_file in "
   "the FirefoxBinary constructor, check it for details.")
WebDriverException: Message: The browser appears to have exited before we could connect. If you specified a log_file in the FirefoxBinary constructor, check it for details.


 
上手くSeleniumが起動しない場合の参考は以下
参考:Selenium 3.4.0 Unable to find matching capabilities · Issue #3884 · SeleniumHQ/selenium · GitHub
参考:How to specify Firefox command line options using Selenium WebDriver in Python? - Stack Overflow


 

- command line argumentとFirefoxProfileについて -

コマンドラインからのオプションとして設定できる項目はMozilla公式の以下にまとまっている。

コマンドラインオプション - Mozilla | MDN

"-sage-mode" すれば拡張を全て無効化してくれるので便利といえば便利そうである。
引数だけで設定できる項目は少なめで、後述するProfileを使ってゴニョる。


 
Seleniumのwebdriverには "FirefoxProfile" なるclassがあり、そちらでも設定を記述できる。
一例で書くと以下

# -*- coding: utf_8 -*-
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

# profileの記述
profile = webdriver.FirefoxProfile()
# useragent指定
profile.set_preference("general.useragent.override", "hogehoge")
# 画像を読み込まない
profile.set_preference("permissions.default.image", 2)
# CSSを使わない
profile.set_preference('permissions.default.stylesheet', 2)
# Flashを使わない
profile.set_preference('dom.ipc.plugins.enabled.libflashplayer.so', 'false')

# Firefoxの起動
binary = FirefoxBinary('/usr/bin/firefox')
binary.add_command_line_options('-headless')
driver = webdriver.Firefox(firefox_binary=binary, firefox_profile=profile)

# スクリーンショットを撮って終了
browser.get("hogehoge")
browser.save_screenshot("test.jpg")
browser.quit()


 
一応Firefoxのconfig entriesが一番まとまっているのはこの辺
About:config entries - MozillaZine Knowledge Base
Category:Preferences - MozillaZine Knowledge Base

あと公式サポートも参考に
Profiles - Where Firefox stores your bookmarks, passwords and other user data | Firefox Help

一部使えない(?)ものもあるけど参考にはなる
On Firefox in Selenium WebDriver tests with Python do not want images to load and CSS to render – Selenium Webdriver Trainings

 
Seleniumのオプション周りは以下がちょっと参考になる
selenium.webdriver.firefox.options — Selenium 3.5 documentation
7. WebDriver API — Selenium Python Bindings 2 documentation

 
加えて"webdriver.FirefoxProfile" で既存の設定ファイルを読み込む事もできる。
またProfileにaddExtensionする事で拡張も使える。Proxyを使う方法もある。


 
使っていて分かった事として、消化不良でquit()するとプロセスがゾンビ化して、次以降の起動で以下のようなエラーが出るっぽい。

WebDriverException: Message: connection refused

う〜んと悩んで実際にpsコマンドで見てみるとこんな感じ。

$ ps aux | grep “firefox”
master    3158  0.0  0.0      0     0 ?        Z    16:33   0:00 [firefox] <defunct>
master   12661  0.0  0.0      0     0 ?        Z    16:53   0:00 [firefox] <defunct>
master   13005  0.0  0.0  12948  1088 pts/3    S+   16:54   0:00 grep --color=auto firefox
master   80330  0.0  0.0      0     0 ?        Z    15:08   0:00 [firefox] <defunct>
master   84301  0.0  0.0      0     0 ?        Z    15:12   0:00 [firefox] <defunct>
master  101809  0.0  0.0      0     0 ?        Z    15:34   0:00 [firefox] <defunct>
master  103666  0.0  0.0      0     0 ?        Z    15:37   0:00 [firefox] <defunct>

まあUbuntuFirefoxGUIで使ってた時もこんな感じだったような気がするから許容範囲か…


 

- おわりに -

TODO:
ChromeFirefoxのheadlessを比べるやつを書く
画面操作してみてissue確認する

今後もheadlessで色々できたら良いなと思います。


 

  • 追記 

後輩曰く「Firefoxは.lockみたいなファイルができて〜」という話。
何気なくツイートしていると下記のような事がわかった。


ChromeやPhontomJSと違い、Firefoxはparent.lockをゾンビ化したプロセスが握っている限り次のFirefoxを起動できないのでこのファイルを開放してやる必要があるらしい。う〜ん…


 

MacへのJupyter導入からextensionと設定メモ

- はじめに -

業務PCがWinからMacになりまして、Jupyter notebookしたいので自分の設定とextensionの導入までやったメモ。

あとChrome拡張使ってCSSを書き換えている話とか。


最初に参考資料を示しておくと、どのネット記事よりも以下extensionのGithubリポジトリのREADMEが分かりやすい。


Pythonやpip、バージョン管理環境に合わせて適宜読み替えて。

この記事書いた時点

Mac OSX Sierra 10.12
pyenv上でPython3環境構築済


 

- JupyterをVivaldiで起動するまで -

jupytera 本体の導入はpip

sudo pip install jupyter

インストールが終わったらconfigファイルを作る

jupyter notebook --generate-config
sudo vim ~/.jupyter/jupyter_notebook_config.py

Windowsだと、マシンのデフォルトブラウザで開いてくれてた気がしたけど、MacだとSafariでnotebookが開いてしまう。
Vivaldiなるブラウザを常用しているので以下設定。

c.NotebookApp.browser =u'/Applications/Vivaldi.app/Contents/MacOS/Vivaldi %s'

Chromeだと多分こう。

c.NotebookApp.browser = u'/Applications/Google/ Chrome.app/Contents/MacOS/Google\ Chrome %s'

ブラウザへのパスは適宜書き換える。

python - Launch IPython notebook with selected browser - Stack Overflow
Jupyterをブラウザ指定して新しいウィンドウで開く【なれない日記20160709】 - けつあご日記

jupyter常用者なのでbashrcにはaliasの指定をしている。

alias ju='jupyter notebook'


 

- jupyter extension -

extension導入は前述の通りREADMEを見ながら。
GitHub - ipython-contrib/jupyter_contrib_nbextensions: A collection of various notebook extensions for Jupyter

sudo pip install -e jupyter_contrib_nbextensions
jupyter contrib nbextension install --user

上のコマンドだけとか、gitからcloneしてsetup.py動かせば導入終わりみたいなネット記事が多い理由は謎。(多分上だけだと、nbextensions見に行っても404 Not Foundだと思うんだけど…)

2つめのnbextension installでブラウザ向けのJSやCSSが入るのだけど、highlight_selected_wordが上手く導入できてないっぽくて死んだ。

NotADirectoryError: [Errno 20] Not a directory: '/usr/local/lib/python3.6/site-packages/jupyter_highlight_selected_word-0.0.11-py3.6.egg/jupyter_highlight_selected_word/static/highlight_selected_word'

highlight_selected_wordだけpipで再インストー

sudo pip uninstall jupyter_highlight_selected_word
sudo pip install jupyter_highlight_selected_word
jupyter contrib nbextension install --user

http://localhost:8888/nbextensions を見に行けばextensionのオン・オフができる。

エディタ内で色々開閉できる「Codefolding in Editor」「Codefolding」、メニューに拡張ショートカットを追加する「Nbextensions edit menu item」「Nbextensions dashboard tab」、Vimキーバインド使う用の「Select CodeMirror Keymap」、PEPの下僕として78文字超えたくないので「Ruler」を使っているのでONにしておわり。


 

- StylishでMonokai風にする -

JupyterはそもそもThemeを使う機能を備えているが、Jupyterを動かすサーバ等環境が変わったら一々設定しないといけないのと、コーディング中にも設定見直したいのでChrome拡張を使ってCSSを書き換えている。

以前までStylishを使っていたのだけど、情報送信の話があったでちょっと考えもの。
Webブラウザアドオン「Styish」、ユーザーデータの収集を始めて騒動に | スラド IT

今はCSSとJSのシンプルな拡張は全て自前。
Stylish以外で簡易なのだとStylus、Stylistあたりか。

一応StylishのユーザグループにJupyter用のCSSが公開されてたりして、これを土台に一部書き換えて使っている。

 

書き換えてMonokaiっぽくする文字周りはこんな感じ。白文字がfffなので適宜。

div.output_stderr {background-color: #050505;}
div.output_stderr pre {
color: #509050; 
font-size: 12px;}
.cm-s-ipython .CodeMirror-matchingbracket { text-decoration: underline; color: #c3c3c3 !important; }
.CodeMirror { color: #c3c3c3 !important; }
.cm-s-default .cm-link {color: #3974dd;}
.cm-s-default .cm-string {color: #de846c;}
.cm-s-default .cm-header {color: #1090f0;}
.cm-s-ipython div.CodeMirror-selected {background: #3C4555 !important;}
.cm-s-ipython .CodeMirror-gutters {background: #39414F; border: 0px; border-radius:0px;}
.cm-s-ipython .CodeMirror-linenumber {color: #5A647B !important; font-size: 11pt;}
.cm-s-ipython .CodeMirror-cursor {border-left: 2px solid #0095ff !important;}
.cm-s-ipython span.cm-comment {color: #6E7C95; font-style: normal !important;}
.cm-s-ipython span.cm-atom {color: #CAA6EC;}
.cm-s-ipython span.cm-number {color: #ae81ff;}
.cm-s-ipython span.cm-property {color: #fff;}
.cm-s-ipython span.cm-attribute {color: #E39194;}
.cm-s-ipython span.cm-keyword {color: #f92672; font-weight: normal;}
.cm-s-ipython span.cm-string {color: #e6db74; font-weight: normal;}
.cm-s-ipython span.cm-operator {color: #f92672; font-weight: normal;}
.cm-s-ipython span.cm-builtin {color: #66d9ef; font-weight: normal;}
.cm-s-ipython span.cm-boolean {color: #E39194;}
.cm-s-ipython span.cm-variable {color: #fff;}
.cm-s-ipython span.cm-variable-2 {color: #fd971f;}
.cm-s-ipython span.cm-error {background: rgba(191, 97, 106, .3) !important;}
.cm-s-ipython span.cm-tag {color: #CAA6EC;}
.cm-s-ipython span.cm-link {color: #E39194;}
.cm-s-ipython span.cm-storage {color: #CAA6EC;}
.cm-s-ipython span.cm-entity {color: #E39194;}
.cm-s-ipython span.cm-class {color: #E5DEA5;}
.cm-s-ipython span.cm-support {color: #77ABE7;}
.cm-s-ipython span.cm-qualifier {color: #77ABE7;}
.cm-s-ipython span.cm-property {color: #fff;}

あとextensionで導入したCodefoldingの三角のアレの位置とかを修正

.CodeMirror-foldgutter-open, .CodeMirror-foldgutter-folded { margin-left: -4px; }

跡は幅を100% にしたりしてこんな感じ

f:id:vaaaaaanquish:20170715184749p:plain

拡張なのでCSSで指定しにくいところの書き換えはできないけどまあ概ね満足。
コードもグラフ出力も黒背景の方が僕は好きです。


 

- おわりに -

extensionは導入はpyenvやAnaconda等のベース環境によってたまに失敗してるイメージがあるんだけど、なんかもっとこう絶対優勝できるようになりたい。

あと便利なextensionあったら知りたいところです。
はてブコメントでよしなに。

Jupyter生活は快適でサイコー。