네이버 부스트캠프/LEVEL-1

[부스트캠프][WK-01 / Day3] 파이썬 기초 3, AI Math 2

1. 강의 내용

Python data structure (최성철 교수님)

1) 스택과 큐(stack & queue with list)

스택(Stack) 은 나중에 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조 입니다. 이를 Last In First Out (LIFO) 구조라고하며 데이터의 입력을 Push, 출력을 Pop이라고 합니다.

리스트를 사용해 구현 가능하며 push는 append(), pop은 pop()을 사용합니다.

# 스택 구조를 활용한 글자 역순 출력
word = input("Input a word : ")
word_list = list(word)
for i in range(len(word_list)): # 하나씩 빼면서 출력
    print(word_list.pop())

큐(Queue) 는 먼저 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조로 First In First Out (FIFO) 구조로 스택과 반대되는 개념입니다. 마찬가지로 리스트를 사용해 구현 가능하며 push는 append(), pop은 pop(0)을 사용합니다.

2) 튜플과 집합(tuple & set)

튜플은 값의 변경이 불가능한 리스트로 선언 시 "[]"가 아닌 "()"를 사용합니다. 리스트의 연산, 인덱싱, 슬라이싱 등 동일하게 사용 가능하나 값의 변경만 불가능합니다.

집합(set) 은 값을 순서 없이 저장, 중복을 불허하는 자료형으로 set 함수를 사용해 선언합니다. 수학에서 활용하는 집합연산이 가능합니다. 'add(): 추가', 'remove(): 삭제', 'update(): 추가', 'discard(): 삭제', 'clear(): 모두 삭제' 등을 사용해 변경 가능합니다.

3) 사전(dictionary)

데이터를 저장할 때 구분 지을 수 있는 고유값(Identifier 또는 Key)을 활용하여 데이터 값(Value)를 관리합니다. 이때, key로 value를 검색하며 다른 언어에서는 Hash Table이라는 용어를 사용합니다. 그 형식은 {key:value} 입니다.

'items(): 데이터출력', 'keys(): 키 값 출력', 'values(): value 출력' 등의 함수를 사용합니다.

# dict로 데이터 별 숫자 세기 및 정렬
def getKey(item):
    return item[1]

command_counter = {}
for data in command_data: # count
    if data[1] in command_counter.keys():
        command_counter[data[1]] += 1
    else:
        command_counter[data[1]] = 1

dictlist = []
for key, value in command_counter.items():
    temp = [key,value]
    dictlist.append(temp)

sorted_dic = sorted(dictlist, key=getKey, reverse=True) # 정렬

4) Collections 모듈

List, Tuple, Dict에 대한 Python Built-in 확장 자료 모듈입니다. 기존 list보다 효율적인 메모리 구조로 처리 속도가 향상됩니다.

  1. deque: Stack과 Queue를 지원하는 모듈로 rotate, reverse 등 Linked List의 특성을 지원합니다. 'rotate(): 순환', 'appendleft(), extendleft(): 왼쪽에 붙임' 등의 함수가 사용 가능합니다.
  2. OrderedDict: dict와 달리 데이터를 입력한 순서대로 dict를 반환하지만 python 3.6부터 dict도 입력한 순서를 보장해 의미가 없어졌습니다. Dict type의 값을 value 또는 key 값으로 정렬할 때 사용 가능합니다.
  3. defaultdict: Dict type의 값에 기본 값을 지정하고 신규 값 생성 시에 사용하는 방법입니다. defaultdict(lambda: 0)을 사용해 default 값을 0으로 설정합니다. 따로 초기값을 입력해주지 않아도 바로 할당 가능하기 때문에 숫자를 셀 때 유용합니다.
  4. Counter: Sequence type의 data element들의 갯수를 dict 형태로 반환해주는 방법입니다. dict 타입에 .elements()를 적용해 리스트로 반환해주기도 합니다. 이외에도 Set의 연산들을 지원합니다.
  5. namedtuple: 데이터의 구조체를 저장하는 방법으로 저장되는 데이터의 variable을 사전에 지정해서 저장합니다.

