관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

텐서플로 1 - 텐서플로에 대하여 : 텐서플로2와 텐서플로1의 차이점 본문

인공지능/딥러닝

텐서플로 1 - 텐서플로에 대하여 : 텐서플로2와 텐서플로1의 차이점

huenuri 2024. 10. 1. 13:59

개발 환경을 힘들게 구축했으니 이제 텐서플로를 실제로 만져보며 실습해보기로 하자. 점심시간이라 조금 배고프지만 이것까지만 마치고 식사해야지~


 

 

텐서플로

텐서플로(TensorFlow)는 2015년 구글 브레인 팀에 의해 공개된 대표적인 머신러닝 라이브러리이다. 파이썬뿐 아니라, 자바스크립트나 Swift를 사용하여 모델을 개발하고 배포할 수 있는 다양한 도구를 지원하고 있다. 텐서플로는 머신러닝과 딥러닝 기술을 개발하는데 검추지 않고, 인공지능 기술이 적용된 서비스를 웹 또는 모바일을 통해 배포하는데 활발하게 사용된다.

 

텐서플로는 딥러닝 연산을 처리하는 라이브러리이다. 텐서플로라는 이름에서 알수 있듯이, 텐서(Tensor)라고 부르는 데이터를 계산 그래프 구조를 통해 흘려가면서 복잡한 행렬 연산을 처리하게 된다.

먼저 노드와 노드 사이를 연결하는 간선(edge)으로 이루어진 그래프 구조를 만들고, 노드와 노드 사이에 연결된 간선을 통해 데이터를 이동시킨다. 아래 그림은 텐서플로 계산 그래프 구조를 그림으로 표시한 것이다. 그래프의 각 노드에서는 add, mtnul 등 정해진 연산을 처리한다.

 

 

노드 사이의 간선 화살표 방향을 따라 텐서 형태의 데이터가 이동한다. 다시 말하면, 한 노드에서 연산을 처리한 뒤 화살표 방향으로 연결된 다음 노드로 텐서가 이동하고, 도착한 노드에 정의된 연산을 처리한다. 이처럼 텐서라는 데이터가 노드에서 노드로 간선을 따라 흐르면서 복잡한 연산을 순서대로 처리하게 된다.

텐서플로는 딥러닝에 필요한 고차원의 복잡한 연산을 빠르고 효율적으로 처리할 수 있기 때문에 전세계 많은 개발자들과 기업들이 활용하고 있다. 

 

 

 

현재 공식 버전인 텐서플로2에서는 고수준 API인 케라스(Keras)를 통합하여 머신러닝 및 딥러닝 모델을 쉽게 구축하고 즉시 실행해 볼 수 있다.


 

 

 

 

텐서플로2 주요 기능

2019년에 출시된 텐서플로2를 이전 세대인 텐서플로1과 구별 짓는 가장 큰 차이점은 즉시 실행 모드를 지원하는 것이다.

 

1. 즉시 실행

텐서플로1은 딥러닝 연산을 처리할 그래프 구조와세션을 먼저 만들고, 여기에 데이터(텐서)를 입력하고 연산하는 과정을 나중에 별도로 실행하기 때문에 2단계로 구성하는 개념이었다. 중간 계산 결과를 확인하려면 그래프를 생성하기 위해 반드시 세션을 실행해야 했다. 이 때문에 번거롭고 디버깅을 어렵게 한다는 단점이 있었다. 또한 코드 구성 방법이 일반적인 파이썬 문법과 차이가 있어서 처음 사용법을 익히는데 어려움이 컸다.

 

하지만 텐서플로2는 즉시 실행을 기본 모드로 사용한다. 별도로 세션을 정의하지 않안도 파이썬 함수로 모델 학습이 가능하다. 즉시 실행이 가능해지면서 여러 가지 장점이 생겼다.

  1. 모델 구조를 만들고 학습을 진행하는 과정이 직관적이다.
  2. 실행 결과를 바로 확인할 수 있기 때문에 오류를 수정할 수 있는 디버깅 과정이 편리하다.
  3. 그래프 구조를 생각하지 않아도 되고, 파이썬 프로그래밍의 제어 도구를 활용해서 모델 학습 과정을 설계할 수 있다.

예제를 통해 즉시 실행 모드를 확인해보자.

 

 

실제 계산 결과를 바로 확인할 수 있는지 코드를 작성해보았다. 텐서플로1에서는 비슷한 코드를 구현하려면 컴파일 과정도 필요하고 2배 이상의 긴 코드를 작성해야 했다.


 

 

 

2.  고수준 API 지원

텐서플로2에서는 고수준(high-level) API인 케라스를 텐서플로 라이브러리 안에 통합하여 제공한다. 따라서 별도로 케라스 라이브러리를 설치할 필요가 없다. 케라스는 입문자 또는 비전공자도 쉽게 사용법을 익힐 수 있다는 장점이 있다.

특별한 기능은 구현하거나 모델 학습을 직접 컨트롤하기 원하는 고급 사용자의 경우, 텐서플로 고유의 저수준(low-level) API를 사용하면 된다. 이처럼 텐서플로는 다양한 사용자 요구 수준에 대응할 수 있다는 장점이 있다.

여기서 말하는 고수준, 저수준이라는 용어는 수준이 높거나 낮다는 뜻이 아니다. 저수준 언어를 기본 바탕으로 해서 고수준 언어를 구현하기 때문에, 저수준은 고수준 언어를 만드는데 필요한 기초 또는 재료로 이해하면 된다.

 

아래 그림을 보면 텐서플로는 파이썬 뿐만 아니라, C++, JAVA 등 다른 언어도 지원하고 있다. 케라스는 저수준 API인 Layers와 Datasets와 같은 백엔드 자원을 활용하여 그 기반 위에 만들어지는 개념이다.

 


 

 

 

 

3. 자동 미분

텐서플로는 딥러닝 모델 학습에 필요한 복잡한 미분을 자동으로 계산해 준다. 딥러닝 모델은 인간의 뇌 신경 구조를 모방한 인공 신경망으로 구현되는데, 인안의 뇌만큼 복잡한 구조를 갖는다. 복잡한 인공 신경망의 구조를 복잡한 수학적 함수식으로 표현한다. 이때 딥러닝 모델이 예측과 실제값과의 오차를 최소로 하는 함수식을 찾기 위해 복잡한 함수를 미분하는 과정이 필요하다. 이때 텐서플로는 미분을 자동으로 계산해 준다.

 

 

아래 그림은 중학교 수학 시간에 배운 2차 함수 그래프다. 손실함수가 2차 함수 형태라고 했을 때 최소값은 아래로 볼록한 정점(접선의 기울기 = 0)이 된다. w(가중치)에 대한 미분 계수가 접선의 기울기를 나타내기 때문에, 미분한 값이 0이 되는 w를 찾으면 손실함수가 최소값을 갖는다. 텐서플로는 이와 같은 미분을 자동으로 처리해 주고 손실이 최소가 되는 지점을 찾아주는 역할을 한다.

우리가 손실함수라고 부르는 이 함수의 최소값을 구할 때는 함수에 대한 미분이 필요하다.

 


 

 

 

학습을 마치고

머신러닝보다 딥러닝 공부가 더 재미있는 것 같다. 이번 시간에는 가볍게 텐서플로2와 1의 차이점에 대해 알아보면서 자동실행 기능을 실습해보았다. 점심을 먹고 3시간 반 정도 공부할 시간이 있을 것 같다. 

텐서플로를 공부한 후 조금 더 쉽게 설명이 되어 있는 혼공머신으로 딥러닝 1장 학습을 이어가볼 것이다.