딥러닝에서는 주로 excel이나 csv로 저장된 데이터로부터 label과 같은 정보를 불러오기 위해 pandas 패키지가 쓰인다. pandas의 모든 기능을 알아보기보다는 자주 쓰였던 기능만 기록해 보려고 한다. 

 

pandas 공식 document를 참고하면 더욱 정확하고 많은 정보를 볼 수 있다. 

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.html

 

pandas.DataFrame.loc — pandas 1.2.3 documentation

A slice object with labels, e.g. 'a':'f'. Warning Note that contrary to usual python slices, both the start and the stop are included

pandas.pydata.org

 

데이터 읽기

 

특정 column 선택하기

 

특정 row 선택하기

 

특정 row, column에 해당하는 data 추출

 

특정 column을 row index로 바꾸기

 

특정 row를 숫자로 선택하기

 

기회가 된다면 loc, iloc을 제외하고 많이 사용되는 문법도 추가하도록 하겠다. 

'Python' 카테고리의 다른 글

Argparse, python 기반의 명령형 인터페이스 라이브러리  (0) 2020.04.22

Semi-Supervised Domain Adaptation of Visual Domain Adaptation (VisDA)-2019 Challenge 에서 1위를 한 네트워크의 베이스가 되는 방법으로 style-agnostic network를 통해 domain gap을 줄이는 방식에 대해 설명한다. 

 

 

Bias Properties of CNN

 

이 논문은 기존의 CNN이 bias를 갖고 있다고 말하면서 시작된다. classification task에서 사람들은 보통 무늬나 텍스쳐보다는 모양을 위주로 보고 판단한다면, CNN은 모양, 즉 contents보다는 무늬나 texture를 위주로 보고 classification하는 bias가 존재한다고 한다. 

 

 

이 논문의 contribution은 contents를 위주로 학습하는 네트워크와 style을 위주로 학습하는 네트워크를 구축함으로써 style bias 즉 domain bias를 줄인 CNN을 만들었다는 것에 있다. 

 

input x와 random하게 뽑은 x'으로부터 contents biased network Gc는 x의 content, x'의 style을 가진 feature를 받아 contents만 보고 classification을 진행하게 되고, style biased network Gs는 x'의 random한 contents와 input x의 style이 합쳐져 style만 보고 classification을 하게 된다. 

 

 

Content-biased Learning

 

 

contents biased network는 style을 blending시킴으로써 contents만 보고 판단하도록 만든다. z, z'은 feature extractor Gf의 output이며 각각 x, x'을 넣은 결과이다. z와 z'의 mean, std를 random한 숫자 alpha를 통해 interpolation하여 새로운 mean^, std^을 만든다. 그 후 z의 mean와 std를 mean^, std^로 변경시켜주어 contents는 동일하나 style이 달라진 feature로 만든다. 

 

이 점에서 주의할 점은 이 논문에서는 feature의 style은 mean와 std라는 가정 하에 진행되고 있다는 것이다. style transfer, instance normalization과 같은 선행연구들을 보았을 때 mean과 std가 어느정도 style에 연관이 있다는 사실은 자명하나 mean과 std가 가장 좋은 파라미터라고 말할 수는 없다. feature의 correlation을 계산하는 gram matrice도 style을 나타내는 파라미터라고 볼 수 있다. 무엇이 가장 옵피멀한 방법인지는 모르겠다. 이부분에 대해서는 더욱 연구되어야 할 부분인 것 같다. 

 

 

그 후 style이 randomization된 contents biased output에 대한 loss를 Gf, Gc에 update 한다. 

 

 

Adversarial Style-biased Learning

 

 

위의 contents biased learning에서와는 달리 interpolation을 진행하지 않은 상태로 z의 mean과 std로 z'의 pdf를 변경시킨다. 이렇게 되면 z'의 random한 contents는 가지고 있는 상태로 style을 대변하는 z의 mean과 std가 합쳐진 상태가 된다. 

 

 

z의 style만을 가지고 classification을 판단하는 위의 loss를 기반으로 Gs를 update해준다. 

 

 

우리는 style에 bias가 적은 network를 만드는 것이 목적이기 때문에 style만을 보고 판단하는 Gs로부터 cross entropy가 maximize되는 방향으로 Gf를 업데이트 해준다. (yk대신 1/K를 곱해준 것의 의미) 이 때 Gf의 모든 parameter를 업데이트하는 것이 아닌 affine transformation parameter(batch normalization parameter)만을 업데이트한다. 

 

 

Pseudo Code

 

 

Results

 

 

논문을 보면 다양한 관점에서 test가 진행되었다. 위의 test는 texture/Shape bias에 관한 실험으로, Gf에 업데이트되는 adversarial loss를 조절하는 adversarial weight를 높일수록 texture 학습은 낮아지고, shape 학습은 높아지는 경향성을 보였다. 또한 같은 class 내의 A-distance또한 줄어들었음을 확인했다. 

 

 

Domain Generation 에 관련된 많은 dataset을 가지고 실험한 결과, AlexNet, ResNet18 backbone모두에서 sagnet의 training 방식을 사용했을 시 평균 정확도가 높아짐을 볼 수 있었다. 

 

 

위 결과는 Unsupervised Domain Adaptation에 적용한 것으로 Office-Home dataset과 DomainNet dataset에서 모두 classification accuracy가 1-3정도 높아지는 것을 확인하였다. 

 

 