Pythonic code (최성철 교수님)

Pythonic code

파이썬 스타일의 코딩 기법으로 파이썬 특유의 문법을 활용하여 효율적으로 코드를 표현합니다.

1) Split & join

Split은 string type의 값을 "기준값"으로 나눠서 list 형태로 반환해 줍니다. join은 string으로 구성된 list를 합쳐 하나의 string으로 반환해 줍니다.

2) list comprehension

기존의 list를 사용하여 간단히 다른 list를 만드는 기법으로 파이썬에서 가장 많이 사용되는 기법 중 하나 입니다. 일반적으로 for+append 보다 속도가 빠릅니다.

# list comprehension 예시
# case 1
result = [i for i in range(10)]
result
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# case 2
case_1 = ["A","B","C"]
case_2 = ["D","E","A"]
result = [i+j for i in case_1 for j in case_2 if not(i==j)]
result
>>> ['AD', 'AE', 'BD', 'BE', 'BA', 'CD', 'CE', 'CA']

# case 3
result = [[i+j for i in case_1] for j in case_2]
result
>>> [['AD', 'BD', 'CD'], ['AE', 'BE', 'CE'], ['AA', 'BA', 'CA']]

3) enumerate & zip

enumerate는 list의 element를 추출할 때 번호를 붙여서 추출할 때 사용합니다. zip은 두 개의 list 값을 병렬적으로 추출합니다.

# enumerate
for i, v in enumerate(['tic','tac','toe']):
    print(i,v)
'''
0 tic
1 tac
2 toe
'''

# zip
for a, b in zip(['a1','a2','a3'],['b1','b2','b3']):
    print(a,b)
'''
a1 b1 
a2 b2
a3 b3
'''

# enumerate & zip
for i, (a, b) in enumerate(zip(['a1','a2','a3'],['b1','b2','b3'])):
    print(i, a, b)
'''
0 a1 b1 
1 a2 b2
2 a3 b3
'''

4) lambda & map & reduce

lambda는 함수 이름 없이 함수처럼 쓸 수 있는 익명함수 입니다. Python3와 PEP 8에서 lambda의 사용을 권장하지 않고 어려운 문법, 테스트의 어려움, docstring 지원 미비 등의 문제점이 있지만 여전히 많이 사용되고 있습니다.

map 함수는 시퀀스형 데이터가 있을 때 함수를 각각의 요소에 적용해 줄 때 사용합니다. 이는 두 개 이상의 list에도 적용이 가능하며 if문도 사용 가능합니다. 최근 map의 사용을 권장하지 않습니다.

reduce는 map과 달리 list에 똑같은 함수를 적용해서 통합합니다.

from functools import reduce
print(reduce(lambda x, y: x+y, [1,2,3,4,5]))
'''
3
6
10
15
'''

lambda, map, reduce는 간단한 코드로 다양한 기능을 제공하지만 직관성이 떨어져서 사용을 권장하지는 않습니다.

5) iterable object

iterable object는 Sequence 자료형에서 데이터를 순서대로 추출하는 object입니다. 내부적 구현으로 iternext가 사용됩니다.

cities = ["Seoul","Busan","Jeju"]
iter_obj = iter(cities)

print(next(iter_obj))
print(next(iter_obj))
print(next(iter_obj))
next(iter_obj)
'''
'Seoul'
'Busan'
'Jeju'
error!
'''

6) generator

generator는 iterable object를 특수한 형태로 사용해주는 함수로 element가 사용되는 시점에 값을 메모리에 반환하는데 yield를 사용해 한번에 하나의 element만 반환합니다. 메모리에 주소값만 가지고 있다가 호출될 때만 불러와 메모리를 절약할 수 있습니다.

# generator comprehension
# generator 형태의 list를 생성해 메모리 주소만 가지고 있고 값은 넣어놓지 않습니다.
gen = (n*n for n in range(500))

list 타입의 데이터를 반환해주는 함수에 사용하면 좋고 큰 데이터를 처리할 때는 generator expression을 사용하면 데이터가 아무리 커도 어려움이 없습니다. 파일 데이터를 처리할 때도 generator를 사용하면 좋습니다.

