Generalized Cross Entropy Loss for Training Deep Neural Networks with Noisy Labels 간단리뷰

|

논문 링크

두줄 요약

  • Categorical cross entropy(CCE)는 학습이 빠르지만 noise에 민감하고, mean absolute error(MAE)는 noise에 robust하지만 학습이 느리니, 중간 지점을 찾아보자!
  • 요것만으로는 잘 안됐던지, EM 비슷하게 data pruning을 두어서 noisy한 데이터를 자동으로 버리게 해보자!

어려운 얘기들도 많고, 히스토리가 많아서 모든 내용을 담진 못했다. 생략된 부분은 궁금하면 논문을 찾아보자!

  • noisy label data로 잘 학습을 시켜보려고 이런저런 시도가 많았다. 나중에 궁금하면 좀 더 파보자.
    • confusion matrix를 만들어서 시도
      • $p(\hat{y} = \hat{y_n} \vert x_n, \theta) = \Sigma_{i=1}^c p(\hat{y} = \hat{y_n} \vert y = i) p(y = i \vert x_n, \theta)$
      • 여기서 $p(\hat{y} = \hat{y_n} \vert y = i)$를 confusion matrix의 $(\hat{y_n}, i)$를 사용
      • confusion matrix를 유추하는 여러가지 시도가 있었다함. 내가 원하는건 아니니 넘어가자
    • svm과 같은 맥락에서, unhinge loss 등 loss를 좀 더 lobust하게 바꿔보려는 시도가 있었고 그 중 MAE가 제일 robust하더라..
    • label cleaning network를 두어서 해보려는 시도가 있었는데 clean label dataset이 필요함.
    • true label을 latent variable로 두고 EM 알고리즘 비슷하게 찾아보자…

$L_q$ loss for Classification

  • CCE
    • $L(f(x_i; \theta), y_i) = -\Sigma_{i=1}^c y_i log(f_{y_i}(x_i ; \theta)) = -log(f_{y_i}(x_i ; \theta))$
  • MAE
    • $L(f(x_i; \theta), y_i) = \Sigma_{i=1}^c \vert y_i -f_{y_i}(x_i ; \theta) \vert = 2 - 2 f_{y_i}(x_i;\theta)$

이므로 loss를 미분해보면

  • CCE의 경우
  • MAE의 경우

가 된다. CCE의 경우, MAE에 비해 $\frac{1}{f_{y_i}(x_i ; \theta)}$ term이 더 붙는데 이로 인해서 두가지의 장단점이 확연해진다. $f_{y_i}(x_i ; \theta)$가 작다는 말은, prediction이 잘 안되었다는 말이며,

  • 클린한 label일 경우
    • 어려운 예제라는 말인데, 그 것에 대해서 CCE의 경우 더 가중치를 두게되며, MAE는 공평하게 gradient를 흘리게 된다.
    • 그래서 CCE가 더 빨리 학습을 잘하게 된다. (CCE의 장점)
      • 라기보다 MAE가 더럽게 느리다
  • noisy한 label의 경우
    • CCE는 그래도 더 가중치를 두게되며, 학습을 망치게 된다 (CCE의 단점)
    • 상대적으로 MAE는 더 잘 학습한다.

요 사이의 임의의 loss function을 만들어보자가 이 논문의 아이디어!

$L_q$ loss

으로 디자인하면 ${lim}_{q\rightarrow 0}L_q$는 CCE와 같으며, $q=1$에서는 MAE와 같다(정확히는 constant배 차이는 난다)

$q=1$은 당연하니 $q\rightarrow 0$일 때를 보인다. 로피탈 정리를 사용하면 간단히 보일 수 있다. ${lim}{q\rightarrow 0} \frac{1-f^q}{q} = {lim}{q\rightarrow 0} \frac{(-f^q)’}{1} = {lim}_{q\rightarrow 0} (-f^q log{f}) = -log{f}$

이제 이 녀석을 $\theta$에 대해서 미분해보면 일반화된 gradient를 볼 수 있다.

