0. Pytorch(파이토치)란

파이토치는 2017년 초에 공개된 딥러닝 프레임워크로 개발자들과 연구자들이 쉽게 GPU를 활용하여 인공 신경망 모델을 만들고 학습시킬 수 있게 도와준다. 파이토치의 전신이라고 할 수 있는 토치(torch)는 루아 프로그래밍 언어로 되어 있었지만, 파이토치는 파이썬으로 작성되어 파이썬의 언어 특징을 많이 가지고 있다. 

 

파이토치는 페이스북의 인공지능 연구팀 멤버들이 주로 관리하며, 독자적으로 운영되는 파이토치 포럼은 사람들이 질문을 올리면 프레임워크 개발자를 비롯한 많은 사람이 답을 해주는 등 활발히 교류가 일어나고 있다.

 

참고 : https://jfun.tistory.com/238

 

Pytorch란?

1. 파이토치란 무엇일까? 출처 : 파이토치 첫걸음 - 최건호 파이토치는 2017년 초에 공개된 딥러닝 프레임워크로 개발자들과 연구자들이 쉽게 GPU를 활용하여 인공 신경망 모델을 만들고 학습시킬

jfun.tistory.com

 

1. 파이토치 패키지의 기본 구성

  • torch : 메인 네임스페이스입니다. 텐서 등의 다양한 수학 함수가 포함되어져 있으며 Numpy와 유사한 구조를 가집니다.
  • torch.autograd :자동 미분을 위한 함수들이 포함되어져 있습니다. 자동 미분의 on/off를 제어하는 콘텍스트 매니저(enable_grad/no_grad)나 자체 미분 가능 함수를 정의할 때 사용하는 기반 클래스인 'Function' 등이 포함되어져 있습니다.
  • torch.nn : 신경망을 구축하기 위한 다양한 데이터 구조나 레이어 등이 정의되어져 있습니다. 예를 들어 RNN, LSTM과 같은 레이어, ReLU와 같은 활성화 함수, MSELoss와 같은 손실 함수들이 있습니다.
  • torch.optim : 확률적 경사 하강법(Stochastic Gradient Descent, SGD)를 중심으로 한 파라미터 최적화 알고리즘이 구현되어져 있습니다.
  • torch.utils.data : SGD의 반복 연산을 실행할 때 사용하는 미니 배치용 유틸리티 함수가 포함되어져 있습니다.
  • torch.onnx : ONNX(Open Neural Network Exchange)의 포맷으로 모델을 익스포트(export)할 때 사용합니다. ONNX는 서로 다른 딥 러닝 프레임워크 간에 모델을 공유할 때 사용하는 포맷입니다.

 

2. 텐서 조작하기(Tensor Manipulation)

벡터, 행렬 그리고 텐서

기본적인 개념인 vector(벡터), matrix(행렬), tensor(텐서)에 관해 알아보자.

사실 본인 전공은 수학과(수리과학부)라 벡터와 행렬은 정말 익숙하다. 또한 차원 개념에 대해서도 편안하게 받아들여진다. 다만 딥러닝에서는 이를 '차원' 개념에서의 n-th dimension의 입장이 아닌 nd-tensor로 표기하며 이해한다. 사실 이는 다차원 행렬 혹은 다차원 배열과 동일하다.

 

