특정 가상 환경에 설치되어있는 패키지만 복사하고 싶다던지, 아니면 자신의 환경을 다른 사람에게 그대로 전달해줄 작업이 있으면 다음 방법을 사용하면 편리합니다.

(Copy) 의존 패키지 복사하기

1. activate env 가상환경 활성화

2. pip freeze > requirements.txt
명령어를 실행시키면 현재 경로에 txt 파일이 생성됩니다.
requirements는 관례적인 이름이기 때문에 다른 이름을 사용해도 무방합니다.

3. type requirements.txt로 확인 또는 직접 경로에 들어가서 열어봐도 됩니다.

(Install) 의존 패키지 설치하기

freeze 명령어를 통해 생성된 파일이 있는 경로에서 다음 명령어를 실행

1. pip install -r requirements.txt

 

이 글은 Data Scientist이신 Roman Orac님의 '5 Reasons You Don't Need to Learn Machine Learning'(link click) 글을 번역한 것입니다.

  • 저자 동의하에 번역을 진행하였다는 점을 알려드립니다.

머신러닝 분야에 몸담고 있는 많은 인플루언서는 1) 우리가 왜 머신러닝 학습을 시작해야하는지에 대한 이유와 2) 일단 시작해보면 머신러닝을 얼마나 쉽게 배울 수 있는지 설명하는 글들을 작성하고 있습니다. 트위터, 링크드인, Medium, Reddit 등 이를 위한 엄청난 양의 글이 있어, 이 중에서도 자신에게 도움이 되지 않는 글을 걸러내는 것도 실력이라는 말이 나올 정도입니다.

글을 읽다보면 마치 우리가 머지않아 전문가가 될 것 같고, 머신러닝을 적용해서 다양한 문제를 해결할 수 있을 것 같은 느낌을 받게 됩니다. 하지만 이번 글에서는 이를 다른 관점으로 바라보고자 합니다. 관련된 다른 글을 비난하거나 비웃자는 글이 아니며, 지극히 주관적인 생각을 다룹니다.

많은 머신러닝 전문가(또는 여기서 부르는 인플루언서)가 작성한 글을 보면서, '왜 많은 사람들이 처음에 머신러닝부터 배우려고 할까?'에 대한 의문이 떠올랐습니다.

아마 주요한 이유는 많은 사람들이 머신러닝을 공부할 때 주로 접할 수 있는 환경과 실제 머신러닝 엔지니어가 머신러닝을 수행하고 있는 환경의 차이를 모르기 때문일 것입니다. 실제로 일부를 제외한 다수의 머신러닝 엔지니어는 뉴스에서 자주 접할 수 있는 알파고와 같은 인공지능이나 테슬라의 전기차와 같은 자율주행을 연구하고 있지 않습니다.

많은 인플루언서가 작성한 글을 공부한다고 해서 머신러닝 전문가가 될 수 없습니다. 또, 하나에 집중하지 않고, 많은 부분을 습득하려 한다면 절대로 이를 달성할 수 없습니다("A Jack of all trades and master of none").

 

Why do so many wish to learn Machine Learning?

Photo by Ariana Prestes on Unsplash

대학을 다니면서 머신러닝 엔지니어가 되기로 결심했습니다. 어렵고, 도전적이며, 특히 매우 재밌어보였기 때문입니다. iOS 게임 개발자가 되겠다고 선택하기 전까진 말이죠.

누군가 나에게 ML 엔지니어로서의 어떠한 것을 권유하더라도, iOS 게임 개발자라는 커리어을 버리지 않을 것입니다. iOS 게임 개발로 커리어를 쌓는게 매우 행복하고, 직업 선택이 예전처럼 극단적(black and white) 결과로 나아가지 않기 때문에 이에 대한 나의 선택이 온전히 틀렸다고 말할 수 없습니다.

Photo by KOBU Agency on Unsplash

