Week1 학습 정리

HY·2023년 11월 10일
0

Boostcamp AI Tech

목록 보기
1/1

Python

강의를 들으면서 잘 모르거나 제대로 정리가 안되었던 내용 위주로 정리했다.

특징

  • 객체 지향적이고 문법이 단순하며 라이브러리가 많다.
  • OS 독립적으로 인터프리터가 있다면 어느 OS에서든 실행시킬 수 있다.
  • 스크립트 언어로 인터프리터를 사용해 한 줄씩 실행시키기 때문에 컴파일 언어에 비해 느리지만 간단하고 메모리를 적게 쓴다.
  • 동적 타이핑 언어로 코드를 작성할 때 자료형을 명시할 필요가 없으며, 실행 시점에 자료형을 해석해 메모리를 할당한다.

Generator

  • 함수 안에 yield 키워드 사용해 iterator를 생성해주는 함수
def make_generator():
	for i in range(10):
		yield i

gen = make_generator()
next(gen)
  • 큰 데이터를 처리해야 하고 list 타입의 데이터를 반환해주는 함수는 generator를 사용하면 좋다. (예를 들어, 큰 파일을 불러야 할 때)

Closure

  • 함수 바깥 쪽의 지역 변수를 이용해 연산하는 함수를 만든 다음, 해당 함수를 반환하는 함수
# 특정 값을 더해주는 함수
def make_adder(x):
	def add_y(y):
		return x + y
	return add_y

add5 = make_adder(5)
print(add5(3))

# 호출 횟수를 세는 함수
def make_counter():
	cnt = 0
	def count():
		nonlocal cnt  # 이걸 쓰지 않아도 읽기는 가능하지만, 쓰기가 불가능 (global도 마찬가지)
		cnt += 1
		return cnt
	return count

counter = make_counter()
print(counter())
print(counter())
  • 외부 변수를 기억하고 이 외부 변수에 접근할 수 있는 함수로 전역변수의 남용을 막을 수 있고 변수 값을 은닉하는 용도로도 사용할 수 있다.
  • 파이썬의 함수가 일급객체이기 때문에, return 값으로도 사용될 수 있다.

Decorator

  • 함수를 수정하지 않은 상태에서 추가 기능을 구현할 때 (자바의 AOP?)
def trace(func):                             # 호출할 함수를 매개변수로 받음
    def wrapper():
        print(func.__name__, '함수 시작')    # __name__으로 함수 이름 출력
        func()                               # 매개변수로 받은 함수를 호출
        print(func.__name__, '함수 끝')
    return wrapper                           # wrapper 함수 반환
 
@trace    # @데코레이터
def hello():
    print('hello')

hello() # hello 함수 시작
				# hello
				# hello 함수 끝

AI Math

행렬

숫자로 이루어진 2차원 배열을 의미한다.

차원이 없는 값은 스칼라(Scalar), 1차원 배열은 벡터(Vector), 2차원 배열은 행렬(Matrix), 3차원부터는 텐서(Tensor)라고 부른다.

역행렬

  • 어떤 행렬 AA의 역행렬은 A1A^{-1}으로 표현
  • 역행렬 A1A^{-1}AAA1A^{-1}을 곱한 값이 단위 행렬(항등 행렬)이 되도록 하는 값
AA1=IAA^{-1} = I

유사 역행렬 (Moore-Penrose 역행렬)

  • 행과 열의 숫자가 다른 행렬의 역행렬을 구할 때 사용
nm,A=(ATA)1ATnm,A=AT(ATA)1n\ge m,\qquad A=(A^TA)^{-1}A^T \newline n\le m, \qquad A=A^T(A^TA)^{-1}
  • 연립 방정식을 풀 때, n=m이면서 행렬식(det)이 0이 아닌 행렬의 경우, 유일해가 존재하지만 행과 열의 크기가 다를 때
    • n > m 일 때, 식의 개수가 변수의 개수보다 많기 때문에 만족하는 해가 존재하지 않음
      • Moore-Penrose 역행렬을 이용하면 최소제곱법에 따른 최적해를 구할 수 있음
        y^y=Xβ\hat{y}\approx y=X\beta
        β=X+y=(XTX)1XTy\Rightarrow\beta=X^{+}y=(X^{T}X)^{-1}X^Ty
    • n < m 일 때, 식의 개수가 변수의 개수보다 적기 때문에 무수히 많은 해가 존재
      • 그 중 한 해가 x=A+1bx=A^{+1}b 이다. (Ax=AAT(ATA)1b=Ib=bAx = AA^T(A^TA)^{-1}b = Ib = b)

경사하강법

볼록한 함수일 때, 함수의 극솟값은 해당 함수의 최솟값이다. 선형회귀방정식을 구할 때 목적식을 최소화하는 값을 찾기 위해 사용된다.

경사하강법은 극솟값을 구하기 위해 사용되는 방법으로 미분 값을 빼주면 함수 값이 작아지는 방향으로 간다. (미분값(접선의 기울기)가 -인 경우 해당 점에서 +로 갈수록 함수 값이 작아지고, +인 경우에는 -로 갈수록 함수값이 작아지기 때문) 극솟값(미분값 0)에 도달할 때까지 연산을 반복해 극솟값을 찾을 수 있다.

회고

일단, 양이 너무 많다. 1주차에는 pre-course에 있던 범위 전체의 강의를 듣고 학습하는 것이었는데, 너무 많았다. 사실 부스트캠프 지원할 때 가산점 받으려고 수료는 했었는데 제대로 들었더라면 지금 이렇게 힘들지 않아도 되었겠지...

강의 자체는 퀄리티가 높은 편이다. 파이썬은 코딩테스트 문제를 풀 때 자주 쓰기도 했고, 프로그래밍에는 베이스가 있어서 듣는게 의미가 있을까 싶었지만, 클로저나 데코레이터 같은 제대로 개념이 안잡혔던 부분까지 다뤄서 찾아보면서 정리를 했다.

하지만 AI Math 파트부터는 지식이 별로 없어서 그런지 너무 훅훅 넘어가는 느낌도 없잖아 있었다.

대학 때 전공 과목을 위해 선형대수를 일부 배우기는 했지만, 유사역행렬이라는 개념은 처음 보기도 해서 약간의 어려움도 있었다. n < m일 때, 양변에 A+1A^{+1}을 곱하면 좌변이 사라지지 않을 것 같은데 왜 저런 답이 나오지? 싶었는데 n < m인 경우에는 무수히 많은 해가 나오기 때문에, 그 중 한 해가 x=A+1bx=A^{+1}b가 되는 것이었다. 누군가 슬랙에 올린 질문과 팀원의 도움 덕분에 유사역행렬 부분은 적어도 강의 내용안에서는 확실하게 이해할 수 있었다.

확률과 통계부분부터 CNN, RNN부분은 사실 원래도 개념이 정확히 잡힌게 아니라 그런지 강의가 머리에 안들어왔다. 너무 미루는 것 같긴 하지만, 주말에 좀 더 공부하고 정리해보아야할 것 같다... 다음주에는 공부하는 것에 좀 익숙해졌으면 좋겠다...

0개의 댓글