Curaai00's Deep Learning Blog

CAM, Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization

딥러닝/시각화
Grad-CAM

Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization

기본적으로 Deep Neural Network는 black box이다. network가 output을 어떻게 만들었는지 모른다. 그래서 우리는 통계적인 방법을 이용하여 분석을 한다. 예를들어 precision, recall, acucracy, confidence, loss 등등 다양한 meausre를 통해 결과를 분석하고 네트워크의 문제점을 알아낸다.

하지만 결과를 바탕으로 네트워크가 어떻게 판단을 하는지 추정은 할수 있지만, 우리는 정확히 네트워크의 forwarding 과정을 알지 못한다. 그것을 해결하기 위한 분야가 visualization 이다.

Class Activation Mapping

classification에서 사용하는 visualzing method이다. CNN은 low level의 feature에서는 edge나 color등등 단순한 특징을 학습한다. 하지만 high level에 가까워 질수록 물체를 인식한다. 일반적으로 마지막 conv feature에는 어떠한 물체를 인식하여 디테일한 spatial information을 가지고 있다. 하지만 fully-connected layer를 거치며 정보가 사라진다.

위의 문제를 해결하기 위해 output layer 전의 conv layer에서 fully-connected layer를 global average pooling을 실행한 후에 사용한다. global average pooling을 하면 무엇을 activation한 각각의 channel의 정보량을 압축한다.

network를 통과한 feature $f_k(x, y)$는 $k$번째 unit의 $(x, y)$ spatial location의 activation을 나타낸다. $k$번째 unit에 대한 global average pooling의 결과는 $F_k = \sum_{x, y} f_k(x, y)$이다. class $c$에 대한 softmax의 input은 $S_c = \sum_k w^c_k F_k$이다. 이때 weight $w^c_k$는 class $c$에 대한 가중치로 대응된다. 즉 $w^c_k$는 class $c$에 대한 $F_k$의 중요도를 나타낸다고 다시 말할수 있다. 최종적으로 softmax의 output $P_c$는 $\frac{exp(S_c)}{\sum_c exp(S_c)}$로 구한다. 이때 bias term은 무시한다.

class activation mapping을 하는 방법은 각 feature map에 대해 class $c$에 대한 중요도 $w^c_k$를 곱해준다.

class $c$에 대한 Class Activation Map $M_c$는 Eqn (1)로 표현된다.


Grad-CAM

CAM은 좋은 성능을 보여줬지만, deep neural network는 CNN classification model만 있는 것이 아니다. CNN + RNN, object detection, face recognition 등등 cnn이 wide하게 사용된다. 하지만 CAM은 가중치 $w^c_k$를 softmax와 연결된 fully-connected에서 왔지만, 일반적인 CNN은 fully connected를 사용하지 않는 경우가 많다. 이때는 CAM을 사용하지 못한다. 또한 classification model에서도 마지막 fully connected layer를 교체하여 재학습 해야한다. CAM은 general 하게 사용할 수 없다.

그 해결방안이 Grad-CAM이다. Deep Learning을 이용한 neural network는 한가지 공통점이 있다. 바로 gradient이다. 모든 neural network는 gradient를 back propagation해서 학습을 하기 때문에, 이 공통적인 gradient를 visualizing하고 싶은 Layer의 feature에 가중치로서 사용한다.

weight $\alpha ^c_k$는 neuron importance를 나타낸다. 여기에 $k$번째 unit의 feature map $A^k$와 $\alpha ^c_k$를 weighted combination한뒤, gradient이다 보니 다른 class에 대한 gradient가 포함될수 있는데, 이때 positive한 gradient는 class $c$이고, negative gradient는 다른 class이므로, ReLU 연산을 통해 class $c$에 대한 Gradient-Class Activation Map 을 만든다.

수식으로 표현하자면 Eqn (3)과 같다.


Guided Back Propagation은 positive gradient만을 visualizing 한 것이다.Grad-CAM은 feature 사이즈 이므로 bilinear interpolation을 사용하여 source image로 resize한다.

위의 그림은 Visual Question Answering에서 사용한 Grad-CAM이다.

Temperature Scaling, Calibration: On Calibration of Modern Neural Networks

딥러닝/이미지 인식
temp

딥러닝을 사용한 분류 문제에서는 흔히들 softmax를 사용해 가장 큰 값(probability)이 나온 것을 해당 class라 판단하고 그때의 확률 값을 confidence로 사용한다. confidence가 낮게 나오면, 해당 data에 대해 model이 학습이 더 필요하거나, 잘못 됐다고 해석할 수 있다. 가장 높은 confidence의 class를 predict class로 선정하듯 confidence는 모델을 해석하는데 아주 유용하게 쓰인다.

