2020 SAI-I 2학기 동아리 프로젝트

 

프로젝트 링크 : https://github.com/sju-coml/2020-Font-picker

프로젝트 실험 보고서 : https://github.com/sju-coml/2020-Font-picker/issues

발표 영상 : https://youtu.be/GHrb8dILj0k?t=632 (발표 중간에 화면에 문제가 있습니다. PPT를 다운받아서 함께 봐주세요)

발표 자료 : https://github.com/sju-coml/2020-Font-picker/blob/main/presentation/트리케라톱스.pdf

 

폰트와 폰트 사이의 스타일을 갖는 또다른 폰트를 만들어내는 GAN기반 모델 실험 프로젝트이다.

본인은 해당 프로젝트에서 팀장을 맡았다. 웹 데모에서는 5개의 베이스 폰트를 지원한다.

 

zi2zi 프로젝트를 기반으로 만들었으며, 레퍼런스 코드를 처음부터 끝까지 완벽하게 분석하고 진행한 연구 프로젝트이다.

나중에 시간이되면 해당 모델의 loss 설계와 문제 해결에 대하여 정리한 포스팅을 해볼까 한다.

해당 프로젝트의 issue에는 매우 디테일하게 실험 과정과 시행착오에 대하여 볼 수 있다.

 

 

만드는데 10분도 걸리지 않습니다.
몸으로 하는 공룡 게임.

 

친한 친구들이랑 해커톤 나갔다가! 쉬는 시간에 기분전환 겸 할 게임을 만들어봤습니다!!

2박 3일이라 시간이 많이 남더라고요! 만든 지 좀 되었지만 워낙 간단하니 쓱 한번 작성해봤습니다.

 

결과물

달리는 모션을 취하다가, 점프 모션을 취하면 점프가 됩니다!

생각보다 쉽고요! 점프 모션을 오래 취하면 체공시간이 길어집니다.

달리다가... 점프!!

 

Teachable Machine

대학교 2학년때 인공지능 수업 듣다가 알게 되었던 도구입니다.

인공지능 모듈을 데이터 생성, 데이터 조작, 모델 설계, 학습 등의 귀찮은 작업을 웹상에서 모두 진행한 뒤,

tensorflow.js 모델로 export까지 해줍니다.

 

 

Teachable Machine

Train a computer to recognize your own images, sounds, & poses. A fast, easy way to create machine learning models for your sites, apps, and more – no expertise or coding required.

teachablemachine.withgoogle.com

 

포즈 프로젝트를 선택합니다.

웹캠을 이용해 연속 촬영으로 샘플을 만들 수 있습니다.

만들 당시에는 발로 마우스를 누르고 모션을 찍었던 것 같네요.

클래스 이름을 수정하고 학습 버튼을 누르면, 아래와 같은 사진처럼 됩니다.

미리보기도 할 수 있고요!

모델 내보내기를 누르면 모든 과정이 끝났습니다.

원래는 모델을 다운로드하여 path를 연결해도 되지만, 업로드해버리면 모델까지도 CDN처럼 이용할 수 있습니다.

위 내보내기 된 코드를 복사해 서보면 웹캠으로 실시간으로 라벨이 분류되는 루프와 canvas에 웹캠을 업데이트하는 코드들로 구성되어있다.

 

T-Rex Game

크롬의 코드를 분리한 아래의 Github Repository를 이용했습니다.

 

GitHub - wayou/t-rex-runner: the t-rex runner game extracted from chromium

the t-rex runner game extracted from chromium. Contribute to wayou/t-rex-runner development by creating an account on GitHub.

github.com

요런 느낌으로 게임을 돌려볼 수 있습니다.

 

그럼 해당 게임의 코드와 내보 내기된 모델을 연결해봅시다.

 

연결!

그런데? 코드를 뜯어서 붙이려면 코드를 읽어야 하잖아요.

10분 만에 만들어야 하는데 코드 읽고 있으면,,, 그래서 이벤트를 이용하기로 했습니다.

 

점프키인 스페이스를 임의로 입력되게 만드려고 합니다.

 

그렇게 TA에서 export 한 코드의 predict함수를 수정해봤다.

  • 점프 모션으로 예측되는 프레임에서 점프
  • 달리기 모션으로 예측되는 프레임에서 달리기
  • 빠른 반응을 위해 정확도가 85%가 넘는 선에서 점프한다. (자세를 바꾸는 과정에서는 애매한 정확도가 나옴)

꾸미기