위의 식에서 $(q-1)$ 부분에 따라서 얼마나 noise에 robust할지, 학습을 빠르게할지 정할 수 있게 되는 것!

Truncated $L_q$ loss

그러나 위의 것만으로는 만족할 만한 결과를 못얻었나보다.. true label의 confidence가 k 이하일 경우에는 loss를 $L_q(k)$로 두어서 truncate를 시키도록 하였다.

실험을 통해 k의 값은 0.5로 고정을 하였다고 한다.

만약 k보다 softmx 값이 작으면, $L_{trunc}$가 constant이며, 따라서 gradient는 0가 되어 학습을 하지않는다.

문제는 처음부터 k가 크면, 처음엔 softmax 값이 균등하게 나오고, k보다 모두 작을테니 학습이 진행되지 않을 것이다. 따라서 요런 방식으로 풀어버린다.

w_i

algorithm

Alternative convex search라는데, local하게는 DNN이 convex할꺼라고 가정하고 썼다고 한다. 모든 data sample에 대해서 $w_i=1$로 뒀는데, EM처럼 중간중간에 pruning을 거쳐 noisy data를 걸러내게 되는 것 같다.

결과

result

vue-cli 설치 및 기본 프로젝트 설명

|

vue-cli 홈페이지

installation and create project

  • npm install -g @vue/cli
  • vue create <project-name>
    • default / manual 중 고른다.
    • manual에서 router / vuex를 골라보자..
  • vuetify plugin 설치
    • vue add vuetify
    • 잘 모르니 Default로…

tree structure

위에 적힌대로 따라하면 프로젝트가 다음 구조로 생성되었을 것이다. node_modules는 너무 폴더가 많아서 지웠다. 하나하나 살펴보자!

  .
  ├── README.md
  ├── babel.config.js
  ├── node_modules
  ├── package-lock.json
  ├── package.json
  ├── public
  │   ├── favicon.ico
  │   └── index.html
  └── src
      ├── App.vue
      ├── assets
      │   ├── logo.png
      │   └── logo.svg
      ├── components
      │   └── HelloWorld.vue
      ├── main.js
      ├── plugins
      │   └── vuetify.js
      ├── router.js
      ├── store.js
      └── views
          ├── About.vue
          └── Home.vue

main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import vuetify from './plugins/vuetify';

Vue.config.productionTip = false

new Vue({
  router,
  store,
  vuetify,
  render: h => h(App)
}).$mount('#app')

별거 없고, Vue 객체를 만들고, router, store(vuex), vutify를 같이 인자로 하여 app에 mount한다. public/index.html에 있는 <div id="app"></div> 여기에 mount될 것이다. rendering할 것은 App이기 때문에 App.vue를 살펴보도록 한다.

App.vue

<template>
  <v-app>
    <v-app-bar app>
      <v-toolbar-title class="headline text-uppercase">
        <span>Vuetify</span>
        <span class="font-weight-light">MATERIAL DESIGN</span>
      </v-toolbar-title>
      <v-spacer></v-spacer>
      <v-btn
        text
        href="https://github.com/vuetifyjs/vuetify/releases/latest"
        target="_blank"
      >
        <span class="mr-2">Latest Release</span>
      </v-btn>
    </v-app-bar>

    <v-content>
      <HelloWorld/>
    </v-content>
  </v-app>
</template>

<script>
import HelloWorld from './components/HelloWorld'

export default {
  name: 'App',
  components: {
    HelloWorld
  },
  data: () => ({
    //
  })
}
</script>

template을 보면

  • toolbar
    • title과 button
  • content

로 이루어짐을 알 수 있으며, content에는 HelloWorld.Vuew를 가져와서 뿌려주는 것을 알 수 있다.

router.js

import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'

Vue.use(Router)

export default new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home
    },
    {
      path: '/about',
      name: 'about',
      // route level code-splitting
      // this generates a separate chunk (about.[hash].js) for this route
      // which is lazy-loaded when the route is visited.
      component: () => import(/* webpackChunkName: "about" */ './views/About.vue')
    }
  ]
})