Annotation

classification neural network $h$는 input $ x \in X$, $K$개의 class를 가진 label $y \in Y = {1, \dots, K}$에 대해 $h(x) = (\hat y, \hat p)$, class prediction $\hat y$ 와 $\hat y$에 해당하는 probability confidence $\hat p$ 를 예측한다. confidence $\hat p$에 대해 설명하자면, model이 100개를 predict하고, confidence가 전부 0.8일 경우 80개가 맞게 분류되었을 것이라고 예상 할 수 있다. 하지만 confidence에 대해 확실한 measure를 원한다.

한정된 sample에서 1을 $M$개의 bin으로 나눈다. $m$번째 bin에는 $I_m = (\frac{m-1}{M}, \frac{m}{M}]$ 에 해당하는 prediction result index가 들어가 있다. 이때 $m$번째 bin의 accuracy와 confidence는 다음과 같다.

  • $m$번째 bin의 $accuracy$는 label과 prediction 같은 경우 / bin의 size이다
  • $m$번째 bin의 $confidence$는 bin의 prediction confidence의 평균이다.

$acc(B_m) = conf(B_m)$인 경우를 well/perpectly calibrated라 한다.

Calibration Error

calibration이 얼마나 잘 되었는지를 ECE(Expected Calibration Error), MCE(Maximum Calibration Error)로 측정한다.

첫번째로 ECE는 accuracy와 confidence의 distribution의 차이를 측정한다. $n$은 총 sample 개수이며, 각 bin의 차이값을 gap라고 부른다.

두번째는 MCE이다. MCE는 bin중에서 가장 큰 gap을 측정한다. gap이 high-risk한 경우에 사용하는 measure이다.

Modern Neural Networks are Mis-Calibrated

deep neural network는 많은 곳에서 사용된다. 옛날에 비해 성능도 많이 상향됐으며, model 또한 deep & wide해졌다. 하지만 model이 커진 만큼 classification error는 감소하였지만, mis-calibrate됐다.


LeNet과 달리 ResNet은 gap이 크다. ResNet의 accuracy, avg confidence line을 봤을 때 우리가 일반적으로 생각하던 confidence 0.5 threshold가 실제로는 안전하지 않을수도 있다. 또한 모델의 mis-calibration에 영향을 주는 요인이 model의 크기에만 있는 것이 아니다. Depth, Width, Batch norm, Weight decay 등 여러 요소가 model의 mis-calibration에 영향을 준다.


training progress에서 test error와 loss를 분석한 그래프이다. epoch 250에서 learning rate가 10배 줄어들며, error와 loss가 함께 줄어들었다. epoch이 300이 넘어서기 시작하면서 NLL이 overfitting을 하기 시작한다. network는 well-modeled probability를 희생하여 classification accuracy를 높이기 위해 학습한다(classification accuracy overfitting).

Temperature Scaling

classification accuracy overfitting, mis-calibration을 해결하기 위해 'temperature scaling'이라는 calibration method를 사용한다. 이를 사용하기 위해선 validation set이 필요하다.

temperature scaling은 모든 class에 대해 single scalar parameter $T$를 logit vector $z_i$에 나눠주는 방법이다.

$\hat q_i$는 calibrated probability이다. $T$가 무한대로 발산할수록 $\hat q_i$는 1/K에 근사한다. T가 0에 근사할 수록 $\hat q_i$은 1에 가까워질 것이다. $T$는 validation set에서 NLL으로 학습한다. 이 방법의 장점은 parameter $T$는 softmax output의 최대값을 바꾸지 않는다. 기존의 model의 accuracy에 영향을 주지 않는다. 그래서 이미 학습되어 있는 model에 사용할 수도 있다.

Experiment


첫번째 그래프는 mis-calibration된 CIFAR-100 Dataset 원래의 ResNet-110 model이다. 2번째는 temperature scaling을 사용한 ResNet이다. 3, 4번째 그래프는 다른 calibration method를 적용한 것으로서 temperature scaling이 가장 좋은 성능을 보여주고 있다.

Attention, RNNsearch: Neural Machine Translation by Jointly Learning to Align and Translate

딥러닝/기계 번역
Attention

Neural Machine Translation by Jointly Learning to Align and Translate

Attention Mechanism이 처음으로 소개된 논문이다. 논문 내에서는 attention보다 soft-alignment라는 용어를 더 사용한다. 기계번역에 attention을 이용하여 network가 alignment을 학습한다. 기존의 기계번역에서 사용한 알고리즘, 딥러닝 모델보다 더 좋은 성능을 냈다.

