しえログ

qiita との使い分けに悩んでる

ICCV 2017 の Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks を読んだ

またもひさびさに書くことになってしまっている・・・。もう年度末ですがあけましておめでとうございます。今年も ciela をよろしくお願いいたします。

今年も引き続き頑張ってブログ書いていく所存ですので頑張って読んでください。ポエムもちゃんと書かないとなぁ・・・。

つーわけで今年一発目は昨年の ICCV 2017 採択の所謂 CycleGAN 論文を読んで社内論文読み会で発表するために資料化したので公開しときます。

(PDF のほうが数式綺麗に貼り付けられてるのでダウンロードしてもらったほうがいいかも)

プロジェクトサイトはこちら

見てくれの結果が面白く、上のリンク見るだけで何やってるかはだいたい把握できると思います。互いのデータセットをノーマル GAN でいうところのノイズのように取り扱うことで、データをそれぞれ交換しつつ差異を学習していくアルゴリズムとなっています。

CycleGAN は僕も業務で利用してみたのですが教師データいらずなので学習データの準備がクソ楽でした。いろいろタスクによって損失変えると面白そうなので応用していつか何か公開出来たらいいなぁ。

年の瀬に GPU マシンを購入した

9月に記事書いたっきりサボってしまっていましたがもうド年末ですね・・・週1でブログ更新していきたいとか息巻いていたあの頃の自分はどこへやら。この2ヶ月間は会議で沖縄行ったり学会(自分は聴講のみ・・・)でイタリア行ったりと、先日のハワイ・広島も含めたら今年はやけに出張の多い年となりました。どこからも無事に帰ってこれたことを喜ばしく思いますわ。ヴェネツィアはいつかまた夏ぐらいに行きたい。


出張しまくって美味しい思いばかりしてたわけではないんす。最近は業務で DeepLearning のモデルを動かすことが増えてきたこともあって、先日思い切って自宅にもちょっとした学習環境をこさえてみようと奮発してみたのである。要件はあまり細かく決めずざっくりとこんな感じ。

  • 予算は15〜20万
  • CPU は Core i5 以上
  • メモリは 16 GB はほしい
  • GPU は CUDA 動かすために nVIDIA

通販サイトいろいろ覗いてみたり、秋葉原まで行って現地での相場感を得たりした結果、パソコン工房の下記のモデルに決定。

Miyabi-EJ3M-i5-RNJR [Windows 10 Home] | パソコン工房【公式通販】

この BTO マシンに対して下記のようにオプションを選択。

  • OS なし
  • メモリ 16 GB
  • 電源 500W GOLD
  • GPU GeForce GTX 1080

1080 Ti で 11GB のビデオメモリを満喫しようとも考えたけど、電源もグレードアップさせなきゃならない上値段もそれなりにするということもあり予算を軽々と飛び越えそうだったので我慢。

最終的な料金は税別149,920円。まぁいい買い物したといえる値段なんじゃなかろうか。

これを18日月曜にオーダーし、wktk しながら待っていたら23日土曜に早速届いた。

社会人になってから自宅でデスクトップマシンを購入利用するのは初めてで、キーボードとディスプレイを持っていなかったため、急いで秋葉原に調達に。ホントは DisplayPort 活かせるディスプレイ買いたかったけど、これも財布と相談して無難に HDMI スピーカー付きの IO Data 製を、キーボードは FILCO の US 配列 Majestouch をそれぞれ購入。

自宅に戻って早速セットアップ開始、Ubuntu 16.04 をインストールしたあとは CUDA 9.1 を入れて一緒に nvidia-387 ドライバもインストール。無事自宅での学習環境が完成。こうしてクリスマス・イブに自分から自分へ素敵なご褒美を贈ることが出来たのでした。

とりあえずユースケース的なベンチマークとして昨日からモナコインマイニングを走らせてみたところ、温度、消費電力それぞれ 80℃、130W 前後をマークしている感じ。