왜 iOS 게임 개발로 행복을 느낄 수 있을까요? 그 이유는 머신러닝을 통해 학습할 때의 재미와 iOS 게임 개발 할때의 재미가 같기 때문입니다. 또는 백엔드, 프론트엔드 애플리케이션 개발을 포함해서 말이죠. 여기서 언급한 세 가지도 충분히 도전적인 분야입니다.

대학을 다니면서 머신러닝을 바라보는 관점은 아래와 같았습니다.(아마도 머신러닝을 얕게 알고있는 많은 사람들이 이와 같은 생각을 하지 않을까 싶습니다. 아래와 같은 생각이 틀렸다는 것은 아니고 어떻게 보면 머신러닝을 학습하고자 하는 사람이 겪을 수 있는 당연한 과정인 것 같습니다.)

머신러닝은 어렵지만(Seems hard), 일자리를 쉽게 얻을 수 있다(ML Job).

재밌고(Fun), 고액 연봉을 받을 수 있으며(High wages),

모든 작업이 자동화될 것인 웹 개발자와 다르게 미래가 보장되어 있다(Future proof).

하지만 나는 이 생각이 틀렸다고 느꼈고, 그 이유를 차근차근 설명해보겠습니다.

1. Machine Learning seems hard

Photo by NOAA on Unsplash

인플루언서들이 작성한 글을 보면 머신러닝을 굉장히 쉽게 다루고 있습니다. 타이타닉 데이터셋을 다운로드하고, 단 10줄의 파이썬 코드로 머신러닝 튜토리얼을 끝마칠 수 있습니다.

실제로 해보면 쉽게 타이타닉 사망자/생존자를 예측할 수 있습니다. 하지만 이를 할 수 있다고해서 돈을 주고 우리를 고용할 필요가 있을까요? 더욱 매력적인 머신러닝 엔지니어임을 어필하려면, 더욱 깊은 수준의 기술을 배우고 사용할 수 있어야 합니다.

모든 것을 다 이해할 수 없을뿐만 아니라 그럴 필요도 없기 때문에 머신러닝을 더 깊이 배우는 것은 더욱 어렵습니다. 더 깊이 배우는 것에 좀 더 쉽게 다가가기 위해선 자신 주변에 훌륭한 멘토가 있다는 것이 매우 중요한 요소인데 현실에서 이를 구한다는 것은 매우 힘든 일입니다. 아마도 훌륭한 멘토를 얻을 수 있는 가장 좋은 방법은 훌륭한 인턴쉽을 수행하는 것이 아닐까요?

(머신러닝 배우는게 매우 어렵고, 멘토 구하기도 힘들기 때문에) 내가 첫 커리어를 시작할 때, 누군가가 이에 대해 말해줬다면 매우 좋았을 것 같습니다. Computer Science가 아닌 다른 분야의 동료와 함께 일할 때, 그와 관련된 것(프론트엔드, 백엔드, 모바일 등)을 배우기 위해 상당한 시간이 투자되었기 때문입니다.

왜냐고요? 음.. 프론트엔드(또는 백엔드, 모바일) 개발에서 멘토를 구하기도 쉽고, 많은 사람들이 이 분야를 하고 있으니까요.

2. Easier to get a Machine Learning Job

Photo by Hunters Race on Unsplash

프론트엔드(또는 백엔드, 모바일) 개발자보다 머신러닝 엔지니어로서 일자리를 구하기 매우 어렵다는 것은 확실하게 말할 수 있습니다.

자그마한 스타트업은 보통 ML Engieer를 감당할만한 자원(Resource)을 가지고 있지 않습니다. 이제 막 시작했기 때문에 데이터'도' 없기 때문이죠. 그렇다면 그들이 뭐가 필요한지 아세요? 소비자에게 비즈니스를 제공할 수 있는 프론트, 백엔드, 모바일 엔지니어입니다.

스타트업이 안되면, 대기업을 가면 되지 않을까요? 뭐 틀린 생각은 아니지만, 실제로 취업 시장에 뛰어들어보면 ML Engineer를 필요로하는 대기업이 많지 않고, 찾아보기도 힘듭니다.

3. Higher wages

Photo by Sharon McCutcheon on Unsplash