router는 home과 about page가 있으며, 각각 path를 통해 routing을 하는 것을 볼 수 있다. 이제 위의 App.vue에서 path를 바꿔서 routing을 해보도록 하자!

new App.vue

  <template>
    <v-app>
      <v-app-bar app>
        <v-toolbar-title class="headline text-uppercase">
          <span>Vuetify</span>
          <span class="font-weight-light">MATERIAL DESIGN</span>
        </v-toolbar-title>
        <v-spacer></v-spacer>
        <!-- (1) -->
        <v-btn text href="/">
          <span class="mr-2">Home</span>
        </v-btn>
        <v-btn text href="/about">
          <span class="mr-2">About</span>
        </v-btn>
        <!-- (1) 끝 -->
      </v-app-bar>

      <v-content>
        <!-- (2) -->
        <router-view/>
        <!-- (2) 끝 -->
      </v-content>
    </v-app>
  </template>

  <script>

  export default {
    name: 'App',
    data: () => ({
      //
    })
  }
  </script>
  1. 버튼을 누르면 route.js에 정의된 path로 넘어가게 만들어주고
  2. 뿌릴 content를 router-view로 바꾸면 된다.

정리

  1. vue-cli를 설치하고, 프로젝트를 만들어보았다.
  2. 프로젝트에 vuex, vuetify, route 를 설치하고 이용해보았다.
    • vuex는 여기를 참조하자.

ASTER: An Attentional Scene Text Recognizer with Flexible Rectification + spline interpolation

|

논문 링크

ASTER: An Attentional Scene Text Recognizer with Flexible Rectification

irregular_text

  • irregular text에 대해서 잘 인식해보겠다.
  • 두가지 네트워크로 구성
    • overview
    • Rectification network
      • Thin-Plate Spline의 parameter를 추정하고 이를 통해 transformation
      • Spatial Transformer Networks framework로 annotation 없이 바로 학습 가능 (모두 미분 가능)
      • input: 64 x 256 으로 resize
      • output: 32 x 100
      • sampler는 여기 참조
    • Recognition network
      • Attentional seq2seq
      • Decoder를 BiDirectional로 만듬
  • Contributions
    • irregular text 문제를 explicit rectification mechanism을 사용해서 풀었다.
    • bidirectional decoder를 만듬
      • 뒤에서부터 볼 때 더 context가 좋을 수 있음
      • 예> FITNESS 에서 I를 알려면 FI 보다 SSENT가 더 좋다.
        • overview
    • ASTER를 사용해서 text detection을 더 잘할 수 있는 방법 제시
  • conference version보다 더 좋게 만듬
    1. rectification network를 고쳐서 성능을 올림
      1. control points prediction과 sampling에 다른 화질의 이미지를 사용
      2. localization network의 non-linear activation을 없애서 수렴을 더 빨리하도록
        • 결과적으로 accuracy, rectified image quality, sensitivity가 좋아짐
    2. bidirectional
    3. end2end application을 해봄
  • 결과
    • rectifier를 넣어보니 SVTP, CUTE 등 irregular text에 대한 dataset에 대해서 3~4% 올라가더라..
      • overview

Appendix

Cubic spline interpolation

Thin-plate spline transformation에 앞서 1D interpolation 기법인 Cubic spline interpolation을 알아보자

  • Cubic
    • line을 3차식으로 근사시키겠다
    • $f(x) = a + bx + cx^2 + dx^3$
  • spline
    • 복수의 제어점을 통과하는 곡선.
    • 인접한 두 점마다 별도의 다항식을 이용하여 곡선을 정의
  • Cubic spline interpolation
    • interpolation을 하는데, cubic spline을 이용한다.