$ nvidia-smi
Sun Dec 31 15:49:46 2017       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 387.26                 Driver Version: 387.26                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 1080    Off  | 00000000:01:00.0  On |                  N/A |
| 69%   82C    P2   132W / 200W |   1999MiB /  8111MiB |     90%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1127      G   /usr/lib/xorg/Xorg                           203MiB |
|    0      2252      G   compiz                                        90MiB |
|    0     12278      C   ./ccminer                                   1693MiB |
+-----------------------------------------------------------------------------+

構築途中のあれこれも機会あったらまたまとめたい。


そんなわけで個人でも手軽に DeepLearning 可能な環境を構築してみた記事を世の中に1件増やしてみた。会社では TITAN X 4枚刺しとかを利用させてもらっているのでさすがにそれを超えるような性能を出せるわけではないけど、自宅で読んだ論文を再現したいときとかに手元に GPU あるのはやっぱり心強い。これで PyTorch でモデルや変数を心置きなく CUDA 化しまくれますね!

皆様来年もよろしくお願いいたします。

Batch Normalization について軽くまとめ

Deep Learning の基礎学習の一環として名前だけ聞いたっきりになっていた Batch Normalization についてゼロから作る Deep Learning に載っていたので軽く読んで勉強した。

Batch Normalization とは

[1502.03167] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

2015 年に Google の Loffe さんらによって提案された手法。
ニューラルネットワークの各活性化関数における出力(activation)の分布が偏っていると色々問題を起こす可能性がある。例えば 0, 1 付近に集中していたりすると勾配消失問題が起こりやすくなるし、かといって他の特定の箇所に集中していても今度は表現力がなくなってしまい複数のニューロンが存在する意味がなくなってしまう。

解決法として活性化関数に応じた以下のような初期値設定法が提案されている。

  • 活性化関数が Sigmoid, tanh の場合
    • Xavier の初期値
  • 活性化関数が ReLU の場合
    • He の初期値

適切な初期値の設定とはまた別として、分布に適度な広がりをもたせたいわけだが、そこで Batch Normalization が考案されている。
具体的には

  • 学習係数を適度に大きくし学習の進行速度を上げられる
  • 初期値にそれほど依存しない
  • 過学習を抑制する

などの利点が。
やることはデータ値の平滑化なので計算は難しくない。

計算法

{m} 個の入力データ値を平均0、分散1に平滑化する形で変換する以下の様な写像 {\mathbf{BN}_{\gamma,\beta}} となる。

{\mathbf{BN}_{\gamma,\beta} \colon \{x_i\}_{i=1}^m \to \{y_i\}_{i=1}^m}

1. 平均を求める: {\mu_B \gets \displaystyle \frac{1}{m}\sum_{i=1}^m x_i}
2. 分散を求める: {\sigma^2_B \gets \displaystyle \frac{1}{m}\sum_{i=1}^m (x_i-\mu_B)^2}
3. 平滑化する: {\hat{x}_i \gets \displaystyle \frac{x_i-\mu_B}{\sqrt{\sigma^2_B+\varepsilon}}}

  • {\varepsilon} はゼロ除算対策の微小値

4. あらかじめ定めておいたパラメータでもってスケーリングする: {y_i \gets \gamma \hat{x}_i + \beta}

この {y_i} を各層の活性化関数の出力として置き換えることでデータの Batch Normalization が完了する。

原著論文周辺

このやり方によって当時の SoTA な画像分類モデルにおいて学習ステップを1/14に減らしたらしい。

ただ、今となっては Loffe からさらに新しく Batch Renormalization という手法が提案されている。
これはミニバッチのサイズが小さかったり、その中のサンプルに独立性があまりない場合に Batch Normalization がそれほど有効でなかった問題を解決したもので、ミニバッチにあまり関係なく独立性を保てる工夫がされているらしい。

[1702.03275] Batch Renormalization: Towards Reducing Minibatch Dependence in Batch-Normalized Models

自宅のソファをリニューアルした

腰を悪くした原因の1つじゃないかと気になっていた自宅のソファを一新した。2シーターのローソファを1シーターの普通(?)のソファに買い替え。旧ソファの廃棄に約9,000円、新ソファ本体約13,000円、ソファカバー9,000円、ソファの脚2,000円と、何ともカネのかかるリニューアルとなってしまった・・・。