Senior ML Engineer는 다른 Senior보다 더 많은 돈을 벌고 있지 않습니다.

미국에는 머신러닝 슈퍼스타가 그들의 사고방식(mindset)에 따라, 또는 돈에 구애받지 않고 자신이 원하는 곳에서 일을 하는 것도 있지만, 사실 미국에서는 이보다 더 높은 돈을 받는 소프트웨어 엔지니어가 다수 존재합니다.

4. Machine Learning is future proof

Photo by Tomasz Frankowski on Unsplash

미래를 보장한다는 머신러닝과 같이 프론트엔드, 백엔드, 모바일 개발도 동일하다고 말할 수 있습니다.

프론트엔드 개발자로서 매우 만족한다면, 그대로 하세요! 머신러닝 모델로 웹사이트를 만들고 싶다면, 이에 대한 지식을 보유하고 있는 동료와 함께 일하면 됩니다. 반대로 그 동료도 프론트엔드 개발자가 필요하겠죠. 혹은 혼자 다 하거나.

5. Machine Learning is Fun

Photo by Braydon Anderson on Unsplash

머신러닝은 항상 재밌지만은 않습니다.

많은 사람들은 머신러닝 엔지니어가 인공지능이나 자율주행차를 연구하는 멋진 일을 할거라고 생각하는데 그렇지 않습니다. 이들 대부분은 학습 데이터를 만들거나 머신러닝 인프라 구축을 위한 작업을 수행하고 있을 것입니다.

또, 머신러닝 엔지니어가 딥러닝 모델을 다양하게 바꿔본다던가, 하이퍼파라미터를 튜닝하는 일을 할 것 같지만 그렇지 않습니다. 오해하지 마세요. 일부는 이와 같은 일을 하겠지만 많지는 않을 거에요.

ML 엔지니어는 현실 세계의 문제와 닮아있는, 또 이를 해결할 수 있는 학습 데이터를 어떻게 구축할 것인지에 대한 고민에 대부분의 시간을 사용한다는 것이 진실입니다. 이 고민이 성공적으로 끝난다면, 복잡한 딥러닝 모델도 사용할 수 있겠지만 대부분의 고전적의 머신러닝 모델도 충분히 잘 작동하고, 좋은 성능을 보여줄 겁니다.

Conclusion

Photo by Johannes Plenio on Unsplash

본문은 자칫하면 오해의 소지가 있을 수 있지만, 앞서 언급했듯이 누군가의 생각을 비하하거나 다른 생각과 싸우자는 글이 아닙니다.

머신러닝이 자신의 길이라고 생각하면, 하세요! 직접 연락해서 (저자에게) 조언을 구해도 좋습니다.

하지만 머신러닝은 모두를 위한 기술도 아니고, 모두가 알 필요도 없습니다. 만약 소프트웨어 엔지니어로서 훌륭하고, 재미를 느낀다면, 계속 소프트웨어 엔지니어 커리어를 쌓아가세요. 몇몇 머신러닝 튜토리얼은 소프트웨어 엔지니어 커리어에 도움이 되지 않을 것입니다.

이 글의 목적은 많은 인플루언서의 글과 다르게 이에 대한 비판적 견해를 말해주기 위함입니다.


대부분 공감하는 말이다. 이 글도 수용할 수 있는 한 가지 방법은 ML 전문가이면서 프론트엔드(백엔드, 모바일)도 전문가이면 되지만..... 쉽지 않다.

사용자에게 빠르게 정보를 제공하기 위해 사용하는 캐시에서 새로운 데이터가 발생했을 때, 가장 오래전에 사용된 데이터를 제거하고 새로운 데이터를 삽입하는 알고리즘입니다.

  1. 새로운 데이터가 들어온 경우
    1. 캐시에 넣어준다.
    2. 캐시가 가득차있다면, 가장 오래된 데이터를 제거하고 넣어준다.
  2. 존재하는 데이터가 들어온 경우
    1. 해당 데이터를 꺼낸 뒤,
    2. 가장 최근 데이터 위치로 보내준다.

