목록분류 전체보기 (245)
Joonas' Note
정의 Dependency Inversion Principle (DIP; 의존관계 역전 원칙) 프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다. 더 자세히는 이렇게 말한다. 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다. 1. 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다. 2. 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다. 의존 관계가 많을수록 코드의 변경이 잦아지는 것은 당연하다. 변경할 곳이 많다는 의미는 코드를 파악하고 수정하는 일이 무척 어렵다는 뜻이다. 의존 관계에 신경을 쓰는 이유는 이런 부분..
정의 Interface Segregation Principle (ISP; 인터페이스 분리 원칙) 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다. 위반 사례 이 ATM기는 총 3개의 모듈을 가지고 있는데, 어떤 거래(transaction)에 대해서 입금(Deposit), 출금(Withdrawal), 송금(Transfer) 모듈을 각자 만들었다. 각 모듈은 전문화된 기능을 가지기 위해 분리되었지만, 무언가 이상하다. 입금 거래 모듈은 입금만 하면 되는데, 위 구조와 같다면 코드가 이럴것이다. public class DepositTransaction extends Transaction implements UI { @Override public void requestDepositAm..
정의 Liskov Substitution principle (LSP; 리스코프 치환 원칙) 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 어떤 모듈 S가 모듈 T의 하위 모듈이라면, 속성의 변경없이 T를 S(상위)로 교체할 수 있어야 한다고 한다. 즉, 부모 클래스와 자식 클래스가 일관되어야 한다는 뜻이다. 위반 사례 이를 위반하는 대표적인 사례로는 원-타원 문제 (또는 사각형-정사각형 문제)가 있다. class Rectangle { private int width; private int height; public void setWidth(int width){ this.width = width; } public void setHeight(int he..
SOLID 원칙들은, 소프트웨어 작업에서 프로그래머가 소스 코드를 읽기 쉽고 확장하기 쉽게 될 때 까지 리팩토링하여 코드 냄새를 없애기 위해 쓰기 좋은 지침이다. 정의 Open/Closed Principle (OCP; 개방-폐쇄 원칙) 소프트웨어 요소는 확장에는 열려 있으나, 변경에는 단혀 있어야 하다. 모듈 중 하나를 수정했는데, 그 모듈을 사용하는 모든 모듈의 코드를 수정하는 일이 있으면 안된다는 뜻이다. 조금만 떠올려봐도 얼마나 끔찍한 일인 지 알 수 있다. 확장에 대해 열려 있다. 이것은 모듈의 동작을 확장할 수 있다는 것을 의미한다. 애플리케이션의 요구 사항이 변경될 때, 이 변경에 맞게 새로운 동작을 추가해 모듈을 확장할 수 있다. 즉, 모듈이 하는 일을 변경할 수 있다. 수정에 대해 닫혀 있..
SOLID 원칙들은, 소프트웨어 작업에서 프로그래머가 소스 코드를 읽기 쉽고 확장하기 쉽게 될 때 까지 리팩토링하여 코드 냄새를 없애기 위해 쓰기 좋은 지침이다. 정의 Single Responsibility Principle (SRP; 단일 책임 원칙) 하나의 클래스나 모듈은 단 하나의 책임만 가져야 한다. 하나의 함수가 여러 개의 일을 한다는 뜻은 예측 불가능하다는 의미이다. 예시 아주 단적인 예시로, 끝 원소를 제거를 하는 함수가 삭제되는 원소를 반환할 이유는 없다. 제거만 하면 된다. Element pop() { if (size < 1) throw "Empty"; size = size - 1; return array[size + 1]; // ? } 삭제되는 값을 얻고 싶다면, pop 하기 전에 끝자..
Proximal Policy Optimization (PPO, 2017) 목적 함수를 완성하기 위한 gradient 식은 아래와 같다. $$ \nabla_{\theta}J_{\theta} \cong \sum_{t=0}^{\infty} \int_{s_t,a_t,s_{t+1}}\nabla_{\theta}lnp_{\theta}(a_t|s_t)~A_t~p_{\theta}(s_t,a_t)~p(s_{t+1}|s_t,a_t)~ds_t,a_t,s_{t+1} $$ 여기서 \(A_t\)는 n-step TD error 인데, \(A_t\)의 정의에 따라서 아래와 같이 달라졌었다. $$ A_t = \begin{cases} G_t & \longrightarrow REINFORCE \\ Q(s_t) & \longrightarro..
A3C (Asynchronous A2C, 2016) 샘플 사이의 상관 관계를 비동기 업데이트로 해결 리플레이 메모리를 사용하지 않음 on-policy 개념적으로는 A2C 를 여러개 두고, 각 에이전트마다 아래와 같이 gradient를 계산해서, 그걸 글로벌 네트워크에 반영하는 방식이다. $$ Q_{(1)}(s_t,a_t)(-\sum y_i log p_i) \rightarrow gradient_{(1)} \\ Q_{(2)}(s_t,a_t)(-\sum y_i log p_i) \rightarrow gradient_{(2)} \\ \vdots $$ 배경 A2C는 샘플 간 상관 관계에 문제가 있었다 시간의 흐름에 따라, 샘플을 수집했기 때문 또한 샘플에 따라 정책(\(\pi\))이 업데이트 되고, 업데이트 된 정..
책을 읽다가 행렬식(determinant)에 대한 노트를 읽었는데, 기하학적으로 설명된 부분에 궁금한 점이 생겨서 정리해보고자 한다. 2X2 행렬 책에서는 2X2 행렬에 대해서 \(det(A)~=~a_{11}a_{22} - a_{12}a_{21}\) 을 이렇게 설명하고 있었다. 행렬 \(A~=~\begin{pmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{pmatrix}\) 의 행렬식은 두 개의 열 벡터 \(\begin{pmatrix} a_{11} \\ a_{21} \end{pmatrix}\) 와 \(\begin{pmatrix} a_{12} \\ a_{22} \end{pmatrix}\) 를 두 변으로 하는 평행사변형의 면적이다. 그럼 행렬 \(\begin{pmatri..