今回購入したのは無印良品のこれ↓。昨日の悪天候の中、配達の方が頑張って部屋まで搬入してくれた。

www.muji.net

当たり前だけどこれまで使っていたのとはまた違う座り心地というか、膝を折り曲げないで座れるのでとても楽チンである。これなら腰もこれ以上悪くすることはないのではなかろうか。

そもそも何で以前ローソファにしたんだっけ?って思い返してみたけど、もう5年近く前の話だし全然思い出せない・・・。リクライニングを倒せば簡易ベッドにできる、ってのも理由の1つだった気もするけどずっと壁に沿って配置してたので倒せない(し、使う機会も特になかった・・・)。アームの方は倒せる空間的余裕があり、しかも倒せば枕っぽくなるので、飲み帰りに友達が泊まりに来たときなんかは寝床として使ってもらっていたけど、そう起こるイベントじゃあないしなぁってことで今回は1シーターにしてみた。

丁度いいので早速ソファに座りながら映画を2本通して観てみたけど、満足度は高い。中々いいソファだよ無印さん。最初間違ってソファカバーのみ購入しちゃったのでサイトはもっと分かりやすくしてくれ無印さん。


今日は土日の嵐が嘘のように晴れて気温もアゲアゲって感じだったので久々にドライブしてきた。羽田空港第1ターミナルから望む夕日が素晴らしかったので、良い3連休の締めくくりが出来た気がしている。

網というか柵というかワイヤーというか。

話題のビジホ開発合宿を行った

前回の記事いつ書いたっけ・・・とすっかり忘れるぐらいにはエントリさぼりしてた。。。

結構忙しかったという言い訳はあるのでそこまで悲観的にはなっていないのだけれど、今月もなんとか2,3記事いかせたい・・・。

ツイッターを遡って記憶をたどることにする。


8月下旬は今更ながら PS4 を買った。いつぞやのエントリで書いていたとおり、ここ最近ずっと PS3 の起動に難が生じていたので少ない財布から絞り出してえいやっと購入してしまった。ソフトはクラッシュ・バンディクー ブッとび3段もりバイオハザード7

クラッシュのほうは原作3作のリメイクなのでまぁいいとして、バイオ7、前情報あまり取り入れずに原点回帰とだけ聞いていたけどまぁなんつーかホラー映画的なエッセンスを取り入れたって感じですかね。原作1〜3に近いというよりは映画版でやっていたような驚かし系の演出が多くてそりゃ確かに VR 映えするかもなーって感じ。

ちなみに PSVR も売ってはいたんだけどあれ5万もするんですね。流石に一月に10万以上もゲーム代につぎ込む気にはならんす。クリスマスあたりにサンタさんがプレゼントしてくれないかな。


PS4 とソフト一式を買ったのはいいものの、その2週後の金曜には社内での論文読み会プレゼンとレポート締め切りが被っていたのである。土日どちらかつぶさないと間に合わんぞこれ、、、ってなっていた際に下記の qiita エントリを思い出した。

qiita.com

もともとビジネスホテルは大好きなほうで、旅行に行ったときにもチェックインする際に異常にワクワクするクセがある。自宅から離れた都内で飲むときなんかは時々ホテル取るなんてことをしていたので、渡りに船とばかりに1人でビジホ開発合宿もといレポート執筆缶詰を試してみることにした。

上野の高層階のみに客室があるちょい豪華目なホテルを予約。都心へ面した部屋ではないものの、自室からはスカイツリー含めた夜景が見える好立地っぷり。

ちゃんと夜は布団で眠ったのでホテルで作業した時間は実質8時間程度なのだけれど、自宅でやってたときの1.5倍ぐらいのパフォーマンスは出せたんじゃなかろうか。次は研究ネタがあって、ガッツリ取り組みたいときとかに利用してみたい。2泊3日予約にして、1泊目:研究開始、2泊目:仕上げ&夜飲み、みたいなプランに憧れる帰りの電車内であった。

広島の帰りに京都観光

8月も半ば過ぎたというのに今月は1本もポエムエントリを書けてないことに気づいた。あかん。

