日記

最近twitterのアカウントを消してしまって*1 アウトプットする場所が無くなったので、代わりに日記を書いていくことにします。できれば毎週~隔週くらいのペースで。

Rust Book (Second Edition) 読んでる

Introduction - The Rust Programming Language

Rust は身の周りやウェブ上で使っている人をちらほら見かけて気になっていたので、新しい言語で取り入れられている考え方をほんのちょっとだけでも理解できたらいいなぁと思い勉強し始めました。 実は Rust は半年くらい前に勉強しようと思いチュートリアル(Rust book)を読んでいたものの途中でよくわからなくなって挫折した経緯があるのですが、その後チュートリアルが全体的に刷新されていたようで、新しい気持ちで読み進めることができました。 全20章構成。

  • 1章(Introduction): セットアップとかそういうの。VSCodeプラグインの保管が神という話も聞きますが、前に試したときにうまく設定できなくてよく分からなくなったので vim に Rust.vim だけ入れて書くことにしてます。最初は多分何でもいいんだと思います。
  • 2章(Guessing Game Tutorial): 数当てゲームによるチュートリアル。cargo の使い方とか、パターンマッチ構文が他の言語に比べて独特な感じがするけどそれ以外は特に難なく読める。
  • 3章(Common Programming Concepts): mutabiilty, データ型、関数、制御フローについて。割と普通。
  • 4章(Understanding Ownership): Rust の大きな特徴である変数の所有権に関する話。メモリ上でデータがどのように格納されているのかについて詳細に述べられており、第一版に比べると格段に説明が詳細になっている印象を受けました。所有権に関するルールを羅列していただけという印象が強かった第一版に比べて、こちらは「なぜそのような制約を設けているのか」について見通しが良くなっているように感じます。
  • 5章(Using Structs to Structure Related Data): 構造体について。メンバ変数の定義とメソッドの定義を別のブロックで書くことになっているのが特徴的?内容自体は割と普通。
  • 6章(Enums and Pattern Matching): 列挙型(enum)について。列挙型がリッチなのも Rust の特徴の1つと言えそう。
  • 7章(Using Modules to Reuse and Organize Code): ファイル分割によるモジュール管理について。「サブモジュールを持つモジュールは、ディレクトリを新規に作ってそこで管理しなければいけない」という仕様を見て少しびっくりしたのだけどなんでそんなことにしてるのだろう?利点がいまいち見えないと思った。
  • 8章(Common Collections): C++だとコンテナとか呼ばれてる類のモジュールについて。String の項目は「UTF-8は大変」みたいなことばっかり書いていて具体的にどう使えばいいのかよく見えてこなくて不満でした。そもそもモジュールとしても使い勝手があまり良くなさそうで、例えば String の部分文字列を取る方法についてググるこういう Stackoverflow の回答が出てくるのですが、普通に面倒で分かりづらい。基本的に String は immutable で使うことが前提っぽいので、それぞれの文字に頻繁にアクセスするようなコードを書く(例えば Suffix Arrayアルゴリズムを書くといったような)用途では別のデータ構造に変換してから使った方がという意図は見えるのですが、チュートリアルでは明示的にはそう書いてないし、そもそも何に変換すると一番良いのかもよく分からない。
  • 9章(Error Handling): エラー処理。Rust では例外ではなく、戻り値を使ってエラー処理する。適当にコードを書きなぐりたい時には panic! を用いて、ちゃんとしたものを作りたいときは Result をちゃんと処理すると良い。Result をパターンマッチで毎回律儀にチェックするのは面倒極まりないけど、"?" 記号などを使えば楽に記述することができる。

第二版は第一版に比べると、構成の見通しが良くなっていたり章末に軽い練習問題が乗っていたりしてチュートリアルの質は上がっていたような気はします。 気になる点も多少ありましたが、まだドラフトということなので完成版に期待したいです。 チュートリアルのあと半分も1~2週間くらいあれば読めそうなので、読み終わったら何か小~中規模のものを作って感触を掴んでみたいところ。