7) function passing arguments & asterisk

함수에 입력되는 arguments는 Keyword arguments, Default arguments, Variable-length arguments 등 다양한 형태가 존재합니다.

Keyword arguments는 함수에 대한 파라미터를 변수명처럼 사용하는 것입니다.

Default arguments는 파라미터의 기본 값을 사용하여 입력하지 않아도 사용할 수 있도록 하는 것입니다.

Variable-length asterisks는 함수의 파라미터가 정해지지 않았을 때 asterisks를 사용해 가변인자를 만들어주는 것입니다.

variable-length는 개수가 정해지지 않은 변수를 함수의 parameter로 사용하는 법입니다. asterisks는 Asterisk(*) 기호를 사용해서 함수의 parameter를 표시합니다.

가변인자는 일반적으로 *args를 변수명으로 사용하며 기존 파라미터 이후에 나오는 값을 tuple로 저장합니다.

def asterisks(a, b, *args):
    print(list(args))
    return a+b+sum(args)

print(asterisks(1,2,3,4,5,6,7))
'''
[3,4,5,6,7]
28
'''

키워드 가변인자는 파라미터 이름을 따로 지정하지 않고 여러개의 값을 키워드의 형태로 넣을 수 있습니다. asterisks(*) 두개를 사용하여 표현하며 입력된 값은 dict type으로 들어갑니다.

def kwargs_test(one, two=3, *args, **kwargs):
    print(one+two+sum(args)) # 3+4+5+6+7+8+9
    print(args)
    print(kwargs)

kwargs_test(10,30,3,5,6,7,8, first=3, second=4, third=5)
'''
69
(3,5,6,7,8)
{'first': 3, 'second': 4, 'third': 5}
'''

asterisk는 * 을 의미하는데, 단순 곱셈, 제곱연산, 가변 인자를 제외하고 unpacking container로도 쓰입니다.
unpacking container는 함수에 여러값을 한번에 넣어주고 싶을 때, tuple이나 list값을 풀어줘서 넣는 것입니다.

def asterisk_test(a, *args):
    print(a, *args)
    print(a, args)
    print(type(args))

test = (2,3,4,5,6)
asterisk_test(1, test)
'''
1 (2,3,4,5,6)
1 ((2,3,4,5,6),)
<class 'tuple'>
'''

def asterisk_test(a, *args):
    print(a, args)
    print(type(args))

test = (2,3,4,5,6)
asterisk_test(1, *test)
'''
1 (2,3,4,5,6)
<class 'tuple'>
'''

Python Object -Oriented Programming (최성철 교수님)

1) 클래스와 객체 (객체 지향 언어의 이해)

객체 지향 프로그래밍은 Object-Oriented Programming(OOP) 라고 불립니다. 객체는 실생활의 물건 같은 것이며 속성(Attribute)와 행동(Action)을 가집니다. OOP는 이러한 객체 개념을 프로그램으로 표현한 것으로 속성은 변수(variable), 행동은 함수(method)로 표현됩니다. 파이썬은 객체 지향 프로그램 언어 입니다.

OOP는 설계도에 해당하는 클래스(class) 와 실제 구현체인 인스턴스(instance) 로 나뉩니다. 붕어빵 틀이 클래스라면 붕어빵이 인스턴스 입니다.

클래스는 snake_case로 네이밍을 하는 함수/변수명과 달리 띄어쓰기 부분에 대문자를 쓰는 CamelCase를 사용하여 네이밍을 합니다.

class SoccerPlayer(object):
    def __init__(self, name, position, back_number): # 객체 초기화 예약 함수
        self.name = name
        self.position = position
        self.back_number = back_number

    def change_back_number(self, new_number): # self를 추가해야 class 함수로 인정
        print("선수의 등번호를 변경합니다 : From {self.back_number} to {new_number}")
        self.back_number = new_number

    def __str__(self):
        return "Hello, My name is {}. My back number is {}".format(self.name,self.back_number)

    def __add__(self, other):
        return self.name + other.name

abc = SoccerPlayer("son", "FW", 7)
park = SoccerPlayer("park", "WF", 13)

