2018年9月21日金曜日

普通のGPUとP100を同時に使う

環境:
OS: CentOS 7.5
マザーボード: Supermicro X10DRG-OT±CPU
マザーボード内蔵GPU: ASPEED AST2400 BMC
外部GPU(pic-e): Nvidia Tesla P100

上記の環境にNvidia driver等をインストールしてCUIで利用していたのだが,GUIが必要になったのでその手順を記す.
単にGnome DesktopをインストールしただけではXがうまく起動してくれなかったので,結局 OSごとインストールし以下の手順でGUIを使えるようになった.

  1. CentOSインストール時にGnome Desktop環境を同時にインストール
    インストール後起動すると,内蔵GPUによってXが立ち上がる.
  2. nouveau無効化 参考: # NVIDIAのドライバをインストールする, @kkk627, Qiita
  3. nvidia-driverインストール
    この時点で再起動すると,guiは立ち上がらない.
  4. /etc/X11/xorg.confを削除, /etc/X11/xorg.conf.x/99-nvidia.confのすべての行をコメントアウト. これらのファイルは2.の段階では存在していなかったので,nvidia driverをインストールするときに生成されたらしい.これらを2.以前の状態に戻すことで,GUI環境を利用できるようになった.
  5. Gnome環境がなぜか非常に不安定になったので,Mateに切り替えたところ,あからさまに不安定な挙動をすることはなくなった.

2018年8月4日土曜日

論文読み 2018, Semi-convolutional Operators for Instance Segmentation

元ネタ: Novotny et al. Semi-convolutional Operators for Instance Segmentation

インスタンスセグメンテーションやバウンディングボックスでない物体検出のため,Semi-convolutionを提案する.

RCNNやYolo, SSDといった物体検出器は,物体がありそうな領域のproposalを計算し,さらにそこからその物体によくあるバウンディングボックスの座標を計算する(Propose and Verify, P&V)のだが,バウンディングボックスはほとんどの場合物体の位置のあらい近似だし,そこから改めて物体の詳細な位置を計算するには手間がかかる.そのため,画像のすべてのピクセルについて,"同じ物体に属するピクセルには同じ色をつけ,異なる物体に属するピクセルには異なる色をつける"という方法(Instance Coloring, IC)がより適していると考えられる.この定性的な優位性にかかわらずICがよい性能を示さないのはCNNのtranslation invarianceによるものと考え,translation variantなSemi-convolutionを提案する.

