🤔 PyTorch 실습
자연어 처리를 하기 전에 PyTorch의 기본 지식에 대해 알아보도록 하겠습니다.
작성하기에 앞서 [ICT COG Academy] 인공지능 고급(언어)과정을 수강하며 복습을 위해 작성한 글임을 명시합니다.
🔎 파이토치(PyTorch)
아래는 파이토치의 공식 문서 링크입니다.
기본 파이토치의 사용에 대해서는 아래의 링크를 참조하는것을 추천합니다.
https://tutorials.pytorch.kr/beginner/blitz/tensor_tutorial.html
🔎 PyTorch를 이용한 ANN(Artificial Neural Network)
ANN(Artificial Neural Network)이란 생물학적 신경망의 구조와 기능을 기반으로 한 계산 모델입니다.
신경망은 입력과 출력을 기반으로 어떤 의미에서 변화하거나 학습하기 떄문에 네트워크를 통해 흐르는 정보는 ANN의 구조에 영향을 미칩니다.
ANN은 'Input Layer', 'Hidden Layer', 'Output Layer'로 구성되어있습니다.
이 때 Hidden Layer는 최소 한 개 이상이 존재해야 합니다.
Hidden Layer가 많아질 수록 모델의 성능이 좋아진다고 가정하고 있으며 이를 'Deep Learning Model'이라고 부릅니다.
제가 관심있는 분야도 Deep Learning입니다.
Hidden Layer은 Input 값들을 집약하여 오른쪽으로 갈 수록 더 고도화된 정보를 가집니다.
이러한 고도화된 정보를 통해 원하는 Output 값을 찾아내도록 하는 것이 목표라고 할 수 있습니다.
🔎경사하강법을 통한 이미지 복원
발전된 기술을 사용할 수록 명확한 근거에 의해 문제를 해결한다고 생각하기 쉽습니다.
하지만 머신러닝 방식을 통한 문제 해결은 주먹구구식이라고 할 수 있습니다.
매우 비효율적이라고 생각될 수 있는 방법을 통해 문제를 해결합니다.
프로젝트를 진행하며 왜 그런지에 대해 알아보도록 하겠습니다.
- 프로젝트 개요
- 이미지 처리를 위해 만들어 두었던 weird_function() 함수에 실수로 버그가 들어가 100×100 픽셀의 오염된 미미지가 만들어졌다.
- 이 오염된 이미지와 오염되기 전 원본 이미지를 동시에 파일로 저장하려고 했으나, 모종의 이유로 원본 이미지 파일은 삭제된 상황이다.
- 다행히 weird_function()의 소스코드는 남아 있다.
- 오염된 이미지와 weird_function()을 활용해 원본 이미지를 복원해보자.
- 일반적인 접근 방법
- weird_function() 함수의 소스코드 분석
- 분석을 토대로 weird_function() 함수의 동작을 반대로 이행하는 함수 구현
- 2에서 구현한 함수에 오염된 이미지를 입력한 후, 복구된 이미지 출력
- 머신러닝 방식의 접근 방법(사고 방법)
- 오염된 이미지와 같은 크기의 랜덤 텐서를 생성한다.
- 랜덤 텐서를 weird_function() 함수에 입력해 똑같이 오염된 이미지를 가설이라고 부른다.
- (사실) 원본 이미지가 weird_function() 함수에 입력되어 오염된 이미지를 출력했다.
- (사실) 인위적으로 생성한 무작위 이미지가 weird_function() 함수에 입력되어 가설을 출력했다.
- 가설과 오염된 이미지가 같다면 무작위 이미지와 원본 이미지도 같을 것이다.
- 그러므로 weird_function(random_tensor) = broken_image 관계가 성립하도록 만든다.
머신러닝 방식의 접근 방법은 비효율적인것 처럼 보입니다.
랜덤으로 생성한 텐서를 입력하여 오염된 이미지가 원본 이미지와 같아질 때까지 계속 학습하여 문제를 하나하나씩 해결하는 과정을 거친다고 생각할 수 있습니다.
즉, 명확한 근거를 통해 함수를 해결하기보다는 퍼즐을 하나씩 맞춰보며 시행착오를 거치는 것과 같습니다.
실제로 실습을 진행해보겠습니다.
Colab을 이용하여 코드를 작성했습니다.
아래 링크를 통해 코드를 확인하실 수 있습니다.
https://github.com/TAEHONG-LEE/Image-restoration-using-gradient-decent.git
신경망 모델의 구현에 대해 알아보도록 하겠습니다.
NeuralNet이라는 이름의 함수를 PyTorch 내의 Module을 이용하여 선언합니다.
linear layer을 Input 값이 거친 뒤, relu함수를 적용합니다.
이후 relu함수가 적용된 값을 다시한 번 linear layer을 거친 뒤 sigmoid함수를 적용합니다.
input size가 2 hidden size가 5인 NeuralNet모델을 생성합니다.
learning_reate는 0.03, epoch은 2000으로 설정합니다.
오차를 계산할 떄는 BCELoss라는 함수를 사용합니다.
optimizer은 SGD를 사용합니다.
SGD는 Stochastic Gradient Descent(확률적 경사 하강법)으로 경사 하강법의 일종입니다.
학습 전의 오차값을 알아보겠습니다.
오차값이 0.77이 나온 것을 알 수 있습니다.
즉 분류의 능력이 없다고 봐도 무방합니다.
이제 경사 하강법을 구현하여 오차를 줄일 차례입니다.
optimizer.zero_grad()를 실행함으로서 미분을 통해 얻은 기울기를 0으로 초기화합니다.
기울기를 초기화 해야만 새로운 가중치 편향에 대해서 새로운 기울기를 구할 수 있습니다.
squeeze() 함수는 차원 중 사이즈가 1인 것을 찾아 해당 차원을 제거합니다.
오차가 0.002만큼 줄어든 것을 알 수 있습니다.
다음 글에서는 전처리와 토큰화에 대해 알아보도록 하겠습니다.
📃참조
'AI > 자연어 처리' 카테고리의 다른 글
[AI] 자연어 처리 - 전처리와 토큰화(2) (2) | 2022.08.05 |
---|---|
[AI] 자연어 처리 - 전처리와 토큰화(1) (2) | 2022.08.01 |
[AI] 자연어 처리 - 기본지식(3) (0) | 2022.07.29 |
[AI] 자연어 처리 - 기본지식(2) (0) | 2022.07.28 |
[AI] 자연어 처리 - 기본지식(1) (2) | 2022.07.28 |