Coffee Break Script

いわゆる息抜き。

黄色本の演習

今さらながら、今年の新入社員とPRMLを読み始めた。とりあえず上巻から。

担当箇所を読んできて解説するという輪読スタイルではなく、演習問題を解いてきてみんなで答え合わせするスタイルにした。

資料作りが意外と手間だったりするし、担当箇所以外はあんまり読まなくなったりしちゃうので。演習問題を解くのを、自分で読むモチベーションにしてもらうのが目的。

まだ新人さんたちと馴染めていないので、これを機に仲良くなれるといいんだけどな。

ハイパーパラメータを管理したい

機械学習ディープラーニングを実験していると、どうしても避けられないのがハイパーパラメータ周りの処理。

ちゃんとグローバル変数とかを書いて処理したいものの、Pythonは変数の名前空間が比較的ふわふわしているので、そのあたりをサポートする関数を用意しました。

概略としては、グローバル変数として持っておきたいものをYAMLまたはJSON形式で準備し、そのファイルを読み込み、グローバルな辞書型の変数として持っておくことで、プログラム中のどこからでも呼び出せるようにするというものです。デフォルトの値はload_params関数の中で直接定義できるようにしていて、もしこれらと同じ名前の変数がyaml/jsonで与えられた場合には、デフォルト値を上書き更新するようになっています。つまり、yaml/jsonファイル自体が実験条件の履歴になります。(なお、yamlファイルはコメントアウトが可能なので、jsonよりもyaml推奨です。)

自分は、実行日時をパラメータとして辞書型変数に格納しておくようにして、main関数の一番最後でパラメータを格納した辞書変数をjson/yamlでファイルに出力するようにしています。こうしておけば、いつ、どのパラメータで実験を実行したか後から見返すことができるようになるので。

具体的なimportの方法、呼び出し方、yaml/jsonの書き方は以下を参照してください。

Utility function to manage global variables such …

Qiita: 湧源クラブ Advent Calendar 1日目

こちらは Qiita: 湧源クラブ Advent Calendar 2019 1日目の記事です!

qiita.com

ここ10年ほどで、湧源クラブ員にもプロ・アマ問わず情報系の人々が爆発的に増加してきた気がしています。 最近は大定例会で自己紹介しながら競プロしている子がいたり、 セミナーに来る高校生も、プログラミング経験者の割合が増えてきている感覚があります。

そんなこんなで、そろそろアドベントカレンダーやってもいいんじゃね、ということで今回企画してみました。

25枠分まだ埋まっていなくてスカスカ具合が少し気にはなりますが、きっと色々なバックグラウンド・興味関心をもった仲間が様々な取り組みの記事を書いてくれることでしょう!(期待しています。)

投稿者の方へ!(12/2追記)

投稿者の方は、記事の冒頭あたりにAdvent Calendarのトップページへのリンクを貼っておいてください。

URLはこちらです → https://qiita.com/advent-calendar/2019/yugen

情報幾何学の初学者向け参考書とそのレビュー

情報幾何学”非”数学者が学習する上で参考になりそうな書籍についてレビューする。特に、ニューラルネットワークなどの統計的学習理論を勉強している物理系/情報系/工学系の人間が読む前提で考えている。書籍は日本語に限り、3冊ピックアップした。

※ここに記載されていない本は私が読んでいないだけで、読んだうえで本記事への掲載を取捨選択したわけではないことに注意をしていただきたい。紹介していない有用な参考文献も世の中にはまだまだあると思うし、もしおすすめがあればコメント欄から推薦してほしい。