이번 포스트에서는 Style Transfer의 기초가 되는 Image Style Transfer Using Convolutional Neural Networks에 대해 간단하게 소개하려고 한다. 또한 그 성능을 올리는 Instance Normalization: The Missing Ingredient for Fast Stylization 도 함께 소개하려고 한다. 

 

 

-Deep Image Representations

 

 

이미지 정보를 보여주기 위하여 각기 다른 layer로부터 content image와 style image를 시각화 해보았다. Content Reconstructions 에서 초기의 layer는 디테일한 픽셀 정보들을 담고있지만 레이어가 깊어질수록 디테일한 정보를 잃었다. Style  Reconstructions에서는 다른 feature들간의 correlations를 계산해 style reconstruction에 사용된다(Gram Matrices). 이는 style image의 컨탠츠는 잃고 스타일만을 복원한다는 특징이 있다. 

 

 

Style Transfer

 

 

Style transfer를 위해서는 contents, style을 담당하는 두 이미지와 Pretrained vgg19, 이미지를 만들어낼 generator model이 사용된다. 두 content image, style image가 pretrained vgg19를 통과할 때 얻은 feature를 적절히 섞어서 contents와 style을 섞는 것을 목표로 한다. 왼쪽의 style image로부터는 거의 모든 layer에서 feature를 뽑으며 content image에서는 네번째 layer에서 feature를 뽑아 generator networks에 loss를 취함으로써 이미지를 만들게 된다. 

 

contents loss는 pretrained vgg와 generator 사이에서 나온 feature 사이의 l2 loss이며, style loss는 feature에 gram matrices 취한 결과의 l2 loss라고 간단하게 생각할 수 있다. 

 

 

- Instance Normalization

 

 

generator로부터 생성된 stylized image의 contrast는 style image의 contrast를 따르게 되기에 content loss를 구할 때 content image의 contrast가 style image의 contrast와 다를 경우 content loss를 optimize하기 힘들어 진다는 문제가 있다. 위의 그림을 보면 conent image의 contrast가 낮아지니 stylized image가 전보다 뭉개지는 것을 볼 수 있다. 

 

 

따라서 image의 contrast를 비슷하게 조절하기 위하여 batch normalization 대신 batch 내에서 공유되지 않고 각 이미지에 대해 개별적으로 normalization하는 instance normalization을 사용하면 style transfer에 더욱 도움이 된다. 현재 CycleGAN에서 generator에서도 batch normalization 대신 instance normalization을 이용한다. 

 

 

-Results

 

 

다시 style transfer 논문으로 돌아와 결과 이미지를 보면, contents는 어느정도 유지가 되며 원하는 스타일이 이미지에 입혀지는 것을 볼 수 있다.

2020년 NeurIPS에 올라온 논문으로 Do Adversarially Robust ImageNet Models Transfer Better? 이라는 논문을 리뷰해 보려고 한다. Transfer Learning을 더 target task에 잘 맞도록 개선한 것으로 adversarial robustness를 강하게 만든다. 

 

 

What is Transfer Learning?

 

transfer learning은 이미지넷과 같은 스탠다드한 데이터셋으로 pre-trained된 모델의 학습된 weight를 가져와 이미 모델이 갖고 있는 지식을 다른 task에 활용하는 학습방식을 말한다. 학습하고자 하는 데이터가 적을 경우 pre-trained된 모델을 사용하여 transfer learning하는 방법이 유용하게 쓰인다. 저자는 transfer learning을 두가지로 나눈다. 

 

fixed-feature transfer learning

앞의 weight는 고정하고 뒤의 classification layer만 다시 학습시키는 방법이다. 

 

full network transfer learning

initial weight만 가져오고 모두 fine-tuning하는 학습 방법이다. 

 

 

Factors that affect transfer learning performance

 

transfer learning performance를 좌우하는 factor로는 pre-trained model의 accuracy가 알려져 있다. pre-trained model의 accuracy가 좋을수록 그 pre-trained model을 사용하는 transfer learning 성능이 좋아진다고 한다. 

 

그런데, 이 논문에서는 transfer learning의 성능을 pre-trained model의 accuracy만 좌우하는 것은 아니며, 또 다른 factor로 adversarial robustness를 언급한다. 

 

 

Adversarial Robustness

 

 

Adversarial Robustness를 알기 위해서는 adversarial attack을 먼저 설명하면 좋을 것 같다. 위 그림과 같이 사람의 눈으로 구분이 안되는 노이지를 이미지에 추가했을 뿐인데, 사람은 이를 여전히 "pig"라고 인지하지만 모델이 "airliner"라고 잘못 판단하게 된다. 이렇게 인지되지 않는 차이를 주어 모델이 잘못 판단하게 만드는 것을 adversarial attack이라고 한다. 여기서 파생되는 Adversarial robustness는 미세한 변화에도 모델이 올바른 판단을 내리는 정도를 말한다.

 

adversarial robustness를 수식적으로 잠깐 보자. 기존의 loss 식을 보면 weight theta에 대하여 x, y의 loss를 줄이는 방향으로 학습이 되었다면,   

 

Empirical risk minimization objective (ERM)

 

adversarial robustness를 높이기 위하여 x에 입실론보다 작은 노이즈를 추가한 x'과 y의 최대 loss를 minimize하는 방향으로 학습되게 한다. 즉, worst-case loss를 minimize한다고 말할 수 있다. 

 