そういえば、コードを書いて色々試していると自動デリファレンス周りで少しハマったことが。

fn main() {
    let mut x = 1;
    {
        let xref = &mut x;
        f(xref, 1);
    }
}

fn f(x: &mut i32, y: i32) {
}

このコードは mainf に渡している引数(xref)がインターフェースとマッチしていないが、自動デリファレンスが働くので正常にビルドできる。しかし、f(...); を代入演算子に替えた以下のコードだと、

fn main() {
    let mut x = 1;
    {
        let xref = &mut x;
        xref += 1;
    }
}

エラーで落ちてしまう。

error[E0368]: binary assignment operation `+=` cannot be applied to type `&mut {integer}`
 --> src\main.rs:5:9
  |
5 |         xref += 1;
  |         ^ cannot use `+=` on type `&mut {integer}`

error: aborting due to previous error

何のことかよく分からなかったので周りの詳しい人に聞いたところ、自動デリファレンスはメソッド呼び出しで使えることは第一版に書いているがそれ以外については何も言っていないこと、またかなり最近の pull request で演算子でも自動デリファレンスできるようにする提案がされていたものの色々理由があって却下されていたことがわかりました。 うーん、何だかなぁ…。

「情報幾何の基礎」読んでる

情報幾何というストイックそうな分野の輪読会に特に理由無くなんとなく参加してたらいつの間にか発表担当になっていたので、色々予習してました。 使用している教本は数理情報科学シリーズの「情報幾何学の基礎」です。

とりあえず復習/予習した内容:

  • 学部1年レベルの解析学の内容 (だいぶ忘れていたので10年前のノートを引っ張ってきて復習した)
  • 双対ベクトル空間、テンソル
  • 微分幾何の入門っぽい話(ゆるふわ)

まだ準備ばかりで情報要素が皆無ですが、今後話がどういう風に盛り上がるのか(そもそも、盛り上がるのか)に期待です。

*1:最近の凍結騒ぎを見てかなり萎えたのと、最近はそもそもほとんど使ってなかったので他の場所を探すことにしました。

京大情報学研究科の談話会で講演してきました

日記です。先週金曜の話ですが、京都大学情報学研究科の通信情報システム専攻で毎週開かれている談話会で講演をしてきました。講演では機械学習とかディープラーニングとか強化学習の基礎や最近の話を結構カジュアルに話しました。もちろんですが趣味ではなく仕事として出張で行ったので、会社の採用活動的な要素も兼ねています。
通信情報システム専攻 2016年度談話会の概要
経緯としては、今年の2月に元出身研究室の助教の先生から何か話せないかとメールで連絡が来たのがきっかけでした。何を話すかについては結構悩んだのですが、結局昨今のAIブームで注目度のそれなりにありそうで、かつ自分もそれなりに取り組んだディープラーニングがいいだろうということでそれをテーマにしました。しかし具体的にどのようなメッセージを残すのかについては幾分悩みました。僕はかつてこの専攻に居たので知っていたのですが、この専攻では機械学習を研究でやっている人というのは一部を除いてほとんどいません。実際に講義中に聞いてみたのですが、機械学習を講義ですら習ったことの無い学生の方々が大半だったようです。情報学科以外の出身者が多分半数以上占めているのでそんなもんかもしれませんが、少し驚きました。専門でやっているわけでもない人に「AI流行ってるからAIやろうぜ」みたいなことを言ってもなんかいまいちだろうと思ったので、無理やりでっち上げた感じではありますが以下のようなことをメッセージに上げました。

  • ディープラーニングはブームの始まりから数年が経ったが今でも進展を遂げている。
  • 環境をセットアップして実験を行うことは以前に比べるとだいぶ容易になっている。実際に実験すれば、良い点も悪い点も見えてくる。極端な例だが、非専門家が1~2ヶ月ですごいサービスを作った例もある。
  • ディープラーニングみたいな技術を実際に使えるものにするためにはそれ単体ではだめで、様々な技術が統合される必要がある。

