E資格(エンジニア資格) 無料問題 4 / 10 ・ 分野3: 深層学習の基礎
次のコードを実行したときの表示はどれか。 import torch, torch.nn as nn logits = torch.tensor([[1., 3., 0.]]) target = torch.tensor([1]) print(round(nn.CrossEntropyLoss()(logits, target).item(), 2))
- 2.17
- 0.66
- 0.17
- 0.84
正解と解説を見る
正解: C
正解の理由
nn.CrossEntropyLoss は正規化していないロジットを受け取り、内部で log-softmax と負の対数尤度を計算する。softmax(1, 3, 0) の正解クラス(1番)の確率は e³/(e¹+e³+e⁰) ≒ 0.844 で、損失は −log 0.844 ≒ 0.17 になる。
違う選択肢
「0.66」… ソフトマックスを通した確率 (0.11, 0.84, 0.04) をさらに CrossEntropyLoss に渡した(二重にソフトマックスを掛けた)ときの値 ≒ 0.66 である。このコードはロジットを直接渡しているので、起こらない。
「0.84」… 正解クラスの確率 ≒ 0.84 そのものである。損失はこの確率の負の対数 −log 0.84 ≒ 0.17 である。
「2.17」… 正解を 0 番と取り違えた −log(0.114) ≒ 2.17 である。正解のラベルは target = 1 で、1 番のクラスの確率で損失を計算する。
押さえどころ
CrossEntropyLoss にソフトマックスを重ねて渡す誤りは、損失が下がりにくくなる典型的なバグである。推論の確率を出したいときだけ、別に softmax を掛ける。