Robust risk minimization objective

 

위의 식에서 d는 arbitrary norm (ex. Euclidean norm)을 뜻하며, epsilon은 desired robustness에 따라 조절 가능하다. epsilon이 0일 때는 위의 ERM과 동일한 경우가 된다. 따라서 objective function의 변화는 다음과 같다. 

 

 

 

Should adversarial robustness help fixed-feature transfer?

 

논문에서는 adversarial robustness를 높이면 transfer learning이 더 잘 될것이냐에 대해 두가지의 가설을 소개한다. 하나는 이전부터 만연했던 가설로, adversarially robust model은 source data에 대해 accuracy가 떨어지기 때문에 transfer performance도 떨어질 것이라는 가설이다. 

 

두번째 가설은 저자의 주장으로, adversarial robustness가 높아지면 standard accuracy는 떨어질 수 있으나, feature respresentation이 높아져 transfer performance가 올라갈 것이라는 가설이다. 

 

 

실제로 standard transfer learning과 robust transfer learning의 feature를 추출해보니 일반 모델보다 더 시각적인 정보를 더 많이 담고 있었다. 위 이미지의 (a) Perceptually aligned gradients를 보면 standard한 방식보다 robust한 방식에서 더 해석 가능하고 그럴듯한 이미지가 추출된 것을 볼 수 있다. 

 

 

Experiments

 

Fixed Feature Transfer Learning

 

이 논문에서는 12가지의 다른 dataset에 대하여 transfer accuracy를 측정했다. 앞단의 weight를 고정하고 classification layer만 다시 학습하는 fixed feature transfer learning에서는 대부분 파란색 막대의 robust한 경우가 더 높게 나왔음을 볼 수 있다. 

 

Full Network transfer learning

 

네트워크의 initial weight만 가져오고 모두 fine-tuning하는 full network transfer learning에서는 12가지의 데이터셋에 대하여 대부분 앞의 fixed-feature transfer learning보다 좋은 결과를 가져왔다. 또한 standard보다 robust learning의 방식에서 마찬가지로 transfer accuracy가 높아지는 것을 볼 수 있었다. 

 

Object Detection and Instance Segmentation

 

Classification 뿐만 아니라 다른 Computer Vision Task인 Object Detection, Instance Segmentation에서도 ImageNet을 기반의 pre-trained model을 robust transfer learning으로 사용할 때 더 좋은 정확도를 달성할 수 있었다. 

 

 

ImageNet Accuracy and Transfer Performance

 

앞서 말했던 transfer performance에 영향을 미치는 standard accuracy와 robustness는 자칫하면 trade-off 관계라고 생각될 수 있다. 그러나 저자는 둘을 동시에 변인으로 두고 관찰하는 것이 아니라, 하나를 고정시킨 후 transfer performance를 관찰해야 한다고 말한다. 

 

즉, robustness를 고정하였을 때, 더 높은 standard accuracy는 transfer learning performance를 증가시킨다. 또한 standard accruacy가 고정됐을 때, 더 높은 robustness는 transfer learning performance를 증가시킨다. 

 

 

따라서 epsilon이 0과 3인 두 경우에 대해 performance가 다른 A~F의 모델에 대해 transfer learning을 진행한다. 이 경우 epsilon을 고정하고 모델들을 바꿨으므로 robustness를 고정하고 standard accuracy에 차이를 둔다고 볼 수 있다. 

 

 

실험 결과, 기존의 논문들에서 주장된 것과 같이 standard accuracy가 높을수록, 즉 F에서 A로 갈수록 transfer accuracy또한 높아지는 것을 볼 수 있었다. 

 

 

그러나 robustness를 fix하지 않고 epsilon을 변화시켰을 때 standard accuracy인 ImageNet Accuracy와 Transfer Accuracy의 linear한 성질이 깨지는 것을 위의 그래프에서 볼 수 있다. 여기서 특히 CIFAR 데이터셋같은 경우는 standard accuracy가 높을수록 transfer accuracy는 낮아져버리는 아예 상반되는 결과를 보여준다. 

 

다른 데이터셋과 다른 CIFAR 데이터셋의 특징을 고려해봤을 때, 이미지의 resolution을 들 수 있다. CIFAR는 32x32의 작은 이미지 사이즈를 갖고 있으며 다른 데이터셋들은 더 좋은 이미지 resolution을 갖는다. 따라서 다른 데이터셋도 CIFAR의 resolution과 동일하게 해주기 위해 32x32로 downscaling하여 실험을 진행하였다. 

 

 

그 결과, 모두 ImageNet Accuracy가 높아질수록 Transfer Accuracy가 낮아지는 결과를 보였다. 이 결과를 해석해보자면, 이미지의 resolution, 즉 정보량이 적을 때 robustness를 증가시키는게 transfer learning performance에 더욱 중요해진다는 의미가 될 수 있다. 

 

 

Comparing Adversarial Robustness to Texture Robustness

 

 

또 다른 실험으로, Stylized ImageNet(SIN)을 활용한 실험이다. 2019년 CVPR에서 발표된 논문중에 CNN이 contents가 아닌 texture에 더 집중해서 학습한다는 논문이 발표된 바가 있는데, 이런 선행연구를 기반으로 texture robustness과 adversarial robustness를 비교했다. 

 

 