(관련 도움이 될 포스트: https://coding-kindergarten.tistory.com/147)

 

출처 : https://wikidocs.net/231831

Tip

- [1,2,3]과 같은 1차원 tensor의 size는 3이다.

- [[1,2,3],[4,5,6]]과 같은 2차원 tensor의 사이즈는 (2,3)인지 (3,2)인지 헷갈리기 시작한다.

   => 항상 size를 확인할때는 바깥쪽의 괄호부터 카운팅한다. 결국 (2,3) 이다.

 

Tensor Example

출처 : https://wikidocs.net/52460

읽다보니 batch_size라는 것이 있다. 이 batch가 data 작업서 사용하는 batch처리와 일관된 맥락인 것 같아 이해가 편했다.

 

*NLP 분야의 3D tensor 이해

[[나는 사과를 좋아해], [나는 바나나를 좋아해], [나는 사과를 싫어해], [나는 바나나를 싫어해]]

다음과 같은 4개의 문장으로 구성된 훈련 데이터가 있다.

컴퓨터 입력을 위해 각 문장을 단어 단위로 쪼갠다.

[['나는', '사과를', '좋아해'], ['나는', '바나나를', '좋아해'], ['나는', '사과를', '싫어해'], ['나는', '바나나를', '싫어해']]

이제 위 데이터는 4X3의 크기를 갖는 2D tensor이다. 컴퓨터에 입력을 위해 각 단어를 벡터로 변환한다.

예시로 각 단어를 다음과 같은 벡터로 변환한다하자.

'나는' = [0.1, 0.2, 0.9]
'사과를' = [0.3, 0.5, 0.1]
'바나나를' = [0.3, 0.5, 0.2]
'좋아해' = [0.7, 0.6, 0.5]
'싫어해' = [0.5, 0.6, 0.7]

이 내용을 바탕으로 맨 위의 훈련 데이터를 재구성 하면 다음과 같다.

[[[0.1, 0.2, 0.9], [0.3, 0.5, 0.1], [0.7, 0.6, 0.5]],
 [[0.1, 0.2, 0.9], [0.3, 0.5, 0.2], [0.7, 0.6, 0.5]],
 [[0.1, 0.2, 0.9], [0.3, 0.5, 0.1], [0.5, 0.6, 0.7]],
 [[0.1, 0.2, 0.9], [0.3, 0.5, 0.2], [0.5, 0.6, 0.7]]]

이 훈련 데이터는 4X3X3의 size를 갖는 3d tensor이다. 

 

만일 Batch size를 2로 한다면

첫번째 배치 #1
[[[0.1, 0.2, 0.9], [0.3, 0.5, 0.1], [0.7, 0.6, 0.5]],
 [[0.1, 0.2, 0.9], [0.3, 0.5, 0.2], [0.7, 0.6, 0.5]]]

두번째 배치 #2
[[[0.1, 0.2, 0.9], [0.3, 0.5, 0.1], [0.5, 0.6, 0.7]],
 [[0.1, 0.2, 0.9], [0.3, 0.5, 0.2], [0.5, 0.6, 0.7]]]

다음과 같이 두 번의 연산으로 수행할 것이다.

 

각 배치의 훈련 데이터 tensor의 크기는 2X3X3이다.

 

3. Numpy로 텐서 만들기

이미 어느 정도 아는 내용이라 따라만 쳐보고 넘어간다.

- ndim은 몇차원인지를 출력

- shape은 크기를 출력. (7,)은 1X7의 size를 의미.

 

인덱스는 0부터 시작이며 (python이니까..), list와 동일한 문법.

 

당연히 slicing도 마찬가지.

 

2차원의 경우도 동일하다.

2차원부턴 shape이 (4,3)인지 (3,4)인지 헷갈리지 말도록 하자.

 

4. 파이토치 텐서 선언하기

위에서 선언한 t는 1차원이며 print 했을때 list나 array와는 다르게 tensor라는 표기가 같이 나온다.

 

2차원의 경우 Size가 [4,3]으로 표기된다. 이 맥락에서 1차원에 대해 (7,)과 같이 표기되었던 np.array에 비해 좀 더 직관적인 표현이 아닌가 싶다. (1차원 한정이긴하지만..)

 

:를 통해 첫번째 차원에 대해 전체를 선택하며 두번째 차원에 대해 1번 인덱스 (즉, 두번째 값)을 가져온다.

 

 

브로드캐스팅

같은 크기의 행렬들에 대해 덧셈이나 뺄셈을 할 때는 우리가 생각하는 대로 계산하면 된다.

같은 크기의 행렬에 대한 계산

다만, 현실세계는 녹록치 않다. 불가피하게 크기가 다른 두 행렬에 대해서도 계산을 해야하는 상황이 온다.

파이토치에서는 알아서(자동으로) 크기를 맞춰 연산을 수행하게 하는 브로드캐스팅이라는 기능을 제공한다.

 

다음과 같이 크기가 다른 두 행렬에 대해 연산이 원래는 되면 안되지만 m2가 자연스레 [10,10]으로 바뀌며 연산이 되었다.

 

다음과 같이 2 by 1 matrix와 1 by 2 matrix에 대한 연산도 하기의 수정본과 같이 브로드캐스팅 된 이후 이루어진다.

=> 이는 굉장히 편리하지만 주의해서 이용해야한다. (python의 eval()과 비슷한 향기..)

 

자주 사용되는 기능들

행렬 곱셈 vs 곱셈

matmul : 이는 선형대수학에서 아는 평범한 행렬 곱셈을 의미한다.

 

mul : element-wise한 곱셈이다.

이는 m2가 브로드캐스팅 된 이후 각 동일한 위치의 element끼리 곱해졌다.

 

(관련하여 numpy의 dot과 matmul에 대해서도 공부하면 좋을듯

관련 링크 : https://jimmy-ai.tistory.com/104)

 

 

 

mean : 평균 계산

다만 1차원 tensor에서는 각 element에 대한 mean value가 나오지만

 

2차원에서 dimension에 대한 인자를 설정함에 따라 값이 소폭 다르게 나온다.

설명 : dimension을 인자로 주면 해당 차원을 제거한다는 의미라고 한다.

 

sum : mean과 동일하게 작동하지만 평균이 아닌 합을 구하는 것 뿐. 이하 동일.

 

max : 원소의 최댓값을 리턴

argmax : 최댓값을 가진 인덱스를 리턴

 

dimension을 설정하지 않은 상태에서 max를 쓰면 전체 element 중 maximum이 나온다.

하지만 dim=0을 설정하면 위에서 말했듯이 1번째 차원(행)을 삭제하며 (1,2)행렬이 되고 이에 대한 값의 계산은 [3,4]가 된다.

 

뒤에 딸려나오는 indices(index의 복수형)은 함께 리턴되는 argmax 값이다.

 

사실 다음과 같이 type을 확인해보니 t.max(dim~)에 대한 값이 tuple이나 다른걸로 나올줄 알았는데 torch관련 class로 정의된 것이 조금 신기했다.

 

뷰(View) - 원소의 수를 유지하면서 텐서의 크기 변경.

pytorch에서의 view는 numpy에서의 reshape과 같은 역할. -> 텐선의 크기(shape)을 변경해주는 역할.

 

위 텐서의 크기는 (2,2,3)

 

3차원 텐서 -> 2차원 텐서로 변경

-1의 경우 pytorch에게 맡기는 의미이며 두번째 차운의 길이는 3이 되도록 한다는 것이다.

reshape처럼 일렬로 배열 후 다시 합친다 생각하면 좋을 것 같다.

 

만일 [-1,7]의 값을 넣는 경우 

RuntimeError: shape '[-1, 7]' is invalid for input of size 12

와 같은 에러가 발생한다. 12의 약수를 넣어야 변환되기 때문이다.

 

 

사이즈를 3차원 -> 3차원도 된다.

-1로 두 자리 이상을 pytorch에게 맡기는 것은 안된다.

 

 

스퀴즈(Squeeze) & 언스퀴즈(Unsqueeze)

[3,1] 사이즈의 텐서 ft를 정의한 후 squeeze를 사용하면 [3]의 크기를 갖는 텐서로 변경된다.

 

궁금한 점 : 꼭 맨뒤의 차원을 내리는 것인지.

 

결론 (예시에 매몰되지말며 글을 잘 읽자)

- 맨 뒤의 차원은 아님. 1인 차원을 없애는 것임.

- 그리고 1인 차원을 제거하는 것임 (글을 잘 읽기.)

- 1인 차원이 없다면 이전과 동일한 텐서 출력

- 1인 차원이 여러개 있다면 다 제거함.

 

unsqueeze : 특정 위치에 1인 차원 추가

이는 view를 통해 만든 것과 동일한 결과를 만들 수 있음

 

=> view(), squeeze(), unsqueeze()는 텐서의 원소 수를 그대로 유지하면서 모양과 차원을 조절.

 

타입 캐스팅 (Type casting)

텐서에는 자료형 존재. CPU 연산이 아닌 GPU 연산을 위한 자료형 또한 존재.

 

이런 자료형 변환을 하는 것 => 타입 캐스팅

 

long type => 64bit 정수형

float type => 32bit 실수형 (각 element에 . 붙어있음)

 

연결(Concatenate)

pandas dataframe concat과 큰 차이가 없는듯.

 

스택킹(stacking)

처음에 생각했을때는 concatenate과 무슨 차이가 있지 ? 했지만

print된 shape을 보았을때 놀랐다.

 

이는 각 tensor끼리 쌓으며 하나의 dimension을 추가로 구성한 것이고

concat의 경우 list의 append마냥 그저 붙이기에 불과한 것이었다.

 

이 또한 dim=0 or 1을 통해 stacking할 방향을 정해줄 수 있다.

 

ones_like와 zeros_like

이는 numpy array에 zeros나 ones와 동일한 기능을 하는 것 같다.

 

In-place Operation (덮어쓰기 연산)

[2,2] tensor 하나 만들고 mul(2.)를 통해 element-wise하게 곱한 결과 및 기존 값 출력

 

다만, mul이 아닌 mul_ 사용시 원래의 값에 덮어쓰기 하며 출력

(이는 dataframe에 대한 연산을 할 때 inplace=True 와 같은 기능인듯하다.)

 

 

파이썬 클래스(class)

pytorch의 구현체들은 대부분 class 개념을 애용하고 있어 설명한다고 한다.

다만 본인도 class를 건너건너 배웠기에 이번 기회에 다시 쌓아나가보자.

 

함수로 덧셈기 구현

(result를 전역 변수로 선언. 다만 실제 사용한적은 정말 오랜만인듯)

함수 외부에서 정의된 result가 함수 내에서도 전역변수로서 정의가 되었고 이 객체에 그대로 더해지는 모습.

만약 두 개의 객체에 대해 계속하여 덧샘기를 구현하려면 다음과 같이 별도의 함수를 계속 독립적으로 만들어주어야함.

 

클래스(class)로 덧셈기 구현

클래스 생성 후 cal1, cal2라는 각각의 객체 생성.

동일한 method로도 각 객체에 대해 개별적으로 계산되는 모습.

 

 

참고 자료

https://wikidocs.net/book/2788

 

Pytorch로 시작하는 딥 러닝 입문

이 책은 딥 러닝 프레임워크 `PyTorch`와 허깅페이스의 `Transformers`를 사용하여 딥 러닝에 입문하는 것을 목표로 합니다. **AI의 완전 쌩 입문자**…

wikidocs.net

본 카테고리는 해당 책의 wikidocs 기준으로 만들어졌다.

 

기존에 알고 있던 Pytorch에 대해 다시 한 번 기초를 재정립할 겸 이 책을 기준으로 정리하고자 한다.

 

깃허브 주소: https://github.com/ukairia777/pytorch-nlp-tutorial

 

GitHub - ukairia777/pytorch-nlp-tutorial: pytorch를 사용하여 텍스트 전처리부터, BERT, GPT와 같은 모델의 다

pytorch를 사용하여 텍스트 전처리부터, BERT, GPT와 같은 모델의 다운스트림 태스크들을 정리한 Deep Learning NLP 저장소입니다. - ukairia777/pytorch-nlp-tutorial

github.com

 

 

01-01 코랩(Colab)과 아나콘다

 

우선 아나콘다부터 설치를 해준다. 다만, 본 책은 Window기준으로 설치를 진행하고 있기에 Mac(M2)의 설치 방법을 찾아 그대로 따라준다.

 

참고 링크: https://applecoconut.tistory.com/entry/M1-M2-ARM-Mac%EC%97%90%EC%84%9C-%EC%95%84%EB%82%98%EC%BD%98%EB%8B%A4-%EC%84%A4%EC%B9%98%EC%99%80-%EC%A0%9C%EA%B1%B0-%EB%B0%A9%EB%B2%95

 

아나콘다를 설치하는 주요 이유는 다음과 같다. (GPT Thank you)

  • 패키지 관리 및 의존성 해결: 아나콘다는 Conda라는 패키지 관리 도구를 제공하여 파이썬 패키지의 설치 및 의존성을 쉽게 관리할 수 있습니다. 특히, 여러 패키지가 서로 다른 버전을 요구하는 상황에서 환경을 분리하여 문제를 방지할 수 있습니다.
  • 가상 환경 관리: Conda는 가상 환경을 쉽게 만들고 관리할 수 있는 도구로, 프로젝트마다 별도의 환경을 설정하여 서로 다른 버전의 파이썬이나 패키지를 사용할 수 있게 해줍니다.
  • 다양한 과학 및 데이터 분석 패키지 기본 제공: 아나콘다는 데이터 과학, 기계 학습, 통계 분석에 자주 사용되는 패키지들(예: NumPy, Pandas, Matplotlib, Scikit-learn, TensorFlow 등)을 기본적으로 포함하고 있어 따로 설치할 필요가 없습니다.
  • 편리한 설치: 아나콘다는 파이썬과 다양한 패키지를 한 번에 설치할 수 있는 통합 환경을 제공합니다. 이를 통해 초보자들도 번거로움 없이 필요한 도구를 빠르게 설치하고 사용할 수 있습니다.
  • Jupyter Notebook 통합: 아나콘다에는 Jupyter Notebook이 포함되어 있어 데이터 분석 및 학습 과정에서 매우 유용합니다. 이를 통해 코드를 실시간으로 실행하고 시각화할 수 있습니다.

 

설치 완료 후 terminal 오픈 시 다음과 같이 (base)가 앞에 붙어있으며 conda에 대한 command를 확인하였을 때 잘 나오는 것을 볼 수 있다.

> conda update -n base conda
> conda update --all

의 명령어로 모든 파이썬 패키지들을 업데이트 해준다. Proceed [Y/N] 나오는 경우는 Y 후 엔터를 쳐주자.

 

Colaboratory

Colab 주소 : https://colab.research.google.com/

-> 학교 이메일 계정으로 만들었다가 별도의 이점은 없는 것 같아 개인 계정으로 재생성.

 

 

CPU에서 GPU로 런타임 유형 변경을 하려는데 TPU가 존재하여 찾아보니 TPU가 더 맞을 것 같아 TPU로 설정하였다.

(추후 여러 코드를 번갈아 돌려가보며 테스트 진행해보고자한다.)

참고 링크 : https://8terabyte.com/7#google_vignette

 

 

머신 러닝 워크 플로우(Machine Learning Workflow)

출처 : https://wikidocs.net/217160

 

1. 수집

데이터 수집에 있어 어떤 데이터를 수집할 것인지, 어느 범위까지 수집할 것인지 생각해야한다.

DSP 입장에서는 어떤 소스를 통해 (ex. from DMP인지 어느 bundle들로부터 데이터를 가져올 것인지, 그 외의 검색 데이터, 혹은 행동 데이터를 가져올 것인지) 데이터를 수집할 지 결정하여야한다.

개인적인 생각으론 수집 단계에선 최대한 많은 데이터를 가져오는 것이 중요하지 않을까 생각한다. 어차피 후의 전처리 및 정제 단계에서 무의미한 데이터들이라면 줄이면 되기 때문이고, 모델링 단계에서 feature 및 factor의 수를 줄이며 연산을 최적화 하고자 하려하기 때문이다.

 

2. 점검 및 탐색

데이터들의 어떤 구조를 띄고 있는지, 데이터의 특징 파악 단계이다.

 

3. 전처리 및 정제

DA로 일을 하며 이 부분이 가장 어렵지 않나 라고 생각된다. 주관적이면서도 객관적이게 데이터를 정제하며 남들을 설득시킬 수 있어야하고 이 부분에서 얼마나 전처리가 잘 되었는 지가 추후 Model의 성능을 결정하기도 하기 때문이다.

또한 Outlier들에 대한 처리를 무조건적으로 제거하는 것이 아닌 각 상황에 따라 알맞게 통제해야 더 좋은 insight를 얻을 수 있다.

 

4. 모델링 및 훈련

모델을 만든 후 Train / Test set을 구분하여 훈련시키거나 hyperparameter에 대한 조정이 필요하면 Validation set 또한 만들어 훈련을 진행하곤 한다. 항상 Overfitting과 Bias에 주의하자.

 

5. 평가

완성된 모델을 평가한다.

 

6. 배포

모델이 성공적이라 판단되면 배포한다.

 

Pandas, Numpy, Matplotlib

pandas

주로 사용하는 데이터 타입은 Dataframe과 Series이다.

numpy

list와 비슷한 구조를 가지지만 더 빠른 연산과 차이점이 조금 있다.

matplotlib

시각화 툴이다. seaborn까지 같이 이용하면 더 아름다운 시각화를 할 수 있다.

 

위 내용들은 이미 잘 알고 있는 부분이라 넘어간다.

 

 

01-05 데이터의 분리(Splitting Data)

출처 : https://wendys.tistory.com/169

학습의 종류에는 크게 세 종류가 있다.

1. 지도 학습(Supervised Learning), 2. 비지도 학습(Unsupervised Learning), 3. 강화 학습(Reinforcement Learning)

 

다만, 이 책에서는 대부분 지도 학습(Supervised Learning)에 대해 배울 예정이다.

지도 학습은 라벨링된 정답이 있는 데이터를 학습 시킨다.

 

그럼 정답이 있는 데이터들을 모두 학습 시키는 것이 아닌 일부는 훈련(train)에 사용, 일부는 테스트(test)에 사용한다.

보통 7:3이나 8:2로 진행하는 것 같다.

 

위 작업을 진행하기 위해서는 데이터를 나눠야하는데 pandas의 Dataframe을 이용할 수도 있고, numpy를 이용할 수도 있다.

다만, scikit-learn을 사용하는 것이 조금 더 편해보인다.

 

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2, random_state=1234)

 

다음과 같은 코드로 분리를 할 수 있다.

 

test_size는 해당 데이터 중 test set의 비율을 얼마나 할 것인지 정하는 param이다.

위 0.2는 20%를 test size로 사용하겠다는 의미이다.

 

random_state는 랜덤으로 데이터를 분할할 때의 시드값이다.

이를 지정하지 않으면 위 코드를 돌릴때마다 다르게 분리가 된다. 하지만 특정 값을 사용하면 계속하여 동일하게 분리된 set들을 얻을 수 있다.

0. 포스팅 목적

주변 지인이 자신이 들었던 수업의 모든 강의 노트를 레이텍으로 쓴 문서를 보여주었는데 굉장히 많은 수식과 Notation을 아름답게 정리하여 감명을 받았고, 언젠간 쓸 일이 있을 것 같아 조금이라도 미리 알아두고자 한다.

 

또한, 현재 Data Analyst로 복무 중인 회사에서도 Notion을 사용할 때 글을 더 잘 작성할 수 있을 것 같다.

알고보니 노션은 TeX 기반인듯. 그래도 뭐라도 알아두면 좋을 것 같다.

 

 

1. LaTeX란 무엇이며, 어디에서 사용되는가?

LaTeX(pronounced "Lah-tech" or "Lay-tech")는 주로 학술 문서 작성에 사용되는 문서 준비 시스템.

LaTeX는 수학, 물리학, 컴퓨터 과학 등의 분야에서 널리 사용되며, 복잡한 수식이나 표, 그림을 포함한 문서를 정교하게 작성할 수 있도록 돕습니다. 특히 학술 논문, 기술 보고서, 책과 같은 긴 문서를 작성할 때 유용합니다.

LaTeX는 TeX라는 시스템을 기반으로 하며, 문서의 구조와 형식을 사용자에게 부담을 주지 않고 관리해 주는 강력한 도구입니다.

 

주요 특징으로는 다음과 같은 부분이 있습니다:

  • 복잡한 수식과 수학 기호를 손쉽게 입력할 수 있다.
  • 문서의 일관된 스타일을 유지하며, 서지 및 참고문헌 관리를 자동화한다.
  • 표, 이미지, 목차 등을 쉽게 작성하고 조정할 수 있다.
  • 고품질의 출판물 수준의 PDF 출력을 지원한다.

주로 학술 논문을 작성하는 대학 교수, 대학원생, 연구자들이 많이 사용하며, IEEE, ACM, APS 같은 학술 기관에서는 LaTeX 포맷으로 논문 제출을 권장하고 있습니다.

 

2. TeX와 LaTeX의 차이점

TeX는 도널드 크누스(Donald Knuth)가 1978년에 개발한 문서 조판 시스템입니다. TeX는 매우 강력하고 유연한 시스템이지만, 사용자가 세부적인 문서 형식을 직접 지정해야 하기 때문에 복잡한 구조의 문서를 작성하는 데 시간이 많이 걸릴 수 있습니다. TeX는 기본적으로 텍스트와 수식을 입력하고, 이를 고품질의 출력물로 변환하는 도구입니다. 그러나 사용자가 서식 지정과 같은 부분까지 직접 다뤄야 하기 때문에 초보자에게는 다소 어려울 수 있습니다.

반면, LaTeX는 Leslie Lamport가 1980년대에 TeX 위에 개발한 패키지로, 문서 형식을 자동으로 관리해주는 도구입니다. 사용자는 문서의 내용을 입력하는 데 집중하고, 서식이나 구조는 LaTeX가 처리하도록 할 수 있습니다. 이는 사용자가 복잡한 조판 작업에 시간을 쓰지 않고도 고품질의 문서를 만들 수 있도록 도와줍니다.

 

요약하자면:

  • TeX: 문서의 내용을 입력하고, 형식과 구조를 세밀하게 조작할 수 있는 기본 도구.
  • LaTeX: 문서의 형식을 자동으로 처리해 주며, TeX보다 사용자 친화적이고, 대규모 문서 작성에 적합.

 

3. LaTeX와 일반적인 워드 프로세서의 차이점

일반적인 워드 프로세서(예: Microsoft Word, Google Docs)는 사용자가 직접 문서의 레이아웃과 스타일을 지정하며, 'WYSIWYG'(What You See Is What You Get) 방식으로 실시간으로 문서의 최종 출력을 확인하면서 작업합니다. 이는 직관적이고 접근성이 좋아서 일상적인 문서 작성에 적합하지만, 복잡한 수식 입력이나 대규모 문서 관리에서는 한계가 있을 수 있습니다.

 

반면 LaTeX는 텍스트 기반의 마크업 언어를 사용하여 문서의 구조와 내용을 지정하고, 이를 컴파일하여 최종 PDF 파일을 생성합니다. 사용자는 실시간으로 최종 결과를 볼 수는 없지만, LaTeX는 문서의 형식과 서식을 자동으로 관리하기 때문에 대규모 문서의 일관성을 유지하는 데 매우 효율적입니다. 주요 차이점을 정리하면:

  • 문서 작성 방식:
    • 워드 프로세서: 실시간으로 보이는 대로 편집(WYSIWYG).
    • LaTeX: 텍스트 기반 명령어로 문서 구조를 지정하고, 나중에 컴파일하여 출력물 생성.
  • 서식 관리:
    • 워드 프로세서: 사용자가 서식을 직접 설정.
    • LaTeX: LaTeX가 문서 서식과 레이아웃을 자동으로 관리.
  • 수학적 표현:
    • 워드 프로세서: 수식을 삽입할 수 있지만, 복잡한 수식은 다루기 어려움.
    • LaTeX: 고급 수식과 기호를 쉽게 입력하고 관리할 수 있음.
  • 대규모 문서 관리:
    • 워드 프로세서: 긴 문서에서 서식 일관성 유지가 어려울 수 있음.
    • LaTeX: 긴 문서에서 일관성 있는 스타일을 유지하며 참고문헌, 목차 등을 자동으로 관리.

LaTeX는 높은 학습 곡선을 가질 수 있지만, 한 번 익히면 특히 학술적인 문서 작성에서 큰 이점 제공.

 

 

기초 문법 연습

사용 사이트

(프로그램 설치 없이 온라인으로 작성 가능)

https://www.sharelatex.com/

 

ShareLaTeX, Online LaTeX Editor

An online LaTeX editor that's easy to use. No installation, real-time collaboration, version control, hundreds of LaTeX templates, and more.

www.sharelatex.com

 

sharelatex project 화면

로그인을 잘 하고 Blank Project를 새로 생성하면 다음과 같은 화면이 표기된다.

 

좌측은 LaTeX 혹은 Visual Editor로 수정할 수 있는 화면이고

우측은 Complie시 보이는 화면이다.

 

다음과 같이 표기가 된다.

 

 

 

인라인 수식 : 텍스트 중간에 수식을 삽입할 때 사용. 수식은 $ ... $와 같이 $ 사이에 작성.

 

예시 :

The quadratic formula is $x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$.

 

결과 : 

 

 

수식 블록: 수식을 한 줄로 표현하고 싶을 때는 \[ ... \]를 사용.

 

예시: 

\[ x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} \]
결과:
 
 
 
 
기본 수식

 

