記事ディレクトリ
バランスの取れた MSE 損失式の導出については、この ブログ
ペーパー アドレス
プロジェクト アドレス
ソース コード アドレスを参照してください。
1. 論文の解釈
1. 問題と課題
ラベルの不均衡は、実世界の視覚回帰でよくある問題です. たとえば、年齢回帰の問題では、トレーニング サンプルのほとんどが大人からのものであるのに対し、高齢者や子供のトレーニング サンプルは比較的少数です.
一般的に使用される平均二乗誤差 (MSE) 損失関数は、まれなサンプルでは不十分なパフォーマンスを示すことが多い. そのため、不均衡な回帰に注目する研究がますます増えており、最近では大規模な評価セットも提案されています [1]。広く研究されてきた不均衡な分類と比較して、不均衡な回帰に関する研究は比較的少ない. 以前の研究では、生成方法によって希少ラベルのトレーニング サンプルを増加させようとしましたが [2]、画像などの高次元データに直面すると、サンプル生成の実現可能性は低くなります。
最近の研究では、主にトレーニング セット内のまれなラベルの重みを増やすために再重み付けが使用されています [1] が、再重み付けは不均衡な分類では効果が限定的であることが証明されており [3]、これは不均衡な回帰の実験でも検証されています。したがって、不均衡回帰問題はまだ初期段階にあり、効果的な方法はまだ不足しています。
2. 方法紹介
不均衡な回帰方法のギャップを埋めるために、バランスの取れた MSE 損失関数を提案して、統計的な観点から不均衡なラベルに対処します。
MSE損失関数の再考
最初に、一般的に使用される MSE 損失関数を再検討し、トレーニング データが不均衡な場合、MSE はラベル分布の影響を受け、一般的なラベルを予測する傾向があることを発見しました。テスト セットのバランスが取れているか、メトリックのバランスが取れている場合、MSE のこの機能により、ラベル全体で平均してモデルのパフォーマンスが低下する可能性があります。この考え方に従って、確率論的アプローチを使用して、MSE に対する不均衡なラベル分布の影響を取り除きます。改善された損失関数を Balanced MSE と呼びます。
統一された観点からの不均衡な分類と回帰
実際、統計的観点からラベルの不均衡を解決するという考え方は、不均衡な分類でも詳細に議論されています. その中でも、NeurIPS 2020 での私たちの作業 Balanced Softmax [4] は、ロングテールの視覚的分類に大幅なパフォーマンスの改善をもたらしました. ただし、MSE 損失関数の確率的重要性について言及されることはめったにないため、この考えは不均衡な回帰問題で初めて調査されます。
それだけでなく、Balanced Softmax と Balanced MSE という 2 つの作業を通じて、不均衡分類と不均衡回帰を議論のための統一されたフレームワークに初めて統合しました。将来的には、このフレームワークを通じて、より不均衡な分類手法を不均衡な回帰の領域に導入することもできます。
柔軟な実装
Balanced MSE でのラベル分布に関する積分計算の柔軟な実装を提供します。提案された実装では、従来のセグメント化されたラベル分布、ガウス混合モデルを使用して適合されたラベル分布を使用するか、前処理されたラベル分布に依存しなくてもかまいません。
ここでは、BMC と呼ばれる前処理ラベル配布に依存しない実装に焦点を当てます。BMC は、各トレーニング バッチからラベル分布情報を推定するため、一般的に使用される MSE 損失関数を置き換える追加の操作は必要ありません。
BMC の形式も非常に興味深いものです。これは、トレーニング バッチの各ラベルをカテゴリとして分類することに相当します。その中で、分類のロジットは、ラベルと予測の間の L2 距離によって得られます。これは、自己教師あり学習で使用される対照的な損失に非常に似ています。これにより、BMC は、分類におけるクロス エントロピー損失関数を介して簡単に実装できます。
実験結果
最初に、合成データセットを使用して Balanced MSE の実験を行います。図 4 は、Balanced MSE が異なるラベル分布の下で真の線形関係に最も近い結果を得ることができることを示していますが、ラベル分布がますます不均衡になるにつれて、再重み付けされた方法のパフォーマンスは悪化します。
図 4 異なるラベル分布の下でのバランスのとれた MSE の 1 次元の不均衡な回帰
図 5 と図 6 はそれぞれ、多次元不均衡回帰と非線形不均衡回帰で、バランスの取れた MSE が依然として最高のパフォーマンスを達成できることを示しています。
図 5 平衡型 MSE は多次元不平衡回帰に適しています
図 6 平衡 MSE は 1 次元の非線形回帰に適しています
さらに、2 つの 1 次元不均衡回帰問題 (年齢回帰と深さ回帰) と、提案した多次元不均衡回帰問題 (人体メッシュ推定 [5]) を含む 3 つの実際のデータセットに対する Balanced MSE の効果を検証しました。
私たちの方法はすべて、現在の最先端のアルゴリズムよりも大幅に優れています。図 7 を見ると、Balanced MSE によって、子供や高齢者などのマイノリティ グループの年齢推定のパフォーマンスが大幅に向上することがわかります。図 8 は、Balanced MSE がまれなポーズを効果的に推定でき、可動域全体を復元できることを示しています。
図 7 不均衡な年齢回帰データセットに対する Balanced MSE のパフォーマンスの向上
エピローグ
不均衡な回帰の問題設定については、一般的に使用される MSE 損失関数を統計的な観点から再考し、MSE が不均衡なラベル分布の影響を受け、不正確な予測を行うことを発見しました。この問題に対処するために、Balanced MSE 損失関数を提案し、ラベル分布の事前計算を必要としない実装を含む柔軟な実装を提供します。
Balanced MSE は、1 次元および多次元の不均衡な回帰問題の両方で、既存の最良の方法よりも優れています。前作の Balanced Softmax と組み合わせることで、不均衡な分類と回帰に統一された視点を提供し、より多くの不均衡な分類手法を不均衡な回帰問題に導入できることを願っています。
2. コードの実装
Balanced MSE の GAI ソリューションは、最初にデータのラベルを適合させ、次に静的 GMM 分布を取得する必要があるため、ストリーミング トレーニングの状況に適応することは困難ですが、GAI メソッドにはまだ MSE 項目があり、 MSE トレーニングの不安定性はまだ解決されていません. 問題; 最終的な損失関数の観点から見た BMC のアプローチは理想的な状況であり、1 つは適応型データ分散であり、もう 1 つは損失関数がソフトマックスの形式であることです。 、MSEの問題を解決します
これを踏まえて、当記事ではBalanced MSEのBMC実装を自作モデルに追加する方法を中心に紹介します
バッチベースのモンテカルロ (BMC) では、トレーニング セットのラベル分布をモデル化する必要はなく、すべてのサンプル ラベルはトレーニング セット ラベルのランダム サンプルと見なされ、Balanced MSE 損失関数に書き換えられます。
入手
損失関数を使用する場合、それが必要です
将模型的输出size修改为[batch, 1]
。そうしないと、次のエラーが発生する可能性があります。python RuntimeError: Expected floating point type for target with class probabilities, got Long
上記のエラーの場合、主にデータのタイプに起因します。
未将noise_var设置为超参数
ここで、変数 noise_varは学習可能な 1 次元のハイパーパラメーターであることに注意してください。
これはプラグ アンド プレイの方法で、著者が GitHub で提供した方法でもあります。コードは次のとおりです。
CPU モード
# 定义Balanced MSE Loss(BMC版本)
def bmc_loss(pred, target, noise_var):
pred = pred.view(-1, 1)
target = target.view(-1, 1)
logits = - 0.5 * (pred - target.T).pow(2) / noise_var
loss = F.cross_entropy(logits, torch.arange(pred.shape[0]))
loss = loss * (2 * noise_var)
return loss
class BMCLoss(_Loss):
def __init__(self, init_noise_sigma):
super(BMCLoss, self).__init__()
self.noise_sigma = torch.nn.Parameter(torch.tensor(init_noise_sigma))
def forward(self, pred, target):
noise_var = self.noise_sigma ** 2
return bmc_loss(pred, target, noise_var)
init_noise_sigma = 8.0
sigma_lr = 1e-2
model = Model()
criterion = BMCLoss(init_noise_sigma)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
optimizer.add_param_group({
'params': criterion.noise_sigma, 'lr': sigma_lr, 'name': 'noise_sigma'})
2 つのハイパーパラメータもデフォルトで与えられます. もちろん、実験中にパラメータを自分で調整することもできますが、noise_var をオンにすることはお勧めしません.
GPU モード
また、GPU での Balanced MSE の使用を容易にするために、CPU と同じ GPU の実装も提供しますが、モデル データを GPU にロードする必要があります。実装コードは次のとおりです。次のとおりです。
# 定义Balanced MSE Loss(BMC版本)
def bmc_loss(pred, target, noise_var):
pred = pred.view(-1, 1)
target = target.view(-1, 1)
logits = - 0.5 * (pred - target.T).pow(2) / noise_var
loss = F.cross_entropy(logits, torch.arange(pred.shape[0]).cuda())
loss = loss * (2 * noise_var)
return loss
class BMCLoss(_Loss):
def __init__(self, init_noise_sigma):
super(BMCLoss, self).__init__()
self.noise_sigma = torch.nn.Parameter(torch.tensor(init_noise_sigma, device="cuda"))
def forward(self, pred, target):
noise_var = self.noise_sigma ** 2
return bmc_loss(pred, target, noise_var)
init_noise_sigma = 8.0
sigma_lr = 1e-2
model = Model()
criterion = BMCLoss(init_noise_sigma)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
optimizer.add_param_group({
'params': criterion.noise_sigma, 'lr': sigma_lr, 'name': 'noise_sigma'})
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)