일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 재귀
- 파이썬
- 개발환경
- 손실함수
- 신경망 학습
- pyenv
- 15649
- 가상환경
- 그리디 알고리즘
- n과 m
- Python
- 파이싼
- 백트래킹
- N-Queen
- 실버
- 1002
- 경사하강법
- 설정
- 밑바닥부터 시작하는 딥러닝
- Mac
- 9020
- 1101
- 4948
- 백준
- end to end
- 기계학습
- BOJ
- streamlit
- Today
- Total
파이톨치
[부스트캠프] 프리코스 정리 본문
부스트캠프에 대한 내 생각
부스트캠프에서 다루는 내용의 범위가 생각보다 방대했다.
컴퓨터를 전공한 사람이 보기에도 내용이 많다.
선형대수부터, 트랜스포머까지 다루며, 최적화는 물론 GPU를 어떻게 효율적으로 쓰는지에 대해서도 나온다.
전공을 배우는 과정에서도 이렇게 깊게 다루진 않는다.
문과분들에겐 미안하지만, 문과분들은 시작부터 빡센 이 내용을 따라가기 힘들 것이라는 생각이 들었다.
컴퓨터를 전공하면서, 인공지능에 진심으로 도전하려는 이들에게 적합한 내용이라는 생각이 들었다.
내 입장에서는 대학원에 가서 열심히 구르기 전에 여기서 굴러보는 것이 좋을 것이라는 확신이 들었다.
때문에 만약 합격을 하게 된다면, 여기서 알려주는 내용을 모두 흡수하고 이 집단에서 1등하는 것을 목표로 할 것이다.
단순히 합격하고 따라가기만 해서는 부족하다. 여기 도전하는 사람들, 그 위에 서고 싶다.
사실 안 붙어도 큰 상관은 없다. 대회가 있다면 계속해서 도전하려고 했고, 전국에서 알아주는 사람이 되고 싶기 때문이다.
이건 넘어야 할 작은 산이다. 큰 산을 넘기 위한 준비과정이다. 넘어지면 안된다.
이것을 작성하는 것은 순전히 나를 위해서이며, 내가 모르거나 헷갈리는 것들만 적었다.
기초 수학
내 생각에 코딩 분야에서 수학을 가장 많이 쓰는 분야는 인공지능 분야라는 생각이 든다.
그 중에서도 선형대수와 확률에 대해 많이 사용하는데, 인공지능이 하는 것은 선형대수를 통해서 확률을 계산하는 것이다.
우리가 흔히 신경망이라고 부르는 것들은 matrix의 연속적인 연산이다.
여기서는 벡터와 matrix에 대한 연산은 이미 알기에 생략한다.
가장 먼저 헷갈렸던 것은 norm에 대한 것이다. 학부시절 배웠지만, 잊고 지냈다.
norm은 벡터의 길이를 측정하는 방법이다.
우리는 고등학교 과정에서 2차원 벡터의 크기를 구하는 법을 배운다. 바로 유클리드 거리이다.
이는 피타고라스의 삼각형을 이용하는 방법이다. a 제곱 + b 제곱 = c 제곱의 형태이다.
이를 확장하여 n 차원에 대한 벡터의 크기를 구할 수 있으며, 선형대수에서는 L2 norm이라고 부른다.
이는 벡터의 모든 요소를 균등하게 고려하기에 노이즈에 민감하지 않고 안정적인 성능을 보인다.
L2가 있다면, L1도 있을 것이다. 이는 절대값에 대한 길이다. L2에서는 제곱을 해서 양수로 만들었지만, 여기서는 절대값을 사용한다. 벡터의 원소들에 대해서 절대값을 취하고 이를 모두 더한 길이이다.
이를 규제로써 활용하면, 희소 벡터를 선호하는 경향이 있다고 한다. 희소한 벡터가 있을 때 값을 크게 만드는 것이다.
때문에 희소하며 중요한 특징만 남기게 만들 수 있다.
다음은 내적이다. 이를 통해 유사성을 측정할 수 있다. 대표적으로 코사인-유사도가 있다. 내적 값 자체는 벡터의 모든 요소들끼리 스칼라곱을 해주면 된다. 벡터와 벡터가 있을 때, 여기 있는 원소들을 1대1로 곱해주면 된다.
이것을 앞에서 본 L2 거리 값으로 나누어 주게 되면, 그것이 코사인 값이 된다. 코사인 값이기에 -1 ~ 1 사이의 값이 된다.
1에 가까울수록 비슷하고, -1에 가까울수록 서로 반대인 특성이 된다.
기울기 벡터를 활용하면, 가중치를 업데이트 할 수 있다. 기울기 벡터는 함수에 대해 변수별로 편미분 한 값이다.
기울기 벡터가 가리키는 방향은 함수가 가장 빠르게 증가하는 방향이다. 때문에 기울기 벡터 반대 방향으로 가야 감소하는 방향이다.
때문에 기울기 벡터에 -를 붙여 가중치를 업데이트 한다. 가중치 = 가중치 - 기울기 벡터가 된다.
이러한 연산을 하는 것을 최적화라 하며, 가중치를 업데이트하며 손실함수에 대해 최소값을 찾아가는 과정이다.
최적화는 여러가지 기법이 있으며, 각각 다른 특징을 가지고 있다.
가장 대표적인 것이 경사하강법이다. 여기서 모든 값을 사용할 수도 있는데 이는 계산하기 힘들다. 최신 AI 모델의 크기가 너무나 방대하기 때문이다. 이를 현대에서는 배치 경사하강법이라고 부르기도 한다.
때문에 확률적인 경사 하강법이나, 미니 배치 경사하강법을 사용한다. 확률적인 것은 매번 새로 뽑아서 업데이트 하는 것이고, 미니 배치는 미리 나누어 두고 배치를 변경해 가며 하는 것이다. 병렬화 관점에서 보았을 때, 미니 배치가 효율적이다.
모멘텀 기법은 관성 개념이다. 이전 업데이트의 방향을 고려해 최적화 과정을 가속화하는 방법이다. 이를 통해 지역 최소값에 빠지는 것을 일부 방지할 수 있다.
Adagrad는 각 매개변수에 맞춤형 학습률을 제공하는 것인데, 이를 통해 자주 나타나는 매개변수의 학습률을 줄일 수 있다고 한다. 어찌보면 L1 규제와 비슷한 동작을 한다.
RMSprop는 위의 단점을 보안하기 위해 각 매개변수가 아니라 이동 평균을 이용해 학습률을 조정한다.
Adam은 현대에서 가장 많이 쓴다고 생각하는 최적화 기법이다. RMSprop와 모멘텀을 적절하게 결합한 식이다.
통계에서 가장 중요한 지표를 소개한다. 이는 분산이다. 사실 중고등학교 때 배우는 내용이지만, 그럼에도 까먹은 부분들이 있어 작성한다. 평균은 오해의 소지가 없지만, 분산의 경우 표본의 분산인지, 모분산인지 중요하다.
모분산인 경우에는 (평균-값)의 제곱을 모두 더한 후에 확률값을 넣어주기 위해서, n으로 나눈다. 하지만 표본분산의 경우, 확률 값을 넣어주기 위해서 n-1의 값으로 나누니 주의하자.
다음은 조건부 확률이다. 이 개념은 내가 중학생 때, 테일즈런너 수학 킹왕짱을 읽으며 학습했던 기억이 있다. 초원이 초능력을 쓰기위해서 조건부 확률을 계산한다. 어떤 사건이 일어났을 때, 특정한 사건이 일어날 확률이다. 즉, 어떤 사건이 일어났다고 가정했을 때, 특정한 사건이 일어날 확률이다. 엄밀히 말하면 틀린 설명일 수 있지만, 이렇게 설명하는게 더 명확하고 재밌다고 생각한다. 예를 들어, 내가 사람을 때렸을 때, 그 사람이 나를 때릴 확률을 구하자고 하자. 이것을 구하기 위해서는 내가 사람을 때려야 한다. 그랬을 때, 그 사람이 나를 때릴 확률은 1일 것이다. (물론 때릴 확률이 0에 수렴할 것이다.)
이것을 확장한 것이 베이즈 정리이다. 이는 사실 단순한 연산이다. 하지만, 내가 모르는 확률에 접근할 수 있게 해준다.
예를 들어서, 한 학급에 학생이 100명이 있다. 여학생 30% 중 3%가 외국인이다. 또 남학생 70% 중 8%가 외국인이다. 해당 학급에서 임의로 뽑은 1명이 외국인일 때, 이 학생이 여학생일 확률을 구하시오(소수점 셋째자리에서 반올림 하시오).
위와 같은 문제가 있을 때, 하나씩 값을 구해보자. P(여학생) = 0.3 이다. P(외국인) = 0.3 * 0.03 + 0.7 * 0.08 이다.
그렇다면 여학생인 경우 외국인인 경우는 무엇일까? P( 외국인 | 여학생 ) = 0.03이다. 왜냐고? 앞에서 본 조건부 확률을 생각해보자. 그렇다면 P ( 여학생 | 외국인 )의 연산은 간단해진다. 0.03 * 0.3 / (0.03 * 0.3 + 0.7 * 0.08) = 0.14가 된다.
다른 방법으로 구할 수도 있다. 단순한 조건부 확률로 구해보면, (0.3 * 0.03) / (0.03 * 0.3 + 0.7 * 0.08) 로 구해도 동일하다.
어렵게 생각할 필요 없다. 모두 조건부 확률에서 파생된 결과이다.
이런 확률을 구할 때, 인과관계를 잘 이해해야 한다. 예를 들어서, 태양이 뜨거운 여름날 아이스크림 판매량이 늘어났다. 동시에 상어에 대한 피해률이 올랐다. 그렇다면 아이스크림 판매량이 상어에 대한 피해률에 영향을 준 것인가? 그렇지 한다. 태양이 뜨럽다는 중첩요인이 영향을 준 것이다. 때문에 단순히 데이터가 많이지고 상관관계를 뽑아낼 수 있다고 해서 이러한 인과관계를 추론할 수 있는 것은 아니다. 조건부 확률만으로는 부족하며 더 복잡한 고려가 필요하다.
딥러닝
딥러닝은 사실 if 문이 수십억, 수십조개가 있는 것이라고 생각된다. 가중치 하나에 if문 하나가 있으며, 우리는 여러 프레임워크를 통해 이를 간단하게 만들고 있다. 때문에 pytorch와 같은 프레임워크를 잘 이해하고 사용하는 것은 중요하다.
내가 모르는 MXNet, Caffe 같은 프레임워크들도 있지만, 나중에 필요하면 배우도록 하자.
프레임워크의 장점은 역전파 알고리즘이나 가중치와 편향에 대한 업데이트를 자동으로 해준다는 점이다. 때문에 사용자는 이를 몰라도 된다.
앞에서 보았던 벡터를 조작하기도 하는데, flatten() / view() / reshape() 와 같은 함수들을 사용한다.
flatten()의 경우, 벡터를 1차원으로 펴주는 역할이다. view()와 reshape()은 거의 비슷한 역할을 한다.
view는 메모리를 공유하며, 기존의 텐서의 메모리를 재구성해서 새로운 모양을 만든다.
파이썬의 list인데, 모양을 변경해서 바꿔주는? 그런 느낌쓰이다. 값을 변경하면 같이 변경된다.
reshape은 연속적이지 않는 값에 대해서도 사용할 수 있고, 메모리 공유도 설정할 수 있다. 더 좋음 이게.
행렬을 곱하는 함수는 torch.mm()과 torch.matmul()이 있다. mm은 2차원 matrix에 대해서 밖에 못쓰니 주의하자.
matmul은 브로드캐스팅이 가능해 더 유연한 연산이 가능하다.
파이토치는 프로젝트 탬플릿을 제공하는데, 이를 통해서 data/model/traning/config/utils 등을 각각의 폴더에서 보기 좋게 관리할 수 있다. (파일 하나에 다 때려넣지 않고, 보기 좋게 정리해줘서 좋다.)
파이토치와 같은 프레임워크를 쓸 때 좋은 점은 이미 알려진 Layer를 사용할 수 있다는 점이다. 예를 들어, LSTM, CNN, RNN, Transformer와 같은 모델을 하나의 층으로써 구현한다.
nn.Parameter와 같은 순정도 있다. 이를 통해서 가중치와 편향을 학습시킬 수 있다. 기본적으로 train 설정을 false로 하지 않는 이상, 파이토치는 자동미분을 지원한다. 말했다 싶이 새로운 층을 nn.Parameter를 통해 추가할 수 있다. 이를 하지 않으면, 자동 미분은 꿈도 꾸지 못한다.
학습 코드를 보다 보면, loss.backward()와 같은 코드를 발견할 수 있다. 이를 통해서 기울기를 계산할 수 있다. 이를 기반으로 최적화 함수에서 optim.step()을 함으로써 비로소 학습이 진행된다.
역전파라는 것은 신경망의 출력과 정답간의 차이를 손실함수의 값으로 계산하기에, 우선적으로 loss 값이 계산될 필요가 있으며, 이를 통해 역전파 미분값을 계산한다. 그리고 이 미분값을 적용하는 것은 최적화 함수의 역할인 것이다.
파이토치는 데이터셋 클래스와 데이터 로더를 정의해서 사용할 수 있다. 기본적으로 제공해주는 클래스가 있지만, 본인이 원하는 방향대로 동작하지 않을 수 있기에 이를 내 입맛대로 바꿀 수 있다. 기본적으로 from torch.util.data import Dataset 안에 원하는 클래스가 있다.
이를 class CustionDataset(Dataset): 과 같이 상속하여 사용한다. 기본적으로 __init__, __len__, __getitem__은 정의를 해줘야 사용할 수 있다.
이렇게 정의한 데이터셋을 데이터 로더를 통해서 불러오게 된다. 모델과 직접적으로 소통을 하며, 배치단위로 데이터를 넘겨줄 수 있게 된다. 이 때 주의해야 할 점은 cpu에서 계산된 데이터를 gpu에 자동으로 전송하지 않기에, device 설정을 해주어야 한다는 점이다.
전처리는 데이터셋이나 별도의 파이프라인에서 진행된다.
결국, 머신러닝에서 가장 중요한 것은 GPU의 특징을 이해하고 사용하는 것이고, 우리가 해야할 것은 상황에 따른 GPU에 대한 최적화일 것이다.
'AI&ML' 카테고리의 다른 글
[Paper review] Co-DETR (1) | 2024.10.20 |
---|---|
[Robot] ros&gazebo 이륜차 만들기 (1) | 2024.08.26 |
[부스트캠프] 인공지능 기초 다지기 - 딥러닝 - Layer (1) | 2024.07.03 |
[부스트캠프] 인공지능 기초 다지기 - 딥러닝 - PyTorch (1) | 2024.07.03 |
[부스트캠프] 인공지능 기초 다지기 - 기초 수학 - 확률론 (1) | 2024.07.03 |