- 제곱, n승, 수열

a^2, a^n, a_{i+1}

 

- 루트

\sqrt{a+b}, \sqrt[3]{x}

 

- 시그마
\sum_{i=1}^{n} i^2

 

- 적분

\int_{0}^{1} x^2 \, dx

 
- 그리스 문자
\alpha + \beta = \gamma, \pi \approx 3.14159

 

LaTeX로 논문을 부드럽게 쓰려면 갈 길이 멀다고 느껴진다.

하기 내용은 teddylee777의 Github을 바탕으로 구성됨.

 

https://github.com/teddylee777/machine-learning

 

GitHub - teddylee777/machine-learning: 머신러닝 입문자 혹은 스터디를 준비하시는 분들에게 도움이 되고

머신러닝 입문자 혹은 스터디를 준비하시는 분들에게 도움이 되고자 만든 repository입니다. (This repository is intented for helping whom are interested in machine learning study) - teddylee777/machine-learning

github.com

https://github.com/ml-tooling/best-of-ml-python

 

GitHub - ml-tooling/best-of-ml-python: 🏆 A ranked list of awesome machine learning Python libraries. Updated weekly.

🏆 A ranked list of awesome machine learning Python libraries. Updated weekly. - ml-tooling/best-of-ml-python

github.com

이것도 도움 많이 될 것 같기도 하고..

 