용어 정리

시작하기전, 이 포스트와 논문에서 사용하는 용어들을 정리하겠다.

  • Soft-alignment(attention): source word => target에 대한 정보를 스스로 alignment를 학습하여 사람이 직접 알려주지 않는 방법이다.

  • Hard-alignment: source sentence의 word를 target sentence의 word로 사람이 직접 지정해준다. Ex)'I am hungry.', '나는 배고프다.'를 I=>나, am => 는, hungry => 배고프다

  • context vector c: 문장의 의미를 담고있는 fixed length vector이다.

  • Annotation: Encoder의 hidden state를 annotation이라고 부른다. 수식에선 Encoder의 hidden state를 h로 표현한다.

  • hidden state: t번째 input에 대한 정보를 담고 있는 vector이다. 아무런 얘기 없이 hidden state라고 나와있을 경우 Decoder의 hidden state를 말하는 것이다. 수식에서는 Decoder의 hidden state를 s로 표현한다.

  • source sentence $ x^T $, target sentence $ y^T $: 길이가 T인 input, target sequence이다. 여기서 sequence는 word vector의 sequence를 말한다. $T_x$는 x의 길이, $T_y$는 y의 길이이다. $ \boldsymbol{x} = (x_1, \cdots, x_{T_x}) $

기존의 방법들

딥러닝을 이용한 기계번역은 x가 주어졌을 때, Neural Network(Model)로 conditional probability를 최대화 하는 y를 찾는 것이다. Model은 Encoder-Decoder 방식에 base를 두고 있는데, RNN, LSTM, GRU를 네트워크로서 사용한다. RNN을 사용할 경우 아래의 이점을 얻을 수 있다.

  1. input & output length에 제한이 없다.
  2. sequential한 data에 대해 순서(alignment)를 학습할 수 있다. 단어를 번역하여 문장을 번역하는 것이 아니라, 문장 전체를 읽고, 의미를 파악하여 다른언어로 변환한다.
  3. 예외 상황에 강하다 => dictionary을 이용한 알고리즘은 dictionary 외의 단어나 입력이 들어오면 정확도가 떨어지지만, 딥러닝의 경우 Dataset의 분포가 다양하다면 작은 예외 상황에 대해서는 유연하다.

Basic RNN Encoder-Decoder는 다음 수식으로 정의한다.

$$ \begin{align} h_t = f(x_t, h_{t-1}) \label{eq:1} \tag{1} \\ c = q(\{h_1, \cdots, h_{T_x}\}) \label{eq:2} \tag 2 \\ p(y_t | \{ y_1, \cdots, y_{t-1}\}, c) = g(y_{t-1}, s_t, c) \label{eq:3} \tag 3 \\ p(\boldsymbol y) = \prod_{t=1}^T p(y_t | \{ y_1, \cdots, y_{t-1}\}, c) \label{eq:4} \tag 4 \\ \end{align} $$

(1),(2)는 Encoder이고, (3),(4)는 Decoder이다.

  1. nonlinear function인 LSTM을 f로 사용하여, 이전 annotations와 input으로 현재 annotation을 구한다.
  2. Annotations sequence(각각의 annotation $h_t$는 $x_t$의 정보를 가지고 있기 때문에 정보가 encoding된 sequence라고 봐도 무방하다.)는 q함수로 fixed length vector c로 생성된다. 여기서는 $h_T$가 c이다.
  3. (문장의 의미를 담고 있는 c, 이전에 예측한 단어 $y_{t-1}$, 현재의 hidden state)을 입력으로 하여 다음으로 올 단어의 확률을 예측한다.
  4. T까지 예측을 하면 한 문장에 대한 기계번역이 완료된다.

h는 x와 $h_{t-1}$로 구할 수 있고, c는 encoder에서 나온 hidden state sequence에서 생성된다. 이전의 방식은 LSTM을 f로 사용하고, q($h_1$ ~ $h_T$)는 $h_T$로 사용했다.

decoder는 Multi-layer인 g로 (이전의 예측한 단어, 현재 hidden state, c)를 입력으로 하여 다음단어의 확률을 예측한다. 1부터 T까지의 단어를 에측하면 한 문장이 되는 것이다.

Attention, Learning to Align

Encoder