그 결과 texture-invariant model를 이용해 transfer learning을 진행한 모델보다 adversarially robust model이 더 좋은 성능을 보였다. 

 

 

Conclusion

 

이 논문을 정리하자면, adversarial robust neural network가 기존의 transfer learning보다 standard accuracy는 떨어트리지만, targe accuracy에 대해서 더 좋은 성능을 보였으며, 그 이유에 대해서는 future work로 남겨두고 있다. 

기본 명령어

  • cd : change directory

  • pwd : print working directory

  • ls : 디렉토리 내용 보기 [-a : 숨겨진 파일까지 보기, -l : 허가정보 등 더 많은 내용 보기]

  • cat : 입력 받아 출력하기 

    • cat 입력 > 출력 (표준입력 : 키보드, 표준출력 : 화면)

    • ex) cat > test : 키보드 입력받아 test에 저장

    • ex) cat test : test라는 파일을 화면에 출력

  • mv : 파일/폴더 이름 변경 | 파일/폴더 이동

  • mkdir : 디렉토리 만들기

  • rm : 파일 없애기 [-r : 재귀적으로 없애기]

  • cp : copy [-r : 재귀적으로 copy]

  • tar : 여러 파일 묶어 하나로 압축 [cvfz : 생성, xvfz : 풀기]

    • ex) tar cvfz new.tar.gz a1 a2 a3

    • c : create, x : extract, v : verbose(출력 정보 제공), f : 파일 이름

  • grep [option] [pattern] [files] : find a text pattern in files [-n : 줄번호 명시, -i : 대소문자 무시, -c : 횟수만]

    • ex) grep -i lee test1 test2 test3 : lee 패턴 test1,2,3에서 찾기

    • ex) ps -ef | grep main.py : 현재 프로세스 중에 main.py 찾아 출력

  • find [탐색위치] [탐색옵션] [명령] : 파일찾기

    • ex) find . -name '*.c' -exec grep '#include' {} \; :현재위치 내에 있는 *.c 파일에서 #include 패턴 들어간 부분 찾기

  • ctrl+d : 입력의 끝

  • df . -h : 현재 위치의 하드웨어 용량 확인

  • du -sh * : 한단계 하위 디렉토리의 사용량 확인

 

프로세스 관리 명령어

  • ps : 현재 bash에서 실행중인 프로세스 보기 [-e: 모든 프로세스 출력, -f : 자세한 정보, -u : 프로세스 소유자 이름, cpu 사용량, 메모리 사용량 등 상세 정보 출력]

  • kill [PID] : 해당 PID 프로세스 죽이기 [-9 : 강제 죽이기, -15 : ]

  • w : 현재 접속중인 사용자들 정보 출력

  • top : CPU 사용량이 많은 프로세스 순서로 출력 [-d : delay]

  • jobs : 현재 shell 아래에서 수행중인 프로세스 보기

  • & : command 뒤에 붙임. background로 프로세스 실행

  • fg [job id] : 프로세스를 foreground로 전환

  • bg [job id] : 프로세스를 background로 전환

  • nuhup : 로그아웃 후에도 계속 프로세스 수행 

    • ex) nohup 실행파일 &

  • ctrl+c : foreground 프로세스 종료

  • ctrl+z : foreground 프로세스 일시중지

  • vmstat : 프로세스, 메모리, cpu 활동사항 등 출력 [delay 1 : 1초마다, -d : 영역별 디스크 사용량출력]

 

사용자 추가

  • adduser [username] : home, shell 알아서 만들어주는 사용자 추가 명령어

 

접근권한 

  • chmod [ugo][+-][rwx] [대상] : user, group, others에 read, write, execute 권한 부여/삭제

    • ex) chmod u-rw permission.txt

    • ex) chmod 777 permission.txt : 000~111 의 십진수를 각 ugo에 대해 쓰기

  • chown -R newowner:newgroup test : test 하위폴더 포함 owner를 newowner로 group을 newgroup으로 변경

 

'Linux' 카테고리의 다른 글

alias를 통한 리눅스 쉘 단축어 등록  (0) 2020.08.06

오늘 소개할 논문은 cyclegan을 활용해 segmentation task에서 domain adaptation을 진행한 논문이다. 

 

먼저 cyclegan을 이용해 source domain을 target domain으로 domain adaptation을 진행하고 target domain으로 스타일이 바뀐 source data로 segmentation 네트워크를 학습하여 실제 target domain에서의 성능을 높이는 방법이다. 

 

즉 전체 네트워크는 2 step이다. 

1. source data의 domain을 target data의 domain으로 바꾸기 (cyclegan)

2. target domain으로 옮겨진 source data'을 이용하여 segmentation 네트워크 학습시키기 (deeplab)

 

이런 2 step domain adaptation은 사실 이전에도 여러번 소개가 되었다. 

Dual Channel-wise Alignment Networks for Unsupervised Scene Adaptation(DCAN) 이나 cyCADA 논문도 위와 같은 형식이라고 알고 있다. 

 

그런데 이렇게 2 step으로 네트워크를 학습시킬 때 발생하는 문제점이 있다. 첫번째 step에서 Image Generator의 성능이 떨어진다면, 두번째 step에서의 성능이 결코 좋을 수 없다는 것이다. 즉, segmentation network의 성능이 image generator의 성능에 의해 한계점을 지니게 된다. 

 