how to calculate?

  • 각 line을 3차식으로 놓으면 변수가 4개씩 생김
  • 인접한 line은 1차, 2차 미분이 연속적임. $C^2$
  • 각 line은 주어진 점을 지남
  • 위 두가지 constraint + boundary condition으로 연립 방정식을 풀면 된다.
    • natural cubic spline
      • 양 끝 라인의 이차미분값이 0
    • clamped cubic spline
      • 양 끝 라인의 일차 미분값이 주어짐

Cubic spline transformation

overview

  • 위의 빨간 점들이 1차원 라인에 대한 변위량을 나타낸다고 하면
  • Cubic spline interpolation을 사용하여 검은 선을 만들 수 있다.
  • 검은 선들을 통해서 변화된 1차원 라인을 만들 수 있음.

Thin plates

  • 얇은 판이 휘어지는 것으로 interpolation을 함.
  • $ f(x,y) = a_1 + a_2x + a_3y + \Sigma_{i=1}^{n}w_i U(\vert P_i-(x, y) \vert ) $
    • $U(r) = r^2log(r)$
  • 더 자세한 내용은 여기 참조

A Simple and Robust Convolutional-Attention Network for Irregular Text Recognition

|

논문 링크

읽어보니 Transformer를 가져다 쓴게 거의 전부임.. 읽은게 아까워서 간단히 정리하고 넘어가자!

Overview

  • irregular text를 인식하는 문제를 다룸

Overview

  1. 가장 기본이 되는 구조
  2. Rectification Network를 사용하여 이미지를 펴는 모듈이 추가
    • 심하게 distortion이 있거나 curved shape에 대해서 잘 안됨
  3. 여러 방향으로 encoding
    • redundant representation
  4. character 단위로 detection, recognition
    • 돈이 없다.
  5. 2D attention과 sequence modeling을 같이…
    • 딱히 단점을 말하지 않음. 자기 논문이라서..?
  6. sequence modeling 없이 2D attention만. 논문의 모델

letter listing을 markdown이 지원하지 않는다. a=1로 생각하고 보자…

Model

주장

  1. irregular text는 2D space에 퍼져있는데, 이를 1D sequence로 모델링하는 것은 부적절하다.
  2. RNN은 sequential하게 학습하기에 병렬 학습이 어렵다
    • 이건 transformer에서 그대로 가져온 내용이니 무시!

      Model

model_structure

  • Sequence modeling 부분을 전부 없애고
  • CNN feature를 2D인 상태 그대로 attention하여 decoding
  • decoder는 layer를 1개만 썼으며, 나머지 parameter는 transformer decoder와 동일
  • 이미지가 (128 x 400 x 3) 로 4배를 키움 이래야 잘됐겠지…

Experiments

Number of Decoder Blocks

attention_map

  • 1개만 써도 충분히 잘되더라..
    • 여러 layer를 써보면 마지막 layer만 제대로 attention을 하더라..(위의 3개)
  • 여러 layer에 auxiliary prediction을 주면 모두 attention을 잘 함 (아래 3개)

E.T.C

  • number of attention heads
    • 8개가 제일 좋더라
  • self attention의 중요도
    • encoder에는 붙여도 효과가 별로 없고, decoder에는 있는게 좋더라
    • 이건 사실 좀 애매해보이는데.. encoder에만 붙여도 ffn layer 빼고는 같지 않을까?

Comparision with State-of-the-art

result1

  • irregular text dataset의 6개 중 5개에 대해서 제일 잘했다.
    • 나머지 하나는 character level로 학습한것이 가져감.
  • [23], [35] 보다 훨씬 빠르다.
    • training time/ inference time 모두일까..? 제대로 안나와있다..

Robustness

result2

  • 여러가지 옵션으로 이미지를 구겨봤는데 그래도 잘하더라…

Livedown: vim markdown preview plugin

|

Installation

~/.vimrc에 다음 추가 후 PluginInstall.

Plugin 'shime/vim-livedown'
" Livedown 단축키"
nmap gm :LivedownToggle<CR>

npm 모듈 설치

npm install -g livedown

사용법

:LivedownToggle로 Preview를 시작 종료할 수 있음

이후 매 저장시마다 Preview가 업데이트됨.