DeepLearningを用いた順序回帰(ordinal regression)

順序尺度を目的変数に持つ順序回帰(ordinal regression)は「単なる分類」や「連続値の回帰」と同様な取り扱いをするかどうかを注意して検討する必要があります。当記事ではDeepLearningを用いた順序回帰の取り扱いについて取りまとめを行いました。
当記事の作成にあたっては、「深層学習 第$2$版」の第$2$章「ネットワークの基本構造」の内容などを参考にしました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

順序回帰の問題設定と学習の方針

順序回帰の問題設定

口コミサイトやAmazonの$5$段階評価のように、順序が決まったカテゴリを持つ目的変数$y_1, \cdots , y_n$を下記のように定義する。
$$
\large
\begin{align}
y_1, \cdots , y_n & \in \{ C_1, C_2, C_3, C_4, C_5 \} \\
C_1 < C_2 &< C_3 < C_4 < C_5
\end{align}
$$

上記のカテゴリ$C_1$〜$C_5$はそれぞれ$5$段階評価の$1$〜$5$に対応するとここでは解釈する。ここで通常のカテゴリ分類ではこのように$C_1$〜$C_5$が得られた際に$C_3$が正解であれば$C_3$のみが正解、その他は不正解である一方で、上記のような場合、$C_2, C_4$は「正解に近い」と見なせる。

このように目的変数が順序が決まったクラスで表されるとき、「正解/不正解」以外に「正解に近い」というのも取り扱う必要が生じる。

DeepLearningを用いた順序回帰

前項の「順序回帰の問題設定」で確認したように、順序回帰では「多クラス分類」と「通常の回帰」の中間のような取り扱いが必要になる。よって、DeepLearningを順序回帰に用いるにあたっては出力層や損失関数の設計を柔軟に取り扱う必要が生じる。詳しくは次節で取り扱った。

DeepLearningの構成法

DeepLearningを順序回帰に用いるにあたっては、大まかに$2$パターンの構成法が存在する。以下、それぞれについて取りまとめた。

2値分類に基づく構成

DeepLearningを順序回帰に用いるにあたっての方法の$1$つ目が、「クラス数$K$に対し、$K-1$個の$2$値分類に帰着させる方法」である。文章で表すと処理の実体以上に難しいので、まず$3$クラス分類を元に具体的に確認を行う。
$$
\large
\begin{align}
[1, 0]
\end{align}
$$

たとえば$3-1=2$個の$2$値分類が上記のように得られた場合、「正解クラスが$1$より大きく、$2$以下であるので、カテゴリ$2$が対応する」という規則を定義する。このとき$[0, 0]$が得られた場合は「正解クラスが$1$以下」なのでカテゴリ$1$、$[1, 1]$が得られた場合は「正解クラスが$2$より大きい」のでカテゴリ$3$が対応する。同様な規則を用いることで$K$クラス分類問題を$K-1$個の$2$値分類を元に表すことが可能である。

上記のような規則を用いることで「$K$クラス分類を$K-1$個の$2$値分類に帰着させる」ことは基本的には可能である一方で、$[1, 1, 0, 0, 0]$のように$1$から$0$に変わるのは最大$1$回でなければならないという制約があることには注意が必要である。DeepLearningの学習時はアノテーション作成時に$[1, 1, 0, 0, 0]$が自動的に対応する一方で、学習済みのDeepLearningを元に予測を行う際は$[1, 0, 1, 0, 0]$のような結果が出力される場合がある。

$[1, 0, 1, 0, 0]$のような場合を取り扱うにあたっては、予測時は「$1$の数$+1$をカテゴリとする」ことで対処可能である。たとえば$[1, 0, 1, 0, 0]$の場合は$2+1=3$のように計算できる。

一方DeepLearningの学習時はたとえばカテゴリ$3$に対応する$[1, 1, 0, 0, 0]$が出力されるように、各出力層をロジスティック回帰に対応させてクロスエントロピーの最小化によってオーソドックスな学習を行えばよい。

ソフトラベルの使用

DeepLearningを順序回帰に用いるにあたっての方法の$2$つ目が、「$K$クラス分類問題に対しソフトラベル用いる方法」である。一般的な$K$クラス分類問題では目的変数の正解フラグに$1-$of$-K$符号(ハードラベル)を用いるが、確率化と同様な処理を行なったソフトラベルを用いる。
$$
\large
\begin{align}
d_{k} = \frac{\exp{(-|\bar{k}-k|)}}{\sum_{i=1}^{K} \exp{(-|\bar{k}-i|)}}
\end{align}
$$

$\bar{k}$が正解であるとき、ソフトラベル$\mathbf{d}$の$k$成分の$d_k$はたとえば上記のように定義される。$1-$of$-K$表現では$[0, 0, 1, 0, 0]$のように表される場合、$\mathbf{d}$は下記のように計算できる。

import numpy as np

k_t = 3.
idx = np.arange(1,6,1)
d = np.zeros(5)

for k in range(5):
    d[k] = np.exp(-np.abs(k_t-idx[k])) / np.sum(np.exp(-np.abs(k_t-idx)))

print("d: {}".format(d))
print("sum of d: {}".format(np.sum(d)))

・実行結果

d: [ 0.06745081  0.1833503   0.49839779  0.1833503   0.06745081]
sum of d: 1.0

上記のように計算された$\mathbf{d}$を用いてDeepLearningの学習を行うことで順序回帰の学習を行うことができる。推論時にはスコアが最大の$k$がクラスに対応する。