x의 각 단어들을 다른 언어로 바꾸는 과정에서 여러 단어를 하나로 포현할 수도 있고, 하나를 여러 단어로 표현할 수도 있다. 또한 앞뒤 문맥상 단어의 의미가 변질될 수 있다. RNN을 통과한 x인 annotation이 각 단어의 의미를 나타내는 것 뿐만아니라, 앞뒤 근처의 단어들까지 요약한 정보를 가지고 있어야한다. 이점을 Bidirectional RNN을 통해 forward RNN, backward RNN으로 해결한다. 그래서 Encoder의 output은  자세한 것은 Bidirectional RNN을 참고하길 바란다. $h_j = \left \lbrack \overrightarrow{h^{\intercal}_j} ; \overleftarrow{h^{\intercal}_j}\right \rbrack$

Decoder

우리의 목표는 soft-alignment로 Decoder가 번역을 좀더 잘하도록 하는 것이다. 그래서 현재 annotation_t가 y_t와 얼마나 연관이 있는지 알려줘야한다. 사람의 손 없이 말이다.

$$ \begin{align} e_{ij} = v_a^\intercal \ tanh(W_a s_{i-1} \ + \ U_a h_j) \label{eq:5} \tag 5 \\ e_{ij} = a(s_{i-1}, h_j) \label{eq:6} \tag 6 \\ \alpha_{ij} = \frac{exp(e_{ij})}{\sum_{k=1}^{T_x} exp(e_{ik})} \label{eq:7} \tag 7\\ c_i = \sum_{j=1}^{T_X} \alpha _{ij}h_j \label{eq:8} \tag 8 \\ s_i = f(s_{i-1}, y_{i-1}, c_i) \tag 9 \\ v_a \in \mathbb R^{n'}, W_a \in \mathbb R^{n' \times n}, U_a \in \mathbb R^{n' \times 2n} \end{align} $$

annotation $h_j$의 중요도를 반영하는 energy e는 n' size의 matrix v, W, U로 만들어진다. 이 matrix도 학습이 가능하기 때문에 현재 annotation을 y에 대해 네트워크(matrix)로 soft-alignemt를 줄 수 있다. e는 softmax로 확률값으로 바뀌게 되어 각 annotation이랑 합쳐져 context vector c가 만들어진다. 임의로 attention을 만들어본다면

'나는 라면을 먹는다.' => 'I eat ramen' 일때, ramen을 예측한다면,

context vector c = 0.1(alpha) * ([나는]의 hidden state) + 0.7(alpha) * ([라면을]의 hidden state) + 0.2(alpha) * ([먹는다]의 hidden state)

과 같이 나타낼 수 있다.

결과

논문 저자들은 English-to-French 번역으로 모델을 측정하였다. ACL WMT14를 사용했고 BLEU라는 predict setence가 target sentence와 얼마나 같은지를 나타내는 성능측정지표이다.

기존의 모델인 RNN Encoder-Decoder(RNNencdec)과 논문에서 새롭게 제시한 모델인 RNNsearch를 비교하였다. 학습할 때 sentence의 word length에 제한을 두어 학습했다. (RNNencdec-30/50, RNNsearch-30/50)

모델

RNNencdec, RNNsearch 모두 Encoder와 Decoder의 hidden units(hidden state)이 각각 1000개씩 이다. target word에 대한 conditional probability를 계산하기 위해 두 모델 모두 single maxout hidden layer를 사용했다.

Adadelta로 minibatch는 80sentence로 학습시켰다고 한다.

분석

attention, soft-alignment의 장점은

  1. 사람의 word2word labelling이 필요없다.

  2. matrix이기 때문에 네트워크로서 학습할 수 있다.(모델의 component로서 추가적인 처리가 필요없음, gradient를 공유함)

  3. 언어모델에 대해 적합한 특성을 가지고 있다.

    Soft-alignment가 hard-alignment와 다르게 좋은점은, 언어는 유연하다는 점 때문이다. 예를들어 한국어와 영어를 예를 들어보자면 "My grandfather have dinner."이 문장하나를 한국어로 바꿔보면

    • "할아버지가 저녁을 먹는다"
    • "할아버지께서 저녁을 먹는다"
    • "할아버지가 저녁을 드신다"
    • "할아버지가 밥을 먹는다"
    • "할아버지가 진지를 드신다"
    • "우리 할아버지가 저녁을 먹는다"

    등 언어별로 문법이나 번역 형태가 다르다. network는 예외 상황에 대해 스스로 학습한다. 또한 x와 y의 길이가 달라 hard alignment가 불가능해도 soft-alignment는 가능하다.

이 3가지 정도가 있다.

그림은 attention(annotation weight alpha_ij)을 visualization한 것이다(0: black, 1:white). x축은 source sentence(English)이고 y축은 예측번 번역 문장이다(French). 보다시피 matrices의 diagonal이 대부분 강한 weight를 띄고 있다.

(a)는 문장의 attention을 visualization한 것이다. (b),(c),(d)는 test set에서 sample로 뽑힌 setences이다.

YOLO v1: You Only Look Once

딥러닝/Object Detection
YOLOv1

YOLO v1: You Only Look Once

yolo는 한때 ssd, faster r cnn과 함께 object detection에 대표적으로 사용되던 모델이다. object detection이란 이미지에서 물체(object)를 인식하여 해당 물체를 찾아 사각형으로 크기, 위치를 표현하는 것이다(detection). 이는 여러 분야에 사용할 수 있다. 예를들어

  • 카메라 앱에서 사람의 손과 얼굴을 인식
  • 자율주행 자동차에서 도로의 자동차와 자전거, 사람, 신호등 등을 인식
  • 방범 cctv에서 사람을 인식

등등 다양한 분야에 사용된다.

Unified Detection

기존의 object detection 네트워크들은 하나의 모델이 아니라 여러 부분들이 합쳐져서 전체 시스템을 만들었었다. roi(region of interest, 물체라고 인식한 영역/box)를 추출하는 부분 따로, feature를 추출하여 detection하고 분류하는 부분이 따로 되어있는 경우도 있다.

yolo는 네트워크를 통과한 feature를 S * S 개의 사각형(grid)으로 분할한다. 이 사각형은 grid cell이라고 부르는데, 이 grid는 물체를 찾고, 인식(분류)하는 역할을 가지고 있다.


  • 각 grid cell은 B개의 bounding box와 box안의 object를 예측한다.
  • 각 bounding box는 (x, y, w, h, confidence)로 구성되어 있다. x, y는 box의 중심좌표를 나타내고 w, h는 전체 이미지에 비한 너비와 높이를 나타낸다. 이 confidence score는 해당 box에 object가 있는지를 나타낸다. 이는 Pr(object) * IOU로 정의할 수 있는데, Pr(object)는 물체가 있을 확률, IOU(Intersection over union)는 예측한 box와 실제 object가 있는 box가 얼마나 같은지를 나타낸다.
  • 또한 각 grid cell은 C개의 conditional class probabilities, Pr(class_i | object)를 이용하여 object중에서도 어떤 class의 object가 존재하는지 예측한다.
  • YOLO를 Pascal VOC로 검증할때에는 S =7, B=2, C = 20으로 7 * 7 * 30 개의 tensor를 예측했다.


위 그림과 같이 (S(7), S(7), 5 * B(2) + C(20))의 shape를 가진다.

Network Design

network 구조는 GoogLeNet에서 영감을 받아 24 conv layer, 2 fully connected layer를 사용했다. Inception module을 사용하는 것 대신에 3 x 3 conv 뒤에 따라오는 1 x 1 reduction conv layer를 추가했다.


Training

fully connected layer전의 conv layer 20개를 미리 ImageNet 1000-class dataset으로 pretrain 시켰다. final layer는 class probabilities 와 bounding box coordinates 둘다를 예측한다. bounding box의 너비와 높이를 0 ~ 1 사이로 normalize 한다. x,y좌표 grid cell 안에서 0~1사이의 값을 가져 파라미터화? 했다.

bounding box coordinates 예측이 box가 object를 포함하지 않는 것을 막기위해 λcoord , λnoobj를 파라미터화 시켜 안정성을 더욱더 강화시켰다. 일반적으로 예측하는 box에는 object가 없는 경우가 많아 네트워크가 obj가 없는 background class를 찾는 것이 object를 찾는 것보다 더 효율적이라고 판단했기 때문이다.

yolo는 여러개의 box를 예측하기 때문에 한 object에 여러 box가 반응하는 경우가 있다. 이때는 box중 가장 높은 IOU를 가진 box를 사용한다.

Loss Function

1^obj_ij 는 obj가 존재하는 i번째 grid cell에 j번째 bounding box를 나타내고, noobj는 obj가 존재하지 않는 경우를 말한다.

위에서 부터 차례로 식 1, 2, 3, 4, 5 이라고 할때

  • 1과 2는 각 box에 대한 loss이다. 하지만 2에서는 w와 h에 square root를 사용했다. 그 이유는 sum-squared errorsms box의 크기에 상관 없이 동일한 weight를 가진다. 작은 box보다 큰 box에서 적은 편차를 가지는데 loss가 이를 반영하여 w와 h를 직접적으로 사용하는 것보다 squared root가 더 좋은 결과를 낸다.
  • 3에서는 confidence score에 대한 loss이다.
  • 4에서는 object가 없는 box에 대하여 loss를 구하였다. 추가적으로 no obj 파라미터를 사용하였다.
  • 5에서는 cell에서의 class를 predict한 loss를 구하였다.