Encoder Based Lifelong Learning
한줄요약
Lifelong learning framework를 각 task별 autoencoder로 구성해서 제안했다.
블라블라..
일단 Lifelong learning이라고 하는 컨셉은 이미 오래전에 나온건데, 한마디로 말하면 '인간'처럼 평생동안 학습할 수 있는 모델을 만드는 것이 목적이다.
기존의 supervised learning의 경우 주어진 데이터만 잘 수행할 수 있도록 학습을 시키는 것이 목적이라면, Lifelong learning에서는 주어진 데이터 이외의 또 다른 데이터가 계속해서 주어지더라도 기존의 지식을 활용하여 새로운 데이터를 잘 학습해야한다. 그리고 주어지는 데이터는 ground truth가 있을수도 없을수도 있다.
Domain adpatation, Incremental learning 등 비슷한 연구주제들이 있긴한데 조금씩 가정과 목적이 다르다.
여태까지 읽어본 것들은 대부분 모두 latent space를 활용해서 무언가를 하려고 했다. 서로 다른 task간의 latent space에서의 거리를 줄이기 위해 grassmann manifold같은 개념들을 활용했었고, 최근에는 knowledge distillation이라고 이미 학습된 뉴럴넷의 weight를 어떻게 잘 활용할 수 있을까가 주된 방향인 것 같다. (사실 뉴럴넷의 각 layer는 하나의 manifold라고 볼 수 있기 때문에, 어찌됐든 latent space를 잘 활용해야하는 것은 큰 줄기가 맞는 듯하다.) 나도 모든 연구를 follow하고 있진 않아서, 해당 논문에서 관련 연구를 조금 보니..fine-tune 기법이 나오고, joint learning(multi task learning)같은게 나왔다. 그리고 이전에 학습된 weight들의 mean과 std를 이용해서 새로운 network의 weight를 초기화 시키는 방법도 있는 듯 하다.
여기서는 앞서 제안된 방법들처럼 데이터를 저장하거나, network 전체의 weigth를 저장하는 것이 아니라 각 task별로 특징을 뽑아낼 수 있는 auto-encoder를 각각 만들어서 auto-encoder만 가지고 있으면 되도록 framework를 설계했다. 즉, weight보다 feature를 각 task별로 어떻게 잘 보존할 수 있을까를 고민했다고 볼 수 있다.
그림에서 F와 T는 모든 task들에 대해 shared되고, 나머지는 각 task별로 존재한다. 잘 보면 auto-encoder는 t-1까지 존재하고 t-1까지의 task specific operator는 knowledge distillation loss로 정의되고, 학습시키고자 하는 T번째의 operator는 원하는 objective function을 사용했다. (여기서는 classification이라 CE을 사용함)
일반적인 joint learning을 통해서 여러 개의 주어진 task들을 모두 수행할 수 있는 모델을 만들고자 하면, eq(1)처럼 loss를 정의할 수 있다. 즉, 각 task 별로 loss의 기대값들의 합을 minimize시키면 된다. (eq(2))
일반적으로 f_t는 하나의 network가 될 수 있는데, 여기서는 이것을 합성함수로 표현했다.
f_t를 T_t o T o F 3개의 합성함수로 표현했다. F는 feature extractor이고, T_t o T는 분류기같은 task operator가 될 수 있다. 여기서 T_t는 각 task 별로 존재하는 분류기이고, T는 공통적으로 사용되는 분류기이다. 네트워크 레이어로 설명하면 F는 conv layer가 될 거고, T_t는 마지막 fc layer가 될것이고, T는 T_t를 제외한 fc layer가 될 수 있다.
Learing without Forgetting(LwF)를 언급하면서 한계점을 지적하는데, LwF에서는 첫 번째 task에 대해 이미 학습된 모델을 가지고, 첫 번째 task에 대해 성능이 충분하다고 가정하고, 동일한 network에두 번째 task에 적용해서 두 번째 task도 성능이 잘 나올 수 있도록 하려고 한다. 즉,
joint learning과 비슷하게 수행하는 것 처럼 보인다.(LwF 논문을 안읽어봐서 여기에만 나오는 설명을 보고는 완벽하게
이해는 되지 않는다.) 그런데 첫 번째 task의 input과 두 번째 task의 input이 distribution이 다르면
다를수록 성능이 저하된다는 것이 실험을 통해 입증되었다. (어찌 생각해보면 당연하다고 생각할 수 있다. input의
variation이 크면 클 수록 network의 manifold가 확확 바뀔테니..)
그래서 여기서는 data의 distribution에 덜 민감하도록 하기위해, latent space에서 각 task의 특징을 잘 보존하려고 한다. 즉,
공통된 feature extractor는 각 task에 따라 변화되는 것을 막을 수 없으므로 feature extractor에서
추출된 feature를 다시 한번 low dimension으로 projection해서 이렇게 project된 정보가
feature extractor가 바뀌더라도 잘 유지되도록 하는 것이 목표이다. Fig 2를 보면 무슨 의미지인지 이해할 수
있다.
그러기 위해서 feature를 input으로 받는 auto-encoder를 만들었다. 즉, input의 모든 정보를 encoding하는 것이 아니라, feature extractor에서 뽑힌 중요한 정보(feature)만 encoding해서 이를 보존하려고 한다.
여기서는 그냥 일반적인 fc layer 2개를 써서 auto-encoder를 만들었고, loss는 eq(4)처럼 주어진다.
eq(4)를 보면 첫 번째 term은 encoding에 대한 term이고, r이 auto-encoder이다, 두번째 term은 auto-encoder로 구해진 feature를 이 후 분류기의 input으로 주었을 때 성능이 잘 유지되도록 한다.
즉, representation도 잘 되면서 실제로 task의 성능도 잘 유지할 수 있는 manifold를 auto encoder를 이용해서구하려고 한다.
그러면 lifelong learning을 위한 시나리오는 아래와 같다.
먼저 주어진 첫 번째 task에 대해 F와 T_1을 학습시키면, F^* 와 T_1^* 를 얻을 수 있다. 그리고 eq(4)에 주어진 것 처럼 F^*(X^1)을 representation할 수 있는 auto encoder를 학습시킨다. 그러면 r_1을 얻을 수 있다.
그리고 두번째 task를 학습 시키면 F의 weight가 변화할텐데,
변화된 F에 첫 번째 task의 input을 넣은 값과 첫 번째 task에 최적화 된 F에 첫 번째 task의 input을 넣은
값의 차이를 최대한 줄이도록 auto encoder의 decode 부분을 학습시킨다. 말로 설명하려니 굉장히
복잡한데..eq(7)을 보면 무슨 의도를 가지고 있는지 알 수 있다.
첫 번째 task는 학습이 되었다고 가정하고 두 번째 task를 학습시킬 때의 loss이다.
첫 번째 term은 두 번째(target) task의 objective function이고, 두 번째 term은 동시에 첫 번째 task에서 사용된 정보를 최대한 이용하기 위해 knowledge distillation을 정의한다. (knowledge distillation에 대해서 정확히 파악이 안되는데, 아마 여기서 T_1은 업데이트를 안하지 않을까?) 그리고 마지막 세번째 term이 optimize된 F와 업데이트되는 F가 새로운 manifold에 projection되었을 때 차이를 최소화하기 위한 term이다.
eq(7)을 일반화하면 eq(8)처럼되고 전체적인 학습과정은 Algorithm 1에 슈도코드로 설명이 되어있다.
Table 1을 보면 ImageNet에 대해 실험을 했는데,
여기서 finetune은 이전 task의 학습된 weight로 초기화를 해서 각각의 task에 대해 학습시킨거고, feature extraction은 이전에 학습한 F와 T는 고정시키고 task specific operatio인 T_t만 각각의 task에 대해 학습시킨 것이다.
finetuen은 전이된 학습 결과의 ref로 쓰였고, feature extraction은 forgetting 결과의 ref로 쓰였다.
옆에 숫자를 보면 ref 대비 손실이 가장 적거나, 성능에 이득이 생기는 경우도 있다. ref대비 성능의 손실이 많이 적어보이긴 한다. memory와 같은 비용은 크게 줄이면서.
지난 번 박사님과의 얘기때도 나왔던 말인데, shallow한 network의 한계를 잘 알고 이걸 최대한 활용을 하는 방향이 좋은 것 같다. 깊게 쌓으면 쌓을수록 성능은 좋아지기는 한데, 효율성도 떨어지는 것 같고 framework를 엔지니어링하기도 참 힘든 것 같다.
'Machine Learning' 카테고리의 다른 글
CAM, Grad-CAM, Grad-CAM++ (0) | 2019.10.25 |
---|---|
Horovod 사용기 (3) | 2019.09.26 |
Gaussian Process (0) | 2018.04.02 |
[CNN] Deformable Convolutional Neural Networks (0) | 2018.04.02 |
[DomainAdaptation] VisDA ICCV 2017 workshop (0) | 2018.04.02 |