본 논문에서는 위와 같은 한계점을 보완하는 방법을 제시한다. 

 

 

 

Contribution

 

논문에 제시되어 있는 자신의 논문의 기여는 다음과 같다고 한다.

 

"""

1. Bidirectional Learning System, which is a closed-loop to learn the segmentation adaptation model and the image translation model and the image translation model alternatively

 

2. Self-supervised learning algorithm for the segmentation adaptation model, which incrementally align the source domain and the target domain at the feature level, based on the translated results

 

3. New Perceptual loss to the image-to-image translation, which supervised the translation by the segmentation adaptation model

"""

 

1. 2step을 개별적인 단계가 아닌 유기적으로 이어지게 (closed-loop) 만듦으로써 앞뒤 스텝의 단점을 상호 보완 가능하게끔 만들었으며,

 

2. 두번째 스텝에서 self-supervised learning algorithm을 추가하였고,

 

3. 첫번째 스탭에서 두번째 스텝 네트워크를 활용한 perceptual loss를 추가하여 segmentation adaptation model로부터 training에 필요한 정보를 얻었다고 한다. 

 

 

 

Model 

 

 

전체 네트워크는 위와 같다. 

 

Image Translation Model을 통해 source data를 target domain으로 shift 한 후, 그 shift된 source data를 Segmentation Adaptation Model을 학습하여 결과를 얻는다. 그런데 Image Translation Model에서 Segmentation Adaptation Model 아웃풋을 이용한 loss인 perceptual loss가 추가된다. Segmentation Adaptation Model에서는 adversarial loss가 존재하고, 스스로 mask를 만들어 self-supervised learning을 진행한다고 하는데... 자세한 내용은 loss를 천천히 뜯어보면 알 수 있겠다. 

 

 

 

Loss

 

loss들을 같이 보기 전, 기억해야할 notation은 다음과 같다. 

 

source data = S

target data = T

translated source data by forward cyclegan = S'

translated target data by inverse cyclegan = T'

Image Translation Model (cyclegan generator) = F

cyclegan inverse generator = F-1

Segmentation Adaptation Model = M

 

 

첫번째 스텝인 image translation model로 cyclegan을 활용하였으며,

그 loss는 

image translation model loss

 

이다. 람다 GAN은 1, 람다 recon은 10 을 사용했다고 한다. 

 

하나하나 뜯어보자. 첫번째로 GAN loss이다. 

 

image translation model loss - GAN loss

S'과 T의 domain을 구분하지 못하도록. 또는 S와 T'의 domain을 구분하지 못하도록 만드는 loss이다. discriminator는 S'을 0으로, T 를 1로 구분하도록 학습하였으니, 반대로 generator는 S'을 1로, T를 0으로 라벨하여 loss를 얻는 것을 볼 수 있다. 

 

image translation model loss - Reconstruction loss

F를 통과하여 만들어진 S'을 다시 F-1 함수에 통과하였을 때, S로 되돌아오는지, reconstruction 되는지 확인하는 pixel-level loss이다. L1 loss를 사용하고 있다. cyclegan 논무에 따르면, 이 loss를 추가함으로써 generator F가 다시 되돌릴 수 있을 만큼만 이미지를 바꿔주어 이미지의 content를 보존할 수 있었다고 한다. 

 

 

image translation model loss - perceptual loss

논문의 핵심 특징 중 하나인 perceptual loss이다. 두번째 step의 segmentation model과 연결시켜주는 고리이기도 하다. segmentation adaptation model M을 마치 perceptual loss의 VGG 네트워크처럼 활용하여 S와 S'의 perceptuality, 그리고 F-1(S')과 S의 perceptuality를 줄이는 방향으로 학습한다. 람다 per은 0.1, 람다 per_recon은 10이다. 이러한 perceptual loss를 추가함으로써 segmentation adaptation model M이 가지고 있는 domain bias를 image translation model에서 보완해 줄 수 있게 된다. 

 

 

두번째 스텝인 segmentation adaptation model로 deeplab v2를 사용하였으며,

그 loss는 self-sueprvised loss의 유무로 두가지 종류가 존재한다. 

segmentation adaptation model loss without self-supervised loss

 

segmentation adaptation model loss with self-supervised loss

람다adv는 0.001이다. 

 

이번에도 하나하나 뜯어보자. 

 

 

segmentation adaptation model loss - adversarial loss

먼저 위 논문의 큰 특징 중 하나인 adversarial loss이다. image translation model 뿐만이 아닌 segmentation model에도 adversarial loss를 추가함으로써 image translation model에서 미처 줄이지 못한 source와 target 사이의 거리를 줄이는 방향으로 보완해 준다. 

 

 

segmentation adaptation model loss - segmentation loss

segmenatation model에서 항상 등장하는 cross entropy loss이다. domain shift 된 S'을 input으로 하여 얻은 M(S') 결과값과 segmentation label Ys 사이의 loss를 계산한다. 

 

 

segmentation adaptation model loss - self-supervised segmentation loss

마지막으로 핵심 loss인 self-supervised segmentation loss이다. target data label이 주어지지 않았을 때, 스스로 라벨을 형성하여 unsupervised learning을 진행한다.

