Python asterisk에 대해

|

Python asterisk에 대해

  • 참고 글
    • https://mingrammer.com/understanding-the-asterisk-of-python/
  • 용도
    • 곱셈 및 거듭제곱 연산으로 사용할 때
    • 리스트형 컨테이너 타입의 데이터를 반복 확장하고자 할 때
    • 가변인자 (Variadic Parameters)를 사용하고자 할 때
      • positional arguments만 받을 때
      • keyword arguments만 받을 때
      • positional arguments와 keyword arguments를 모두 받을 때
    • 컨테이너 타입의 데이터를 Unpacking 할 때
  • 파이썬은 타 언어에 비해 비교적 연산자 및 종류가 풍부한 편으로, asterisk(*)는 곱셈 이상의 여러 의미를 가짐
  • 본 글에선 파이썬 코드를 더 파이썬스럽게 쓰기위한 asterisk(*)에 대한 여러 연산을 살펴봄

1. 곱셈 및 거듭제곱 연산으로 사용할 때

  • 일반적으로 사용하는 곱셈 연산 및 거듭제곱 연산까지 내장 기능으로 지원
>>> 2 * 3
6
>>> 2 ** 3
8
>>> 1.414 * 1.414
1.9993959999999997
>>> 1.414 ** 1.414
1.6320575353248798

2. 리스트형 컨테이너 타입의 데이터를 반복 확장하고자 할 때

  • 파이썬에선 *을 숫자형 데이터 뿐만 아니라 리스트형 컨테이너 타입에서 데이터를 반복적으로 확장하기 위해 사용
# 길이 100의 제로값 리스트 초기화
zeros_list = [0] * 100

# 길이 100의 제로값 튜플 선언
zeros_tuple = (0,) * 100

# 리스트 3배 확장 후 연산
vector_list = [[1, 2, 3]]
for i, vector in enumerate(vector_list * 3):
  # i + 1 의 수를 vector_list의 각 숫자(e)에 곱한 후 list를 출력
  print("{0} scalar product of vector: {1}".format((i + 1), [(i + 1) * e for e in vector]))
# 1 scalar product of vector: [1, 2, 3]
# 2 scalar product of vector: [2, 4, 6]
# 3 scalar product of vector: [3, 6, 9]

3. 가변인자 (Variadic Parameters)를 사용하고자 할 때

  • 함수에서 가변인자를 필요로 할 때 (들어오는 인자의 갯수를 모르거나 어떤 인자라도 모두 받아서 처리해야 할 때) 사용
  • 파이썬에서는 positional arguments와 keyworkd arguments의 두 가지 종류의 인자가 존재하며, 전자(positional arguments)는 위치에 따라 정해지는 인자, 후자(keyword arguments)는 키워드를 가진(이름을 가진)인자를 의미함
  • Variadic positional/Keyword argument를 살피기 전 간단히 두 인자의 차이에 대해 살펴보면 아래와 같음
# 2~4명의 주자로 이루어진 달리기 대회 랭킹을 보여주는 함수
def save_ranking(first, second, third=None, fourth=None):
    rank = {}
    rank[1], rank[2] = first, second
    rank[3] = third if third is not None else 'Nobody'
    rank[4] = fourth if fourth is not None else 'Nobody'
    print(rank)