점프하면 테두리 색이 삭 변하고, 아래 정확도 %가 뜨게 만들었다.

끝!

날렵한 곰의 논문 리뷰 시리즈 입니다.
* 논문 읽는 연습을 하는 단계에서 쓴 글입니다.

- 논문 링크 : https://arxiv.org/abs/1512.03385

 

Deep Residual Learning for Image Recognition

Deeper neural networks are more difficult to train. We present a residual learning framework to ease the training of networks that are substantially deeper than those used previously. We explicitly reformulate the layers as learning residual functions with

arxiv.org

Abstract

문제점

- neural network는 깊게 쌓을수록 학습하기가 어렵다.

해결점

- 이전의 모델들보다 더 깊은 모델을 학습하기 위한 residual learning framework (잔차 학습 프레임워크)를 제안한다.

- 해당 모델은 레이어의 입력을 참조하여 레이어를 잔차 학습 함수로 재구성한다.

- 해당 논문은 residual network가 쉽게 optimize가 되며, 상당히 깊은 모델에서 정확도를 얻는 경험적인 증거를 제공한다.

내용

- ImageNet dataset에서 VGG net보다 5배 더 깊지만 여전히 복잡도가 낮은 최대 152 레이어 깊이의 residual network를 평가했다.

- 해당 논문은 CIFAR-10을 100개와 1000개 레이어로 분석한 내용을 담았다.

결과

- test set에서 3.57%의 에러율로 ILSVRC 2015 분류 대회에서 1위를 달성했다.

- 이외 COCO와 ImageNet에서 좋은 성과를 거두었다.


Summary

최근 연구결과들에서 convolutional neural network는 deep 하게 쌓을수록 결과가 좋아서 이미지 분류에서 많이 사용되고 있으며 모델의 깊이가 매우 중요함을 시사한다.

Is learning better networks as easy as stacking more layers?

"그렇다면 레이어를 많이 쌓을수록 더 괜찮은 모델을 학습할 수 있을까?"라는 의문을 가질 수 있다.

해당 질문에 대하여 대답하는 데에는 Vanishing gradients, Exploding gradients 때문이라고 생각할 수 도 있었지만,

해당 문제들은 Normalized Initialization와 Intermediate Normalization Layers에 의하여 해결되었다.

(Intermediate Normalization Layers는 Batch Normalization같은 것을 말하는 것)

 

깊은 게 쌓은 모델은 수렴을 시작할 때 성능 저하(degradation problem)를 보였고 모델 깊이가 증가할수록 정확도는 빠르게 떨어졌다.

기대와 다르게 이러한 성능저하는 Overfitting으로 야기된 것이 아니었다. 

 

위의 실험으로 이를 증명했다. Figure 1을 보면 레이어를 56개 쌓은 모델과 20개를 쌓은 모델로 CIFAR10을 학습한다.

56개 쌓은 모델은 train set과 test set에서 모두 20개 쌓은 모델보다 낮은 성능을 보였다.

(Overfitting이 문제였다면 적어도 training set에서는 낮은 에러를 보여야 하지만 그렇지 않다.)

 

 

이러한 학습정확도의 저하(degradation)는 모든 시스템을 비슷하게 최적화 하기가 어려움을 보여준다.

 

깊은 모델을 구성하는 해결책으로는 identity를 매핑하는 레이어를 추가하고 이외의 레이어는 학습된 하위 모델을 복사하는 방법이 있었다.

하지만 해당방법이 실험을 통해 좋은 성능을 내진 못했으며, 해당 방법보다 더 동등하거나 더 좋은 방법을 찾지 못했다.

 

그렇기에 해당 논문에서 deep residual learning 이라는 방법을 도입했다.

 

각 쌓여진 레이어들이 기본 매핑으로 fit 되길 바라는 것이 아닌 잔차매핑에 fit 되도록 했다.

기본매핑을 H(x)로 표시할 때, 우리는 비선형 매핑인 F(x) = H(x) - x를 제시한다. 그리고 이를 전개하면 H(x) = F(x) + x가 된다.

이는 참조되지 않은 기본매핑을 fit 시키는 것보다 잔차 매핑(residual mapping)을 fit 시키기가 더 쉽다는 가정을 기반으로 한다.

To the extreme, if an identity mapping were optimal, it would be easier to push the residual to zero than to fit an identity mapping by a stack of nonlinear layers.

극단적으로 identity mapping이 optimal 하면 잔차를 0으로 만드는 것이 비선형 레이어로 identity mapping을 fit 하는 것보다 쉬울 것이다.