分野にやんわりと誘いつつ、今皆さんのやっていることも大事なんですと言って敬意を払うといった風でしょうか。
あと雑談レベルですが以下のようなことも話しました。

  • 実際に何か実験することが大事で、講演だけ聞いてても多分あまりわかるようにならない。
  • (自己紹介のときに)進路決めには色んな葛藤が伴ったけど、グダグダしているうちに成り行きで決まった。
  • これは僕が勝手に思っているだけのことかもしれませんが。思考の方法として、ボトムアップ的なものとトップダウン的なものがあると思う。僕はボトムアップ的なものは好きだったけど、トップダウン的なものはそんなに得意ではなかった。コンピュータ科学は結構ボトムアップ的なものが多いと思う。例えばCPUの設計ならまずは論理回路や順序回路のようなプリミティブなものから入って単純な演算器を作り、それらを複雑に組み合わせてCPUを作り。さらに色んな最適化も考えるといった具合で。各種分野の数学も、基本的な定義から入って簡単な命題を導出し、補題、定理、と非自明な結果を積み重ねていく。パターン認識のような問題はちょっと雰囲気が違う。例えば人間の認知のシステムは何らかの仕組みで上手く動いているが、中の仕組みが分からない。最初に巨大なブラックボックスが与えられていて、それをなんとか理解できるところまで分解していく。ディープラーニングはまさに突然謎のモデルがどこかからやってきて、何が起きているのかを実験から推論しなければならない、といった感じだったと思う。トップダウン的な感じがする。それの裏付けと言っていいのか分からないが、機械学習やデータ分析には情報系分野意外にも物理など別分野出身の人が多い。そういう理由もあってなのかどうなのか、自分は働きはじめてこの分野に慣れるまで比較的時間がかかった方だと思う。

あとは、「大学院に居る頃は専門の分野に取り組むだけで手一杯だけど、今重要とみなされている分野に(研究にはならないとしても)多少手を出しておくと、今後活動する上でのヒントになるかもしれない」といったことも口頭で言おうかと思っていたのですが完全に失念していました。しかしこれは結構ポジショントーク的なので言わなくてよかったのかもしれません。

日帰りだったので居たのは一瞬でしたが、春の京都は自分を初心(大学に入学したばかりの頃とかの気持ち)に帰らせてくれるのでとても良かったです。

論文:Beating the World’s Best at Super Smash Bros. Melee with Deep Reinforcement Learning

モデルフリー系の深層強化学習の手法を用いてスマブラDXのゲームAIを作ったという論文が出ていたので読んだ。以下はそのメモ。

概要

論文URL : https://arxiv.org/abs/1702.06230
著者のグループは github でコードを公開しており、そのデモ動画が twitch や youtube に上がっている。
www.youtube.com
上の動画はその一例。明記されていないが、動きからして 2P のキャプテン・ファルコンが強化学習 AI で、1P が人間だと思われる。スマブラの素人が見てもあまりピンと来ないのだが、人間側は世界ランキングでトップ50相当のプレイヤー(二人いて、途中で交代している)らしい。

reddithacker news でも活発に議論されている模様。

内容

環境の定義について

  • Atari のゲーム環境などとは異なり、画像ではなくエミュレーターのメモリから必要な情報を取り出してそれを観測情報としている。具体的にはプレイヤーの位置、速度、行動状態などがあると記されている。観測の次元がどれくらいなのかは自分が見た限りでは明記されていないように見えるが、多くとも数十次元程度といったところだろうか。
  • ゲーム自体は60フレームで動いているが、行動は2フレームおきに行うようにしている。スキップしたフレームでは何も行わないと記されている(が、これだと左右移動とかが不自然になるので正確には直前の行動を繰り返しているのでは?)
  • ゲームキューブのコントローラーには2つのアナログスティックと幾つかのボタンが有り、複雑な入力を入れることが可能である。が、簡略化のために、アナログスティックの操作は9個に限定し、ボタンは5つのうち高々1つしか選べないようにしている。これにより、9*(5+1)=54個の離散の行動値から1つを選ぶように設定している。
  • 報酬関数の設計は、相手を倒す/相手に倒されるでそれぞれ+1/-1が得られる設定にしている。が、これだけだと報酬を得るまでが遠すぎるので、相手に与えた/相手から与えられたダメージも報酬に加えている。