학습이 덜 된 네트워크에서 나온 결과값을 정답값이라고 가정한다는 것이 아이러닉하게 들릴 수도 있겠다. 그러나, segmentation task의 특징을 잘 생각해 보자. 도로를 segmentation한다고 했을 때, 도로의 정 중앙이 도로에 속한다는 것은 쉽게 알 수 있지만, 도로의 가장자리, 즉 나무 또는 보도와 가까운 pixel일수록 도로인지 아닌지 판단하는 것은 어려워진다. 즉, 같은 segmentation task에서도 pixel마다 쉽게 class를 판단 가능한지 아닌지 난이도의 차이가 존재하기에 확률의 차이가 존재하게 된다.

따라서 높은 확률로 판단 가능한 쉬운 pixel에 대해서 우리는 sudo label을 만들 수 있다. 몇퍼센트의 확률로 class를 확신하면 sudo label로 설정할 것이지에 대한 threshold는 0.9로 정했다고 한다. 이렇게 정해진 threshold로 우리는 target data에 대한 sudo label을 구할 수 있고, 이 sudo label을 논문에서는 mask라고 부른다. figure 3에서 예시로 주어진 mask를 살펴보면 구분선은 검정색(0)으로 구분하기 어려운 곳이기 때문에 sudo label을 형성하지 못한것을 볼 수 있고, 특정 class의 내부는 흰색(1)로 구분하기 쉬웠기 때문에 sudo label이 형성되었음을 볼 수 있다. 이렇게 정해진 sudo label에 대해서만 target segmentation loss를 구하여, training을 더욱 가속화한다.

 

 

 

Training Process

 

이렇게 정의된 2 step network를 구성하는 F,M model은 다음과 같은 프로세스로 training이 진행된다. 

 

training process

 

먼저 일반 segmentation model과도 같은 M(0)를 학습시킨다. 위의 M을 training 하는 loss에서 adversarial loss와 self-supervised segmentation loss를 제외한 segmentation loss만을 활용한 것을 말한다.

 

이 M(0)를 기반으로 cyclegan F(1)을 학습한다. <- Equation 2

F(1)의 아웃풋으로 adversarial loss와 segmentation loss를 갖는 M을 학습한다. <- Equation 1

그 후 M에 self-supervised segmentation loss를 추가하여 M을 N번 학습한다. <- Equation 3

 

위와 같은 과정을 K번 진행했다고 한다. K는 2, N은 3으로 최종 네트워크를 지정하였다. 

 

 


 

이렇게 논문의 전반적인 내용이 끝났다. 결과는 생략하겠다. 

 

이 논문에서 인상 깊었던 것은 

 

1. 2 step 네트워크일 때 두 네트워크를 유기적으로 연결한 것

2. segmentation model에서 sudo label을 만들어 self-supervised learning을 활용한 것

 

이다. 두 특징은 segmentation task에만 한정이 되는 것이 아니라 같은 idea로도 다양한 task에 활용될 수 있을 것 같다. 

개발을 하다보면 커맨드 창에서 항상 똑같은 파일 위치로 이동하게 된다.

cd ../../data/workspaces 이런식으로 나의 작업파일이 있는 공간으로 매번 이동해야 하는데 참 귀찮다.

 

로컬에서 돌리는 것이 아니라 서버에서 돌린다면 

ssh user@203.244.566.254

이런식으로 서버에 들어가기 위해 매번 ip 주소를 친다는 것도 참 귀찮다. 뿐만 아니라 서버에 들어가서도 작업공간으로 들어가야하니 또 귀찮다. 

 

그래서 alias가 필요하다. alias는 리눅스 쉘에서 "cd ../../data/workspaces" 와 같은 명령어를 "ws" 와 같이 다른 단축어로 등록함으로써 긴 타자를 대체할 수 있다. 

 

 

alias 등록하기

alias를 등록하기 전 리눅스에 기본적으로 설정되어 있는 단축어들을 보자. 

>>alias

를 통해 확인해 보면 egrep, fgrep, grep, l 등이 있음을 확인할 수 있다. 우리는 여기에 우리의 단축어도 함꼐 등록하고자 한다. 

 

>>vi ~/.bashrc

vi 편집기를 통해 bashrc로 들어간다.

.bashrc는 shell이 시작될 때 실행되는 파일로 매번 로그인하여 새로운 shell이 만들어질때마다 먼저 실행되는 파일이다. 여기에 alias를 등록해두면 매번 새로운 단축어를 지정하지 않아도 자동으로 지정되게 된다. 

 

그럼 이런식으로 뭐가 써져있는걸 볼 수 있는데, 다 무시하고 맨 끝으로 가서 마지막 줄에 

이런식으로 

>>alias ws='cd ../../data/jaayeon/workspaces'

와 같이 alias 단축어='명령어' 형태로 추가해 준다. 

참고로 vi 편집기에서 i를 누르면 내용을 추가할 수 있다. 

 

>>:wq

등록하고 싶은 단축어를 모두 썼으면 esc를 눌러 편집모드에서 나간 후 :wq 를 써준다. 

wq는 저장하고 나가기 이다. 그냥 나가는 것은 q이다. 

 

저장한 단축어를 바로 사용하고 싶다면

>>source ~/.bashrc 

를 쓰거나 쉘을 한번 나갔다가 들어오면 반영된다. 

 

 

'Linux' 카테고리의 다른 글

리눅스 자주 쓰는 명령어 모음  (0) 2021.02.08

