딥러닝 기초 - Songwooseok123/Study_Space GitHub Wiki
Numpy, Torch, TensorFlow 비교
Numpy vs Pytorch
- 딥러닝 모델 안에서 최적의 해를 찾기위해 변수에 대한 미분과정은 필수 과정입니다.
- 넘파이만을 사용하게 되면 미분식을 직접 입력해야하지만 pytorch는 backward()라는 함수를 한 번 호출만 해주면 계산을 끝내기 때문에 편함
- 또한 Pytorch는 내부적으로 CUDA와 cuDNN이라는 API를 통해 GPU연산을 사용할 수 있고 numpy로 연산하는 거보다 속도 면에서 15배 이상 빠릅니다.
Tensorflow vs Pytorch
- 텐서플로우는 연산그래프를 먼저 만든 다음 값을 전달해 결과를 얻는 define and run 방식으로 학습 도중에 조건에 따라 변화를 줄 수 없는 정적인 모델 .
- 그래프 정의하는 부분과 연산을 하는 부분이 분리되기 때문에 코드길이가 길다.
- 딥러닝 자체 연구보다 응용할 목적인 실제 산업 현장에서 많이 사용됨.
- 커뮤니티가 큼. 사용자가 많고 배포환경도 좋고 생태계구성도 잘 되어있지만 SOTA 모델에서는 점점 pytorch 가 점점 더 많이쓰이고 작년 논문 점유율도 Tensorflow보다 3배 높아졌습니다.
- 파이토치는 연사그래프를 만드는 동시에 값이 할당되는 define by run 방식으로 학습시키는 도중에 단계마다 조건을 바꿔줄 수 있는 동적인 모델. 초보자가 이해하고 다루기 쉽다.
- 직접적인 딥러닝 모델연구에 많이 사용
List, Numpy, Pandas 비교
- List : 파이썬 내장 기본 형태 파이썬의 여러 변수를 한 번에 담을 수 있는 창고(문자,숫자,배열 등등 동시에 저장)- 하지만 이게 메모리에는 랜덤으로 저장이 되어있고 필요한 데이터를 부를 때마다 메모리에서 주소를 찾아서 가져오게 됨. List의 size 크기가 동적임.
- Numpy (nd array):n 차원 array 공간을 만들어서쓰는 거임(정적임) 한 타입의 변수만 한 배열에 담을 수 있고 메모리에서 이 array 배열을 덩어리로 한 번에 불러오고 메모리도 덜씀. 계산을 할 때도 numpy 함수를 쓰면 c 언어 기반의 for문이 내장되어있어서 효율적이다. 예를 들어 [1,2,3] nd array* 10 =[10,20,30] Array size 크기가 정적임. 숫자형식 행렬, 공학 연산(내적, 외적, 미분,eigen value) 가능
- 판다스: 판다스 series 들(열들)이 모여 dataframe(전체 엑셀)로 정리 엑셀, 스프레드시트 등과 같은 구조 데이터 변수화
Xai란
AI 모델이 특정 결정을 내린 원인과 그 작동 원리를 사람들이 쉽게 파악하게 해주는 알고리즘입니다. Interpretation algorithm이라고 부릅니다. Model이 어떻게 판단을 내렸는지 이 알고리즘이 알려주고 , 사람이 생각하는 부분과 겹치는 정도로 모델의 신뢰도와 해석 가능성을 계산합니다.
기억나는 알고리즘으로는 LRP 알고리즘으로 이미지를 인풋으로 넣었을 때 고양이라고 판단한 이유에 대해서 픽셀 하나하나의 영향력을 숫자로 알려주는 알고리즘입니다. 예를 들어 input으로 사진을 넣었고 사진의 픽셀들이 cnn의 layer들을 통과하며 연산을 통해 결국 70이라는 아웃풋을 냈다고 하겠습니다. 아웃풋을 보고 50미만이면 강아지, 50이상이면 고양이라고 판단하는 모델이라고 했을 때 모델은 70을 보고 고양이라고 판단할 겁니다. 이 70에서부터 역 추적을 통해서 바로 전 레이어로 가는 방법 입니다. 학습된 가중치와 편향을 이용해서 전 레이어에서 각각의 노드들이 가지는 영향력을 계산합니다. 이런식으로 레이어를 거슬러올라가다보면 input 레이어까지 올것이고 결국 input이미지의 픽셀하나하나의 영향력을 알 수 있게됩니다. 영향력이 큰 순서부터 픽셀에 빨간색으로 칠한다면 고양이의 귀와 꼬리 이런부분은 빨간색으로 칠해지고 반대로 판단을 방해했던 픽셀 즉 배경이나 아니면 강아지와 비슷한 몸통부분이런 부분은 파란색으로 찍힐겁니다.
또는 CAM 알고리즘이나 SMOOTH GRAD처럼 이미지의 특징이 되는 부분을 색칠해서 시각화해주는 알고리즘이 있습니다. Cnn을 통과해 나온 featuremap을 인풋 x에 대해서 미분해서 구함으로서 핵심이 되는 부분을 강조합니다. (이걸 sensitivity map이라고함). featuremap이라는 것은 cnn의 convolutional layer를 통과해서 나온 결과 행렬입니다. 이게 뜻하는게 인풋의 사진이 어느 지역에서 활성화되어있는지를 알려주는것입니다. 미분을 하면 그 위치에서의 영향력을 알려주는 것입니다. 클래스 c에 대한 인풋의영향력.
알려주면 사람이 보고 아 모델이 이렇게 생각하는 구나 하고 끝나는게 아니라, 사람이 생각하는 이유(GROUND TRUTH)와 비교해서 신뢰도를 측정합니다.
Smooth grad: input에 noise 추가한 후에 sensitivity map을 구하고(sensiticity map은 activation function을 input x에 대해 미분해서 구함으로서 핵심이 되는 부분을 강조함) n개의 sample에 대해서 평균을 낸다.-> 더 선명한 sensitivity map을 구하는 방법
GAN이란
Generative adversarial model의 약자로서 generative는 data 생성을, adversarial은 적대적으로 학습한다는 걸 의미하는데 모델의 목적은 최대한 진짜와 비슷한 데이터 생성입니다. 구조는 판별기와 생성기로 구성되어 있는데 판별기는 경찰, 생성기는 위조지폐범으로 비유할 수 있습니다. 판별기 업데이트는 진짜 지폐와 가짜 지폐를 구분할 수 있는 방향으로 학습을 시킵니다. 생성기 업데이트는 생성한 가짜 지폐가 판별기에서 진짜라고 인식하도록 속이는 방향으로 학습을 시킵니다. 위조 지폐범과 경찰이 서로 경쟁자로 인식하여 모두 발전하는 학습방법입니다. 판별기와 생성기의 학습을 반복하다보면 판별기가 진짜데이터와 가짜 데이터를 구분할 수 없을 정도로 진짜와 비슷한 데이터를 생성할 수 있게 됩니다. Gan은 대표적으로 이미지나 영상의 합성,복원에 사용되고 있습니다. 제가 있던 대학원 연구실에서 패션 스타일 추천과 온라인피팅 플랫폼 개발을 위해서 gan을 활용해 연구를 하고 있습니다. 현재 진행중인 사항이어서 말씀드리긴 어렵지만 간략하게 말씀드리자면 패션계에 sns스타 30명으로부터 패션 이미지 데이터를 수집했고 제가 직접 사진을 보며 이 것은 오피스룩, 치마에 셔츠 이런식을 태깅을 했습니다. 선배들이 저 휴학한 이후에 최초 분류 모델은 cnn모델중 Resnet을 썼고 추천시스템은 구현을 했으며 gan을 이용해서 온라인피팅 플랫폼을 만들고 있습니다.
Object detection/Retrieval
object detection의 아키텍처는 pretrain된 cnn 모델에서 인풋이미지의 특징을 추출에서 어떤 사진인지 분류하고 동시에 객체의 위치를 뱉어주는 2가지 output을 냅니다.따라서 분류와 회귀를 모두하는 문제입니다. 객체의 위치를 알려줄 때는 bounding box로 칸을 칠 수도 있고 segmentation으로 객체의 픽셀에 색칠을 하기도 하고 이 것을 응용해서 이미지를 인풋으로 넣으면 유사한 이미지를 찾아주는 객체검색 image retrieval에도 쓰입니다. 저는 객체 검색 공부가 재밌었는데 읽은 논문들이 주로 객체가 있는 위치를 어떻게 더 정확하게제안하는지, 또 그 정교함에서 추가적으로 발생하는 연산량을 줄이기 위해 cnn 모델안의 연산 과정을 수정하는 논문들이었습니다. 예를들어 mac을 r-mac으로 바꾸고 연산량은 pooling과정에 손을대어 대략적으로 계산한다. MAC -> RMAC: 이미지를 CNN모델에 넣으면 Convolutional layer를 지나면서 이미지의 특징을 추출해서 이미지를 피쳐벡터 하나로 만들어줍니다. 이미지의 특징벡터를 뽑아내는 과정이 제일 중요한게 객체탐색을 하던 검색을 하던 이 벡터와 비교하기 때문에 제일 잘해야합니다. 인풋 이미지를 convolutional layer에 통과시키면 channel 개수 feature map이 나오는데 이 feature map 을 하나에 값으로 수렵시켜서 값을 뱉어내고 이걸 모아서 벡터를 만듭니다. 이게 이미지 한장을 표현하는 feature vector입니다. Feature map을 하나의 값으로 수렴시킬 때 max pooling이라고 해서 최대값을 쓰는데 이미지의 위치를 찾는 문제를 풀 때는 지역정보가 중요하기 때문에 이 방법을 쓰면 성능이 떨어지게 됩니다. 따라서 지역정보를 담기위해 featureamp의 지역을 여러 개로 나누어서 값을 여러 개 구해서 이미지 한장의 feature vector에 지역정보까지 담는식으로 성능을 올립니다. 지역을 쪼갰기 때문에 당연히 연산량이 늘었을텐데 이부분은 integral image 방법을 이용합니다. 모든 지역에 대해서 max값을 찾는 일을 하지 않고 이 지역에서는 대략적으로 max 값이 몇일꺼야 라고 하는 표를 만들어놓는 기법으로 연산량 줄이는 개념으로 많이 쓰입니다. 완전탐색기법으로 sliding window 방법이 있으나 시간복잡도 때문에 selective search 방법을 많이씁니다.
CNN
(1)원래 dnn을 사용했는데 dnn보다 파라미터 개수가 적습니다. 즉 overfitting 문제가 덜 발생합니다
- Overfitting? : train데이터를 너무 과도하게 학습한 경우 테스트 데이터에 대해서 성능이 안 좋은 것.
(2)두번째로는 pooling이라는 다운 샘플링 layer가 들어간다는 점입니다. 필터함수로 추출한 피쳐맵을 특정 기준에 따라서 대푯값을 추출합니다. 파라미터 감소 역할을 하기도 합니다.
작동원리 : 이미지를 input으로 넣으면 convolution layer를 통과하면서 필터함수로 이미지의 특징을 추출합니다. 이걸 이미지의 featuremap이라고 부릅니다. 학습은 이 필터함수를 최적의 값으로 업데이트하는 과정입니다. Convolution layer에서 특징을 추출하고 pooling layer에서 다운 샘플링하고 번갈아가면서 layer가 쌓여있다가 마지막에 output을 냅니다.
RNN
트랜스포머 모델 기존 자연어처리 영역에서는 순환신경망인 rnn을 이용했다. 하지만 2017년 attention is all you need라는 논문이 나오면서 attention기법을 활용하는 transformer모델이 나왔고 현대 기계번역 등의 자연어처리 태스크에서 거의 모든 아키텍처가 이걸 기반으로 하고 있다.기존의 seq2seq 모델은 인코더-디코더 구조로 구성되어있고 인코더는 입력 시퀀스를 하나의 벡터로 압축하고 디코더는 이벡터를 통해서 출력 시퀀스를 만들어 냈습니다. 하지만 이런 구조는 인코더가 입력 시퀀스를 하나의 벡터로 압축하는 과정에서 입력 시퀀스의 정보가 손실된다는 단점이 있었고 이를 보정하기 위해 rnn을 없애고 어텐션이 사용되었습니다.
Pca & Lda
Pca란 예를 들어 2차원 데이터가 좌표평면에 막 찍혀있는데 이걸 1차원 어떤 직선에 찍고 싶은 겁니다. 어떤 직선이 원래 데이터를 잘 표현할까, 이걸 어떤 직선에 사영을 시켜야 주성분을 분석 한다고 합니다. 따라서 사진처럼 만차원 데이터를 축소시키고 싶은 차원의 개수만큼 주성분을 분석하여 줄이는 겁니다. Lda도 비슷한데 얘는 조금 다르게 같은 class들는 값들이 모여있고 다른 class들끼리는 분산이 최대한 커지게 하는 축을 찾는 방식입니다.