手法

  • ニューラルネットを用いたQ学習(DQN)と方策勾配法(Advantage Actor-Critic)を試した。
  • Atari ではゲーム環境を実時間の数百倍でエミュレートできるが、スマブラDXではせいぜい1~2倍の速度でしかエミュレートできず、そこがボトルネックになってしまう。これを解決するために、複数個(50個とかのオーダー)のエミュレーターを並列で走らせた。計算資源はどこかから調達した。
  • ハイパーパラメータは色々チューニングした。ε(行動をランダムに選ぶ確率?)は0.02、割引率は0.99くらい、割引報酬の和は10ステップまで取る。
  • Q関数やactor,criticのニューラルネットアーキテクチャには隠れ層2、チャンネル数128の全結合のものを用いた。詳しく調べていないが、層を増やしたりしても結果は良くはならなかったと記されている。
  • 活性化関数として、leaky relu のソフト版のようなものを使ったと記されている : $f(x) = \log(\exp(0.01x) + \exp(x))$ …が、一体なぜ?
  • 学習率は手で調整して 1e-4 にした。
    • この後で、TRPO でステップ幅を決める手法も紹介されているが、実験どの部分で使ったのかよく分からない。

実験1 : 普通に対戦

  • エージェントをそれぞれスマブラDXに標準搭載されているAIと対戦させた。
  • ステージは「戦場」、プレイキャラは両方ともキャプテン・ファルコン (↑の動画の通り)
  • DQN も Actor-Critic も20時間くらい経てば相手を上回る性能になった。DQNの方が収束が速い。
  • 報酬関数の値を見ると DQN と Actor-Critic で大差はなかったが、学習した方策に大きな違いが見られた。DQN は相手(標準AI)に対してハメ技のような手を探して相手を自滅に追い込むのに対し、Actor-Critic では人間と似た戦略に落ち着いた。
  • 学習アルゴリズムのベースラインとして、OpenAI が提供している A3C のアルゴリズムを試してみたが、うまくいかなかったと記されている。

実験2 : 自己対戦

  • それなりに強いエージェントが出来たことなので、AlphaGo のときと同じ要領で自己対戦のアプローチを試した。
  • 最初は弱い人間プレイヤーにも負けるエージェントだったが、1週間自己対戦を行うと中級プレイヤー(著者)も勝てないほどになった。
  • その後さらに1週間自己対戦を行った後、スマブラDXのトッププレイヤー達と対戦を行わせたところ、エージェントの方が倒した回数を上回る結果となった。(詳細は論文のテーブル1)
  • しかし、エージェントは謎のハメ技を使うと倒せてしまうことも判明した。具体的には、ステージの端で座ったままで居るとエージェントは変な挙動をして、自滅してしまうこともあるらしい。学習中にハメ技を仕掛けてくるような対戦相手が居ないことが原因だろうとしている。

実験3 : 複数キャラ

  • キャプテン・ファルコンしか使えないのは不満なので、他のキャラクターでも学習を試みた。具体的には Sheik, Marth, Fox, Falco, Peach, Falcon が挙がっている。
    • 投擲技を行うキャラ(フォックスとか)が居る気がするのだがいいのだろうか…
  • …学習した結果、どれくらい強くなかったのか書かれていない。
  • 環境が多様になったおかげか、奇妙な挙動をしたりハメ技で死んだりすることは無くなったと書かれている。
  • あるキャラクターのエージェントを学習する時に、初期値として他のキャラクターで学習したパラメータを持ってきて学習すると、学習時間が短くて済んだと記されている。

