ICLR2017読み会を開催しました

はじめに

こんにちは、AIシステム部の内田(@yu4u)です。 大分時間が経ってしまいましたが、先日、深層学習に関する論文が多数発表された国際学術会議、International Conference on Learning Representations (ICLR'17) の論文読み会をSakuraカフェにて開催したのでその報告です。 ICLRは、オープンレビューを採用しているので、リジェクトされたものも含め全ての論文およびレビューを読むことができるので、こういう読み会には丁度良いかもしれません。

ICLR'17ウェブサイト

オープンレビューサイト

読み会のConnpass

読み会のTogetter

当日の様子

IMG_3694.JPG

懇親会の様子

IMG_3708.JPG

背景

私自身はコンピュータビジョンが専門ですが、その中で利用するニューラルネットのモデルやその学習方法、モデル圧縮等に興味があり、ICLRの論文は良く読んでいました(ICLRの論文を読むというよりは、気になる論文を読んでいたらそれがICLRの論文であるケースがあるという方が正確)。

そんな折、同僚がICLRに参加するらしいということでふと調べてみると、ICLRに関しては過去国内で読み会が開催されていない (to the best of my knowledge) ことに気づき、使命感(?)から開催を企画する運びとなりました。 Twitterで発表者を募ったところ、Connpassでは発表者の募集ができないくらい多くの方に手を上げて頂けたので、当初15時くらいから開催しようかと思っていたのですが、半日フル開催というボリュームにすることができました。

感想とか

こういう勉強会の企画・運営は初めてだったのですが、会場はもとより、コーヒーブレークや懇親会まで会社的にフルバックアップしてもらえたので、スムーズに開催することができました。あとConnpassは良いサービスですね!

発表者の方々がその道のプロばっかりだったので、発表内容のクオリティが高かったのが凄かったです。当日はずっと司会だったのですが、内容がかなり学術的であることもあり、たまに質問が途切れると専門ではない内容でも質問をしなければという使命感から、学会の座長をしている気分でした。おかげで、実はコンピュータビジョンとか個別の分野よりも、こういうより抽象的なレイヤーの研究のほうが面白いのではないかと思い始めてきました。

機会があれば、またこういう勉強会は企画してみようと思います。あと、来年のICLR読み会も開催したいと思います。

当日の発表内容

以降の内容は当日の各発表の解説です。当日何となく理解したつもりになった発表も、厳密に分かっていないところもあるので、結局元の論文を読み返したりしてしまいました。専門ではない内容も多いため、間違いがあればご指摘ください!

ICLR2017紹介

[ICLR2017読み会 @ DeNA] ICLR2017紹介 from Takeru Miyato

最初の発表では、PFNの宮戸さんにICLR2017を俯瞰できるようなご講演をして頂きました。 実は大学の研究室の先輩であるPFNの @sla さんから、宮戸さんがICLRで発表されるということを聞き、ICLRという会議自体を俯瞰できるようなご講演をお願いしたところ、ご快諾頂きました。 現場の盛り上がりを感じられる内容で、ポスター会場の混み具合はもとより、夜は企業がパーティーみたいな場を設けているということで、もはやお祭りですね。 本会議の採録率は39%らしく(去年は28%)、間口を広げる方向にシフトしているのかもしれません。来年は是非発表者として参加してみたいですね。

医療データ解析界隈から見たICLR2017

医療データ解析界隈から見たICLR2017 from RIKEN, Medical Sciences Innovation Hub Program (MIH)

次に、理化学研究所の川上さんに、医療データ解析をされている立場からICLRという会議を振り返って頂きました。 川上さんは医師免許を持っておられるお医者さんでもあり、同僚の @pacocat がICLRの現地でお会いした際に読み会に興味を持って頂けたとのことで、なかなか聞けない切り口でご講演頂けるのではと思いお願いさせて頂きました。 弊社もヘルスケア事業にも力を入れており、医療領域における機械学習の活用は非常に興味があります。個人的にはパーソナライズドな医療に期待しています。 論文の実験の再現性が低いという話があり、再現しなかったからと言って直ちに間違っているということも言えないので、なかなか新しい手法が出てきて一気に変化が起こるような領域ではないのだろうと考えさせられました。 自分の分野だと、話題の手法はあっという間に再実装や追試がされていくので、対照的だと感じました。最近だと、例えばSELUs (scaled exponential linear units) という手法が話題になって、あっという間に追試された結果が色々Twitterに流れてきたのは印象的でした。

Data Noising as Smoothing in Neural Network Language Models

ICLR2017読み会 Data Noising as Smoothing in Neural Network Language Models @Dena from Takanori Nakai

@Quasi_quant2010 さんのご発表。 これまでn-gramを用いた言語モデル (language modeling) では、Kneser-Neyに代表されるスムージングが非常に重要な役割を果たしていた。他方、RNNによる言語モデルでは、単語(列)の頻度を明示的に扱っているわけではないので、そのようなスムージングを直接的に行うことはできなかった。 そこで、n-gramから導出される確率を利用して、RNN言語モデルを学習する訓練データに対し、単語を置き換えたりするノイズを加えることで、スムージングと同様の正則化を実現することを提案し、経験的にperplexityが低下することを示した。

レビューでも経験的と言われていますが、アイディアは面白いですね。画像でいうと、ちょっと賢いData Augmentationをしているようなイメージでしょうか。 ちなみにKneserの発音は「k N AI z uh r」らしいです。

http://d.hatena.ne.jp/tkng/20100426/1272266900

On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima

170614 iclr reading-public from Katsuhiko Ishiguro

石黒さん(みらい翻訳/NTTドコモ)のご発表。 DNNは多数のlocal minimumがあり、それらの局所解はどれもglobal minimumと遜色ないと言われている。この論文では、そのlocal minimumにはsharp minimumとflat minimumがあり、大きなバッチサイズを使うとsharp minimumに、小さなバッチサイズを使うとflat minimumに収束すると主張している。 Flat minimumは、局所解から多少パラメータを変動させても、ロスがあまり増加しないような局所解であり、訓練データとテストデータの分布の違いによりロス関数がずれたとしても、あまり精度が変わらない汎化された理想的な局所解と定義される。

大きいバッチサイズと小さいバッチサイズそれぞれで得られたパラメータを結ぶ直線上にあるパラメータを内挿・外挿により求め、ロスを算出することで、sharp minimumとflat minimumを可視化しているのが面白く、説得力があります。 ちなみにその後、バッチサイズの大小ではなく、SGDのパラメータ更新回数こそが重要であるという主張の論文が出ています。

論文:https://arxiv.org/abs/1705.0874

解説:https://www.slideshare.net/JiroNishitoba/20170629

Q-Prop: Sample-Efficient Policy Gradient with An Off-Policy Critic

Q prop from Reiji Hatsugai

@Reiji_Hatsu さんのご発表。 強化学習において最適な方策を見つける手法は、直接方策をモデル化する方策ベースの手法と、状態の価値をモデル化する価値ベースの手法に大別できる。 方策ベースの手法は、現在推定している方策と学習に利用しているサンプルが同じである方策オン型であり、安定した学習が可能である一方、方策がアップデートされるとこれまでの学習サンプルが利用できないためサンプル効率が悪い。 価値ベースの手法(Q学習)は、常に価値が最大となる方策を選択するため、サンプルの方策とは異なる方策に基づく方策オフ型である。このため、任意の方策でサンプリングされたデータで学習できる一方、学習が安定しない、複数ステップ法への拡張が難しいという問題がある。 この論文では、これらの手法のいいとこ取りをするというのがポイントである。具体的には、方策勾配の関数に、criticのTaylor展開したものを加えて数式コネコネすると、actor-criticの手法に似たアップデートの式が出てきて、criticが方策オフ型で学習できるようになる。

何となく雰囲気は分かるが、導出がトリッキーなので、時間があるときにAppendix Aの数式を追ってみたいです。上記のいいとこ取りという観点では、同じくICLR'17に下記のような論文もあります。 PGQ: Combining Policy Gradient And Q-learning

論文:https://arxiv.org/abs/1611.01626

解説:https://www.slideshare.net/sotetsukoyamada/pgq-combining-policy-gradient-and-qlearning

Tying Word Vectors and Word Classifiers: A Loss Framework for Language Modeling

言葉のもつ広がりを、モデルの学習に活かそう -one-hot to distribution in language modeling- from Takahiro Kubo

@icoxfog417 さんのご発表。 機械学習である単語を表現する場合には、その単語のIDに該当する次元が1でそれ以外が0となるone-hotなベクトルが利用される。学習時のロスもこのone-hotなベクトルをベースに計算されるので、推論結果が、正解の単語とほぼ同じような単語であろうと全く違う単語であろうと同じロスが発生する。 本論文では、これに対し、単語間の類似度に基づき、正解をone-hotではなく広がりのある分布として表現し、その分布を用いてロスを計算することを提案している。 具体的には、元々のone-hotのベクトルと、単語の埋め込みベクトル間の内積により算出される類似度をsoftmax通すことで作られるベクトルの重み付き和により、この広がりのある分布を定義している。 また、one-hotのベクトルをdenseなベクトルにする埋め込み行列Lについても、出力時の射影Wと本質的に対応しているべきであり、それらを個別に学習しないような手法を提案している。具体的には、LがWの転置であるという制約を導入している。

読み会では、LとWの対応について逆行列で求めているのかという質問がありましたが、フルランクではないのでどのようにしているのかと思いましたが、論文を読むと上記のように転置であるという制約を入れているようです。

Stochastic Neural Networks for Hierarchical Reinforcement Learning

ICLR読み会 奥村純 20170617 from Jun Okumura

奥村さん(DeNA)のご発表。 迷路を解くような問題では、報酬がゴールにたどり着いた時にしか発生しない(報酬がsparse)。このようなケースでは、探索時にゴールに全く辿り着かずに学習が進まないという問題がある。これに対し、中間的なタスクを設定し、そこで汎用的なスキルを身に付けさせることで、報酬がsparseである問題を解決しつつ、身につけた汎用的なスキルを他の問題にも適用できるようにできれば嬉しいよねという問題提起。 本論文では、迷路を解く問題に対し、取り敢えず移動するというタスク(蛇のような関節モデルを想定しており、移動すらランダムだと難しい)を設定し、更に様々な方向に移動する多様性もあるように学習させるために、確率的ニューラルネットの利用と、色々な動きをした際に報酬にボーナスを与える相互情報量ボーナスを導入している。

やっていることは理解できるのですが、背景でなるべく中間タスクはhandcraftedにならないようにと言っている割に、えらくタスクに依存する手法となっているのがちょっとモヤモヤします。

Optimization as a Model for Few-Shot Learning

Optimization as a Model for Few-Shot Learning - ICLR 2017 reading seminar from Hokuto Kagaya

@_hokkun_さんのご発表。 Deep learningは大量の訓練データが存在する場合には威力を発揮するが、例えば鳥というクラスの中で細かい鳥の種類を分類するようなfine-grainedなタスクなどにおいて、各クラスに十分な訓練データが準備できないケース(few-shot learning)がある。そのようなケースでも高精度な認識をするための手法。 SGDの更新式ってLSTMのセルの更新式に似ているよねという発想から、SGDのパラメータの更新の方法をLSTMで学習するというメタ学習を提案している。

枠組みとしては通常の学習でも活用できそうな気がしますが、自動的にドメイン特化した更新式を獲得する枠組みがポイントなので、ドメインが決まっている通常の学習では単に学習率とかを色々単純に試したほうが良いかもしれません。 つまり、問題設定として、メタ学習データでメタ学習を行い、メタテストデータで先ほど獲得した学習方法を利用して学習を行う(ややこしいがメタテストデータに学習データとテストデータがさらに存在する)という前提があり、そもそも学習データで学習率を調整できない(ドメインが変わるので意味がない)のでこのようなアプローチが重要になるのだと思います。

Autoencoding Variational Inference for Topic Models

@nzw0301 さんのご発表。 Latent Dirichlet Allocation (LDA) をNeural Variational Inference (NVI) で行う(明示的にDirichlet分布は利用していないのでLDAと言うのは語弊がある?)。VAEではガウス分布のパラメータをニューラルネットが出力し、そのガウス分布からサンプルを生成する。この際、backpropができるような計算グラフを構築するreparameterization trickを利用する。LDAでは、ディリクレ分布のパラメータを生成し、多項分布(トピック分布)を生成したいが、そのままでは上記のtrickは利用できない。そこで、事後分布をガウス分布で近似するLaplace近似を利用し、ガウス分布からのサンプルにsoftmax(σ())を適用することで、多項分布をサンプルすることを可能とする。 上記のトピック分布θとトピック毎の単語生成確率行列σ(β)との積によって、最終的な文書の単語分布が得られる。ここで、σ(β)は、トピック毎の多項分布であり、最終的な単語分布はそれらのθによる重み付き和となる。このようなケースでは、生成される単語分布は、トピック毎の単語分布よりシャープにならず、幾つかのトピックにおいて主観品質の悪い結果をもたらすことがある。これに対し、本論文では、得られる単語分布をσ(βθ)とするProdLDAを提案している。この場合、βは多項分布であるような正規化がされていないため、上記の問題を解決できるとしている。また、学習方法もBNとDropoutを利用するなど工夫しているらしい。

とても勉強になりました。σ(βθ)としてしまうのは乱暴なようだけど、この定式化でもσ(β)はちゃんとトピック毎の単語性生成行列になるのですね。下記の論文のように、reparameterization trickにもいろいろな種類があって面白いです。

https://arxiv.org/abs/1611.00712

Variational Lossy AutoEncoder

@crcrpar さんのご発表。 VAEでは、潜在変数の事前分布p(z)を正規分布に、事後分布p(z|x)をガウス分布とすることが多い。このような単純な分布は表現能力が低く、真の事後分布にうまくfitしない問題が発生する。この問題に対し、Normalizing Flow、Inverse Autoregressive Flow (IAF) といった、より複雑な事後分布を生成できる手法が提案されている。これらの手法では、単純な分布を徐々に複雑な分布にする可逆変換を利用している。本論文では、IAFで事後分布を複雑な分布にするのではなく、Autoregressive Flow (AF) を用いて事前分布を複雑な分布にすることを提案し、AF事前確率とIAF事後確率のエンコーダ処理は同一であることを示した。

AFを事前確率に入れるほうがIAFを事後確率に入れるより表現能力が高いという主張が良く分かりませんでした。事前知識が足りず、normalizing flow辺りの論文から理解しないといけないですね。

Semi-Supervised Classification with Graph Convolutional Networks

Semi-Supervised Classification with Graph Convolutional Networks @ICLR2017読み会 from 英爾 関谷

関谷さん(DeNA)のご発表。 隣接行列で表現される重み付き無向グラフが与えられ、各ノードには特徴信号が紐付いている。一部ノードにはクラスラベルも付いており、残りのノードにはクラスラベルは付いていない。このような前提で、クラスラベルの付いていないノードのクラス分類を行う、graph-based semi-supervised learningの問題をグラフ畳み込みネットワークで解く手法。 グラフに対する畳み込みは、各ノードの特徴信号を並べたベクトルに対し、グラフラプラシアンの固有ベクトル行列を利用してグラフフーリエ変換を行うことでフーリエドメインに変換し、そこで畳み込みカーネルとの要素積を行い、最後に逆フーリエ変換する処理として定義される。 上記の処理は行列演算と固有値分解の計算量が大きいため、畳み込みカーネルをグラフラプラシアンの固有値の関数と定義し、1次までのチェビシェフ近似を用いることでノード数に線形なグラフ畳み込みを行うことを提案している。

チェビシェフ近似の辺りから、何でそれで良いのか理解が難しいです。ちなみに特徴ベクトルは独立に周波数ドメインに変換されて畳み込みが行われるようですが、次元間の関係をうまく捉えるような拡張とかできないかな、と思いました。

続きを読む
ツイート
シェア
あとで読む
ブックマーク
送る
メールで送る

golang.tokyo #6 を開催しました

こんにちは、オープンプラットフォーム事業本部の@pospomeです。
普段は GAE/Go の環境でサーバサイドエンジニアとして働いています。
(´・ω・`)

DeNA といえば、 Perl の印象が強いかもしれませんが、
AndApp というPCゲームプラットフォームの開発に GAE/Go を採用したこともあり、
AndApp以外の新規プロジェクトでも Go を採用するケースが増えてきました。

そういった経緯もあり、golang.tokyo #6 が 6/1 に DeNA にて開催されました。

当日の様子

DSCN2043.JPG DSCN2044.JPG DSCN2041.JPG

当日の資料

こちらにまとまっているので是非覗いてみて下さい。

発表に対する感想

ここからは pospome が当日の発表に対する感想をつらつらと書いていこうかと思います。

Gopher Fest 2017 参加レポート

Alias Declarations は面白い機能ですね。
「sync.Map」「環境変数の上書き」「go test の vendoring 無視」も嬉しいですね。

初めてGolangで大規模Microservicesを作り得た教訓

「非対称暗号が遅いから別サービスとして PHP で実装した」というのは
Microservices ならではの特徴ではないでしょうか。

regex, reflection が遅いというのは皆さんご存知かもしれませんが、
多用すると影響が出るくらい遅くなるケースがあるんですね。
ちなみに、PHP で実装したのは GAE/SE で利用可能で、サクっと
実装できそうだったからです。

ゲーム開発には欠かせない?!あれをシュッと見る

CSVはよく使いますよね。
こーゆーCLIツールをサラッと作れるのは Go の魅力の1つではないでしょうか。

Go Review Commentを翻訳した話

以下の記事を書いた方だったんですね。
「いいね」が100を超えたみたいです。
http://qiita.com/knsh14/items/8b73b31822c109d4c497

僕も読みましたが、Indent Error FlowInitialisms みたいな
個人の好みによってバラつきが出るものは
このようにルール化されると統一できていーですよね。

ScalaからGo

Sacla と副作用のお話でしたが、最終的に Scala の方が好きっていうw
と言いつつ、僕は個人的に DDD, クラス設計 とか好きなので、
実は Scala, Swift のように色々できる多機能な言語に魅力を感じたりします・・・。
もちろん、Go も好きですよ。

Crypto in Go

LTでセキュリティ系の話は珍しいですね。
勉強になりました。

まとめ

ということで、参加者の皆様、勉強会お疲れ様でした。
予想以上の来場者に、我々も改めて golang の人気の高さを感じました。
今回の勉強会で得られた知見を仕事や趣味で活かしていけるといいですね。

参加者並びに運営の皆様、弊社へお越しいただき、ありがとうございました。
また機会があれば弊社で開催させていただければと思っております。

続きを読む
ツイート
シェア
あとで読む
ブックマーク
送る
メールで送る

『詳解Linuxカーネル』の輪読を始めました

初めまして!
IT基盤部の安武です。

本日は、社内で最近始めた『詳解Linuxカーネル』という書籍の輪読会について紹介します。
この本は文字通り、Linux カーネルの仕組みについて詳細に解説した、1000ページ超の大型本です。

the-linux-kernel-cover.jpg

O'Reilly Japan - 詳解 Linuxカーネル 第3版
Daniel P. Bovet, Marco Cesati 著、高橋 浩和 監訳
2007年2月発行

決して易しい本ではありませんが、カーネルのアーキテクチャを理解しておくことはアプリケーション開発者にとっても、運用担当のエンジニアにとっても、アドバンテージになる技術スキルだと思います。

私は 2〜3 年ほど前にこの本を購入しました。
しかし、ときどきリファレンス的にピンポイントで参照することはあったものの、実質ほぼ「積ん読」状態(*1)になっていました。

「複数人で輪読(*2)したら読み進められるだろうな」と思いついたのが最近のこと。
社内の Slack チャンネルで何気なくつぶやいてみたところ、意外とすぐに反応が返ってきました。

linux-kernel-slack-screenshot.png

その後、複数のチャンネルで声を掛けて回ったところ、IT基盤部以外の部署からも参加者が集まり、合計で9名になりました。 それが、先月下旬のことでした。

第1回の輪読会はその翌週、7/2 19:00〜 に行いました。
その会の後、Twitter で輪読の良さについてつぶやいたところ、更に「参加したい」というメンバーが増え、7/13 現在、発表担当でない者も含めて、合計で15名が輪読会に参加しています。

rindoku-linux-kernel-2nd.jpg

写真は 7/7 に実施した第2回の輪読会の模様です。

輪読の進め方として、最初にシンプルなものを定めました。

  • 担当の人は該当章をよく読んで、かんたんな要約を作っておく
  • 担当外の人もなるべく読んで、1個以上質問を用意しておく

業務外の活動ですし、自分としては読むきっかけが生まれるだけでもありがたかったので、ルールは厳格にせずゆるく進める方針でいます。

要約のフォーマットとしては、一番楽だろうと「Gist など」と最初に提示しておきましたが、2回の輪読会を経て、スライド形式に落ち着きつつあります。その方が図表など交えてビジュアルに説明しやすいからです。

実際に輪読をやってみて、よかったと感じていることを挙げてみます。

  • 集団で取り組むことである種の強制力が生まれ、積ん読状態だった本を読み進めることができた。
  • 輪読会での議論を通して、より理解を深めることができる。

特に後者については、『Linux カーネル2.6解読室』を読んだメンバーや、CPU周りの低レイヤの仕組みに詳しいメンバーもいて、有意義な議論ができているのではないかと思います。

以上、私が発起人になって始めた『詳解Linuxカーネル』輪読会の紹介でした。

ここ最近、社内でどの程度、有志による輪読会が開かれていたかわかりませんが、今回の輪読会を進めながら Slack に #rindoku チャンネルを作り、社内 Wiki に「Rindoku」というスペースを作ってみました。
ので、今後更に別の輪読会が生まれてくるのではないかと期待しています。

1人で読むことと比較して、理解がより深まり、他者から刺激を得られますので、輪読、オススメです。

脚注

(*1) つんどく - ウィクショナリー日本語版
(*2) もし輪読そのものに詳しくないという方には、例えばこちらの記事が参考になると思います。

続きを読む
ツイート
シェア
あとで読む
ブックマーク
送る
メールで送る