이번 방학에는 domain adaptation 논문들을 정리하여 리뷰해 보려고 한다. 심심할 때 리눅스 쉘에서 자주 쓴 명령어도 정리해 기록해 보고자 한다. 

 

지금 2020년도 기준으로 이번에 리뷰하는 [Domain Adversarial Training of Neural Networks] 논문은 어찌 보면 상당히 올드하다. 이보다 더 좋은 많은 알고리즘들이 쏟아져 나오고 있지만, 그럼에도 불구하고 Domain Adaptive에 가장 기본적인 성질을 담고 있으며, 이를 수식적으로 잘 설명한 논문이니 Domain Adaptation 카테고리에서 첫 번째로 리뷰해 본다. 

 

 

 

먼저 domain adaptation이란 무엇인지 간단히 짚고 넘어가 보자. domain adaptation이란 간단히 말해서 위와같이 잡지에서 찍은 것과 같은 SVHN 숫자 dataset에서 training 시킨 네트워크로 전혀 다른 style을 갖는 MNIST 숫자 dataset을 분류하는 데에 쓰고 싶을 때 두 domain의 간격을 줄여주는 방법이다. 우리는 이렇게 네트워크를 training 할 때 쓰인 dataset을 source dataset, 그 도메인을 source domain이라고 칭한다. 또한 source로 training 시킨 네트워크로 분류하고자 하는 test set을 target dataset이라고 하며, 그 도메인을 target domain이라고 한다. 

 

 

 

간단한 문제에서는 source domain 하나, target domain 하나가 주어진다. 더 고차원적인 문제를 생각해 본다면, source에 한가지의 domain이 있는 것뿐만이 아닌 여러 가지의 다양한 domain이 source domain으로 주어질 수 있다. 위 그림처럼 같은 숫자를 담고 있지만 그 숫자의 굵기나 색깔, 배경, 폰트가 다름으로써 다양한 domain의 숫자 dataset이 주어질 수 있다. 우리는 이를 [multi source domain adaptation]이라고 부른다. target domain이 여러 가지인 경우도 마찬가지로 [multi target domain adaptation]이라고 부른다. 

 

 

 

이런 domain adaptation은 transfer learning의 일종으로 분류된다. source와 target 데이터셋의 distribution이 다르지만, 두 도메인에 같은 task를 적용할 때 이를 Transductive Transfer Learning이라고 부르며, 이 해결 방식으로 Domain Adaptation이 제시되었다. 

 

 

 

그럼 이제 진짜로 논문리뷰를 시작해 보겠다. 2020-07-25 기준으로 본 논문은 2000회에 육박하는 높은 인용수를 보인다. 

 

 

 

먼저 DANN(Domain Adversarial Neural Net)의 네트워크 구조를 보고 넘어가자. DANN은 classification에서 class label을 구분하는 task와 source와 target의 domain을 구분하는 두 task를 동시에 진행한다. 네트워크 앞부분은 서로 공유하며, 앞 네트워크에서 뽑은 feature로부터 class label을 구분하는 보라색 네트워크와 input으로 들어온 사진이 source인지 target인지 구분하는 분홍색 네트워크로 구성되어있다. 이때 우리의 목표는 앞의 feature extractor Gf가 최대한 source와 target에 동시에 포함되는, domain의 특성을 지우고 class 분류에만 쓰인 특징을 뽑게 하는 것이다. 이를 위하여 back propogation시 domain label을 구분하는 분홍색 네트워크에서 뽑힌 loss에 -람다를 곱해 feature extractor weight를 업데이트한다.  이렇게 되면 

  1. MInimize Training classification error
  2. Maximize Training & test domain classification error

두 목적을 동시에 달성할 수 있게 된다. 

 

 

위와 같은 방식으로 정말 domain간의 거리를 줄일 수 있는가?라는 의문이 들 수 있을 것이다. 위 논문에서는 실제로 줄어든다는 것을 수식적으로 증명한다. 

 

그런데, 두 dataset의 domain 분포 거리를 줄이려면, 두 domain 거리를 측정할 수 있어야 할 것이다. 두 domain 사이의 거리를 측정하는 방식은 Domain Divergence를 측정함으로써 계산할 수 있다. 

 

 

 

우리의 목적을 한번 더 말하자면, target domain error를 줄이는 것이다. target domain error는 source domain error + domain divergence로 upper bound를 정할 수 있다. 즉, source domain에서 classify를 잘하고, source domain과 target domain과의 거리가 가깝다면, target error가 작을 것이다. 

 

Ben David는 domain divergence를 위와 같이 정의한다. 여러 domain classifier 이타를 원소로 하는 classifier 집합을 hypothesis class H 라고 정의했을 때, H-divergence란 두 도메인을 잘 구분하는 classifier를 얼마나 담을 수 있는지를 뜻하기에 도메인을 구분하는 능력을 칭한다. 실제로 거리의 개념은 아니지만 두 도메인 사이의 거리와 같은 말이라 생각해도 괜찮다.(말은 통한다)

 

H divergence는 'source domain을 1로 판단할 확률 - target domain을 1로 판단할 확률'이라고 정의되어 있다. 이해를 돕기 위해 간단히 예시를 들어보자면, classifier가 두 도메인을 구분하지 못할 때 위 식은 1/2 -1/2가 되어 0이 되며, 두 도메인을 잘 구분할 때 1-0 또는 0-1이 되어 그 절댓값은 1로 divergence가 커지게 된다. 

 

 

 