議論

  • Q学習は固定された環境ではうまくいったものの、自己対戦のような環境が変遷していく場合にはうまくいかなかった。policy iteration に加えて環境の変化に追随するのが難しいのではないかと筆者らは予想している。
  • 探索と活用について:Actor-Critic ではエントロピー項の係数で探索量を調整しているが、スマブラDXでは多くのフレームではどう動こうが重要ではない場面が多く、そういったときにエントロピーが高くなり、行動が不安定になりがちになるのでなんとかする方法が欲しい。
    • どうでもいい場面ならどう動こうが別に良いのでは? と思ったのだけど違うのだろうか
  • 人間には反射速度に200ms程度の限界があるのに、このエージェントは2フレーム(33ms)で反射していて、人間との対戦ではフェアではないのではないか、という批判がある。これに対して、行動を即時に行うのではなく、一定フレームだけ遅れて行うようにして学習させたところ、6フレーム遅延させたあたりから一気に性能が悪化していったと記されている。遅延そのものだけでなく、報酬の遅れなどが原因なのかもしれないが、定かではない。

感想

  • 手法面での真新しさは特に無いものの、モデルフリー系の強化学習手法を実際の難しいタスクに適応しようとしたケーススタディとして面白い。細かいチューニングとかの話も結構参考になる(かも)。
  • Q学習系と方策勾配系の手法で振る舞い方に差が出るという話は聞いたことがなかったので面白いと思った。普通の論文では報酬の合計値でしか性能を見ないので、こういった違いにはなかなか気付けない気がする。ただ、この話がどこまで一般的なものなのかはよく分からない。
  • 良い強化学習エージェントを作り上げるには、試行錯誤も学習も含めやはり相当な計算資源と時間が必要なのだと感じた。
  • そもそも海外で未だにスマブラDXが人気ということを知らなかった。
  • 論文のタイトルはやや誇張気味で、まだやることは色々残っている。

読書メモ:Drones: The Facts, Fun & Dangers of Drone Technology

最近のドローン事情について知りたくなったのでいろいろ調べていたらこれを見つけたのでとりあえず読んだ.
www.amazon.co.jp

概要

昨今はドローン市場が盛り上がっているが,どのような分野でドローンが活用されているのか,または活用されると期待されているかについて書かれている.分量は43ページとかなり少ない.値段も320円とお手頃で評価もそこそこよい.英語読むのが速い人なら速攻で読み終えられるのではなかろうか.
分量が少ないだけあってあまり細部については書かれていない印象がある.例えば Amazon Prime Air のようなドローンを使った配達業なんかは注目度が高い気がするのだが,自分の画面だと2ページくらいしか書かれてなくて短い.(法規制のこともあってあまりおもしろい話が無いせいもあるのかもしれないが.)