우선 내가 관심 있는 분야가 무엇인지 생각해보자.

1. Computer Vision

2. NLP

3. Ranking Algorithm System

4. (비슷하지만) Recommendation System

 

굳이 따지자면 NLP보단 CV쪽 좋아하는 듯.

특히 LLM은 안 좋아하는듯.

Reinforcement Learning하고 그래도 LLM 공부도 해보고 싶은데 갈 길이 머네.

 

 

논문 리뷰를 한다면 굵직한 것들 위주로 할 것 같다.

NLP 부분에선 다음과 같이 진행할듯하다.

  1. Attention is all you need(2017)
  2. BERT: Pre-traning of Deep Bidrectional Tranformers for Language Understanding(2018)
  3. GPT(Generative Pre-trained Transformer)(2018)
  4. GPT-2: Language Models are Unsupervised Multitask Learners(2019)
  5. Transformer-XL: Attentive Language Models with Long-Range Dependencies (Dai et al., 2019)
  6. XLNet: Generalized Autoregressive Pretraining for Language Understanding (2019)
  7. T3: Exploring the Limits of Transfer Learning with Text-to-Text Transfomer (2020)
  8. GPT-3: Language Models are Few-Shot Learners(2020)
  9. LaMDA: Language Models for Dialogue Applications (2021)
  10. Pathway Language Model: A Novel Neural Architecture for Natural Language Processing (2022)
  11. LLaMa: Open and Efficient Foundation Language Models(2023)
  12. GPT_4: A Large Multimodal Model for Generating Text, Translating Languages, Writing defferent Kinds of Creative Content, and Answering Your Questions in a Informative Way(2023)
  13. PaLM-E: An Embodied Multimodal Language Model (2023)
  14. Claude 2: A Large Language Model for the Next Generation of (2023)
  15. HyperCLOVAX: A Korean-specific Large Language Model for the Next Generation (2023)