abc + park
'''
'sonpark'
'''

__는 특수한 예약 함수나 변수, 함수명 변경(맨들링)으로 사용되며 그 예시로 __main__, __add__, __str__, __eq__ 등이 있습니다.

2) 객체 지향 언어의 특징

  1. 상속(Inheritance)
    상속은 부모클래스로부터 속성과 Method를 물려받은 자식 클래스를 생성하는 것입니다.
  2. class Person(object): def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender

class Employee(Person): # 상속할 때 object 대신에 부모클래스를 적어줘야함.
def init(self, name, age, gender, salary):
super().init(name, age, gender) #super()를 활용해서 부모클래스의 속성을 가져옴
self._salary = salary # 부모클래스에 없는 속성 추가

2. **다형성(Polymorphism)**
다형성(Polymorphism)은 같은 이름 메소드의 내부 로직을 다르게 작성하는 것을 말합니다.

```python=
class Animal(object):
    def __init__(self, name):
        self._name = name

    def talk(self): 
        raise NotImplementedError() 

class Cat(Animal): 
    def talk(self):
        return "Meow!"

class Dog(Animal):
    def talk(self):
        return "Woof!"

animals = [Cat('Mong'), Cat('Kong'), Dog('Choco')]

for animal in animals:
    print(animal.talk())
'''
Meow! Meow! Woof!
'''
  1. 가시성(Visibility)
    가시성(Visibility)은 누구나 객체 안에 모든 변수를 볼 필요가 없기 때무에 객체의 정보를 볼 수 있는 레벨을 조절하는 것입니다. '__'를 변수 앞에 붙여주면 마음대로 변경하지 못하게 막을 수 있습니다.
class Inventory(object):
    def __init__(self):
        self.__items = [] # 접근하지 못하게 숨김

    @property #property decorator : 숨겨진 변수를 반환하게 해줌
    def items(self):
        return self.__items # 반환 가능

items = my_inventory.items # 접근 가능, __items로는 접근 불가

3) decorate

데코레이터(decorator)를 이해하기 위해서는 일급 객체, 내재함수, 데코레이터의 개념을 알아야 합니다.

일급 객체(일급함수)는 변수나 데이터 구조에 할당이 가능한 객체로, 변수로 사용할 수 있고 파라미터로 전달이 가능하거나 리턴 값으로 쓰일 수 있습니다. 파이썬의 함수는 일급함수 입니다.

내재함수는 함수 내에 또 다른 함수가 존재하는 것입니다.

데코레이터는 복잡한 클로져 함수를 간단하게 만들어 줍니다.

def star(func):
    def inner(*args, **kwargs):
        print("*" * 30)
        func(*args, **kwargs)
        print("*" * 30)
    return inner

@star # printer함수를 star함수 안에 넣어줍니다.
def printer(msg):
    print(msg)
printer("Hello")

'''
******************************
Hello
******************************
'''

Module and Project (최성철 교수님)

1) 모듈

모듈은 어떤 대상의 부분 혹은 조각으로 프로그램에서는 작은 프로그램 조각들입니다. 이러한 모듈이 모여 프로그램이 됩니다.

모듈은 파이썬에서의 py 파일을 의미합니다. 저장 후에는 import 문을 사용해서 모듈을 호출합니다.(같은 디렉토리에 있어야 함) 모듈을 호출할 때 범위 정하는 방법을 namespace라고 합니다. 호출하는 방법에는 Alias를 설정하는 방법(별칭), 모듈에서 특정 함수 또는 클래스만 호출하는 방법, 모듈에서 모든 함수 또는 클래스를 호출하는 방법이 존재합니다.

Built-in Module은 파이썬이 기본 제공하는 라이브러리로 별다른 조치 없이 import문으로 바로 가져올 수 있습니다. 예시로 random, time, urllib 등이 있습니다.

2) 패키지

패키지는 하나의 대형 프로젝트를 만드는 코드의 묶음으로, 다양한 모듈의 합이며 폴더로 연결됩니다. __init__, __main__ 등 키워드 파일명이 사용되며 다양한 오픈 소스들이 모두 패키지로 관리됩니다.

  • Package 만들기
    1) 기능들을 세부적으로 나눠 폴더로 만듦
    2) 각 폴더별로 필요한 모듈 구현
    3) 각 폴더별로 __init__.py 구성
    4) __main__.py 파일 만들기
    5) 실행하기-패키지 이름만으로 호출하기

3) 프로젝트

두 개의 프로젝트를 동시에 진행할 때 서로 필요한 패키지끼리 충돌이 날 때를 대비하여 필요한 패키지만 설치하는 환경을 가상환경이라고 합니다. 여기에는 기본 인터프리터와 프로젝트 종류별 패키지를 설치 합니다. 여기에 다양한 패키지 관리 도구를 사용하는데, 대표적으로 virtualenv와 conda가 있습니다.

virtualenv + pip는 가장 대표적인 가상환경 관리 도구이며 레퍼런스와 패키지 개수에 장점이 있습니다. conda는 상용 가상환경도구이고 설치가 용이하며 windows에서 장점이 있습니다. 현재는 conda를 많이 사용합니다. conda가 windows에서 좋은 이유는 파이썬은 C로 되어 있어서 어떤 코드는 C의 컴파일을 사용해야 하지만 pip에는 컴파일된 코드가 들어있지 않은 경우가 있는데 conda는 컴파일된 도구들을 같이 한번에 뿌려주기 때문입니다.

conda activate my_project # 가상환경 호출
conda deactivate          # 가상환경 해제
conda install <패키지명>   # 패키지 설치

딥러닝 학습방법 이해하기 (임성빈 교수님)

1) 신경망

선형 모델은 단순한 데이터를 해설할때는 도움이 되지만 복잡한 패턴의 문제를 풀때는 선형 모델로는 한계가 있습니다. 이를 극복하고자 비선형 모델인 신경망을 사용하는데, 수식으로 분해해보면 선형 모델과 비선형 모델의 결합으로 되어있습니다.

위 그림은 선형 모델의 형태입니다. 각 행 벡터 $o_i$(n×p)는 데이터 $x_i(n×d)$와 가중치 행렬 $W(d×p)$ 사이의 행렬곱과 절편 $b(n×p)$ 벡터의 합으로 표현된다고 가정해봅시다. $x$라는 변수들을 $o$라는 변수들에 각각 선형으로 연결하게 될 때, $d$개의 변수로 $p$개의 선형모델을 만들어서 $d*p$ 개의 연결선을 만들게 되는데 이것이 가중치행렬 $W(d×p)$ 입니다.

2) softmax

소프트맥스 함수는 분류문제를 풀 때 학습을 시키기 위해 필요한 연산자로 모델의 출력을 확률로 해석할 수 있게 변환해주는 연산입니다. 출력 벡터 $o$에 소프트맥스 함수를 합성하면 확률벡터가 되므로 특정 클래스 $k$에 속할 확률이라고 해석할 수 있습니다.

추론을 하는 경우 원-핫 벡터로 주어진 출력에서 가장 큰 값을 가진 주소만 1로 출력하기 때문에 소프트맥스 함수를 사용하지 않습니다.(학습에만 사용)

3) 활성함수 (activation function)

비선형함수로써, 선형모델로 나오는 출력물 각각의 원소에 적용되는 것입니다. 소프트맥스는 출력물의 모든 값을 고려해 출력한다면 활성함수는 다른 주소의 출력값은 고려하지 않고 해당 출력값만 고려합니다.

활성함수를 이용해 선형모델로 나온 출력물을 비선형으로 변환시키는데 이렇게 변환된 벡터를 잠재벡터라고 합니다.

활성함수는 실수 값을 입력으로 받아서 실수 값을 반환해주는 비선형 함수입니다. 활성 함수를 쓰지 않은 딥러닝은 선형 모형과 차이가 없습니다. 시그모이드(sigmoid) 함수나 tanh 함수는 전통적으로 많이 쓰이던 활성 함수이지만 딥러닝에서는 ReLU 함수를 많이 쓰고 있습니다.

4) 신경망 분해

$x$를 입력 받아 $W(1)$이라는 가중치 행렬을 통해 $Z$로 보내고 $Z$에 활성함수를 씌워 $H$라는 잠재벡터로 보냅니다. 이러한 메커니즘을 여러번 반복해 선형모델과 활성함수의 여러층 합성이 딥러닝의 기본적인 수식적 표현입니다.

 

총 L개의 신경망 계산을 통해 최종 출력물로 $o$라는 행렬을 계산하는 과정을 forward propagation(순전파) 라고 합니다.

 

층이 깊어질수록 목적함수를 근사하는데 필요한 뉴런(노드)의 숫자가 훨씬 빨리 줄어들어 좀 더 효율적으로 학습이 가능합니다. 즉, 조금 더 적은 노드를 가지고 복잡한 패턴을 파악할 수 있기 때문에 층을 깊이 쌓습니다. 단, 층이 깊어질수록 학습하기 어려워질 수 있습니다.

5) 역전파(backpropagation) 알고리즘

딥러닝은 역전파(backpropagation) 알고리즘을 이용하여 각 층에 사용된 파라미터 W와 b를 학습합니다. 각각의 가중치 행렬 $W(L)$에 대해 손실함수에 대한 미분을 계산할 때 역전파 알고리즘을 사용합니다.

 

위층의 그래디언트를 계산한 후 아래층으로 내려가며 그래디언트를 계산합니다. 이 과정에서 역전파는 연쇄법칙 기반 자동 미분(auto-differentiation)을 사용을 통해 그래디언트 벡터를 전달합니다. 이 과정에서 각 노드의 텐서 값을 컴퓨터가 기억해야 미분 계산이 가능하기 때문에 순정파보다 역전파가 더 많은 메모리를 쓰게 됩니다.


확률론 맛보기 (임성빈 교수님)

1) 딥러닝에서의 확률론 필요성

딥러닝은 확률론 기반의 기계학습 이론에 바탕을 두고 있으며 기게학습 시 사용되는 손실함수들의 작동원리는 데이터 동간을 통계적으로 해석해서 유도하게 됩니다. 회귀 분석에서의 손실함수인 L2-norm은 예측오차의 분산을 최소화하는 방향으로, 분류 문제에서의 교차엔트로피는 모델 예측의 불확실성을 최소화하는 방향으로 학습하도록 유도합니다.

데이터 공간 $X×Y$라 표기하고 $D$를 데이터 공간에서 데이터를 추출하는 확률분포라고 부릅니다. $D$를 한번에 아는 것은 불가능하기 때문에 이를 기계학습을 통해 추정합니다.

2) 확률변수

확률변수는 확률분포 $D$에 따라 이산형(discrete)과 연속형(continuous) 확률변수로 구분합니다.

  • 이산형 확률변수: 확률변수가 가질 수 있는 경우의 수를 모두 고려하여 확률을 더해서 모델링
  • -> $P(X=x)$ 함수는 확률변수가 $x$ 값을 가질 확률로 확률질량함수 입니다.
  • 연속형 확률변수: 데이터 공간에 정의된 확률변수의 밀도(density) 위에서의 적분을 통해 모델링

  • -> $P(x)$는 밀도함수로 누적확률분포의 변화율을 모델링하며 확률로 해석하면 안됩니다.

결합분포 $P(x,y)$를 가지고 원래 확률분포 $D$를 모델링할 수 있습니다. 원래 확률분포 $D$가 연속이냐 이산이냐에 따라서 결합분포 $P(x,y)$의 분포를 연속이냐 이산이냐 정하는 것이 아니라 원래 확률분포와 상관없이 결합분포가 정해질 수 있습니다.

 

 

$P(x)$는 입력 x에 대한 주변확률분포로 $y$에 대한 정보를 주진 않습니다. 이러한 $P(x)$를 주변확률분포라 하며 결합분포 $P(x,y)$에서 유도 가능합니다.

 

조건부확률분포 $P(x|y)$는 데이터 공간에서 입력 x와 출력 $y$ 사이의 관계를 모델링합니다. $P(x|y)$는 특정 클래스가 주어진 조건에서 데이터의 확률분포를 보여줍니다. 조건부 확률분포를 보면 좀 더 명확하게 데이터들의 분포들을 살펴볼 수 있습니다.

 

  • 조건부확률과 기계학습

조건부 확률 $P(y|x)$는 입력 변수 $x$에 대해 정답이 $y$일 확률을 의미합니다. 만약 연속확률분포일 경우 $P(y|x)$는 확률이 아니고 밀도로 해석합니다.

 

조건부확률은 로지스틱 회귀에서의 선형모델과 소프트맥스 함수의 결합은 데이터에서 추출된 패턴을 기반으로 확률을 해석하는 데 사용됩니다. 분류 문제에서 $softmax(W\phi+b)$는 데이터 x로부터 추출된 특징 패턴 $\phi(x)$와 가중치 행렬 W을 통해 조건부 확률 $P(y|x)$을 계산합니다.

 

분류가 아닌 회귀 문제의 경우 y가 연속 값이므로 보통 연속 확률변수를 다루기 때문에 확률로 해석하기는 어려워 밀도함수로 해석해야해 조건부기대값 $E[y|x]$을 추정하게 됩니다.

조건부기대값은 L2-norm(목적식)을 최소화하는 함수이기 때문에 사용합니다. 만약 데이터가 강건(robust)하게 예측을 하는 경우에는 조건부기대값보다는 중앙값(median)을 사용해 추정하기도 합니다. 즉, 원하는 목적에 따라 사용되는 estimator가 달라집니다. 딥러닝은 다층 신경망을 사용해서 데이터로 특징 패턴 $\phi$을 추출합니다. 특징 패턴을 학습하기 위해 어떤 손실 함수를 사용할지는 기계학습 문제와 모델에 의해 결정됩니다.

  • 기대값

확률분포가 주어지면 데이터를 분석하는 데 사용 가능한 여러 종류의 통계적 범함수(statistical functional)를 계산할 수 있습니다. 기댓값(expectation)은 데이터를 대표하는 통계량이면서 동시에 확률분포를 통해 다른 통계적 범함수를 계산하는 데 사용됩니다. 기대값을 이용해 분산, 첨도, 공분산 등 여러 통계량을 계산할 수 있습니다.

 

연속확률변수냐 이산확률변수냐에 따라 적분을 취해주거나 급수를 취해주고 연속확률변수일땐 밀도함수를, 이산확률변수일 땐 질량함수를 곱해줍니다.

 

3) 몬테카를로 샘플링(Monte Carlo)

기계학습의 많은 문제들은 확률분포를 명시적으로 모를 때가 대부분입니다. 확률변수를 모를 때 데이터를 이용하여 기대값을 계산하려면 몬테카를로 샘플링 방법을 사용해야 합니다.

몬테카를로는 이산형이든 연속형이든 상관없이 성립합니다. 샘플링하는 분포에서 독립적으로 샘플링을 해줘야만 대수의 법칙에 의해 수렴성을 보장하고 몬테카를로 샘플링이 작동합니다.


2. 과제 수행 과정 / 결과물 정리

필수과제 4,5 마무리
야구문제의 경우 main() 함수를 구현하는 과정에서 에러가 자주 발생해 시간이 많이 소요되었습니다.


3. 피어세션 정리

  • 과제 1,2,3 리뷰
  • 파이썬 3-1 ~ 4-2
  • AI Math 5강, 6강

클래스와 객체와 인스턴스의 차이는?

붕어빵에 비유하자면

  • Class : 붕어빵 틀 기계 (설계도)
  • 객체 : 붕어빵에 들어가는 재료
  • 인스턴스 : 틀에서 만들어진 붕어빵 각각의 실체
  구조 실체
클래스 O X
객체 X O
인스턴스 O O

Gradient Vanishing

시그모이드와 ReLU


4. 학습 회고

파이썬 기초에서 파이썬의 데이터 구조, 객체, 모듈 등을 배웠고

AI Math에서 딥러닝 학습방법, 확률론을 배웠습니다.

확률론에 대한 추가적인 학습이 필요합니다.