部の構成については以下のようになっている.

  • Introduction
    • ドローンの歴史について.戦争の最中に開発され,今でも主に軍事用途で使われていることが説明されている.
  • Chapter 1
    • ドローンの種類について.空中に浮遊するヘリコプタータイプ(ロータリー)のものと,RQ-11 Raven のような固定翼のものがある.ロータリーは移動を精密にできるが,電気をよく消費するし移動速度が低い.固定翼のものは省電力で移動速度が大きいが,飛行機と同じように移動するため離着陸に滑走路が必要になる.
  • Chapter 2
    • ドローンの市場規模について.大体軍事用途である(c.f., Drones Report Market Forecast - Business Insider)が,今後は商用利用・個人利用も増えていくだろうとの見通しを立てている.ドローンメーカーは垂直統合と技術ライセンスが主な戦略になっていく.商用利用では農業が80%を占めるようになるだろうと予想している.
  • Chapter 3
    • ドローンは軍事だけでなく,警察でも使われる.
  • Chapter 4--10 : いろんな軍事以外の応用について書かれている.
    • いろいろな応用があるが,以下の3つのどれかに分類できるような気がした.
      • ドローンにカメラなどのセンサーを積んで,人間では辿りつけないか,あるいは従来のヘリコプターのような機体で移動するには高コストだった場所から広範囲に地上の情報を集める.例えば,災害地の監視,上空地図の作成,農地の監視など.農業用途のドローンの需要が大きいのは,現状は多くを人手でやっている農地の監視作業をドローンで肩代わりできるようになるのが大きいのと,今後も世界人口の増加で農業自体の需要が大きいため.
      • ドローンに何かものを積んで,ものの移動手段とする.農地での農薬散布,商品の配送など.法規制が厳しいため,配送は現状ではすごい田舎など人がいない場所に限られる.そういえば,商品の配送でドローンを最初に使おうとしたのは Amazon Prime Air なのかとおもいきや実はオーストラリアの Flirtey というベンチャー企業だったらしい.
      • カメラを載せてかっこいい映像を作る.報道用の映像撮影,不動産の物件のかっこいいPV作成(建物を上空からいい感じに映したらそれで興味を惹かせることができる,らしい… ほんまか)など.
  • Chapter 11
    • ドローンがテロに使われちゃったら嫌だから法規制はやっぱり慎重にしないといけないという話.短い.

感想

ドローンが期待されている使われ方についての記述は自分みたいな素人でも分かりやすかった.反面,ドローン市場の全体像については具体的な数字が少なくていまいちつかみにくいような気がする.今後も状況はガンガン変わっていくので油断ならない.

ニューラルネットのメモリ消費を小さくする類の手法

ちょっと前に論文読んだので備忘録としてメモしておく.

前置き

  • 本格的なニューラルネットはパラメータ数が多いのでモデルサイズが大きくなってしまうことが多い
  • このようなモデルでも普通のマシンで動かす場合には(GPUのメモリを使い切らない限り)問題にならないことも多いが,モバイル端末などメモリ容量が制限されたハードウェア上で動かしたい場合には問題になる.
  • これをなんとかする論文をいくつか読んだ.

Deep Learning with Limited Numerical Precision (ICML2015)

  • 普通はNNのパラメータは32bit浮動小数点数で保持されているが,小数の精度を落とす(たとえば16bitとか8bitとかにする)ことでメモリ消費を単純に1/2とか1/4にできる.
  • 16ビット幅の固定小数を使ってNNを学習のフェーズから行う.
  • 小数を丸めるときに,単に一番近い値に丸めるのではなく,切り上げか切り下げかをその値によって確率的に選ぶと良い感じになる,と主張している.
    • 更新のときに小さい値が何度も足されるふうになる時に,一番近い値に丸めるのだと全く更新されないけど,確率的にやるとたまにちゃんと更新されて良い感じになるというイメージ.
    • この丸め方の違いで学習性能が大きく変わることが実験結果から示されている.
  • 後半に,それ用のハードウェアをFPGAで構成する話も載っている(未読)
  • 感想
    • 確率的に丸めることでまともになるというのは結構妥当な感じがするしNN以外の手法でも使えそうな気がする.ある良い感じの条件下(たとえば目的関数が凸とか)だったら高確率で高精度小数で計算した時から結果がずれないみたいなことは言えても不思議じゃない気もする.ちゃんと考えたわけじゃないので雑な意見だけど….
    • 小さいモデルでしか実験してないけど最近の10層以上のネットワークでも同じような結果は得られるか気になった.
    • しかしメモリが制限された環境で学習したい状況というのがどんな状況なのかあまりイメージが沸かなかった.学習自体は富豪環境でやってテストだけ貧民環境でやりたいことのほうが多いんではないか.
      • GPUのメモリに入りきらないくらいでかいモデルを訓練したい時には良いのかもしれない?

