Softmax関数をベースにした Deep Metric Learning が上手くいく理由

# はじめに
　Deep Learningを使った距離学習（Metric Learning）では、Contrastive Lossや[Triplet Loss](https://qiita.com/tancoro/items/35d0925de74f21bfff14)などを用いて、画像間の類似性（や非類似性）を直接学習していく方法が広く利用されていますが、学習データの組み合わせや選び方が難しく、学習自体が難航するケースが多い事も知られています。それだけに、これまで様々な改良と工夫が提案されています。
　しかし、最近はこのような学習データ選びに難航することなく、一般的なクラス分類タスクの感覚で、Softmax関数をベースに学習できるMetric Learningが注目を浴びています。ArcFaceなどはその代表的手法で[こちら](https://qiita.com/yu4u/items/078054dfb5592cbb80cc)で詳しく説明されています。
　Softmax関数をベースにしたMetric Learningがうまくいく理由、またさらなる改良の余地はあるのか？これらに関して少し紹介しようと思います。



# Center Loss
　クラス分類にMetric Learningの要素を取り入れた元祖といえばCenter Loss[^Center]ではないでしょうか。Center Lossに関しては、[こちら](https://cpp-learning.com/center-loss/)で詳細に説明されていたので、ざっと要点のみを紹介します。
　Center Lossでは、各特徴ベクトルと対応するクラス中心との距離にペナルティを設けることで、クラス分類と特徴空間上のクラス中心位置を同時に学習します。これによりクラス内変動は小さくなるため、より効果的にクラス分離する方法としてECCV2016で発表されました。

　本論文では、CNNの最終層の１つ手前のFC層を２次元に改良し、その値をそのまま２次元平面にプロットする事で特徴量の可視化を行っています。下図はMNISTに対して通常のSoftmax関数でクラス分類した際の中間特徴量を可視化したものです。

<img width="90%" alt="スクリーンショット 2020-02-03 17.45.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/2ba98ba7-1845-8092-58e4-0b9b26f5ec64.png">

　損失関数は、通常のSoftmax Cross Entropy Lossに、各特徴ベクトルとそのクラスの中心ベクトルとの距離を表すCenter Lossの項を加えたものになります。
<img width="70%" alt="スクリーンショット 2020-02-03 18.09.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/7a3aefd5-a2c7-5db3-f230-633720df8901.png">

クラスの中心$C_{y_i}$を都度正確に計算するのは計算量的に現実的ではないため、ミニバッチ毎に以下の計算を行い、クラス中心$C_{y_i}$を逐次更新していきます。

<img width="60%" alt="スクリーンショット 2020-02-03 19.02.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/7b43dc9c-5971-ab31-4709-b9edf1d6be78.png">
<img width="100%" alt="スクリーンショット 2020-02-03 19.02.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/d8186bbd-b8d3-b2e6-f7eb-b1b5ccc55dfd.png">
<img width="40%" alt="スクリーンショット 2020-02-03 19.06.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/fa1dd667-4b6d-4408-7cf8-38f40e79acdd.png">

以下はクラス中心の具体的な更新例です。ミニバッチ内でクラスAに属するデータが$A1$、$A2$、$A3$の３つの場合、クラスAの中心位置$C_A$は下図のように更新されます。

<img width="90%" alt="スクリーンショット 2020-02-03 19.22.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/0372e982-e656-8011-d2dd-46994d29d657.png">

　最後に Center Lossの結果を可視化した図を載せておきます。ハイパーパラメータ$\lambda$の値を大きくする事で、クラス内変動も小さくなることが分かります。

<img width="80%" alt="スクリーンショット 2020-02-03 19.32.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/d770393e-bbfe-d7bc-2f06-495e62fdac7b.png">


# Sphereface
　Softmax関数を使って学習した場合の特徴空間には固有の角度分布がある事を見出し、Center Lossのようなユークリッド距離によるマージンよりも、角度に基づくマージンの方が適しているという事を主張。Angular Softmax (A-Softmax) Lossを提案[^Sphere]し、CVPR2017で採択されました。

　順に見ていきたいと思います。まず、通常のSoftmax Cross Entropy Lossは以下の通りです。
<img width="40%" alt="スクリーンショット 2020-02-03 22.30.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/916a1613-bee3-305d-3779-799f4cbae40f.png">
次に、これを内積の公式 $\boldsymbol{a}\cdot\boldsymbol{b}=\|\|\boldsymbol{a}\|\|\,\|\|\boldsymbol{b}\|\|\cos\theta$ を使って $\boldsymbol{W^T_j}$と$\boldsymbol{x_i}$の内積部分を書き換えます。
<img width="60%" alt="スクリーンショット 2020-02-03 22.49.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/afb5236d-ee72-fb64-918c-49965689b2f7.png">
さらに、重みパラーメタを正規化して$\|\|\boldsymbol{W_j}\|\| = 1$となるようにし、バイアス$b_j$も$0$にします。
すると、以下のようになり、これをModified Softmax Lossと定義します。
<img width="70%" alt="スクリーンショット 2020-02-03 23.03.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/8e3f73d3-0959-48f3-b276-3252545b4002.png">
次に、この$L_{modified}$における決定境界がどうなっているのか確かめてみます。決定境界とは２つのクラスがちょうど同じ確率になる境界値を指します。

クラス１の重み$W_1$と特徴量$x_i$のなす角を$\cos\theta_1$、クラス２の重み$W_2$と特徴量$x_i$のなす角を$\cos\theta_2$とすると、この２つの確率がちょうど同じになるのは以下の条件を満たす場合です。

```math
\frac{e^{\|\boldsymbol{x_i}\|\cos\theta_1}}{\sum_{j} e^{\|\boldsymbol{x_i}\|\cos(\theta_{j,i})}} = \frac{e^{\|\boldsymbol{x_i}\|\cos\theta_2}}{\sum_{j} e^{\|\boldsymbol{x_i}\|\cos(\theta_{j,i})}} \\
\|\boldsymbol{x_i}\|\cos\theta_1 = \|\boldsymbol{x_i}\|\cos\theta_2 \\
\theta_1 = \theta_2
```
したがって、クラス1とクラス2の確率がちょうど同じになるのは、重み$W_1$と$W_2$の角度を２等分する直線方向に$x_i$がある場合です。
<img width="30%" alt="スクリーンショット 2020-02-03 23.42.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/f0c1edc0-11ae-f42f-4e76-f21cc7f35418.png">
この結果から、Softmax Lossによって学習された特徴量$x_i$というのは、本質的にはsoftmaxをかける直前の最後の重み$Wj$の角度に沿った分布をとっていることがわかります。
<img width="90%" alt="スクリーンショット 2020-02-03 23.54.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/a9bba142-4b8a-0108-08b7-8d8b4622456a.png">
これはつまり、Softmax関数に対して、Center Lossのようにユークリッド距離ベースのマージンを組み合わせるのは親和性がよくない事を示唆しており、**角度に沿ったマージンを設ける事こそが最も効果的**であると示しています。

## Angular Softmax (A-Softmax) Loss
Angular Softmax (A-Softmax) Lossは以下のように定義されています。
<img width="80%" alt="スクリーンショット 2020-02-04 0.29.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/074ebbf4-a762-d0e8-5459-a89ae70a980e.png">
$L_{modified}$に対して、自クラスの重み$W_{y_i}$とのなす角$\theta_{y_i,i}$にのみ係数$m$のペナルティを与えるため、決定境界を本来の位置よりも自クラスの重み$W_{y_i}$のに近くに寄せる効果が期待あります。
<img width="205" alt="スクリーンショット 2020-02-04 0.39.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/ee10fb46-84ce-d647-34d6-932e8396d988.png">

## CosFaceやArcFace
　Spherefaceが主張するような角度に沿ったマージンをとるやり方は、Sphereface以降にもいくつか提案されています。CosFace[^Cosface]やArcFace[^Arcface]などがそれにあたります。
<img width="90%" alt="スクリーンショット 2020-02-04 0.59.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/960d1884-1391-e490-b96f-3851ac54912a.png">

　詳細な内容は割愛しますが、簡単に説明すると、CosFaceからは$x_i$の正規化も行われるようになったため、２つのベクトルのなす角の$\cos\theta$がそのまま類似度として表現できるようになりました。また、$\cos\theta$の値が小さすぎてSoftmaxが機能しなくなるのを防ぐためにハイパーパラメータ$s$を導入しています。
　さらにその後、ArcFaceはマージンの場所を変更しています。角度に直接マージン指定しているので、Softmaxにおける分離境界は区間全体に渡って線形かつ一定となります。


# Uniform Loss
　SpherefaceなどのCosine Based Softmax LossにUniform Lossという新しい項を追加する事で、クラス中心を均一に分散させる等分布制約を課し、特徴空間を最大限に活用できるようにする手法が提案[^Uniformface]されました。CVPR2019で採択されています。Uniform Lossは、特徴空間である超球面上で、クラスの中心をクラス間反発を伴う電荷のように考え、そのポテンシャルエネルギーを最小化するような働きをします。これまでの既存手法は、クラス間距離を大きくすることとクラス内変動を小さくすることを目標にしているものが多いですが、Uniform Lossではそれに加えてクラス間距離の最小値の最大化も期待できます。

　**Center Loss** の場合は、クラス内の要素とクラス中心との間の距離を単に最小化するのみで、そもそもクラス間の関係は記述されていません。
<img width="80%" alt="スクリーンショット 2020-02-04 13.03.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/6d89b9a8-c7fd-8765-d5d0-2b9f17e7167e.png">

　**Sphereface**、**Cosface**、**Arcface** の場合は、超球面上でマージンを持った識別境界が学習されるので、結果的にクラス内変動は小さく、クラス間距離は大きくなるように学習が進みます。ただし、特徴空間の全体的な分布を明示的に制約しているものはないため、特徴空間内で局所的な配置となり、バランスが取れていない可能性があります。
<img width="70%" alt="スクリーンショット 2020-02-04 13.08.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/c5074e62-0f75-60da-1b3d-5ca5851b2498.png">

　Uniform Lossは、球の表面上に電荷を配置した場合、それらが均一に分布した場合にポテンシャルエネルギーが最小化されるという事実がモチベーションとなっているので、クラスの中心を電荷とみなし、その電位エネルギーを表す関数をLossとして表現します。
<img width="80%" alt="スクリーンショット 2020-02-04 13.15.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/55d3afc6-e580-be9b-9aec-336a730f7611.png">

２つのクラス間にその距離の２乗に反比例する反発力$F$を定義します。
<img width="30%" alt="スクリーンショット 2020-02-04 13.17.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/79736825-0fb1-5672-9b68-eedc38b874a1.png">

距離関数$d$ は、クーロンの法則をそのまま踏襲しユークリッド距離を使用します。また、反発力$F$が大きくなりすぎるのを防ぐために1を加えます。
<img width="40%" alt="スクリーンショット 2020-02-04 13.21.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/101a733e-b6fb-4ee4-e559-c6feca3c3d85.png">

全てのクラス中心のペアワイズのエネルギーの平均値としてUniform Lossを定式化します。
<img width="50%" alt="スクリーンショット 2020-02-04 13.25.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/62032b84-f16e-daf1-0eff-6036eedd5bb5.png">

SpherefaceのLoss（Cosine Based Softmax Loss）関数の部分は以下の通りです。
<img width="70%" alt="スクリーンショット 2020-02-04 13.30.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/01a75d29-b53a-3973-e40a-f82fd2cc3856.png">

この２つのLossの和が最終的なLoss関数となります。
<img width="20%" alt="スクリーンショット 2020-02-04 13.31.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/e326acd4-389a-2cc5-f81a-5e62317a2df1.png">

最後に、クラスの中心の更新方法ですが、これはCenter Lossのそれと全く同じ方法で更新します。

ちなみに余談になりますが、3次元球面上にN個の点を置き、点間の球面距離の最小値が最大となるように配置した場合、その球面距離の長さはいくつになるか？という問題はTammes問題と呼ばれていて、現在でも完全な解答が見つかっていない数学上の未解決問題の一つだそうです。

# P2SGrad
　SenseTime ResearchとThe Chinese University of Hong Kongの共同研究として、AdaCos[^Adacos]とP2SGrad[^P2sgrad]という２つの論文が2019年5月7日に同じAuthorから同時に発表されました。どちらの論文もCVPR2019で採択（AdaCosの方はOral採択）されています。提案されている手法もさることながら、Sphereface、Cosface、ArcfaceなどのCosine Based Softmax Lossの本質的な違いや、勾配の最適化のプロセスに関して言及している点が特に面白いと感じました。AdaCosに関しては既に[こちら](https://qiita.com/ninhydrin/items/797a308c864e9238c71e)で説明されていたので、P2SGradの方を詳しくみていきたいと思います。

　さて、P2SGradですが、特筆すべきは、特定の損失関数を定式化せずに、モデルを最適化できる点だと思います。Metric Learningに関わらず、一般的なDeep Learningでは損失関数を定義し、損失関数が小さくなるように重みやバイアスを更新しながら学習していくというのが定石です。しかし、P2SGradでは、特徴空間の重みベクトルを更新するための最適な勾配方向と大きさを直接的に求め、それをBackpropagationしてパラメータの最適化を進めていきます。さらに、損失関数を定義しなくてよいということは、ArcFaceやCosFaceの損失関数にあった$m$や$s$といったハイパーパラメータを調整する必要もありません。

## Cosine Based Softmax Loss の Backpropagation
まずは、角度マージンのない Cosine Based Softmax Lossに関する勾配を確認しておきます。
次の $f_{i,j}$は 特徴量$\vec{x_i}$のクラス$j$ に関する logits になります。

```math
f_{i,j}  = s \cdot \frac{\langle \vec{x_i}, \vec{W_j} \rangle}{\|\vec{x_i}\|_2\|\vec{W_j}\|_2} = s \cdot \langle \boldsymbol{\hat{x_i}}, \boldsymbol{\hat{W_j}} \rangle = s \cdot \cos\theta_{i,j} \tag{1}
```
$\boldsymbol{\hat{x_i}}$と$\boldsymbol{\hat{W_j}}$はそれぞれ$\vec{x_i}$と$\vec{W_j}$の正規化されたベクトルを表します。

クラス数が$C$の場合、$i$ 番目の特徴量がクラス $j$である確率$P_{i,j}$は、Softmax関数で下記のように書けます。

```math
P_{i,j} = Softmax(f_{i,j}) = \frac{e^{f_{i,j}}}{\sum^{C}_{k=1}e^{f_{i,k}}} \tag{2}
```

正解クラスが$y_i$の場合のCross Entropy Lossは次のようになります。

```math
L_{CE}(\vec{x_i}) =-\log{P_{i, y_i}} = -\log{\frac{e^{f_{i,y_i}}}{\sum^{C}_{k=1}e^{f_{i,k}}}} \tag{3}
```
この $L_{CE}(\vec{x_i})$ に対し、$\vec{x_i}$ と $\vec{W_j}$ の勾配を求めます。

```math
\frac{\partial L_{CE}(\vec{x_i})}{\partial \vec{x_i}} = \sum_{j=1}^{C}(P_{i,j} - \mathbb{1}(y_i=j)) \nabla f(\cos\theta_{i,j}) \cdot \frac{\partial \cos\theta_{i,j}}{\partial \vec{x_i}} \tag{4}
```

``` math
\frac{\partial L_{CE}(\vec{x_i})}{\partial \vec{W_j}} = (P_{i,j} - \mathbb{1}(y_i=j)) \nabla f(\cos\theta_{i,j}) \cdot \frac{\partial \cos\theta_{i,j}}{\partial \vec{W_j}} \tag{5}
```
関数 $\mathbb{1}(y_i=j)$ は、$j=y_i$のとき$1$で、それ以外は$0$になります。
さらに $\frac{\partial \cos\theta_{i,j}}{\partial \vec{x_i}}$ と $\frac{\partial \cos\theta_{i,j}}{\partial \vec{W_j}}$ を計算すると、それぞれ以下のようなベクトル値になります。

```math
\frac{\partial \cos\theta_{i,j}}{\partial \vec{x_i}} = \frac{1}{\|\vec{x_i}\|_2}(\boldsymbol{\hat{W_j}} - \cos\theta_{i,j} \cdot \boldsymbol{\hat{x_i}}) \tag{6}
```

```math
\frac{\partial \cos\theta_{i,j}}{\partial \vec{W_j}} = \frac{1}{\|\vec{W_j}\|_2}(\boldsymbol{\hat{x_i}} - \cos\theta_{i,j} \cdot \boldsymbol{\hat{W_j}}) \tag{7}
```

次に、$\nabla f(\cos\theta_{i,j})$の部分を計算します。$f$は logits 部分を表す関数なので、角度マージンを持たない$f(\cos\theta_{i,j})$は$s \cdot \cos\theta_{i,j}$です。したがって $\nabla f(\cos\theta_{i,j}) = s$ となります。
Cosfaceの場合は$f(\cos\theta_{i,y_i})=s \cdot (\cos\theta_{i,y_i} - m)$なので$\nabla f(\cos\theta_{i,y_i}) = s$となり、Arcfaceの場合は$f(\cos\theta_{i,y_i})=s \cdot \cos(\theta_{i,y_i} + m)$なので、$\nabla f(\cos\theta_{i,y_i}) = s \cdot \frac{\sin(\theta_{i,y_i} + m)}{\sin\theta_{i,y_i}}$となります。

いずれにしても、$\nabla f(\cos\theta_{i,j})$はパラメータ$s$や$m$や$\cos\theta_{i,y_i}$によって決まるスカラー値になります。また、普通は$s>1$の値を使うので、上記は全て$\nabla f(\cos\theta_{i,j}) > 1$となります。

それでは改めて、$\frac{\partial L_{CE}(\vec{x_i})}{\partial \vec{W_j}}$を$j$によって場合分けして整理してみましょう。

$j \neq y_i$の場合

```math
\frac{\partial L_{CE}(\vec{x_i})}{\partial \vec{W_j}} = P_{i,j} \cdot \nabla f(\cos\theta_{i,j}) \cdot \frac{\partial \cos\theta_{i,j}}{\partial \vec{W_j}} = T \cdot \frac{\partial \cos\theta_{i,j}}{\partial \vec{W_j}} \tag{8}
```

$j = y_i$の場合

```math
\frac{\partial L_{CE}(\vec{x_i})}{\partial \vec{W_j}} = (P_{i,j} - 1) \cdot \nabla f(\cos\theta_{i,j}) \cdot \frac{\partial \cos\theta_{i,j}}{\partial \vec{W_j}} = U \cdot \frac{\partial \cos\theta_{i,j}}{\partial \vec{W_j}} \tag{9}
```

$P_{i,j}$はSoftmaxの値なので、取り得る値の範囲は $P_{i,j} \in [0, 1]$ です。つまり、上式の$T$および$U$はそれぞれ$T>0$と$U<0$ の範囲をとるスカラー値ということになります。

Backpropagationによって重みベクトル$\vec{W_j}$は、下記のように最適化されていきます。

```math
\vec{W_j} \leftarrow \vec{W_j} - \eta\cdot \frac{\partial L_{CE}}{\partial \vec{W_j}} \tag{10}
```


これらの事実にもとづいてまとめると、以下の事がわかります。

- 正解クラスの重みパラメータ$\vec{W_{y_i}}$は、Backpropagationによって$\vec{W_{y_i}}$に垂直な$\frac{\partial \cos\theta_{i,j}}{\partial \vec{W_j}}$ の方向に更新されていく。そしてその勾配ベクトルの長さは$(P_{i,j} - \mathbb{1}(y_i=j)) \nabla f(\cos\theta_{i,j})$である。

- 正解じゃないクラスの重みパラメータ$\vec{W_j}$は、Backpropagationによって$\vec{W_j}$に垂直な $-\frac{\partial \cos\theta_{i,j}}{\partial \vec{W_j}}$の方向に更新されていく。そしてその勾配ベクトルの長さは$(P_{i,j} - \mathbb{1}(y_i=j)) \nabla f(\cos\theta_{i,j})$である。

- $\frac{\partial \cos\theta_{i,j}}{\partial \vec{W_j}}$は、$\vec{W_j}$に対して垂直方向なので、これは最速かつ最適でとても合理的な更新である。

- Cosine Based Softmax Lossは、CosFaceやArcFaceなどいろいろあるが、更新する勾配方向は全て同じである。これらの本質的な違いは勾配の長さ部分であり、この部分がモデルの最適化に大きく影響している。

<img width="50%" alt="スクリーンショット 2020-02-05 8.19.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/811dc1a6-29bd-75fb-e2c4-294e7fbb47f2.png">

## 勾配の長さ
　これまでみてきたように、勾配の長さは $(P_{i,j} - \mathbb{1}(y_i=j)) \cdot \nabla f(\cos\theta_{i,j})$なので、**$P_{i,j}$の値が勾配の長さに大きく影響**します。さらに、$P_{i,j}$は logits $f_{i,j}$と正の相関があります。そして、logits $f_{i,j}$はハイパーパラメータ$s$や$m$の影響を強く受けます。

　ArcFaceの例をみていきます。$f_{i,y_i}$ は $s \cdot \cos(\theta_{i,y_i} + m)$です。ハイパーパラメータ$s$と$m$が異なると同じ$\theta_{i,y_i}$の場合でも、$P_{i,y_i}$の値が大きく変わる事がわかります。

<img width="80%" alt="スクリーンショット 2020-02-05 10.30.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/985999ab-0f40-035b-e573-e96c3151acc3.png">

　ここであらためて考えるべきは、ArcFaceの本来の目的です。ArcFaceはクラス分類をしたいのではなく、抽出された２つのベクトル$\vec{x_1}$と$\vec{x_2}$のなす角$\theta$が近いか否かを知りたいのです。つまり、本来的には$\theta_{i,y_i}$の大きさこそが、Backpropagationにおいて重要な勾配の長さ（つまりは、$P_{i,j}$）に影響しなければならないのに、ハイパーパラメータ$s$や$m$が強く関与してしまっています。
　さらに、もうひとつ。$P_{i,y_i}$の値はクラス数$C$によっても変化します。クラス数$C$の増加とともに、不正解のクラス$P_{i,j}$ に割り当てられる確率は、多かれ少なかれ小さくなっていくことが予想されます。これはClosedなクラス分類問題においては合理的です。ただし、これはOpen-Setの問題である顔認識には適していません。 

　勾配の長さに影響を与える値として $\nabla f(\cos\theta_{i,j})$ もあります。これはCosine Based Softmax Lossの種類によって異なります。

角度マージンを持たないCosine Based Softmax Lossの場合、

```math
\nabla f(\cos\theta_{i,j}) = s \tag{11}
```

Cosfaceの場合、

```math
\nabla f(\cos\theta_{i,j}) = s \tag{12}
```

Arcfaceの場合、

```math
\nabla f(\cos\theta_{i,j}) = s \cdot \frac{\sin(\theta_{i,j} + m)}{\sin\theta_{i,j}} \tag{13}
```
となります。

つまり、角度マージンを持たないCosine Based Softmax Loss、および Cosfaceにおいては、$\nabla f(\cos\theta_{i,j})$で勾配の長さに与える影響は、常に一定$s$である事を示しています。しかし、Arcfaceでは、勾配の長さと$\theta_{i,j}$は負の相関関係にあり、これは完全に予想に反しています。$\theta_{i,y_i}$が徐々に減少すると、一般的には $P_{i,y_i}$の勾配を短縮する傾向がありますが、Arcfaceでは長さを伸ばす傾向があります。したがって、Arcfaceでは $\nabla f(\cos\theta_{i,j})$が勾配の長さに与える幾何学的な意味は説明されなくなります。

<img width="90%" alt="スクリーンショット 2020-02-05 11.59.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/4d7640f5-42fd-05d4-c8ca-182848dfd60b.png">

## 勾配の長さを決定するP2SGradの提案
　ここからがようやく本題で、ハイパーパラメーター、クラス数、logitsのいずれにも依存せず、$\theta_{i,j}$のみによって勾配の長さを決定する新しい方法**P2SGrad**を説明します。P2SGradは特定の損失関数を定義せずに、直接勾配を求めるため、式$(4)$と$(5)$を見直していきます。
　まず、勾配方向はこれまで説明してきた通り、最も最適な方向なのでここを変更する必要はありません。次に、勾配の長さ部分である$P_{i,j}$と$\nabla f(\cos\theta_{i,j})$を考えます。$\nabla f(\cos\theta_{i,j})$に関しては、そもそもハイパーパラメータを除外したいという目的で見直しているので、ここは$1$にしてしまいます。

　次に、$P_{i,j}$ですが $P_{i,j}$の代わりに$\cos\theta_{i,j}$を使う事を考えます。理由は以下の３つです。

- $P_{i,j}$と$\cos\theta_{i,j}$は値の理論範囲$[0, 1]$が同じである。ただし、$\theta_{i,j} \in [0, \pi/2]$とする。
- $P_{i,j}$とは異なり、$\cos\theta_{i,j}$はハイパーパラメーターやクラス数$C$のいずれからも影響を受けることはない。
- 推論時は$\cos\theta$による類似度を元に顔認識を行う。$P_{i,j}$はClosedなクラス分類タスクにのみ適用される確率に過ぎない。

これらを考慮し、新しいP2SGradを定式化します。式$(4)$と$(5)$はそれぞれ式$(14)$と式$(15)$に置き換えられます。

```math
\tilde{G}_{P2SGrad}(\vec{x_i}) = \sum_{j=1}^{C}(\cos\theta_{i,j} - \mathbb{1}(y_i=j)) \cdot \frac{\partial \cos\theta_{i,j}}{\partial \vec{x_i}} \tag{14}
```

``` math
\tilde{G}_{P2SGrad}(\vec{W_j}) = (\cos\theta_{i,j} - \mathbb{1}(y_i=j)) \cdot \frac{\partial \cos\theta_{i,j}}{\partial \vec{W_j}} \tag{15}
```

このP2SGradは簡潔ではあるがとても合理的です。$y_i = j$の場合は勾配の長さと$\theta_{i,j}$は正の相関となり、$j \neq y_i$の場合は、負の相関が成り立ちます。

　最後に学習のやり方を説明します。一般的な学習はfoward処理により式$(3)$のCross Entropy Lossを求め、その後、backpropagationにより最終層から式$(4)$と式$(5)$を逆伝播し、各層の重みやバイアスパラメータの勾配を順に求めて行きます。P2SGradを使った学習では、foward処理によって得た特徴量$\vec{x_i}$から直接 式$(14)$と式$(15)$を求めます。後は通常の学習と同じ手順でそれを逆伝播し、各層の重みやバイアスパラメータの勾配を順に求めていきます。

## 実験
　詳しい実験結果はオリジナル論文を見てもらうとして、参考までにLWFのデータセットで実験した結果を載せておきます。CNN部分はResNet-50を使い、学習のイテレーションと$\theta_{i,y_i}$の平均値の関係を示した図です。
<img width="80%" alt="スクリーンショット 2020-02-05 16.13.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146511/cd7f203f-9497-cf22-beb2-875488f553e4.png">
P2SGradによる学習はその他のCosine Based Softmax Lossよりも $\theta_{i,y_i}$の減少が早い事がわかります。


[^Center]: Y. Wen, K Zhang,  Z Li, and Y. Qiao. “A Discriminative Feature Learning Approach for Deep Face Recognition." In ECCV, 2016.
[^Sphere]: W. Liu, Y. Wen, Z. Yu, M. Li, B. Raj, and L. Song. “Sphereface: Deep hypersphere embedding for face recognition.” In CVPR, 2017.
[^Cosface]: H. Wang, Y. Wang, Z. Zhou, X. Ji, D. Gong, J. Zhou, Z. Li, and W. Liu, "CosFace: Large Margin Cosine Loss for Deep Face Recognition," in Proc. of CVPR, 2018.
[^Arcface]: J. Deng, J. Guo, N. Xue, and S. Zafeiriou. "ArcFace: Additive Angular Margin Loss for Deep Face Recognition," In CVPR, 2019.
[^Uniformface]: Y. Duan, J. Lu, and J. Zhou. "Uniformface: Learning Deep Equidistributed Representation for Face Recognition." in CVPR, 2019.
[^Adacos]: X. Zhang, R. Zhao, Y. Qiao, X. Wang, and H. Li. "AdaCos: Adaptively Scaling Cosine Logits for Effectively Learning Deep Face Representations." in CVPR, 2019.
[^P2sgrad]: X. Zhang, R. Zhao, J. Yan, M. Gao, Y. Qiao, X. Wang, and H. Li. "P2SGrad: Refined Gradients for Optimizing Deep Face Models." in CVPR, 2019.