# positional arguments 2개 전달
save_ranking('ming', 'alice')
# positional arguments 2개와 keyword argument 1개 전달
save_ranking('alice', 'ming', third='mike')
# positional arguments 2개와 keyword arguments 2개 전달 (단, 하나는 positional argument 형태로 전달)
save_ranking('alice', 'ming', 'mike', fourth='jim')
  • 위 함수는 first, second라는 두 개의 positional argument와 third, fourth라는 두 개의 keyword arguments를 받고 있음
  • Positional arguments의 경우 생략이 불가능하며 갯수대로 정해진 위치에 인자를 전달해야 함
  • Keyworkd arguments`의 경우 함수 선언시 default 값을 설정 할 수 있으며, 만야 ㄱ인자를 생략 할 시 해당 default 값이 인자의 값으로 들어감
    • 생략이 가능한 형태의 인자
  • Keyworkd arguments는 positional arguments 전에 선언이 불가하므로 아래와같은 경우 에러 발생
def save_ranking(first, second=None, third, fourth=None):
  ...
# 에러 발생!
  • 위의 경우 만약 최대 4명의 주자가 아니라 10명 또는 그 이상의 정해지지 않은 주자가 있다고 하면 10개의 인자를 선언하기도 번거로울뿐더러 주자의 수가 미정일 경우 위와 같은 형태로는 처리가 불가능함
  • 이 때 사용하는게 바로 가변인자(Variadic arguments)
  • 가변인자는 위에서 설명한 positional arguments와 keyworkd arguments에 모두 사용 가능하며 사용방법은 아래와 같음

Positional arguments만 받을 때

def save_ranking(*args):
  print(args)

save_ranking('ming', 'alice', 'tom', 'wilson', 'roy')
# ('ming', 'alice', 'tom', 'wilson', 'roy')

Keyword arguments만 받을 때

def save_ranking(**kwargs):
  print(kwargs)

save_ranking(first='ming', second='alice', fourth='wilson', third='tom', fifth='roy')
# {'first': 'ming', 'second': 'alice', 'fourth': 'wilson', 'third': 'tom', 'fifth': 'roy'}

Positional과 keyword arguments를 모두 받을 때

def save_ranking(*args, **kwargs):
    print(args)
    print(kwargs)
    
save_ranking('ming', 'alice', 'tom', fourth='wilson', fifth='roy')
# ('ming', 'alice', 'tom')
# {'fourth': 'wilson', 'fifth': 'roy'}
  • 위에서 *args는 임의의 갯수의 positional arguments를 받음을 의미하며, **kwargs는 임의의 갯수의 keyword arguments를 받음을 의미
    • 이 때 *args, **kwargs형태로 가변인자를 받는것을 packing 이라고 함
  • 위의 예시에서 볼 수 있듯이 임의의 갯수와 임의의 키값을 갖는 인자들을 전달하고 있음
    • *args: Positional 형태로 전달되는 인자로 tuple 형태로 저장
    • **kwargs: Keyword 형태로 전달되는 인자로 dict 형태로 저장
  • 앞의 예시와 동일하게 positional 선언 전의 keyword 선언은 에러를 발생시킴
def save_ranking(**kwargs, *args):
  ...
# 에러 발생!
  • 이러한 가변인자는 매우 일반적으로 사용되므로 오픈소스 코드에서도 쉽게 발견 가능
  • 보통은 코드의 일관성을 위해 관례적으로 *args**kwargs를 사용되지만, *required**optional처럼 인자명도 일반변수와 같이 원하는대로 지정이 가능함
    • 단, 오픈소스 프로젝트 진행하고 있고 별 특별한 의미가 없다면 관례적인 표현인 *args**kwargs를 따르는게 좋음

4. 컨테이너 타입의 데이터를 unpacking 할 때

  • * 는 컨테이너 타입의 데이터를 unpacking하는 경우에도 사용 가능함
  • 이는 3번의 경우와 유사한 원리로 종종 사용할만한 연산방법.
  • 가장 쉬운 예로 listtuple 또는 dict 형태의 데이터를 가지고 있고 어떤 함수가 가변인자를 받는 경우에 사용 가능함
from functools import reduce

primes = [2, 3, 5, 7, 11, 13]

def product(*numbers):
    p = reduce(lambda x, y: x * y, numbers)
    return p

product(*primes)
# 30030

product(primes)
# [2, 3, 5, 7, 11, 13]
  • product() 함수가 가변인자를 받고 있기 때문에 리스트의 데이터를 모두 unpacking하여 함수에 전달해야 함
  • 이 경우 함수에 값을 전달할 때 *primes와 같이 전달하면 primes 리스트의 모든 값들이 unpacking되어 numbers라는 리스트에 저장됨
  • 만약 이를 primes 그대로 전달하려면 이 자체가 하나의 값으로 쓰여 numbers에는 primes라는 원소 하나가 존재하게 됨
    • numbers = [primes] = [[2, 3, 5, 7, 11, 13]]
  • tuple 또한 list 와 동일하게 동작하며 dict 의 경우 * 대신 **을 사용하여 동일한 형태로 사용 가능
headers = {
    'Accept': 'text/plain',
    'Content-Length': 348,
    'Host': 'http://mingrammer.com'
}

def pre_process(**headers):
    content_length = headers['Content-Length']
    print('content length: ', content_length)

    host = headers['Host']
    if 'https' not in host:
        raise ValueError('You must use SSL for http communication')

pre_process(**headers)
# content length:  348
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#   File "<stdin>", line 7, in pre_process
# ValueError: You must use SSL for http communication
  • 또 다른 형태의 unpacking이 한 가지 더 존재하는데, 이는 ㅎ마수의 인자로써 사용하는게 아닌 리스트나 튜플 데이터를 다른 변수에 가변적으로 unpacking하여 사용하는 형태임
numbers = [1, 2, 3, 4, 5, 6]

# unpacking의 좌변은 리스트 또는 튜플의 형태를 가져야하므로 단일 unpacking의 경우 *a가 아닌 *a,를 사용
*a, = numbers
# a = [1, 2, 3, 4, 5, 6]

*a, b = numbers
# a = [1, 2, 3, 4, 5]
# b = 6

a, *b, = numbers
# a = 1
# b = [2, 3, 4, 5, 6]

a, *b, c = numbers
# a = 1
# b = [2, 3, 4, 5]
# c = 6
  • 여기서 *a, *b로 받는 부분들은 우변의 리스트 또는 튜플이 unpacking된 후 다른 변수들에 할당된 값 외의 나머지 값들을 다시 하나의 리스트로 packing함
    • 3번의 가변인자 packing과 동일한 개념

결론

  • 3번의 내용이 매우 자주 사용되는 중요한 기능이자 자주 헷갈릴 수 있는 부분이기에 숙지 필요

IBM Watson Soul Machine

|

[Background Survey] IBM Watson Soul Machine

IBM Watson

  • 참고 글
    • http://www.seminartoday.net/news/articleView.html?idxno=10131
    • https://www.ibm.com/watson/kr-ko/products.html
  • IBM Watson API: IBM에서 제공하는 다양한 AI API에 기본으로 탑재되는 인공지능. Watson API는 IBM Watson의 Cognitive 기술을 담아 애플리케이션이나 솔루션을 개발 할 수 있도록 모듈화 한 서비스. IBM 클라우드 플랫폼인 ‘블루믹스’ 상에서 이용 가능하며, 제공하는 IBM Watson의 API는 아래와 같음.
    • AI Assistant: 다양한 대화 기술을 애플리케이션에 통합
      • Watson Assistant: 간편한 도구 및 대화 트리로 챗봇 개발 (한국어 지원)
    • Knowledge: 가속화된 데이터 최적화 기능을 통해 통찰력 확보
      • Discovery: 데이터에서 필요한 정보를 찾아서 정답을 추론하고 trand(추세)를 모니터링하여 드러나지 않는 패턴을 찾음 (한국어 지원)
      • Discovery News: 사전에 보강된 뉴스 콘텐츠에 실시간으로 엑세스 (한국어 지원)
      • Natural Language Understanding: 고급 텍스트 분석을 위한 자연어 처리 (한국어 지원)
      • Knowledge Studio: 비정형 텍스트에서 의미 있는 정보를 찾고 통찰력을 갖도록 Watson을 학습시킴 (한국어 지원)
    • Vision: 콘텐츠를 식별하고 태깅한 후, 이미지에서 발견된 세부 정보를 분석하고 추론
      • Visual Recognition: 머신 러닝 기술을 사용하여 시각적 콘텐츠를 태깅하구 분류 (한국어 지원)
    • Speech: 텍스트와 음성을 변환할 수 있으며, 음성모델을 사용자가 지정할 수 있음
      • Language Translator: 텍스트를 한 언어에서 다른 언어로 번역 (한국어 지원)
      • Natural Language Classifier: 자연어를 해석하고 분류 (한국어 지원)
    • Enpathy: 어조, 성격 및 감정 상태를 이해
      • Personality Insights: 텍스트를 통해 성격 특성을 예측 (한국어 지원)
      • Tone Analyzer: 텍스트에 나타난 감정과 커뮤니케이션 스타일을 이해
  • 위 기능들 중 필요한 기능들간의 조합이 가능하며, 다양한 데모 및 예제들이 제공됨

Soul Machine

  • 참고 글
    • https://m.blog.naver.com/PostView.nhn?blogId=ibm_korea&logNo=221330091341&proxyReferer=https%3A%2F%2Fwww.google.com%2F
    • https://www.ibm.com/case-studies/soul-machines-hybrid-cloud-ai-chatbot
    • https://www.scmp.com/lifestyle/gadgets/article/2188050/5g-networking-makes-artificial-humans-and-real-time-holograms
  • 소울 머신 은 뉴질랜드에 본사를 둔 회사로, IBM Watson의 Watson Assistant 기반의 챗봇에 사람의 얼굴 표정과 목소리로 사용자의 감정까지 고려하는 인공지능 아바타를 제작.
  • 사용자의 표정이나 목소리로 분석된 감정을 판단하여 슬픈 얼굴 표정이나 목소리로 위로를 전하고 답변하는 등의 기능 수행.
  • 소울머신은 IBM Watson 기술을 이용해 감정적으로 고객의 요구 및 질문에 반응하는 인공 인물을 제작하는 서비스를 제공
  • 소울머신 적용시 40%이상의 human factor 감소, 지속적인 학습으로 정확도의 점차적 향상이 가능
  • IBM Watson API가 적용된 플랫폼에 대해 맞춤형 아바타 제작 및 적용시 8-12주의 시간 소모
  • 클라우딩 서비스 기반의 IBM Watson Assistant와 소울머신 플랫폼을 통합하여 구현되며, 아래와 같이 동작
    • 사용자가 소울머신의 가상 인공 인물에게 질문
    • 소울머신 플랫폼에서 입력된 고객의 음성 오디오 스트림을 Watson Assistant API로 전송(Cloud)
    • Watson이 전송된 오디오를 텍스트로 변환
    • Watson이 해당 질문에 연관된 답변을 사전에 정해진 규칙을 따르도록 알맞은 답변을 생성
    • 생성된 답변을 소울머신 플랫폼에 전달
    • Watson이 답변을 생성하는 동안 소울머신 플랫폼은 고객의 목소리 톤과 미세한 얼굴 표정 등 감지된 시청각 자료를 분석
    • 최종적으로 Watson이 만든 답변과 소울머신의 시청각 자료 분석 결과를 토대로 사용자의 질문에 대한 알맞은 목소리 톤과 얼굴 표정으로 결과 출력(대답)

Soul Machine Timeline

  • 2017년 호주 정부의 장애인 서비스 국가표준인 NDIS 에 소울머신과 IBM Watson 기반의 Nadia 인공지능 아바타 제작 및 적용
    • https://www.cmo.com.au/article/648607/going-beyond-chatbots-avatars-next-stage-ai-cx/
  • 2017년 Air Newzealand 에 소울머신과 IBM Watson 기반의 Sophie 인공지능 아바타 제작 및 적용하여 항공편 예약 등의 서비스를 제공
    • https://www.soulmachines.com/news/2017/09/26/soul-machines-latest-project-with-air-new-zealand-shows-the-potential-of-digital-humans-in-customer-service/
  • 2017년 Autodesk 와 제휴하여 소울머신과 IBM Watson 기반의 Ava 인공지능 아바타를 제작 및 적용하여 24/7 서비스 질문 및 답변 적용
    • https://www.soulmachines.com/news/2017/11/15/hot-off-the-press-soul-machines-partners-with-autodesk-to-launch-ava-at-autodesk-university-2017-2/
  • 2018년 Royal Bank of Scotland 에 소울머신과 IBM Watson 기반의 Cora 인공지능 아바타를 제작 및 적용
    • https://www.soulmachines.com/news/2018/02/26/press-cora-is-causing-quite-a-stir-across-global-media/
  • 2018년 NatWest bank UK 에 소울머신과 IBM Watson 기반의 Cora 인공지능 아바타 적용
    • https://www.soulmachines.com/news/2018/02/23/press-natwest-begins-testing-ai-driven-digital-human-in-banking-first/
  • 2018년 Daimler Financial Services 에 소울머신과 IBM Watson 기반의 Sarah 인공지능 아바타를 제작 및 적용
    • https://www.soulmachines.com/news/2018/02/26/press-new-partnership-with-daimler-financial-services-2/
  • 2018년 IBM Watson IoT platform 에 소울머신과 IBM Watson 기반의 INES 인공지능 아바타를 제작 및 적용
    • https://www.soulmachines.com/news/2018/04/26/press-a-new-security-digital-human-who-can-answer-cybersecurity-questions/
  • 2018년 ANZ (Australia and New Zealand Banking Group) 에 소울머신과 IBM Watson 기반의 Jamie 인공지능 아바타를 제작 및 적용
    • https://www.soulmachines.com/news/2018/07/09/hot-off-the-press-introducing-jamie-anzs-new-digital-assistant/
  • 2018년 가상 인공지능 아기 Baby X 제안
    • https://www.soulmachines.com/news/2018/08/29/press-nigel-latta-launches-a-curious-mind-series-featuring-babyx/
  • 2018년 오클랜드 에너지 회사 Vector 에 소울머신과 IBM Watson 기반의 Will 인공지능 교육용 아바타를 제작하여 어린아이들에게 학습용 자료 배포
    • https://www.soulmachines.com/news/2018/09/18/press-worlds-first-digital-teacher-starts-work-teaching-kids-about-energy/
  • 2019년 Bank ABC (Arab Banking Corporation) 에 소울머신과 IBM Watson 기반의 Fatema 인공지능 아바타를 제작 및 적용
    • https://www.soulmachines.com/news/2019/02/25/press-virtual-banks-to-dominate-future-banking-sector/
  • 2019년 미국 Verizon 통신사는 소울머신의 인공지능 아바타와 자사 기술로 인공지능 아바타 ‘Lia’를 개발하고, 이에 5G를 접목시켜 가상현실(VR) 서비스를 제공할 예정
    • https://www.scmp.com/lifestyle/gadgets/article/2188050/5g-networking-makes-artificial-humans-and-real-time-holograms
    • https://www.soulmachines.com/news/2019/03/12/press-5g-will-help-bring-digital-humans-to-life/

신경망 초기 가중치 설정

|

신경망 초기 가중치 설정

  • 참고 글: https://sacko.tistory.com/43
  • 참고 글: https://pythonkim.tistory.com/41

  • 가중치 초깃값을 0으로 설정하면?
    • 학습이 제대로 수행되기 어려움.
      • Back-propagation에서 가중치 값이 똑같이 갱신되기 때문
    • 가중치가 각각 영향력이 있어야 하는데 고르게 되어버리는 상황이 발생하면 각각의 노드를 만든 의미를 잃어버리게 됨
    • 따라서 각종 예제코드에서조차 초기 가중치를 random하게 설정하는것을 확인 할 수 있음

1. Sigmoid 가중치 초깃값 설정: Xavier

표준편차가 1인 경우

  • 활성화함수가 sigmoid인 경우 값이 0과 1에 주로 분포되어있음
    • 이로인해 sigmoid 함수의 미분 값이 0에 가까워지게 됨
    • 레이어가 쌓이게 되면 결국 back propagation시의 기울기 값은 점점 작아지다 결국 사라지는 vanishing gradient 문제가 발생하게 됨
views

표준편차가 0.01인 경우

  • 기울기가 사라지는 문제는 발생하지 않았으나 0.5 주변으로 값이 여전히 치우쳐있기에 다수의 뉴런을 사용한 이점이 사라짐
    • 100개의 뉴런이 똑같은 값을 출력하게 되는 꼴
views

Xavier 초기값

  • Xavier Glorot & Yoshua Bengio의 논문에서 권장하는 가중치 초기값
  • 앞 층의 입력 노드 수에 더하여 다음 계층의 출력 노드 수를 함께 고려해 초기값을 설정하는 방법
  • 밑의 그래프를 보면 앞의 두 방식보다 고르게 값들이 분포하게 되어 효율적으로 학습이 이루어짐을 알 수 있음
  • Sigmoid를 활성화함수로 사용했음에도 네트워크의 표현력에 문제가 발생하지 않음
import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

x = np.random.randn(1000, 100)
node_num= 100
hidden_layer_size = 5
activations ={}

for i in range(hidden_layer_size):
    if i != 0:
        x = activations[i-1]
        
    w = np.random.randn(node_num, node_num) / np.sqrt(node_num)
    
    a = np.dot(x, w)
    z = sigmoid(a)
    activations[i] = z
    
fig = plt.figure(figsize=(10,2))
for i, a in activations.items():
    plt.subplot(1, len(activations), i+1)
    plt.title(str(i+1) + "-layer")
    plt.yticks([],[])
    plt.hist(a.flatten(), 30, range=(0,1))
plt.show()
views

2. ReLU 가중치 초깃값 설정: He

  • He 초깃값은 ReLU에 특화된 초기값

예시코드

  • Xavier: 입력값과 출력값 사이의 난수를 선택해서 입력값의 제곱근으로 나눈다.
  • He: 입력값을 반으로 나눈 제곱근을 사용. 분모가 작아지기에 xavier보다 넓은 범위의 난수를 생성하게 됨
import numpy as np

# fan_in: 입력값
# fan_out: 출력값

# Xavier initialization
W = np.random.randn(fan_in, fan_out)/np.sqrt(fan_in)

# He initialization
W = np.random.randn(fan_in, fan_out)/np.sqrt(fan_in/2)

3. 활성화함수 별 가중치 초기값 설정 방식에 따른 활성화값 분포의 비교

Sigmoid 함수- Std 0.01, Xavier, He

views

ReLU 함수- Std 0.01, Xavier, He

views
  • ReLU 함수에서 가중치 초기값 설정 방식에 따른 가중치 분포를 확인하면 He 방법이 가장 고르게 나타나는것을 확인 가능
  • Std 0.01의 경우 깊어질수록 가중치가 0으로 사라진 것을 확인 할 수 있으며 Xavier 또한 뒤로갈수록 0에 몰려있는것을 확인 가능

Tanh 함수- Std 0.01, Xavier, He

views

4. 예제: MNIST 데이터셋으로 가중치 초깃값 비교

views
  • ReLU를 활성화함수로 했을 때 초기 가중치 설정에 따른 결과는 위와 같음
  • Std 0.01로 초기화시 학습이 전혀 이루어지지 않았으며(vanishing gradient) He 초기화 방법이 가장 빠르게 낮은 loss로 학습이 된 것을 확인

Batch normalization

|

Batch normalization

  • 참고 글: https://sacko.tistory.com/44

1. 배치 정규화 도입

  • Batch normalization: 네트워크 학습 과정에서 gradient vanishing/exploding을 해결하기 위한 접근방법

Batch normalizatioln(배치 정규화)

  • 학습의 효율을 높히기 위해 도입됨.(regularization)
    • 학습 속도의 개선이 가능
    • 가중치 초깃값 선택에 대한 의존성이 적어짐
      • 학습 시마다 출력값을 정규화하기 때문
    • 과적합(overfitting) 위험을 줄임
      • Drop out 대체 가능
    • Vanishing gradient 해결
  • 배치 정규화는 활성화함수의 활성화값 또는 출력값을 정규화(정규분포로 만들어줌)하는 작업임
  • 배치 정규화를 활성화함수 이전에 하는지 이후에 하는지는 아직 정답이 정해져있지는 않음
  • 신경망의 각 layer에서 데이터(batch)의 분포를 정규화 하는 작업으로, 일종의 noise를 추가하는 방법으로(bias와 유사) 이는 배치마다 정규화를 함으로써 전체 데이터에 대한 평균의 분산과 값이 달라질 수 있음
  • 학습할 때마다 활성화값/출력값을 정규화하기 때문에 초기화(가중치 초깃값)문제에서 비교적 자유로워짐

  • 각 hidden layer에서 정규화를 하면서 입력분포가 일정하게 되고 이에따라 learning rate를 크게 설정해도 학습이 잘 진행되게 됨
    • 학습속도가 빨라지게 됨
views

입력 분포의 균일화

  • 학습할 때 hidden layer의 중간에서 입력분포가 학습할 때마다 변화하면서 가중치가 엉뚱한 방향으로 갱신될 가능성이 있으며, 이 때 학습이 제대로 이루어지지 않게 됨
  • 신경망의 깊이가 깊어질수록 학습 시에 가정했던 입력분포가 변화하여 엉뚱한 학습이 될 수 있음
views

2. 배치 정규화 알고리즘

  • 간단하게 배치 정규화는 학습 시의 mini-batch를 한 단위로 정규화를 하는 것으로, 분포의 평균이 0, 분산이 1이 되도록 정규화 하는것을 의미함
views
  • 먼저 input으로 사용된 미니배치의 평균과 분산을 계산
  • 그 다음 hidden layer의 활성화값/출력값에 대해 평균이 0, 분산이 1이 되도록 정규화(normalization) 수행
    • 이로인해 데이터의 분포가 덜 치우치게(biased) 됨
    • 배치 정규화 단계마다 확대 scale과 이동 shoft 변환(transform)을 수행
views
  • 그림에서 파란색 선이 배치 정규화를 했을 때의 결과임
    • 훨씬 학습 속도가 빠르며, 가중치 초깃값 세팅에 영향을 받지 않는것도 확인 가능

3. 기타 참고

  • 배치 정규화는 가중치의 scale을 정규화하여 gradient exploding을 방지
views
  • ReLU와같은 활성화함수의 사용이나 낮은 learning rate값 사용, 초기화 작업등은 간접적인 vanishing gradient/exploding 방지를 위한 방법
  • 학습 과정 자체에서 학습을 안정화시키고 학습속도를 개선하는 직접적인 vanishing gradient/exploding 방지를 위한 방법으로 제안된것이 배치 정규화

정리

  • 네트워크 학습 시엔 mini-batch의 평균과 분산으로 normalize하고, test 할 때는 계산해높은 이동 평균으로 normalize를 한다.
  • Normalize한 후엔 scale factor와 shift factor를 이용해 새로운 값을 만들고, 이 값을 내놓는다.
  • 이 scale factor와 shift factor는 다른 레이어에서 weight를 학습하듯이 back-prop에서 학습되어진다.

Windows에 딥러닝 개발환경 구축하기

|

Windows에 딥러닝 개발환경 구축하기

  • 서버컴퓨터 GPU에서 학습을 돌리고있으면 아무것도 할수가 없다.
  • Test라도 하기 위해서 윈도우에서 개발환경(test 환경)을 구축했다.
  • Anaconda와 conda 가상환경을 이용하여 pip로 패키지를 설치하면 큰 스트레스 없이 구축 가능하다.

Windows 환경

  • Windows 10 Pro 64bit
  • Intel i7-7700K 32GB RAM
  • GeForce GTX 1080 8GB

Anaconda 설치

  • 우분투에선 다양한 실험을 해야하므로 anaconda를 설치하지 않지만(충돌 오류 방지..) windows에선 테스트환경 구축이므로 anaconda의 편리함을 이용하려한다.

  • https://www.anaconda.com/distribution/ 에 접속하여 anaconda를 다운로드 받는다.
    • 현재 최신 버전은 anaconda5.3(default python 3.7)이지만(가상환경 생성 시 하위 버전 파이썬 버전 호환 가능함) 안정성을 생각해서 anaconda5.2(default python3.6)을 설치하는것을 추천한다.
    • 몇몇 라이브러리들은 아직 python 3.7을 지원하지 않는다.
  • 이전 버전 설치를 위해 https://repo.continuum.io/archive/index.html 에 접속한다.
    • anaconda3-5.2.0-windows-x86_64.exe 을 검색하여 해당 파일을 다운로드 받는다.(windows 64bit 운영체제)
views
  • 다운로드 받아진 파일을 눌러 주욱 설치한다.
    • 몇몇 옵션이 나오면 아래와 같이 하나만 하는게 아니라 모두 선택한다.
      • 아래와같이 선택하면 별도로 anaconda의 python path 환경변수를 설정해줘야 함.
        • 추가 Path 환경변수: \Anaconda3, \Anaconda3\Scripts, \Anaconda3\Library\bin
    • 기존에 파이썬이 설치되어있으면 python path가 변경된다는 경고문이 나온다. 변경하고 진행하면 된다.
views
  • 설치 완료후엔 VS code를 설치하겠냐고 묻는데 필요에따라 설치하면 된다.
    • VS code 사용시엔 별도 설정이 필요하다.
    • 따로 path를 잡아줘야 하는등 불편하므로 개인적으로 그냥 sublimetext를 사용하고 코드는 anaconda prompt에서 동작시킨다.
  • 사용시엔 시작 창에 anaconda prompt로 검색하여 뜨는 dos창을 사용하면 된다.
views

설치확인

  • Anaconda prompt에 python --version, conda --version, pip --version등을 쳐서 제대로 잡히면 설치가 제대로 된 것이다.
views

CUDA/cuDNN 설치

  • cmd에서 nvcc --version을 쳤을 때 버전이 나오면 이미 설치된 상태이다.

CUDA 설치

  • https://developer.nvidia.com/cuda-toolkit-archive 에서 원하는 버전을 다운받는다.
    • 현재 설치하려는 딥러닝 라이브러리와 호환되는 버전을 설치해야 한다.
    • CUDA 10.0 이 필요하므로 https://developer.nvidia.com/cuda-10.0-download-archive 에서 다운받는다.
views
  • Installer Type의 경우, network나 local이나 상관없다. (network로 진행해서 설치함)
  • 설치하는 CUDA 10.0 같은경운 자동으로 시스템변수가 추가되므로 별도 작업이 필요하지 않다.
  • 그래픽드라이버 설치하듯이 설치하면 쉽게 설치가 완료된다.
    • 설치 과정에서 그래픽카드 드라이버와 같은 관련 dependency가 자동으로 재설치되므로 설치완료후 컴퓨터 재부팅이 필요하다.

cuDNN 설치

  • https://developer.nvidia.com/rdp/cudnn-download 에서 다운로드 받는다.
    • 현재 설치하려는 딥러닝 라이브러리와 호환되는 버전을 설치해야 한다.
    • cuDNN v7.5를 설치한다.
views
  • 해당 파일 다운로드 후, 압축파일 내의 파일들을 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0 내의 해당 폴더로 옮긴다.
views

설치확인

  • 설치 완료 후 anaconda prompt에 nvcc --version을 입력하여 제대로 출력되면 설치가 제대로 된 것이다.
views

Anaconda 가상환경 세팅

  • Anaconda prompt에서 진행한다.
  • 패키지 버전관리를 위해 가상환경에서 진행하는게 좋다.

  • 가상환경 생성: conda create --name 가상환경_이름 python=파이썬_버전
    • ex. conda create --name torch1.1 python=3.6
    • Proceed 에선 y를 선택해주면 된다.
  • 가상환경 리스트: conda info --envs
  • 가상환경 활성화: activate 가상환경명
    • ex. activate torch1.1
  • 가상환경 비활성화: deactivate 가상환경명 또는 deactivate
    • ex. deactivate torch1.1

Pytorch 설치(GPU)

  • Anaconda prompt에서 activate 가상환경명으로 가상환경 활성화 후 진행한다.
  • https://pytorch.org/ 에 접속하여 아래와 같이 세팅 후 생성된 명령어를 이용하여 설치한다.
    • pip install https://download.pytorch.org/whl/cu100/torch-1.1.0-cp36-cp36m-win_amd64.whl
    • pip install torchvision
views

설치확인

  • Anaconda prompt 에서 activate 가상환경명으로 가상환경이 활성화된 상태에서 python 입력 후 아래와같이 입력한다.
import torch
torch.cuda.is_available()
  • 위 명령어 모두 오류 없이 출력되고 torch.cuda.is_available()의 리턴 값이 True일 경우 제대로 설치 된 것이다.
views

Tensorflow 설치

  • Anaconda prompt에서 activate 가상환경명으로 가상환경 활성화 후 진행한다.
  • https://www.tensorflow.org/install/gpu 에 접속하여 설치한다.
    • pip install tensorflow-gpu # stable
    • 이전 버전 설치는 https://seongkyun.github.io/others/2019/05/10/ex_tensorflows/ 를 참조하여 동일하게 진행한다.
      • 관련 cuda, cudnn 버전 확인 필수

설치 확인

  • Anaconda prompt 에서 activate 가상환경명으로 가상환경이 활성화된 상태에서 python 입력 후 아래와같이 입력한다.
import tensorflow as tf
tf.test.is_gpu_available()
  • 위 명령어 모두 오류 없이 출력되고 tf.test.is_gpu_available()의 리턴 값이 True일 경우 제대로 설치 된 것이다.
views
  • 외에도 필요한 pip 패키지는 우분투와 동일하게 pip install로 설치하면 된다.