파이썬으로 구현하면 다음과 같습니다.

cache_Size = 5
cache = [1, 2, 3, 4, 5]
user_data = [3, 7, 2]

for data in user_data:
	# Miss!
	if data not in cache:
		if len(cache) < cacheSize:
			cache.append(data)
		else:
			cache.pop(0)
			cache.append(data)
	# Hit!
	else:
		cache.pop(cache.index(data))
		cache.append(data)

# 캐시 결과 확인
print(cache) # [4, 5, 3, 7, 2]

결과를 쫓아가보면,

  1. 3은 캐시에 존재합니다. 따라서 최근 위치로 옮겨줍니다. --> [1, 2, 4, 5, 3]
  2. 7은 새로운 데이터 입니다. 하지만 그대로 넣어주면 cacheSize를 넘어가므로 가장 오래된 데이터 1을 제거하고 넣어줍니다.
    --> [2, 4, 5, 3, 7]
  3. 2는 캐시에 존재합니다. 따라서 최근 위치로 옮겨줍니다. --> [4, 5, 3, 7, 2]

립시츠 함수를 다루는 이유는 아래 BatchNormalization 내용을 다룬 논문 때문입니다.

How Does Batch Normalization Help Optimization?

기존 BN 논문에서는 'BN은 Internal Covariance(내부 공변량 변화, 가끔 가다보면 내부 공선성이라고 표현하기도 하더라, 여기서는 더 많이 사용되는 내부 공변량 변화를 사용하겠습니다)을 해결하기 때문에 잘된다.'라고 주장합니다. 위 논문은 이에 반례를 제공하고, 한 단계 나아가 BN이 왜 잘되는지 수학적으로 증명하고 있으니 이를 조금씩 살펴보겠습니다.
(논문 소개와 립시츠 함수에 관한 글)

이번 글에서 소개할 논문

Internal Covariance

먼저 내부 공변량 변화를 쉽게 설명하자면, 우리가 흔히 사용하는 hidden layer는 당연하게도 input을 받아들이고 output을 내보냅니다. 또, 이렇게 도출된 output은 다음 단계에서 hidden layer의 input으로 활용되죠. 문제는 여기에 있습니다. 이전 층의 불규칙한 output으로 인해 다음 층의 input distribution이 급격히 변화하고, 이러한 문제가 최종적으로 학습에 큰 영향을 끼치게되어 좋지 않은 성능을 가져다 주는 문제입니다.

즉, 사공이 많으면 배가 산으로 가듯이 기존 입력값의 분포가 여러 가지 모양을 가지게 되니 해결하고자 하는 데이터의 분포를 학습할 수도 없고, 모델 입장에서는 혼란을 가지게 되어 우리에게 안좋은 성능을 가져다줍니다. 하지만 BN은 충분히 다양한 모델 구조에서도 자신의 성능을 증명했듯이, 이러한 문제를 해결할 수 있다고 합니다. BN은 다양한 장점을 가지고 있지만 그 중, 규제화(Regularizer) 기능을 이용하면, 이러한 문제가 해결되어 좋은 성능을 가지게 해준다고 합니다. 마치, hidden layer의 출력값에 표준화를 적용해준다는 것과 비슷합니다.

그림: BatchNormalization Paper, Algorithm1

신경망의 입력으로 사용할 데이터에 표준화를 적용하는 것과 그렇지 않은 것의 성능 차이는 여러 가지 데이터셋에서도 확인해 볼 수 있습니다. 이를 알면 위에서 말한 장점처럼 수학적으로 자세히 증명하지 않아도, BN이 좋은 성능을 이끌어내고 있다고 느낌적으로 생각해볼 수 있습니다.

 

Lipschitz Function

(위키 백과) 립시츠 함수는 두 점 사이의 거리를 일정 비 이상으로 증가시키지 않는 함수이다.
검색해보면 흔히 볼 수 있는 수식은 아래와 같다.

$$\left| f(x) - f(y)\over x - y\right| <= K$$