즉 F(x) = 0 이 되도록 학습하는 것이 더 최적화하기에 쉬운 방법이라는 것이다.

 

F(x) + x는 "shortcut connectons"로 실현 가능하다. shortcut connectons는 한 개 이상의 레이어를 skip 하는 것이다.

위의 경우 간단한 identity mapping을 수행하며 이것의 출력과 쌓인 레이어의 출력이 더해진다.

 

Identity shortcut connections 은 추가적인 파라미터와 복잡한 계산이 필요하지 않으며, 위 모델은 여전히 end-to-end로 SGD를 이용한 backpropagation이 가능하며 기본 라이브러리로 쉽게 구현할 수 있다.

 

 

위 논문에서 2가지를 보여주려고 한다.

1) deep residual net은 쉽게 optimize 되지만 plain은 deep 해질수록 높은 에러를 보이는 것

2) deep residual net은 쉽고 즐겁게(?) 레이어가 깊어질수록 이전 모델들에 비하여 높은 정확도를 얻어내는 것 

 

Residual Learning

위와 마찬가지로 H(x)를 근사 시키는 것보다 이항 하여 F(x)를 근사 시키는 것이 학습에 있어 더 유리하다는 내용이다.

 

Identity Mapping by shortcut

식은 대강 이런식으로 생겼다

Fig.2에서의 모델로 재구성하면 F = W2σ(W1x) 이런 모양이 된다. 여기서는 표기를 위해 bias를 생략했다고 하니 F = W2+b2σ(W1x+b1)라고 생각하면 될 것 같다. 또한 위 식을 구현하기 위해서는 F와 x를 같은 차원으로 맞춰주어야 한다.

 

만약 F에서 output size가 x size와 달라졌다면 linear projection으로 차원을 맞춰 줄 수 있다.

 

Network Architectures

plain net과 residual net을 테스트한다.

 

Plain Network

plain baseline은 주로 VGG net에 영감을 얻어 만들어졌다. 합성곱 레이어는 3x3 필터와 2개의 규칙으로 설계되었다.

i) 같은 output feature map size와 같은 크기의 필터

Ii) 만약 feature map size가 절반으로 줄어들면 필터 크기가 2배로 늘어나 시간 복잡도를 보존한다.

 

합성곱 레이어에서 stride 2로 downsampling을 하고,

모델의 마지막엔 global average pooling layer, 1000-way의 fully-connected layer, softmax를 사용했다.

34개의 레이어로 되어있으며, 이 모델은 VGG net보다 필터가 많고 복잡도가 낮다. (VGG-19의 18% 정도의 연산량)

 

Residual Network

Plain Network를 기반으로 하며 shortcut connection이 추가되었다.

Residual Network는 input과 output을 같은 크기로 맞추어 주어야 한다. 그렇게 하기 위해 2가지를 고려해 볼 수 있다.

(A) zero padding을 추가하여 사이즈를 맞춘다. 해당 방법은 파라미터가 추가로 발생하지 않음.

(B) projection을 이용하여 사이즈를 맞추어 준다.

 

Implementation

구현 방법과 파라미터 설정에 대하여 설명한다.

- 224x224 size의 데이터를 사용한다.

- batch normalization을 이용한다. (conv net과 activate 사이에)

- Initialize Weights

- SGD

- mini-batch 256개

- learning rate 0.1

- iteration 60 x 10^4

- weight decay 0.0001

- momentum 0.9

- dropout은 사용 안 함

 

 

Experiments

ImageNet Classification

Plain Network.

plain net의 경우 이전의 결과에서 실험 결과에서 34-layer가 18-layer보다 더 성능이 안 좋은걸 확인했었는데 이는 Batch normailization을 사용한 결과이기에 vanishing gradient 때문이라고 보기 어렵다.

아래 결과를 보면 plain은 34-layer가 더 낮은 성능을 보이는 반면 ResNet은 34-layer가 더 높은 성능을 내며 degration문제가 어느 정도 해결된 것이 관측 가능하다.

ResNet.

resnet의 모든 shortcuts에 identity mapping을 이용하고 사이즈를 맞추기 위해 zero padding을 사용한다.

그렇기에 다른 추가 파라미터가 없다. 위에서 말한 (A) 방법을 사용함.

 

1. 34-layer resnet이 18-layer resnet 보다 더 높은 성능으로 degration문제를 잘 잡았다.

2. plain과 비교했을 때 34-layer는 성공적으로 training error를 줄였다.