Fixed Point Quantization of Deep Convolutional Networks (ICLR2015 under review)

  • レビュー中だけど引用されていたので読んだ.
  • これも,精度を落とした固定小数点数でNNを学習のフェーズから行う.
  • この論文では,NN全体で同じビット幅の固定小数を使うのではなく,レイヤーによって幅を変えるともっと消費メモリを抑えられるということを主張している.
  • 適切なビット幅を求めるために,SQNR(signal-to-quantization-noise ratio)という量を考える.
    • SQNR については知らなかったが,量子化した際に元の値からの誤差がどれくらい大きくなるかの期待値(の対数)を表す(という理解でいいんかな…)
    • 量子化幅を求めるには,量子化したい値がある分布に従っていると仮定して,SQNRが最小になるような幅を求めることにする.
    • 分布が正規分布だとどれくらいにすればいいかというのが大体知られている.実際のCNNに渡される入力を見ると,おおむねどのレイヤーの重みの分布もactivation valueも正規分布っぽいかんじになっていると分かるので,そう仮定する.
    • CNNでのSQNR(の逆数)は各層でのSQNR(の逆数)の和になる.これを最小化しようとすると閉じた式が得られる.
  • 提案手法によると,入力に近い層ほど高い精度の小数を使うべきで,出力に近い層ほど精度を落としても良いということになるらしい
  • Fine-tuning は重要
    • CIFAR10のCNNを使った手法のベースラインの精度は7%程度だが,実験を見るとFine-tuningすると全層4ビットでも1~2%程度悪くなるだけで済むらしい.Fine-tuningしないとひどくなる.
    • …と書かれているのだけど細部があんまり書かれていないような.普通に勾配法実行するのだとして丸め方はどうするのかとか.
  • 感想
    • 単にモデルの容量削減という目的で性能だけ見るとそんなに良くなってないけど,
    • 下のレイヤーのほうが上のレイヤーより小数精度が高くないといけないというのは,特徴量の最低限必要な量子化粒度がレイヤーによって違うということを示唆していて面白いかもしれない.

Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding(ICLR2015 under review)

  • これもレビュー中だけど紹介されたので読んだ
  • 小数の精度を落とす以外にも色々工夫して最近のモデルを50倍くらい圧縮する.工夫としては3つくらいある.
    • その1.値が小さい重みを0につぶして,畳込みの重み行列を疎行列として扱う.(図2)
      • これだけでもだいぶ効き目がある.(10倍くらい圧縮される)
      • ただ,閾値をいくらにするかはどこにも書いてなくて謎だけど適当でいいのか…
    • その2.非零の重みを量子化して何種類かにして,重みをHashedNetsみたいに共有させる.そこからさらに再学習も行う.
      • HashedNetsはハッシュによって重みを共有する要素を決めていたが,この手法は学習済みのモデルからどの要素を共有させるかを重みのクラスタリングによって決めている.
    • その3.重みの分布と,疎行列で表す際のlocation indexの分布は偏っているのでハフマン符号化して表すとよりメモリ消費を抑えられる.
  • 感想
    • オーソドックスな圧縮手法を一通り使ったら良くなったという話っぽい.
    • 実験を大きいモデルでちゃんとやってて性能もかなり出てるので実用的そう.

2014年度振り返り

働き始めて1年位経ったっぽいので去年度の振り返りでもします.

仕事

PFIに入社していたのですが入社して半年くらいで PFN (Preferred Networks) という新たに立ち上げた関連会社に移籍しました.環境自体はそこまで大きく変わってません.
仕事で表に出せる情報が現状は少ないです.そのうち何か表に出せる成果になるとよいのですが.