다만, 기존 RNN이나 CNN 기반에 대해서도 다져놓고 가고 싶은데 더 찾아봐야겠다.

 

아마 컴퓨터 비전 쪽에선

1. ImageNet Classification with Deep Convolutional Neural Networks(AlexNet)

2. You Only Look Once: Unified, Real-Time Object Detection

3. Generative Adversarial Networks(GAN)

의 순서로 갈 거 같은데 맞는 지는 잘 모르겠다.

 

고민하지 말고 일단 해보고 생각하자.

꾸준히만 가면 누구든 내가 다 이긴다.

'ML & AI' 카테고리의 다른 글

Object Detection for All  (0) 2024.11.24
머신러닝 모델 - 1. 선형 회귀 모델 (Linear Regression)  (0) 2024.09.21

Before to Start

     I currently work as a data analyst in the ad-tech field. As I mainly deal with the publisher and SSP sides, I haven't had much opportunity to consider the strategies of DSPs and other ecosystem participants. This time, I want to gain a deeper understanding of the strategies employed by these other players in the ecosystem.

  There are lots of participants in the ad-tech ecosystem, such as Publisher, SSP (supply-side platform), DSP (demand-side platform), Advertiser, ad-exchange, and more. Since their roles and the scope of their possible responses vary, their strategies also differ significantly. By understanding these differences, I aim to learn more about the other participants.

 