그 밑에 나온 수식까지 함께 봐보자. 위의 식은 true divergence이며 밑의 식은 이를 정말로 구할 수 있게 modify한 empirical H-divergence이다. 위의 식으로부터 밑의 식을 얻기 위해서는 

  1. 확률 Pr을 sigma * 1/n 으로 바꿔 계산 가능하게끔 만든다. 
  2. 'source domain을 1로 판단할 확률' = '1 - source domain을 0으로 판단할 확률'     이므로 위의 식의 앞 Pr 부분을 치환해 준다. 

이렇게 하면 empirical H-divergence를 구할 수 있다. 

 

 

empirical H-divergence 식의 이해를 돕기 위해 좀 더 설명하자면, 먼저 I [ ]는 indicator function으로 true면 1을, false면 0을 뱉는다. min term 내부를 보면, domain classifier 이타가 domain을 잘 분리했을 때 1+1이 된다. 근데, 이 이타가 존재하는 공간은 symmetric hypothesis class이므로, 1+1이 존재하면 0+0도 존재하게 된다. (마치 100점 맞는 친구는 0점도 맞을 수 있다는 의미이다) 두 값중 min값이 선택되면 0+0이 선택되게 된다. 만약 domain classifier 이타가 domain을 잘 분리하지 못한다면 1/2+1/2가 된다.

 

따라서 min term은 잘 분리하면 할수록 0(0+0)에 가까운 숫자가 되고, 잘 구분하지 못할수록 1(1/2+1/2)에 가까워진다. 잘 구분하지 못할수록 숫자가 커지게 되니 이는 마치 loss 값과 같다고 할 수 있다. 그래서 이 min term은 domain classifier의 loss값으로 대체 가능하다. 

 

 

 

min term은 domain classifier error인 입실론으로 대체되며, 이때의 H-divergence를 Proxy Distance, Proxy-A-distance(PAD)라고 부른다. 보통 이 domain classifier로 간단한 MLP나 linear SVM을 많이 사용한다. 

 

직관적인 이해를 돕기위해 다시 예시를 들어보자면, domain loss가 작을 때, PAD는 커지게 되며, 이는 source와 target domain 거리가 멀어 구분이 쉽다는 것이다. 반면 domain loss가 클 때 PAD는 작아지게 되며, 이는 source와 target의 distribution이 비슷해 구분이 어렵다는 뜻으로 해석 가능하다. 

 

 

지금까지의 과정을 되짚고 넘어가보자.

 

Target error <= source error + H-divergence

 

이며, H-divergence를 구하기 위해 empirical H-divergence를 구해봤다. 그런데 사실 true H-divergence와 empirical H-divergence는 완전히 동일할 수 없다.

 

H-divergence <= empirical H-divergence + H-complexity

 

true H-divergence의 upper bound가 empirical-H-divergence + H-complexity 로 measure 된다. 즉, 우리가 경험적으로 구한 empirical H-divergence에 그 classifier의 복잡도를 더한 값이 실제 H-divergence의 upper bound가 된다. 이는 overfitting과도 관련이 있는데, classifier가 train dataset에 맞춰 꼬불꼬불한 구분선을 갖게 된다면, 이는 train dataset에 overfitting 되어 valid dataset이나 test dataset에서 좋은 성능을 갖지 못한다. 이때 꼬불꼬불한 classifier는 complexity가 높다고 말할 수 있겠다. 이처럼 우리는 H의 complexity를 구해, 우리가 경험적으로 구한 H divergence가 실제로 잘 작동할 것이라는 것을 입증해야 한다. 

 

 

target error <= source error + empirical H-divergence + constant complexity 

를 수식으로 나타내면 위와 같다. 이타*는 domain을 잘 구분하는 classifier로 베타 >= inf(Rs+Rt) 식에 의해 베타는 source, target 모두에서 잘 작동하는 domain classifier 이타가 존재할 때 최소가 된다. 그런 classifier 이타가 H 안에 존재하려면(H는 classifier 이타의 집합이라고 위에 언급하였다!) H의 dimension은 충분히 커야한다. 그러나, complexity term이 존재하기에 H의 dimension은 한없이 커져서만도 안된다. 

 

즉, 잘 구분하는 classifier 이타를 H에 포함할 수 있을 만큼 H의 complexity는 커야하지만(베타 값을 작게 하기 위하여), complexity가 너무 크다면, constant complexity의 값이 커져 결국 target error의 upper bound는 커져버리게 된다. 따라서 충분한 성능을 내는 classifier가 있어야 하나 이 classifier가 너무 복잡해서는 안 되겠다. 그래서 간단한 MLP나 SVM을 주로 쓰나 보다. 

 

 

주절거리다 보니 본 논문의 핵심 아이디어는 대충 다..? 건들여 본 것 같다. 마지막으로 정리해보자면, 

  1. 네트워크가 source domain에서 좋은 성능을 낼수록
  2. source-target divergence가 작을수록
  3. H set의 complexity가 적당히 클수록

target domain error를 minimize할 수 있다. 

 

 

그럼 이만 논문 리뷰를 끝내고, 다음 포스팅부터는 2019-2020년도의 최근 논문 위주로 리뷰해 보도록 하겠다!

 

 

 

 

+ Recent posts