紹介文献リスト

  1. 情報幾何の方法(甘利俊一・長岡浩司、岩波書店
  2. 情報幾何学の基礎(藤原彰夫、牧野書店)
  3. 代数幾何と学習理論(渡辺澄夫、森北出版)

各書籍の目次比較

コンテンツとしてどのようなものが含まれているか、目次をもとに列挙する。あくまでコンテンツを確認することが目的なので、以下の箇条書きリストが目次と一致しているわけではない。

情報幾何の方法(甘利俊一・長岡浩司、岩波書店

  1. 微分幾何の基礎知識
    1. 微分可能多様体
    2. 接ベクトルと接空間
    3. ベクトル場とテンソル
    4. 部分多様体
    5. Riemann計量
    6. アファイン接続と共変微分
    7. 平坦性
    8. 自己平行な部分多様体
    9. 接続の射影と埋め込み曲率
    10. Riemann接続
  2. 統計的モデルの幾何学的構造
    1. 統計的モデル
    2. Fisher情報行列とRiemann計量
    3. α-接続
  3. 双対接続の理論
    1. 接続の双対性
    2. 双対平坦空間
    3. ダイバージェンス
    4. α-アファイン多様体とα-分布族
    5. 直行双対葉層化
  4. 統計的推論の微分幾何
    1. 統計的推論と指数型分布族
    2. 指数型分布族における統計的推論
    3. 曲指数型分布族における推論
    4. 推定の高次漸近理論
    5. 情報量の分解定理
    6. 検定の高次漸近理論
    7. 推定関数の理論とファイバーバンドル
      1. 局所指数族バンドル
      2. Hilbertバンドルと推定関数
  5. 時系列と線形システムの幾何
    1. システムと時系列の空間
    2. システム空間の計量と接続
    3. 有限次元モデルの幾何学
    4. 安定システムと安定フィードバック
  6. 多元情報理論と統計的推論
    1. 多元情報の統計的推論
    2. 0レートの検定理論
    3. 0レートの推定理論
    4. 一般の多元情報の推論問題
  7. 情報幾何のこれからの話題
    1. 凸解析と線形計画の内点法幾何学
    2. ニューロ多様体非線形システム
    3. Lie群と情報幾何
    4. 量子観測の情報幾何
    5. 情報幾何が提起する数学上の問題

情報幾何学の基礎(藤原彰夫、牧野書店)

  1. 準備
    1. 写像定理
    2. 双対空間
    3. テンソル
  2. Euclid平面の幾何
    1. Euclid空間
    2. 座標系
    3. 接ベクトル
    4. ベクトル場の微分
  3. 局面から多様体
    1. 曲面
    2. 多様体
    3. 接ベクトル空間
    4. ベクトル場
    5. テンソル
  4. 多様体のアファイン接続
    1. ベクトル場の共変微分
    2. アファイン接続
    3. 曲率
    4. 捩率
    5. 平坦な多様体とアファイン座標系
    6. Riemann接続
    7. 部分多様体
  5. 双対アファイン接続の幾何
    1. 双対アファイン接続
    2. 双対平坦な多様体の幾何
  6. 確率分布空間の幾何構造
    1. Chentsovの定理
    2. Fisher軽量とα-接続
    3. 指数型接続と混合型接続
    4. Sn-1の双対微分幾何
    5. 自己平行部分多様体
    6. 双対葉層構造
  7. 統計物理学への応用
    1. 最大エントロピー原理
    2. 平均場近似
  8. 統計的推論への応用
    1. 統計的パラメータ推定
    2. 大偏差原理
    3. 統計的仮説検定
    4. 補足:Cramerの定理
  9. 量子状態空間の幾何構造
    1. 状態と測定
    2. 有限量子状態空間の双対構造
    3. 量子統計的パラメータ推定問題
    4. 補足:作用素単調関数

代数幾何と学習理論(渡辺澄夫、森北出版)

  1. 特異点
    1. 多項式と解析関数
    2. 代数的集合と解析的集合
    3. 臨界点と特異点
    4. 特異点解消定理
    5. 正規交差特異点
    6. 特異点解消定理の応用
    7. 多様体
  2. 代数幾何
    1. ブローアップ
    2. 多項式環イデアル
    3. 代数的集合とイデアル
    4. 射影空間
    5. 代数的集合の特異点
    6. 特異点解消のアルゴリズム
  3. 超関数
    1. 超関数論の基礎
    2. 超関数とゼータ関数
    3. メリン変換
    4. 漸近展開
    5. 一般形の漸近展開
  4. 経験過程
    1. 測度空間・確率空間
    2. 法則収束
    3. 関数空間に値をとる解析関数
    4. 経験過程
    5. 対数尤度比とカルバック情報量
  5. 学習理論
    1. 確率的複雑さの漸近挙動
    2. 汎化誤差の漸近挙動
    3. 学習係数
  6. 学習理論と諸科学
    1. 学習と情報科学
    2. 学習と脳科学
    3. 学習と統計科学

各書籍に対するコメント

情報幾何の方法(甘利俊一・長岡浩司、岩波書店

この分野の先駆者、甘利先生が書かれた本。1993年に出版されてから版は変わっていないようだ。分量も130ページそこそこしかなく、とてもコンパクトにまとまっている印象。エッセンスだけ詰まっている感じなので、分かる人は分かるが言葉が足りないと感じる人もいるかもしれない。情報幾何で使われる基本的な概念、定理などをずらずらと定義していくスタイルなので、発見的学習を後押ししてくれるような示唆に富むタイプの教科書ではない。初学者向けというよりも、すでにある程度知っている人が原理原則を確認するために戻る用のハンドブックという立ち位置にある本だと思う。

情報幾何学の基礎(藤原彰夫、牧野書店)

甘利先生の本の第1~4章をより詳しく解説している感じ。数学を本分としない工学系や情報系の学生向けに書かれているとあってなかなかに読みやすい。大学1回生レベルの数学知識のみを前提としているのも優しい。個人的に嬉しいのは統計物理学との接点について解説してあるところ。たとえば、情報幾何では汎化誤差に関連する指標として「確率的複雑さ」という量が導入されているが、これは「対数周辺尤度」あるいは「自由エネルギー」と呼ばれている。この異名についてはこの後紹介する「代数幾何と学習理論」の中でも触れられているのだが、どこがどう自由エネルギー(ヘルムホルツの方)と関連しているのかということは「代数幾何と学習理論」には書かれていない。他にも最後の章では量子統計との関連から量子計算にも情報幾何が使えるのではないかといったこと(解説ではなく問題提起)が書かれていたりと、物理屋さんには興味のそそられる内容になっていると感じた。

代数幾何と学習理論(渡辺澄夫、森北出版)

この本はとてもユニークであると感じた。まず、情報幾何を特異点や超関数の観点を含めて丁寧に解説している本は他に見たことがない。(学会誌レベルの解説記事では存在する。)そして、数学的な議論を粛々と積み重ねて学問としての情報幾何を解説する王道的な教科書ではない。確かに、大学1回生レベルの線形代数微積分を前提にしているという点では上述の2冊と同じスタートラインから解説を始めるのだが、「(統計的)学習理論」に数学的枠組みを与えるために情報幾何では何を明らかにしようとしているのか、というゴールをはっきりさせたうえで、そこに向かって必要な数学的知識を整理しているとこが新しい。個人的には一番読みやすいと感じた。やはり私のような工学系の人間にとっては、漠然と定理や補題を証明していく数学の本よりは、何のためにこの定理を知る/証明するのかあらかじめはっきりさせておいてくれるこうした本の方がスッキリと読めるような気がする。

まとめ

以上の3冊を使って勉強をするには、「情報幾何学の基礎」で数学的知識を物理学的観点も含めて身につけつつ、「代数幾何と学習理論」で情報幾何学が持っている問題意識と、これまでにどのような知見が得られてきたのかを確認していく、というプロセスをたどるのが良いのではないかと思う。

とりあえず私もざっと読んだだけなので、これから腰を据えてじっくり読み込んでいこうと思っている。

Anaconda Navigatorも含めて諸々アップデートする方法

Anaconda Navigatorの標準機能を利用してパッケージなどのアップデートをかけようとしても失敗する(アップデートが終わらない)場合の対処法について述べる。

失敗するケース

  1. Anaconda Navigatorを起動
  2. Environments > base (root)と仮想環境を選ぶ
  3. 右側のパッケージ一覧でUpdatableを選択する
  4. ポップアップウィンドウが出て「アップデートしますか?」的な質問が出るのでYes的なボタンを押す
  5. アップデート開始
  6. ご臨終(シークバーが進まない/いつまで経っても終わらない)

対処法

  1. Anaconda Navigatorを終了させる(起動してなければ次へ)
  2. スタートメニュー > Anaconda Promptを右クリックして「管理者として実行」を選択
  3. コンソール画面でconda update --allを入力しEnter
  4. アップデート内容の確認メッセージにYと入力してEnter
  5. アップデート開始
  6. アップデート終了(のはず)

とりあえず私の環境(Windows10, Python3.6.1, Anaconda4.5.1)ではうまくいった。

というか、もう素直にLinuxを使えばいいと思う。

numba ( @jit ) と try-catch は一緒に使えない

インタープリタ言語であるPythonを高速化させるための、最も手っ取り早い手段がnumbaを使うことです。

from numba import jit

@jit
def function_name(input_args):
    hoge
    hogehoge ...

    return hoge

というコードを書くと、とりあえずそれだけで多少高速化してくれるという優れもの。 どのくらい高速になるのかという検証は他のブログに譲るとして、僕のように「とりあえず動くものが書ければOK」という使い方をしている人間にとってこの@jitは高速化の”おまじない”に等しい。

ところが、このおまじないには一つ弱点がある。try-catchの例外処理が使えないのである。

たとえば、次のようなコードを動かすと…

from numba import jit

@jit
def function_name(input_args):
    hoge ...
    try:
        hoge1
    exception ERROR:
        hoge2

    return hoge

こんな感じのエラーが出ます。(最後の4行だけ抜粋)

    (前略)
  File "C:\ProgramData\Anaconda3\lib\site-packages\numba\controlflow.py", line 515, in run
    assert not inst.is_jump, inst
AssertionError: Failed at object (analyzing bytecode)
SETUP_EXCEPT(arg=XXX, lineno=XXX)

※arg=とlineno=の後のXXXには本来なら数字が入ります。

numbaのcontrolflow.pyでエラーが起きているので、try-catch節を評価して内部状態を遷移させることがそもそもできない仕様になっていると思われます。実際にstackoverflowでもこの問題について触れられていました。

stackoverflow.com

今のところnumbaのjitがtry-catch構文に対応する様子はなさそうなので、『try-catchを使いたい場合は@jitを使わない』というのが唯一の対策なのでしょう。(回避策ご存知の方はコメント欄までお願いいたします。)

これまで全体像を把握しきったデータをハンドリングすることしかしてこなかったので、try-catchをあまり使ってこなかった(単にif文だけ使っていた)のだが、思わぬ落とし穴でした。

同じように困っている人のために記録として残しておきます。 ではでは。

■Qiitaにも要約が載っています。念のため。

qiita.com

iPhoneでホテルなどの認証付き公共Wifiにログインしたいのに認証画面が出ない場合の対処法

現代においてwifiの確保は基本的人権に含まれると言ってもいいでしょう。

特に海外ではなおさらです。

空港、ホテル、レストランなどなどあらゆる場所で無料のwifiが利用できるようになってきています。

ところが……なぜかiOS端末(iPhoneiPad)はこれらの公共wifiとひたすら相性がわるい!!セキュリティが確保されていない(不特定多数がつなげてくる)アクセスポイントへの接続には何らかの制限がかかっているんでしょうか……教えてくわしいひと!

さて、この手のwifiは基本的にオープン(wifi接続画面で鍵のマークがついていない)のですが、いざログインしようとするとユーザー名やパスワード(たいていはその両方)の入力を求められることになります。PC(MacbookとかMacbookAirとか)ではこのログイン画面がデスクトップ上にポップアップで出現するので、ホテルの人などから聞いたログイン情報を打ち込めば接続できるようになります。

問題はiOS端末(iPhoneiPad)のケースです。ログイン情報を入力するためのポップアップ画面がいつまで経っても出てきません。SafariなどのWebブラウザでGoogleのトップページなどを表示しようとするとたまーに入力画面が出現しますが、かなり稀です。

では、どうしたらよいか。答えはひとつ!

SafariAppleのトップページをひらけ!

これだけ。ですが注意点が一つ。通常のAppleのトップページはhttpsで始まりますが、httpで始まるURLにアクセスしましょう。そうするとリダイレクトされてhttpsで始まるAppleの公式サイトが表示されるか、ログイン情報を入力するためのページがSafariで表示されるようになります。

念のため、アクセスすべきURLをベタ打ちで貼っておきます。

http://www.apple.com

以上のテクニック、古いですがソースはこれです。2018年5月現在、うまくいっています。

https://discussions.apple.com/thread/4507909

そのほか、タウンWiFiというアプリを使うと日本国内限定ですが公衆WiFiに自動で繋げてくれます。WiFi接続を前提に格安SIMを使っている人や、通信容量を節約したい人向けです。

タウンWiFi 話題のギガ節約アプリ

タウンWiFi 話題のギガ節約アプリ

  • TownWiFi Inc.
  • ユーティリティ
  • 無料

ではでは。