3. 18-layer의 두모델은 정확도는 비슷하지만 더 빠르게 수렴한다. SGD를 이용하여 수렴할 때 Plain보다 ResNet이 더 좋은 성능을 낸다.

 

Identity vs. Projection Shortcuts.

Identity 방식으로 해봤으니 이번엔 projection shortcuts방식으로 해본다.

 

아래 표에서 ResNet-34의 A, B, C 방법을 비교한 것을 보자

(A) 현재까지 봤던 zero padding으로 차원을 증가시킨 방법이다. 이 방법은 추가적인 파라미터가 필요 없다

(B) projection shortcuts를 이용하여 차원을 증가시킨 방법이다. 다른 shortcut은 identity

(C) 모든 shortcut이 projection

위의 표를 보면 C > B > A 순의 성능을 확인할 수 있다.

A는 zero padding에 대하여는 잔차 학습이 이루어지지 않기에 B보다 성능이 약간 낮고

C가 B보다 projection shortcuts에 extra parameters가 많이 들어가기 때문에 성능이 더 높다.

 

= degradation problem의 문제의 해결에 projection shortcuts이 필수적이지 않다는 것을 말하려고 한다.

그래서 해당 논문에서는 C 모델을 사용하지 않는다.

 

Deeper Bottleneck Architectures.

아래는 deep 한 net을 설명한다.

위 모델에서는 학습시간을 고려하여 Bottleneck 구조를 사용한다.

각각의 잔차 함수는 2개 대신 3겹으로 쌓는다. 모양은 오른쪽 그림과 같은 구조로 이루어져 있다.

1x1은 차원을 감소시키고 복원하는 역할을 하여 3x3이 더 적은 입력과 출력을 갖게 한다.

이를 통해 기존과 비슷한 복잡성을 유지할 수 있다.

 

50-layer ResNet.

2-block인 34-layer를 -> 3-block으로 바꾸어 50-layer로 만들었다.

(B) 모델을 이용했다.

해당 모델은 3.8 billion FLOPs

 

*플롭스(FLOPS, FLoating point Operations Per Second)는 컴퓨터의 성능을 수치로 나타낼 때 주로 사용되는 단위이다.

 

101-layer and 152-layer ResNets.

3-layer를 더 쌓아봤다.

해당 모델은 11.3 billion FLOPs

여전히 VGG모델들보다 복잡성이 낮다

* VGG-16/19 nets (15.3/19.6 billion FLOPs)

이렇게 만든 ResNet은 34-layer 보다 확실하게 높은 성능을 보인다.

 

Comparisons with State-of-the-art Methods.

6개의 각기 다른 깊이의 모델을 앙상블 하여 test set에서 3.57%의 top-5 error를 보였다.

해당 모델로 ILSVRC 2015 1등 했다.

 

-끝-

작성일 : 2020.01.12

 

인공지능을 처음 공부할 때 일반적으로 접하게 되는 XOR 문제로부터 layer의 필요성과 다층 퍼셉트론의 필요 이유를 학습하게 됩니다.

"Frank Rosenblatt"은 연결주의 퍼셉트론을 주장하였으나 XOR 문제 해결을 근본적으로 할 수 없다는 거센 비판을 받게 되고, Frank Rosenblatt는 자살을 하고 맙니다. 하지만 이후 그를 보완하여 다층 퍼셉트론 개념과 역전파 개념이 나타나며 이러한 문제를 해결하고, 현재 인공지능계를 엄청난 발전으로 이끌었습니다.

 

하지만 제목과 같이 위의 문제를 해결해 보고자 합니다. 

이 글을 쓰게 된 계기는 Tensorflow KR 그룹에서 우연히 [1] 깃허브 개인 실험 게시물을 보았고 굉장히 재미있는 주제인 것 같아 위 실험을 따라 해 본 글과 함께, 그와 관련한 정보에 대해서도 정리해 보려고 합니다.

 

 

활성함수를 이용한 단일 퍼셉트론 문제 해결

위의 [1] 저장소의 내용으로 실험을 해본 내용입니다.

https://science.sciencemag.org/content/367/6473/83?fbclid=IwAR2ZeS2yG1DCXD_RNqgA-4LRNoEXerdP3uWLAmydzz7xFa5OZlAfSgQBEPI

 

Dendritic action potentials and computation in human layer 2/3 cortical neurons

A special developmental program in the human brain drives the disproportionate thickening of cortical layer 2/3. This suggests that the expansion of layer 2/3, along with its numerous neurons and their large dendrites, may contribute to what makes us human