Ad tech Landscape 2023 for Playwire

 

Publisher (매체)

  Publisher(매체)는 inventory라고 하는 '지면'을 제공한다. 이러한 지면을 광고 게재를 통해 수익을 창출한다. 머나먼 이전에는 광고주들과 다이렉트로 계약하여 광고를 게재하고 수익화를 하였지만 현재는 SSP나 Ad exchange를 통해 더욱 안정적이고 다양한 수익화를 실현한다. 기술의 발전으로 인한 RTB(Real-Time Bidding)가 큰 몫을 하였다.

 

Amazon Ads Example. 다음과 같이 매체 내에 광고를 게재할 수 있는 공간을 Inventory 혹은 지면 이라고 한다.

 

  퍼블리셔가 할 수 있는 몇가지 수익화 방안들이 있다.

 

  1. 다양한 SSP 연동 및 자체 미디에이션 구축

Header Bidding Example (from: https://clearcode.cc/blog/adtech-for-publishers/)

     여러 SSP의 SDK들을 직접 어플에 탑재하여 Inhouse Mediation을 구축하는 방안이 있다. Waterfall mediation이나 Header Bidding을 통해 직접 미디에이션을 구축할 수도 있다. 또한, 퍼블리셔의 데모그래피 혹은 타겟 국가에 따라 최적화가 잘 되는 특정 SSP가 존재할 수 있다(이는 SSP와 연동된 dsp나 ssp의 자체 물량 조달에 의존). 혹은 직접 Inhouse-Mediation을 구축하는 것이 아닌 Mediation Platform을 도입하여 다양한 네트워크를 연동할 수 있다.

  2. 여러 지면 발굴

     여러 어플들을 사용하다보면 광고가 하나도 없는 앱이 있고, 광고가 덕지덕지 붙어있는 앱들이 있다. 수익화 측면에서는 당연히 광고가 많을 수록 기대수익이 올라간다. 또한 사용자 경험을 해치지 않는 선에서 Interstitial 광고나 Rewarded Video를 노출시킬 수도 있다.

3. SSP의 Bid floor 조정

     만일 Publisher가 자체 Waterfall Mediation을 구축하였다면 각 SSP들의 bid floor를 조정하여 Revenue를 최적화할 수 있다.

 

Fill Rate과 eCPM의 적절한 조화가 수익에 매우 중요하다.

https://www.linkedin.com/pulse/your-waterfall-how-publishers-monetise-ad-inventory-vinnakota/

다음과 같이 여러 SSP를 사용함으로서 하나의 SSP로 만들 수 있는 최대 수익보다 더 많은 수익을 창출할 수 있다.

(위와 같은 사진에서는 Waterfall Mediation을 이용하여 서로 다른 eCPM을 Targeting(Bid floor를 조정하거나, CPC 물량의 비중을 파악하여) 하여 No Fill을 최소화 하여 매출을 최대화 할 수 있다.)

 

또한, 개인정보 활용안을 이용하여 ssp나 dsp쪽으로 유저 식별값들(ex. hashed 된 email, 성별, geolocation 정보들)을 보내주면 더 잘 사거나 비싸게 살 수 있다.

 

다만 해당과 같이 최대 수익을 창출하기 위해선 SDK 탑재 및 여러 세팅이 정상적으로 이루어져야한다.

해당 Format에 올바른 사이즈의 광고들이 불러지는지, SSP측과 discrepancy가 발생하지 않기 위해 SDK에서 측정하는 impression이나 Click이 잘 작동하도록 세팅되었는지, Mediation에 연동된 Network들이 정상적으로 작동하는 지 등 개발적 측면에서도 원활하게 작동해야 한다.

 

최종적으로 Publisher는 본인의 지면을 Selling하는 것이기에 최대한 높은 가격으로, 최대한 많이 파는 것이 중요하다.

 

SSP(Supply-Side Platform)

SSP의 수익 모델에는 무엇이 있을까. 아마 수수료 장사일 것이다.

DSP -> SSP -> 매체 를 통해 광고가 송출되기에 사이에서 15~30% 정도의 수수료를 받는다.

또한, dsp를 통한 것이 아닌 ssp 자체적으로 광고를 조달하여 (물론 기술력이 된다면) 팔 수도 있다.

나가는 것은 인건비, 서버 유지비 등이 있을 것인데 대규모 트래픽 처리가 필요하여 어느 정도의 기술력은 요구된다.

 

SSP 입장에선 Bidder들(DSP)의 관리가 중요할 것이라 생각한다. 무작정 많은 Bidder들을 연동한다면 bid request에 대한 response가 늦게 들어올 수 있고, 혹은 문제를 일으킬 수 있다. 빠른 response는 Auction의 종료를 빠르게 하며 Auction이 빠르게 종료될 수록 매체에 보내는 응답이 빨라지게 된다. 유저가 해당 지면에 얼마나 오래 머무를 지 모르기에 빠른 응답도 수익 증대에 도움이 되는 방향이다.

 

https://www.leadswork.net/en/leadswork-en/rtb-tmax-understanding-and-utilization/

물론 tmax(최대입찰시간)를 설정하여 자체적으로 request에 대한 response 응답을 종료하고 이후 flow로 넘어갈 수 있다.

 

추가로 일반 open auction이 아닌 Guaranteed Deal, Preferred Deal, Private Market Placd 등으로 추가 수익화를 노려볼 수 있다. (어차피 수수료 장사이기에 매체 입장에서 매출이 늘어날 수록 SSP의 매출도 늘어난다.)

 

또한, 많은 다양한 Publisher들을 연동하는 것이 중요하다. 예를 들면 특정 오래된 Publisher에 연동된 SSP들이 몇 없는 경우가 있다. 이런 경우 특정 DSP들이 큰 비용을 지불하고서라도 해당 SSP에 입찰하는 경우가 있다.

 

SSP는 기술력보단 영업력이 중요한 것이 아닐까 생각한다. Meta의 경우 뛰어난 기술력은 있지만 매체 관리 측면에서 힘들어서인지(?) SSP 사업을 접은 것처럼말이다.

 

DSP(Demand-Side Platform)

DSP는 광고주가 다양한 광고 인벤토리에 실시간으로 접근하고 구매할 수 있도록 돕는 플랫폼이다.

DSP는 광고 캠페인을 관리하고, 타겟팅을 최적화하며, 실시간 입찰(RTB)을 통해 효율적으로 광고를 구매할 수 있게 함.

 

RTB의 발전으로 인해 가장 많은 수혜를 본 것이 DSP이자 가장 많이 머리가 아픈 것도 DSP가 아닐까 싶다.

이전에는 적당한 CPC나 CPM으로 정산을 하며 (광고주와 exchange) 중간에서 커미션을 받으면 되었지만 현재는 최소한의 비용으로 최대한의 효율을 내기 위해 노력을 많이 하는 것 같다.

 

이 부분은 뇌피셜적인 부분이 있지만 많은 SSP 혹은 DSP들이 점차 Ad-Exchange로까지 확장하는 이유는 본인들의 효율을 더 객관적으로 평가하고 타 DSP들의 Bidding 및 Performance를 확인하며 Bench-marking 할 수 있기 때문이 아닐까. 또한 Bench Marking 뿐 아닌 커미션을 독자적으로 흡수할 수 있는 platform 사업이 되어가는 것 아닐까.

예를 들면 MAX에서의 AppLovin이나 ironsource에서의 unityads나 본인들의 수준을 평가하며 개선 - 보완해나갈 수 있지 않을까.

또한 Admob의 경우도 타 미디에이션 플랫폼을 이용한 admob 보다 admob sdk를 선호하긴 한다.  

 

Real-world에서 생각을 해보자면 정말 '효율적인' 방법으로만 입찰을 하여 진행을 할 수 있지만 광고주들의 특정 압력이 존재할 수도 있을 것 같다. 광고주 입장에서 광고를 통해 원하는 점은 '특정 페이지에 인입되는 유저 수 증대' 혹은 '특정 어플 설치' 등이 있을 수 있다. 하지만 특정 어플의 특정 지면들에 대해서는 '실수로 클릭을 유발하는' 지면들이 존재하고 이러한 클릭을 통한 성과는 제외하여야하기에 Conversion을 높이는 유저들을 더욱 타겟팅해야할 것이다. 그래서 CTR Prediction 뿐만 아닌 CVR Prediction도 유의미하게 발전해나가야한다.

 

그리고 월별로 광고비를 설정하다보니 '이번달 내에는 최소 이만큼의 유저는 끌어들여야해' 혹은 '이만큼의 PV는 찍어야해'라는 압박이 있을 수도 있을 것 같다. 그렇다보니 정말 '효율적인 입찰'뿐만 아니라 조금은 비 효율적이더라도 더 많은 물량을 때려박아 적당한 (최고의 효율과 최대한의 매출의) 타협을 하는 것도 있지 않을까 싶다.

 

그외에도 DSP - Publisher의 직접 연동도 가능한 것으로 알고 있다. 중간에 SSP나 Ad-Exchange를 거치지 않다보니 더 적은 비용으로 지면을 구매할 수 있기에 비용적으로 유리하다. 다만 Publisher 입장에서 DSP와 다이렉트로 연동하며 (SDK 탑재든 S2S 연동이든) 공수가 들텐데 Fill Rate을 못 채우거나 만족스러운 eCPM이 나오지 않으면 상생이 어려울 수 있을 것 같다.

 

그럼 DSP는 입찰할 때 무엇을 기준으로 입찰하는가? => 유저의 adid 및 기타 device, geo 정보들이다.

bid request가 보내올때 adid를 비롯한 여러 정보가 있기에 본인들이 소유한 데이터 혹은 DMP에서 어떠한 유저인지 알 수 있다. 기존에 어떤 물품들에 대해 구매를 하였고 구매 패턴이 어떻고 관심사는 어떻고 데모그래피는 어떤 사람이고 등. 또한 다른 웹사이트 및 앱 데이터, 제3자 데이터, CRM 데이터, 쿠키 및 픽셀 등 을 사용하면 정말 많은 정보들이 있을 것 같다. 어떤 페이지에 머문 기간을 통해 해당 유저의 관심사가 어떤지, 어떤 물품 구매를 희망하는 지 알 수 있고 유저가 구매할 확률을 계산할 수도 있다. 이러한 확률을 통해 기댓값보다 낮게 입찰하여 낙찰된다면 수익을 내는 것이 아닐까.

이러한 확률 계산은 매우 어렵다. 데모그래피적 특성, 매체의 특성, 최근의 CTR이 어떤지 등이 모두 고려되어야 하지 않을까. 그래서 요즘은 ML 기술력이 중요하다 생각한다.

 

ROAS를 증대시켜야 광고주들로부터 더 많은 물량을 받게 되고 그로 인한 수익은 더 증가할 것이다.

그래서 내가 DSP에서 일을 해보고 싶다. (결국 못하고 ad-tech 업계를 떠나게 되었다.)

 

DMP

데이터 저장소 역할.

다만, 어느 소스로부터 adid를 수집하고, 동일 유저에 대한 판별은 어떻게 할 것이고 등의 적당한 기술력은 지녀야 할 것 같다.

예를 들어 ad-exchange와 협약을 맺어 adid들에 대한 정보를 가져온다면 (어떤 dsp에서 집행한 광고인지는 몰라도) 어느 종류의 광고 (ex. 신발광고)를 클릭(혹은 전환)에 대한 데이터를 얻는다면 유저 - 관심사에 대한 맵핑이 가능하고 더 높은 단가에 팔 수 있을 것이라 생각한다. 최대한 많은, 정확한, 최근의 관심사를 반영할 수록 DSP에게 더욱 환영받을 것 같다.

 

Advertiser

광고주는 어떤 식으로 진행하는 지 잘 모르겠다.

경험해본 바로는 구글 애즈 / 애플 서치 애즈 / 메타 밖에 안 틀었던 것 같은데 Criteo 같은 곳에서 광고를 집행하는 회사들이 진짜 있는 지는 잘 모르겠다. 그리고 사실상 현재 한국은 쿠팡이 굉장히 큰 손인 것으로 알고있다. 쿠팡 광고를 집행하는 것이 쿠팡에서 spending을 태우는 것인지, 구매까지의 Conversion에 자신 있는 dsp들이 본인들의 커미션을 생각하고 태우는 것인지는 잘 모르겠다.

 

 

 

 

+ Recent posts