- toc {:toc}
Language Selection
내가 관심 갖는 딥러닝, 머신러닝에는 주로 파이썬이 사용된다.
Github에서 Deep learning 검색에 대한 사용 언어 결과다. Jupyter Notebook을 제외하고 살펴보더라도 Python이 많은 경우 사용되는 것을 확인할 수 있기 때문에 Python(이후 파이썬)으로 선택해 탐구해보기로 선택했다.
파이썬 언어 역사
파이썬은 왜 만들어졌을까?
파이썬은 1980년대 후반, 네덜란드 Centrum Wiskunde & Informatica(CWI) 국립 수학 정보과학 연구소에서 일하던 네덜란드 프로그래머 Guido van Rossum에 의해 만들어졌다. Van Rossum은 CWI에서 ABC라는 프로그래밍 언어 개발에 참여했다. 이후 amoeba라는 분산 시스템을 제작하는 일을 했는데, 작성해야하는 모든 응용 프로그램이 기본적으로 쉘 스크립트 또는 C 프로그램이었다. 쉘 스크립트는 작성 및 사용이 쉽지만 가독성이 떨어지고 더 크고 복잡한 프로젝트에는 적합하지 않았고, C는 강력한 프로그래밍 언어지만 작성하는 데 더 많은 노력이 필요하고 간결하지 않았다. 때문에 Van Rossum은 쉘 스크립트의 사용 용이성, C 프로그래밍의 강력함을 결합한 언어를 만들고자 했고, 파이썬을 만들었다.
파이썬 로드맵
(출처 : https://python.land/python-tutorial)
-
1991년 ~ - Van Rossum이 0.9.0 버전을 출시했다.
- 상속, 예외 처리, 함수, 데이터 유형이 있는 클래스
- 모듈 시스템
- 함수 주석 지원
-
1994년 ~ - 파이썬의 첫 번째 안정된 버전 1.0 공개
- 함수형 프로그래밍 지원
- 중첩 프로그래밍 지원
-
2000년 ~ - 파이썬 2 공개
- 중첩 함수, garbage collection 지원
- 반복자, with문, 함수 및 클래스 데코레이터, collections 모듈에 대한 지원 추가
-
2008년 ~ - 파이썬 3 공개
- 유니코드 지원 개선
- 오류 및 예외 처리 개선
파이썬 3가 공개되고 난 후 파이썬 2와 3은 나란히 개발되며 유지됐다. 이는 파이썬 3 코드가 파이썬 2 코드와 호환되지 않기 때문이다. 이로 인해 업그레이드에 대한 강점이 떨어졌다. 초반에는 파이썬 3가 파이썬 2보다 느렸다. 하지만 계속해서 개선되고 새로운 기능, 라이브러리가 생기면서 2020년 파이썬 2가 사라지고 파이썬 3로 대체되었다.
파이썬은 왜 데이터 사이언스에서 사용될까?
파이썬이 데이터 사이언스에 사용되기 전, 데이터 분석에는 R, MATLAB 등이 사용됐다. R은 지원하는 통계 함수의 범위가 아주 넓었고 문법, 데이터 구조들이 통계 분석에 최적화 되어 있었다. MATLAB의 경우 수치해석, 신호 처리 등 가지고 있는 장점이 많았다.
하지만 데이터 분석에 강점을 띠는 2005년 NumPy, 2008년 Pandas 라이브러리가 나오면서 Python을 이용해 고수준의 수학적 함수들이 제공되었다. 이를 통해서 큰 데이터셋을 이용해 복잡한 데이터 분석 작업을 수행하는 작업이 용이해졌다. 또한, 파이썬은 쉽게 배울 수 있고, 활발하고 방대한 커뮤니티, 그리고 모듈로 작용해 여러 라이브러리들이 어우러질 수 있다는 점 등을 통해 활발하게 작용하고 새로운 라이브러리들이 생겨나면서 파이썬의 사용이 보편화됐다.
파이썬의 장점과 단점
장점
- 사용에 용이하다.
- 파이썬의 문법은 아주 간편하고 배우기 쉽다.
- 방대하고 활성화된 커뮤니티가 생성되어 있다.
- 커뮤니티가 활성화되면서 강력한 라이브러리들이 꾸준하게 개발되고, 유지 보수된다.
- 다재다능한 언어이다.
- 단순 데이터 분석, 딥러닝과 같은 분야에만 사용되는 것이 아닌 데이터 분석 외의 파생될 수 있는 작업(데이터 크롤링, 데이터베이스 구축 등)에도 파이썬을 사용할 수 있다.
- 양립 가능성
- 파이썬은 다른 프로그래밍 언어와의 호환, 통합이 용이하다는 점에서 장점을 갖는다. 파이썬이 가지고 있는 부족한 점을 다른 언어의 장점을 활용하여 보완할 수 있다.
단점
-
속도가 느리다.
- 특정 작업을 수행하는 연산 속도가 컴파일 프로그래밍 언어들보다 느리다. 이는 파이썬이 인터프리터 언어이고 인터프리터를 통해 실행되는 언어이기 때문이다.
- 컴파일러는 실행 전 전체 코드를 기계어로 한번에 변경하는 컴파일 과정을 거치고 실행하는 반면 인터프리터는 코드를 실행할 때 한 줄씩 읽어 기계어로 전환해 실행되도록 한다. 실행할 때 한 줄씩 전환해야하기 때문에 속도가 느린 단점이 있다.
-
메모리 소비가 많다.
- 인터프리터를 사용하기 때문에 실행될 때마다 계속해서 인터프리터가 작동해야한다. 이 때, 작동하기 위해서는 부가적인 정보들을 저장해야하고 이로 인해 메모리 소비가 증가한다.
- 추상화, 동적 타이핑의 특징들이 메모리 소비를 증가시킨다.
파이썬 머신러닝, 딥러닝 라이브러리
1. NumPy(Numerical Python, 넘파이)
넘파이는 파이썬의 고성능 수치계산을 위한 라이브러리이다. 벡터, 행렬 연산, 수학적 연산을 간편하게 할 수 있는 함수들을 제공한다. 넘파이는 C와 포를란 라이브러리로 만들어졌기 때문에 파이썬 코드보다 빠른 연산 성능을 보인다.
벡터 연산과 브로드캐스팅을 통해 행렬 연산을 한번의 작동만으로 실행되도록 지원한다. 이를 통해 속도를 잡는다. 행렬 연산에 사용되는 선형 대수 뿐만 아니라 푸리에 변환, 랜덤 변수 생성 등 여러 수학적 연산을 지원한다.
2. Pandas (판다스)
판다스는 빅데이터 처리를 위한 라이브러리이다. 데이터가 가지고 있는 구조를 파악하고, 정제, 탐색, 시각화하는 것에 강점을 갖는다.
3. Tensorflow (텐서플로우), Pytorch (파이토치)
-
Tensorflow는 기계 학습을 위해 Google Brain 팀에서 연구 목적으로 개발한 후 오픈 소스로 공개된 라이브러리이다. Tensorflow는 이름처럼 텐서라는 대상이 연산되는 과정을 일련의 흐름으로 수행할 수 있도록 지원한다.
-
Pytorch는 페이스북 AI 연구팀에서 인공 신경망을 훈련하기 위해 제작한 라이브러리이다. 인공신경망 모델을 구축, 학습, 배포하는 프로세스를 간소화할 수 있도록 지원한다.
두 라이브러리 전부 컴퓨터 비전, 자연어처리, 로보틱스, 추천 시스템 등 실질적으로 머신러닝, 딥러닝에 대한 작업에 사용되는 중요한 라이브러리이다. Tensorflow와 Pytorch 모두 인공 신경망을 구축하고 교육하는데 사용할 수 있으며, 데이터 전처리, 증강, 시각화, 자동 미분을 지원하여 모델을 학습하고 사용할 수 있도록 도움을 준다.
그럼 이 둘의 차이는 무엇일까?
가장 큰 차이로는 Tensorflow는 정적 계산 그래프, Pytorch는 동적 계산 그래프를 사용한다는 점이다.
-
정적 계산 그래프는 처음에 전체적인 구조가 정의 된 후 여러 번 실행되는 구조를 띤다. 런타임 중에 그래프를 수정하기 어렵다.
- 그래프 구축 시 동일한 그래프를 반복 사용하므로 그래프에 대한 최적화 및 병렬화를 할 수 있다.
- 최적화 과정을 통해 속도가 느려질 수 있으나 학습이 반복되는 횟수가 많아질수록 효율성이 극대화 된다.
- 전체 구조를 정의하기 때문에 파일로 저장할 수 있고 파이썬 에서 작성한 코드를 c++에서 동작시킬 때 파이썬에서의 코드에 대한 요청 없이 쉽게 불러올 수 있다.
-
동적 계산 그래프는 구조의 정의가 런타임 중에 함께 동적으로 이루어지고 즉석에서 수정할 수 있다.
- 다양한 모델 아키텍처로 실험하고 동적으로 발생하는 사이즈 문제를 자동적으로 처리한다.
- Tensorflow는 그래프를 정의하는 과정과 훈련하는 과정을 분리해야 하지만 Pytorch의 경우 함께 작동하도록 할 수 있어 디버깅이 편리하다.
각각이 가지고 있는 장단점이 있기 때문에 프로젝트의 특정 요구 사항에 따라 사용할 프레임워크가 달라지게 된다. 모델을 배포해서 사용하는 것이 목적인 경우에는 최적화와 병렬화할 수 있는 Tensorflow가, 다양한 모델을 실험하고 유연성을 갖기 위해서는 Pytorch를 사용하는 것이 일반적이다.
참고문헌
- History of Python : https://en.wikipedia.org/wiki/History_of_Python
- Pytorch VS Tensorflow : https://dev-jm.tistory.com/4