ニューラルネットでなんかうまくいくことがわかっているけどちゃんとした理由はよく分かってないようなテクが世の中には結構色々あるのですが,なぜうまくいくのか理解する助けになりそうなことに最近は興味があります.本当は理論的な結果を言えれば美しくて一番良いのですが,この分野はいかんせん理論的な解析が何十年も前から大して進んでいなくてあんまり期待が持てないので,当面は実験して色々分析するのが手っ取り早いし,ついでに変なお絵かきみたいなこともできるので楽しいんじゃないかと思っています.あるいはうまくいくと思われているテクを撃墜するとかも.

大学の頃やっていた研究分野と今仕事でやっている分野は結構違うところが多く,学び直すことも多かったですが最近段々ノリが分かってきたという気がしないでもないです.

学会

修士にやってた頃の研究のおかげで3回国際学会(SIGMOD,KDD,ICALP)に行くことができました.SIGMOD,KDDはアカデミックのみならず企業からの関心が非常に高く,参加者数もとても多く賑わっていました.一方でICALPの参加者は大体アカデミックのいかにも理論っぽい人たちの集まりで,落ち着いた雰囲気を感じました.理論のコミュニティと応用のコミュニティの空気の違いを見れたのは大きかったのかなぁと思います.
あとネガティブなネタではありますが,SIGMOD 併設のデータベース系理論会議 PODS のどんよりとした雰囲気のビジネスミーティングは,理論出身の自分にとってはとても悲しいものに見えました.
また論文書いてどっかいって発表とかできると面白いですが,なんか良いネタを探さないと….

弐寺DP

京都にいる頃は弐寺の置いてあるゲーセンにはほとんど行かなかったのですが,東京に来てから比較的職場の近くにゲーセンがあるのでたまに行っています.12.3にイージーランプが付きました.十段の達成率も75%までいきました.調子が良いのでこれは年内皆伝ペースか? と思ってましたが最近になって段々自信がなくなってきました.とりあえず12.3を大体埋めないといけないけど先が長い.

競プロ

もうすっかり選手ではなく運営をする立場になりました.競プロは良いコミュニティが形成されていると思うのでそれが長く続くことを願っています.そういう点では最近の topcoder の運営には不満な点がかなり多く,改善されることを期待しています.
なんかせっかくなので巷ではあんまり無さそうなタイプのコンテストを開けると面白そうだと前から薄々思っているのですがそれはできたとしても結構先になるのだろうなぁ.

旅行

色々なところに行きました.今年も色々なところに行きたいです.

語学

英語が宇宙一できないので iKnow やってるんですが全然リスニング力が向上しなくて辛いです.

情報オリンピック春合宿で講義しました

1週間前の出来事ですが「機械学習とその理論」というタイトルで講義しました.大体 PAC 学習の話してます.スライドを公開しているので以下にそのリンクを載せます.

今回の講義では,才能がありそうな若い人らを前にどんなことを話せばいいか,テーマ選びに少し悩みました.色々考えた所「プログラミングコンテストの界隈ではあんまり触れられないけどコンピュータサイエンスの研究や実際の応用で重要なことっていっぱいあるしそういうのを伝えるのが大事なのかなぁ」と思い,その中の1つである機械学習のことについて話すことにしました.
機械学習を語るには色んな切り口があると思うのですが,情報オリンピックに参加しているような人ならきっと理論っぽい話が好きなんじゃないかなぁと思い,基本的な理論のモデルである「PAC学習」について話しました.機械学習というと大体統計的な観点から入門することが多いのですが,それだと少し数学の道具の準備とかが大変そうだったため今回は敢えて全く話してません.まぁ本当は準備してる時間がなかったからなんですが. アルゴリズムの話も全くしてないのですが本当はパーセプトロンくらいは話したかったような気がしないでもないです.
ちなみにこの講義はこの合宿のメインイベントではないので,あんまり堅いことばっかりしゃべると聞いてて面白くないだろうなぁと思ったためスライド構成は割とエンターテインメントに走っています.

…どうでもいいんですがマイクロソフトのパワーポイントがクリップアートの提供を終了したせいで画像探しに苦労しました.いちいち自分でライセンス確認しないといけないとか勘弁して欲しい.