[10초면 OK] 파이토치 딥러닝 신경망으로 사인함수 근사하기

[Must Have] 텐초의 파이토치 딥러닝 특강
골든래빗 출판사
이종민(텐초) 지음

《Must Have 텐초의 파이토치 딥러닝 특강》에서 재미있는 글을 선별해 연재해보겠습니다.

  1. 파이토치 권고 코딩 스타일
  2. 파이토치로 사인함수 근사해보기
  3. 오차 역전파에서 가중치가 업데이트되는 과정
  4. 트랜스포머 소개

2. 파이토치로 사인함수 근사해보기

이제부터는 사인곡선을 근사하는 신경망을 직접 만들어보겠습니다. 이번 단계에서는 파이토치가 어떻게 신경망을 학습하는지 자세히 알아보기 위해 미리 정의된 신경망 알고리즘과 오차 역전파 알고리즘 API를 사용하지 않고, 직접 알고리즘을 만들어봅니다. 이 신경망은 다음과 같은 순서로 학습됩니다.

먼저 딥러닝 모델을 정의합니다. 모델을 학습하기 위해 데이터를 불러온 다음, 원하는 만큼 반복해서 모델을 학습합니다. 불러온 데이터를 이용해 모델의 예측값을 계산합니다. 이때 데이터가 입력층에서 출력층까지 흘러가기 때문에 이 계산을 모델의 순전파를 계산한다고 합니다. 모델의 예측값과 손실 함수를 이용해 오차를 계산합니다. 오차를 역전파하고 모델의 가중치를 수정합니다. 원하는 만큼 반복했다면 학습을 종료합니다.

①  랜덤하게 가중치를 적용해 사인곡선 그리기

사인곡선 공식은 y = sin(x) 입니다. x에 대해서 y값을 예측하는 모델을 만들어봅시다. 여기서는 랜덤하게 가중치를 뽑아 사인곡선을 근사하겠습니다. 사인함수는 3차 다항식으로 근사할 수 있습 니다. 3차 다항식에는 계수가 4개 존재하므로 4개의 랜덤한 가중치를 뽑아 다항식의 계수로 이용하겠습니다.

실제 sin(x) 함수에서 추출한 y값으로 사인곡선을 그리는 그래프와, 임의의 가중치를 얻어 예측한 사인곡선 그래프를 출력하는 코드를 구현하겠습니다.

 

위의 그래프가 실제 사인함수이고, 아래 그래프는 임의의 가중치로 근사한 사인함수입니다. 아직은 가중치들을 학습하기 전이라 완전히 다른 모양의 그래프가 그려졌습니다. 또, 계수들은 랜덤하게 주어진 값이기 때문에 위에 나온 그림하고 다른 그림이 나와도 당황하지 마세요. 코드를 상세히 살펴보겠습니다.

−π부터 π 까지 1,000개의 점을 추출합니다.

❷ 실제 사인곡선에서 y 데이터를 입력합니다.

❸ 예측 사인곡선에 사용할 임의의 가중치를 뽑아 y를 만듭니다. 가중치로 사용할 3차 다항식의 계수는 4개(0차부터 3차까지)입니다. 계수 모두에 임의의 값을 넣어줍니다. 이때 사용한 torch.randn( ) 함수는 정규분포에 따라 랜덤하게 값을 반환해줍니다.

➍ 실제 사인곡선을 실제 y값으로 만듭니다. subplot( ) 함수는 여러 개의 그래프를 그려줍니다. 그중에서 실제의 y값을 그려줍니다. title( ) 함수로 각 그래프에 이름을 지정해주고, plot( ) 함수를 이용해 그래프의 입력값과 함수값을 지정해 그래프를 그립니다. subplot( ) 함수에 인수 3개를 주었습니다. 각각 행의 개수, 열의 개수, 위치를 뜻합니다. 예를 들어 subplot(2, 3, 5)는 2행3열로 영역을 나누고 5번 위치에 그림을 그립니다. 다음 그림을 보면 이해가 될 겁니다.

➎ 예측 사인곡선을 만듭니다. 임의의 가중치로 만든 예측용 y값을 사용합니다.

➏ show( ) 함수로 그래프를 그려줍니다.

 

가중치를 학습시켜서 사인곡선 그리기

드디어 딥러닝의 첫 단추인 가중치를 학습할 차례입니다. 이번에는 사인곡선을 신경망으로 학습해서 근사해보겠습니다. 사인 곡선과 상당히 비슷한 곡선이 그려질 것 같네요.

달라진 코드를 쉽게 확인할 수 있게 배경을 진하게 처리해뒀습니다. 먼저 각 계수에 대한 기울기를 계산합니다. 기울기를 계산한 다음, 학습률과 기울기를 곱해 보폭을 얻습니다. 이때 얻은 보폭만큼 계수들을 수정하면 됩니다.

첫 번째 그래프가 진짜 사인곡선이고 두 번째 그래프는 사인곡선을 학습한 결과를 가지고 만든 그래프입니다. 두 그래프가 거의 비슷해졌습니다. 마지막 그래프는 학습이 이루어지기 전의 그래프입니다. 사인곡선과는 완전히 달랐던 그래프가 몇 번의 학습을 거친 것만으로도 사인곡선과 유사하게 변한 것을 알 수 있습니다.
이전 코드와 달라진 부분만 설명하겠습니다. 손실을 정의합니다. 흔히 사용하는 제곱오차, pow(2)는 제곱을, sum( )은 합, item( )은 실수값으로 반환하라는 뜻입니다. 가중치를 업데이트하는 데 사용되는 손실값을 미분했습니다. 가중치는 기울기의 반대 방향으로 움직입니다. 만약 기울기가 양수라면 빼주고, 음수라면 더해줘야 하므로 기울기에 -1을 곱해줍시다.

여기서는 a, b, c, d 총 4개의 가중치(계수)를 사용했습니다. 하지만 자연어 처리에서는 가중치를 1,750억 개 정도 사용한다고 말씀드렸습니다. 따라서 이런 식으로 수백만 개의 가중치를 일일이 계산하는 일은 불가능합니다. 우리는 선배들이 닦아놓은 길을 걸어가면 됩니다. 다음 절부터는 복잡한 가중치 계산을 파이토치에 맡겨보겠습니다.

이종민(텐초) 

일본 JAIST 정보과학 석사. 동경의 딥러닝 엔지니어로 Ghelia에서 B2B 인공지능 솔루션을 개발 중이다. 딥러닝의 유용함을 널리 알리고자 유튜버로  활동하고 글을 쓰고 책을 집필합니다. 쉬운 그림을 이용해 10초만에 핵심을 전달하자는 의미에서 닉네임을 텐초로 지어 활동하고 있습니다.

– SNS : www.youtube.com/c/텐초

Leave a Reply

©2020 GoldenRabbit. All rights reserved.
상호명 : 골든래빗 주식회사
(04051) 서울특별시 마포구 양화로 186, 5층 512호, 514호 (동교동, LC타워)
TEL : 0505-398-0505 / FAX : 0505-537-0505
대표이사 : 최현우
사업자등록번호 : 475-87-01581
통신판매업신고 : 2023-서울마포-2391호
master@goldenrabbit.co.kr
개인정보처리방침
배송/반품/환불/교환 안내