립시츠 조건이 성립하면 균등연속함수(역은 필수는 아님)이므로 해당 범위에서 미분이 가능하며, 미분 계수는 정해진 K 값을 넘을 수 없게 됩니다. 즉, 쉽게 해석해보면 립시츠 함수일때 기울기가 K를 넘지 않으므로 gradient exploding과 같은 문제를 예방할 수 있습니다. 이 점만 기억하면 논문의 주장을 충분히 이해할 수 있습니다.

 

BatchNormalization은 내부 공변량 변화랑 정말 관계가 있을까?

위에서 설명했듯이 BN은 내부 공변량 변화 문제를 해결한다고 했습니다. 이를 반증하기 위해 논문에서는 한 가지 실험을 수행합니다.

기존처럼 BN을 쓴 것과 여기에 Noise를 추가한 경우를 실험합니다. 노이즈를 추가하는 이유는 일부러 내부 공변량 변화를 발생시키기 위함입니다. 빨간색 분포를 보면 Layer를 거칠수록 파란색, 주황색 분포보다 더욱 불안정함을 알 수 있습니다. 하지만 성능을 확인해보면 내부 공변량 변화 존재 유무를 떠나서 거의 비슷하거나 또는 Noise를 추가한 모델이 더 좋은 성능을 보여주고 있다는 것을 볼 수 있습니다.

여기서 바로 BN이 주고 있는 성능 향상의 원인이 내부 공변량 변화에 크게 치우쳐져 있지 않음을 알 수 있습니다.

심지어 BN을 쓴다고 해서 내부 공변량 변화가 해결되지 않고, 완전히 심각한 문제를 일으키는 경우도 있습니다.

 

BatchNormalization은 그럼 무슨 역할을 하고 있을까?

이후에도 논문에서는 BN이 내부 공변량 변화와 약한 관계를 가지고 있음을 실험적으로 증명합니다. 그럼에도 불구하고 BN을 사용하면 성능 향상이 일어날 뿐더러 training 과정이 BN을 사용하지 않은 경우보다 더욱 stable함을 보여주고 있다는 것이죠.

왜 잘될까요? 논문에서는 BN을 optimization 관점으로 바라보아야 한다고 주장합니다. 일반적으로 신경망이 가지는 land-scape는 non-convex하고, unstable하기 때문에 loss function을 최적화하는데 문제점을 가지고 있습니다. 따라서 이 논문은 "BN이 내부 공변량 변화를 해결한다기 보다는 이러한 문제점을 해결해주고 있는 것이 아닐까?" 라고 생각합니다.

그럼 이 논문에서 BN을 통해 밝힌 것은 다음과 같습니다.

  1. optimization problem의 landscape를 더욱 smooth하게 만들어줍니다.
  2. Loss function이 립시츠해져서 loss의 gradient가 더욱 smooth해집니다. 이러한 결과는 향후 학습에서 gradient가 더욱 reliable해지고, predictive하게 만든다고 합니다.
  3. predictive가 어느정도 보완되기 때문에 gradient based optimization problem에서도 다음 스텝을 밟는데 있어 어느정도 위험을 배제할 수 있다.

2번 실험에 관한 내용은 다음 figure에서 확인할 수 있습니다.

 

자세한 수학적 증명은 논문을 통해 확인하시길 바라고, 그 중 하나를 보자면,,

아래 그림에서 오른쪽의 $\gamma^2 \over \sigma^2$가 립시츠 함수에서 상수 역할을 하기때문에 왼쪽 항의 Loss function에서 발생하는 gradient가 smooth 될 수 있다고 합니다.

 

Reference

www.slideshare.net/HoseongLee6/how-does-batch-normalization-help-optimization-paper-review

ko.wikipedia.org/wiki/립시츠_연속_함수

www.youtube.com/watch?v=hiN0IMM50FM&list=PLWKf9beHi3TgstcIn8K6dI_85_ppAxzB8&index=34

서로 바뀐 내용이 충돌되서 pull이 되지 않는 경우입니다.

해결 방법은 매우 간단합니다.

git add -A
git stash
git pull