7月末に帰国してからというもの、2週間後にはまたヒロシマで行われる MIRU に行かなきゃいけなかったということもあって、企業展示について考えたりと色々やることが多かったのである。 どうしてこう色々重なるんだと思いつつも、夏秋は学会シーズンだし仕方ない。ウマイお好み焼きも食べられたし宮島にも上陸できたし、出張したかいはあったと言えよう。

ちなみにヒロシマからの帰りに京都で途中下車してアニメ的な聖地巡礼に赴いていた。もともと機会があったら有頂天家族聖地巡礼に行こうと考えていた矢先だったので渡りに船とばかりに色々巡ってきたのである。京都を観光するのは3度目なんだけれど、過去2回とも京都には1泊しただけの慌ただしい旅だったので今回は2泊することである程度ゆっくり回れた。腰が万全の状態ではなかったので朝から歩き通せなかったのは辛かったけど観光以外にもウマイ飲み屋を2件見つけられたので大満足である。以下フォトログ

f:id:cielan:20170811110747j:plain 平等院鳳凰堂

f:id:cielan:20170811123307j:plain 宇治のシャレオツなスタバ。

f:id:cielan:20170811145403j:plain 下鴨神社

f:id:cielan:20170811152930j:plain 3匹。次男はいない。

f:id:cielan:20170812105801j:plain へそ石様。

f:id:cielan:20170812114935j:plain 六道珍皇寺

宇治周辺だけ有頂天家族ではなくてユーフォ響かす系だけど、一度平等院鳳凰堂見てみたかったのよね。次はいつになるかわからんけど京都は見どころが沢山あるので機会があればいつでも立ち寄りたいが、サクラクエストでまた富山がフィーチャーされていたしそっちでもいいかもしれない。

KDD 2017 の Visual Search at eBay を読んだメモ

最近お仕事で CBIR 関連やっているので半ば義務感でさらっと目を通してみた。
結果まで書ききる体力なかったので手法とアーキテクチャのみ軽く・・・。

[1706.03154] Visual Search at eBay

www.youtube.com

タイトル

Visual Search at eBay

著者

Fan Yang, Ajinkya Kale, Yury Bubnov, Leon Stein, Qiaosong Wang, Hadi Kiapour, Robinson Piramuthu

概要

eBay の運営するサービスである ShopBot および Close5 の2つに関する技術事例・システム論文。リストに上がっては売れていくという揮発性のあるオンラインマーケットプレイスに対する画像検索へのアプローチ。画像検索技術だけでなく、スケールするシステムアーキテクチャと実装にまで触れている。

手法

DNN アーキテクチャ

例によって DNN でアプローチしているわけだが、 共通 conv 層の先を2つに分割し、セマンティックハッシュ生成用とカテゴリ認識用に別々の fc 層を構築したネットワークを用いている。

f:id:cielan:20170806112032p:plain
論文中より Fig. 3

検索結果のランキングはバイナリハッシュのハミング距離でソートするわけだが、より検索結果を改善するために以下の計算による属性スコアを取り入れて、そのうえで再度ランキング化している。

 {
S = \lambda S_{appearance} + (1 − \lambda)S_{aspect} \\
S_{aspect} = \frac{1}{\sum_{i=1}^nw_i}\sum_{i=1}^n\sum_{j=1}^mw_i\mathcal{I}(a_i^q=a_j)
}

 {S_{appearance}}: バイナリハッシュの正規化されたハミング距離
 {w_i,0 \leq i \leq n}: reward point。ハードコードされているが、属性によって可変設定。
 {a_i^q,0 \leq i \leq n}: クエリ画像  {q} から予測して得られた属性
 {a_j,0 \leq j \leq m}: 検索結果の画像から得た ground-truth な属性
 {\mathcal{I}(\cdot)}: 中身が一致していたら1を返す indicator 関数

システムアーキテクチャ

画像の取り込み及び保存はこんな感じ。
BigTable には MD5 を、CloudStorage には画像本体を格納している。

f:id:cielan:20170807002827p:plain
論文中より Fig. 6

さらに画像ランキングを保持するアーキクチャは Hazelcast を Kubernetes 上に構築。

f:id:cielan:20170807002841p:plain
論文中より Fig. 7