science.sciencemag.org

우선 위와 같이 생각한 배경이라고 적혀있었습니다.

 

요약하자면 인간의 뇌의 뉴런은 전기적 입력 및 출력을 형성하며 뇌 기능을 하게 되는데, 이중 어떠한 뉴런은 신호의 임계치 수준 이상의 강도가 되면 오히려 강도가 감쇠되는 모습을 보였다는 연구 내용입니다.

( 생명공학과로서 매우 흥미 생기는 이야기입니다..! )

 

이를 이용하여 위의 개발자분은 활성함수에서 임계치 이상의 값이 나오면 0으로 바꾸는 ReaLU라는 활성 함수를 고안했다고 합니다.

(자세한 것은 위 저장소에도 매우 잘 소개 되어있습니다.)

개발자님이 고안한 ReaLU

얼추 이러한 모양으로 생겼는데 위의 개발자분은 1.6을 임계값으로 지정하여 { [x > 1.6] = 0, [x < 0] = 0 }으로 하셨습니다.

위와 같은 모델을 똑같이 만들어 보고 어떤 모양의 XOR 모델이 만들어 질까 실험해 보았습니다. [2]

위 링크의 실험은 colab단일 페이지로 만들어 보았습니다.

 

X

위와 같은 입력을 넣었을 때!

y_

학습 후 이렇게 올바른 Y값이 나오는 것을 볼 수 있었습니다. 본인은 퍼셉트론이 XOR을 만들 수 없는 이유만을 들어왔던 터라 혼자 이런저런 생각을 해보다가 시각화를 진행해 보았습니다.

너무 예쁘다 생각한 그대로 나왔다.

시각화 사진을 보면 {0, 0}에서 0의 수치를 가지고 있고, {1, 1}에서는 1.6의 임계치를 넘어 0이 된 값을 볼 수 있다. 또한

{0, 1}과 {1, 0}도 1.0에 근사한 값을 가진 것을 볼 수 있었습니다. (조금 낮아 보이는 건 기분 탓이다. 진짜다!)

 

이와 같이 XOR을 해결하는 합성함수를 사용한 모델을 검증해보았고, 모델의 시각화를 통해 이해를 해볼 수 있었습니다.

 

그렇다면 시행착오도 조금 작성해보려고 한다. 위와 같은 학습이 단번에 이루어지지는 않았습니다.

잘못 학습되어버림

예를 들면 이렇게 학습되기도 했다는 이야기입니다. 즉 local minimum에 빠지는 경우가 많았습니다. 

ㅠㅠ

무엇이 문제인지는 몇 가지를 더 시행해 봐야겠지만, 만약 이 글을 보게 된다면 코멘트를 좀 달아 주시면 좋겠습니다.

인공지능을 공부하게 된 지 얼마 안됐고 pytorch를 사용해보는 게 처음이기에 코드 내부의 문제가 있을 수도 있다고 생각했습니다.

 

가설 - loss함수를 다른 걸 써야 하나??

초기 - mes loss  (안됨)

loss = (y_hat - y_var). pow(2). sum() (안됨)

 

시간 날 때 이어서 써보도록 하겠습니다.

 

 

다른 개발자는 XOR을 어떻게 단인 퍼셉트론으로 해결하려고 하였나.

천천히 읽으며 채워볼까 생각해봤는데 이는 간단하게 요약/소개를 하고 마무리를 해보려고 합니다.

 

https://medium.com/@lucaspereira0612/solving-xor-with-a-single-perceptron-34539f395182

 

Solving XOR with a single Perceptron

Advocating for polynomial transformations as a way to increase the representational power of artificial neurons.

medium.com

이 문서는 단일 퍼셉트론의 표현력을 높이기 위해 선형의 분류에서 벗어나 비선형 퍼셉트론을 만드는 방법에 대해 XOR문제를 이용하여 소개했습니다.

 

XOR이 선형적으로 분리되지 않는 문제를 activation function앞에 

이러한 다항식을 추가하여 아래와 같이 XOR을 표현할 수 있다고 합니다.

또한 이 글에서는 여러 다항식을 추가해서 문제를 해결해보는 여러 가지 솔루션 소개하고 있고 수학적 이해를 돕게 하기 위한 식 유도 등을 포함하고 있습니다. 한번 읽어 보시길 하랍니다.


[1] https://github.com/sunggukcha/xor

[2] https://github.com/lunaB/AI-Experiment/blob/master/XOR%20perceptron.ipynb

+ Recent posts