Instance Coloringを行う(理想的な)CNNΦ\Phiは,X\mathcal{X}を画像の集合,L\mathcal{L}
ラベルの集合,Ω\Omegaを画像の中のピクセルの集合),S=(S1,...)\mathcal{S}=(S_1, ...)をインスタンスごとのラベルの集合,M>0として,
u,vΩ:{Φu(x)Φv(x)1M,k:u,vSkΦu(x)Φv(x)1+M,otherwise\forall u, v \in \Omega: \begin{cases} \|\Phi_u(\mathbf{x}) - \Phi_v(\mathbf{x})\| \leq 1 - M , \exists k: u, v \in S_k \\\|\Phi_u(\mathbf{x}) - \Phi_v(\mathbf{x})\| \leq 1 + M , \text{otherwise}\end{cases}
と定式化できる.しかしCNNはtransformation invariantなので,画像の中に同じインスタンスのレプリカがあると,それらを同じインスタンスであるとしてしまう.
そのためtransformation variantな操作Ψ\PsiΦu(x)=f(ϕu(x),u)\Phi_u (\mathbf{x}) = f(\phi_u(\mathbf{x}), u)と定め,semi-convolutional operatroと呼ぶことにする.f:L×ΩLf:\mathcal{L} \times \Omega \rightarrow \mathcal{L}':はmixing functionだが,単純に
Ψu(X)=Φu(x)+u,ϕu(x)L=R2\Psi_u(\mathbf{X}) = \Phi_u(\mathbf{x}) + u, \phi_u(\mathbf{x}) \in \mathcal{L}=\mathbf{R}^2
とすることができる.このとき,
uSk,Ψu(x)+u=ck\forall u \in S_k, \Psi_u(\mathbf{x}) + u = c_k
が成立する定数ckc_kが存在する.ckc_kはインスタンスkのセントロイドと考えることができ,またΨ\Psiはピクセルuuからckc_kへのdisplacementを計算する関数と考えることができる(fig.1).


figure 1.

もちろんラベル空間L\mathcal{L}は二次元では足りないし,より高度な出力を同時にしたいことも多いので,より高次元な出力ができるよう,
Ψu(x)=u^+Φu(x),u^=[ux,uy,0,...,0]TRd\Psi_u(x) = \hat{u} + \Phi_u(\mathcal{x}), \hat{u} = [u_x, u_y ,0 ,..., 0]^T \in \mathbf{R}^d
などと,ゼロパッディングを施すことになる.

学習の際のlossは
L(Φx,S)=SSΨu(x)1SSSΨu(x)\mathcal{L}(\Phi|\mathbf{x}, \mathbf{S}) = \sum_{S \in \mathcal{S}} \left \| \Psi_u(\mathbf{x}) - \frac{1}{|S|} \sum_{S \in \mathcal{S}} \Psi_u(\mathbf{x}) \right\|
として定式化する.

2018年6月22日金曜日

論文読み 2015, Simultaneous Deep Transfer Across Domains and Tasks

元ネタ: Tzeng and Saenko, Simultaneous Deep Transfer Across Domains and Tasks, 2015, ICCV 2015


figure 1. Deep Domain Confusionのダイアグラム

Tzengの前の論文では,source domain での分類と並行して,sourceとtargetに対して生成する表現が似てくるように学習させるため,confusion loss
MMD(Xs,XT)=1XsxSXSϕ(xs)1XTxtXTϕ(xt)MMD(X_s, X_T) = \left\| \frac{1}{|X_s|}\sum_{x_S \in X_S} \phi(x_s) - \frac{1}{X_T} \sum_{x_t \in X_T} \phi(x_t)\right\|
をも最適化するように学習させた(fig.1).しかしdomain同士の表現が似ていてもそれぞれの内部でdecision boundaryが似ているかは別の話だから,この論文では表現の構造のみならずsource domainのラベルの構造をtarget domainに変換する.変換にはtarget domainにいくつかラベル付きの点が必要だから,unsupervised domain adaptationに直接適用することはできない.


figure 2. Simultaneous Deep Transferのダイアグラム

domain confusionによって表現を似せる

インプットからfc7までを,表現を生成するネットワークGとし,Gの出力する表現θrepr\theta_{\text{repr}}がsource domainから来たのかtarget domainから来たのか区別するネットワークfcDを構成する.fcDは通常のnegative log likelihoodによって最適化する.つまり損失関数は
LD(xS,xT,θrepr;θD)=d{source, target}1[yD=d]logqd\mathcal{L}_D(x_S, x_T, \theta_{\text{repr}}; \theta_D) = -\sum_{d \in \{\text{source, target}\}} 1_{[y_D = d]} \log q_d
ただしθD\theta_DはfcDの重みで,qdq_dはfcDの結果のlogit.

さらにfcDを騙すようにGを最適化する(adversarial learning).損失関数は
Lconf(xS,xT,θD;θrepr=d1Dlogqd\mathcal{L}_{\text{conf}}(x_S, x_T, \theta_D; \theta_{\text{repr}} = - \sum_{d} \frac{1}{D} \log q_d

sourceからtargetへのクラス構造のadaptation

通常ニューラルネットワークの(Kクラスの)クラス分類では,最終層にK個のニューロンを配置し,その出力にsoftmaxをかけてそのargmaxに対応するクラスをそのネットワークの推測とするわけだが,ここではsoftmaxの出力そのものに様々な操作を行っていく.
特に,あるクラスに対応するデータ点全てのsoftmaxの出力の平均を"soft label"と定義する(fig.3).ただし通常のsoftmaxはピークが強調されすぎるので,softmaxの温度τ\tauを高くする.
softmaxτ(k)(x)=exp(x(k)/τ)jexp(x(j)/τ)\text{softmax}_{\tau}^{(k)}(\mathbf{x}) = \frac{\exp(\mathbf{x}_{(k)}/\tau)}{\sum_j\exp(\mathbf{x}_{(j)}/\tau)}

figure 3. soft label概念図

これによってsource domainにおける各くらすにおけるsoft labelが計算できる.これらのsoft labelに対して,ラベル付きのtarget domainの点{xT,yT}\{x_T, y_T\}に対して損失関数を
Lsoft(xT,yT;θrepr,θC)=ili(yT)logpi\mathcal{L}_{\text{soft}} (x_T, y_T;\theta_{\text{repr}},\theta_C)=-\sum_i l_i^{(y_T)}\log p_i
とする.ただしppxTx_Tに対するsoft activation, lil_iはsource domainのクラスiに対応するsoft label,
この損失というのはtargetのsoft activationとsourceのsoft labelの,targetクラスにおけるcross-entropyに等しい(fig.4).

figure 4. soft loss

以上のlossを最適化する.


結果

論文読み 2014, Deep Domain Confusion: Maximizating for Domain Invariance

元ネタ: Tzeng et al. Deep Domain Confusion: Maximizing for Domain Invariance, 2014
図表は特に断りがない限りこの論文から引用

Domain adaptationのメソッド.ネットワークがsource domainとtarget domainに共通する表現を学習し,かつsource domainで優れた分類モデルとなるようにすれば,target domainにおいても優れた分類を行えるはずである(fig.1).
そこで,source, target domainにおける表現ϕ\phiの距離をMaximum Mean Discrepancy(MMD)と定義しdomain (confusion) lossとよび,classification lossとの和を最適化する.ϕ\phiをネットワークとして

MMD(Xs,XT)=1XsxSXSϕ(xs)1XTxtXTϕ(xt)MMD(X_s, X_T) = \left\| \frac{1}{|X_s|}\sum_{x_S \in X_S} \phi(x_s) - \frac{1}{X_T} \sum_{x_t \in X_T} \phi(x_t)\right\|


figure 1. domain confusion概念図

Deep domain confusionでは,fc_adapt層以外のパラメータを共有するネットワークを2つ用意し,ラベルのついたデータ店に対してのみclassification loss を計算し,さらにすべてのデータ点でdomain lossを計算し,その和を最適化する.(fig.2).
fc_adaptはそれぞれのネットワークで異なり,source domainとtarget domainの違いを吸収する.

figure 2. Deep Domain Confusion 概念図(破線はパラメータの共有を意味する)

このメソッドはadversarial learningとして見ることもできる(らしいSaito et al, 2017).
conv1 - fc7をgenerator, fc_adaptをdiscriminator(critic), fc8をclassifierとして,discriminatorがsource domain, target domainを区別できないようにgeneratorを学習すると同時に,classifierが正しくクラス分類を行うように学習するのである(fc_adaptをdomain lossが大きくなるように学習していないのが気になるところだ).