Posts

Pytorch기초-Tensor

 - tensor 생성, 변환 import torch import numpy as np # 배열 생성 data = [[ 1 , 2 ] , [ 3 , 4 ]] # 배열을 tensor 로 변환 tensor = torch.tensor(data) print (tensor) # tensor([[1, 2], [3, 4]]) # 배열을 array 로 변환 array = np.array(data) print (array) # [[1 2] [3 4]] # array 를 tensor 로 변환 array_to_tensor = torch.from_numpy(array) print (array_to_tensor) # tensor([[1, 2], [3, 4]]) # tensor 를 array 로 변환 tensor_to_array = tensor.numpy() print (tensor_to_array) # [[1 2] [3 4]] - tensor의 size와 dtype을 유지하여 새로운 tensor 생성 import torch import numpy as np data = [[ 1 , 2 ] , [ 3 , 4 ]] tensor = torch.tensor(data) # 기존 tensor 와 속성이 같고 각 원소가 1 인 tensor 생성 ones = torch.ones_like(tensor) print ( f"Ones Tensor : \n { ones } " ) # 기존 tensor 와 속성이 같고 각 원소를 랜덤으로 배정한 tensor 생성 rand = torch.rand_like(tensor , dtype =torch.float32) print ( f"Random Tensor : \n { rand } " ) - 특정 size를 갖는 tensor 생성 import torch import numpy as np shape = ( 2 , 3 ) rand_tensor = torch.rand(shape) ones_tensor = t

백준 1021번 : 회전하는 큐(Python)

문제 링크 :  https://www.acmicpc.net/problem/1021 문제 지민이는 N개의 원소를 포함하고 있는 양방향 순환 큐를 가지고 있다. 지민이는 이 큐에서 몇 개의 원소를 뽑아내려고 한다. 지민이는 이 큐에서 다음과 같은 3가지 연산을 수행할 수 있다. 첫 번째 원소를 뽑아낸다. 이 연산을 수행하면, 원래 큐의 원소가 a 1 , ..., a k 이었던 것이 a 2 , ..., a k 와 같이 된다. 왼쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a 1 , ..., a k 가 a 2 , ..., a k , a 1 이 된다. 오른쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a 1 , ..., a k 가 a k , a 1 , ..., a k-1 이 된다. 큐에 처음에 포함되어 있던 수 N이 주어진다. 그리고 지민이가 뽑아내려고 하는 원소의 위치가 주어진다. (이 위치는 가장 처음 큐에서의 위치이다.) 이때, 그 원소를 주어진 순서대로 뽑아내는데 드는 2번, 3번 연산의 최솟값을 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가 순서대로 주어진다. 위치는 1보다 크거나 같고, N보다 작거나 같은 자연수이다. 출력 첫째 줄에 문제의 정답을 출력한다. 구현 방식 우선, 입력 값들을 받아낸다. import sys input = sys.stdin.readline N , M = map ( int , input().split( ' ' )) l = list ( map ( int , input().split( ' ' ))) 큐와 주어진 리스트를 동시에 연산하는 것보다 주어진 리스트 만으로 해결하고자 하였다. 선택할 수 있는 행동은 좌측으로 이동하냐, 우측으로 이동하냐 인데 더 최소한의 움직임을 택해야 한다. 우선 좌측으로 이동하는 함수이다. d

동차 변환(Homogeneous Transformations)

Image
 동차 변환(Homogeneous Transformaions)이란 벡터의 회전과 평행이동을 하나의 행렬 곱셈으로 연산하는 방법이다. 1. 위치 표현(Representing Positions) 벡터 표현에 대한 notation은 다음과 같다. $$p^a$$ 위 표기는 $a$번 좌표계를 기준으로 한 $p$ 벡터를 의미한다. 위 그림에서 0번 좌표계를 기준으로 한 p점까지의 벡터는 $p^0$이고 1번 좌표계를 기준으로 한 벡터는 $p^1$이라 표현한다. 또한 좌표계의 원점과 원점 사이의 벡터를 표현할 때에는 0번 좌표계에서 1번좌표계의 원점까지의 벡터는 $o_1^0$,  1번 좌표계에서 0번 좌표계의 원점까지의 벡터는 $o_0^1$ 과 같이 표현한다. 만약 1번 좌표계에서 $v_1$을 표현할때에는 $v_1$의 시작점이 1번 좌표계의 원점으로 평행이동했다 생각하여 $v_1^1$과 같이 표기한다. 쉽게 생각하자면, 벡터의 시작점은 superscript로 표기하고 끝점은 subscript로 표기한다 생각하면 된다. 2. 회전 변환(Representing Rotations) 위 그림에서 각각 좌표축을 크기가 1인 단위벡터라 생각하자. 이때 Rotation matrix는 다음과 같이 정의한다. $$\begin{matrix}R_1^0 &=& \left[ x_1^0 \mid y_1^0 \right] \\ &=& \begin{bmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{bmatrix} \end{matrix}$$ 이는 0번 좌표계에서 바라본 $\theta$만큼 회전한 좌표계의 좌표이다. 위 식에서 행 또는 열은 크기가 1이며 서로 수직 관계라는것을 알 수 있다. 이를 내적의 형태로 표현할 수도 있다. $$R_1^0 = \begin{bmatrix} x_1 \cdot x_0 & y_1 \cdot x_0 \\ x_1 \cdot y_0 & y_1 \cd

그래디언트 디센트(Gradient decent)

Image
1. 손실함수 손실함수(Loss funcion)란 참값과 예측값의 편차 제곱의 형태이며 식은 다음과 같다. $$L(w) = \left( f_{true}(t) - f_w(t) \right)^2$$ 여기서 $w$는 Neural Network의 parameter이다. 이 손실함수를 최소화하기 위하여 그래디언트 디센트를 이용한다. 2. 그래디언트 디센트 손실함수를 각각의 parameter로 편미분하면 $$\nabla_w L(w) = \left( {\partial L(w) \over \partial w_1}, {\partial L(w) \over \partial w_2}, {\partial L(w) \over \partial w_3}, \cdots \right)$$ 위와 같이 되는데 이는 손실함수를 증가시키는 방향이다. 따라서 손실함수를 감소시키는 식을 정의하게 되는데 이를 그래디언트 디센트라 한다. $$w' = w - \alpha \nabla_w L(w)$$ 이를 예시를 들어 코딩해보자. 임의의 함수를 우리가 원하는 데이터와 일치시키는 parameter를 구하는 것이 목표이다. $f_w(x_1, x_2) = w_1x_1 - w_2x_2 + 1$ 위 함수의 초기 parameter가 $w_1 = 0.5, w_2 = 1.2$일 때 $f_2(1, 2) = 1$이 되는 parameter를 구해보자. import   numpy   as   np def   f_w ( w ,  x ):      w1 ,  w2  =  w      x1 ,  x2  =  x      f  =  w1 * x1  -  w2 * x2  +  1      return   f def   Loss_f ( w ,  x ):      L  = ( 1.0  -  f_w ( w ,  x )) **  2      return   L 우선 우리가 정한 함수를 정의하고 이에따른 손실함수도 정의한다. def   gradient ( w ,  x ):      dw  =  1e-6      w1  =  np . arra

벨만 방정식(Bellman equation)

Image
  1. 벨만 방정식이란? 앞서 State Value Function과 Action Value Function은 Return의 기댓값의 형태라 정의하였다. 하지만 이 수식 그대로를 적용한다면 모든 경우의 수를 시도해 본 후에야 Value Function을 구할 수 있을 것이다. 이는 복잡한 문제에서는 현실적으로 불가능하므로 이를 보완하고자 하는 시도중의 하나가 벨만 방정식을 이용하는 것이다. 벨만 방정식은 각 step 간의 재귀적 관계를 이용하여 정리한 식으로 이를 활용하면 현실적인 구현이 가능하다. 2. 벨만 기대 방정식(Bellman Expectation Equation) 2.1 상태 가치 함수 기본 정의에 따라 식을 순차적으로 전개해보자. $$\begin{matrix}v_{\pi}(s) &=& E \left[ G_t \mid S_t = s, \pi \right] \\ &=& E \left[ R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \dots \mid S_t = s, \pi \right] \\ &=& E \left[ R_{t+1} + \gamma G_{t+1} \mid S_t = s, \pi \right] \end{matrix}$$ 이때 시간 $t+1$에서 return의 기댓값은 다음 그림을 보면 $t+1$에 해당하는 모든 상태의 return에 대한 기댓값을 취하면 상태 가치 함수와 같게 된다. 따라서 위 식은 다음과 같이 표현 가능하다. $$E \left[ R_{t+1} + \gamma v_{\pi}(s_{t+1}) \mid S_t = s, \pi \right]$$ 이를 전개하여 수열의 합 형태로 나타낼 수도 있다. $$\begin{matrix} v_{\pi}(s) &=& \underset{a \in A} \sum \pi (a \mid s) \underset{s' \in S} \sum P_{ss'}^a \left( R_{s'} + \ga

강화학습 기본 알고리즘(2)

Image
5. 다이내믹 프로그래밍(Dynamic Programming) 다이내믹 프로그래밍이란 환경에 대한 모든 정보를 알고 있는 Model Based 기법이다. 따라서 S, A, P, R, $\gamma$를 알고 있는 상황이다. 이를 활용하여 각 상태에서 가치를 구하여 정책 평가를 한 뒤 이를 활용하여 탐욕적으로 정택을 갱신하여 정책 제어를 한다. 6. 몬테카를로 방법(MC : Monte-Carlo Prediction) 몬테카를로 방법에서는 모델을 알 수 없는 Model Free 에서 사용하는 기법이다. 우선 다음 수식을 보자. $$v_{\pi}(s) = V(s)\ when\ N(s)\ \rightarrow\ \infty \\ N(s) \leftarrow N(s) + 1 \\ S(s) \leftarrow S(s) + G_t \\ V(s) \leftarrow V(s)/N(s)$$ 위와 같이 MC에서는 누적된 반환값을 카운트로 나누어 상태 가치 함수를 구한다. 하지만 위와 같은 방법으로는 프로그램 상에서 비효율적이므로 증분평균(Incremental Mean) 개념을 이용하여 계산한다. 증분 평균이란 평균을 구할 때 이전에 계산한 값을 활용하여 누적 계산하는 방법이다. $$\begin{matrix} \mu_k &=& {1 \over k} \sum_{j = 1}^k x_j \\ &=& {1 \over k} \left( x_k + \sum_{j = 1}^{k-1} x_j \right) \\ &=& {1 \over k} \left(x_k + \left({k-1 \over k-1}\right) \sum_{j=1}^{k-1} x_j \right) \\ &=& {1 \over k}(x_k + (k - 1) \mu_{k - 1}) \\ &=& \mu_{k-1} + {1 \over k}(x_k - \mu_{k - 1}) \\ &\approx& \mu_k + {1 \over k} \left(x_k - \

강화학습 기본 알고리즘(1)

Image
  1. 마르코프 결정 과정(Markov Decision Process) 마르코프 결정 과정(MDP)는 마르코프 보상 과정(MRP)에 행동(A : Acton)과 정책($\pi$ : Policy) 가 추가된 개념이다. MDP에서는 Action이 추가되었기 때문에 이에 따른 상태 전이 확률과 보상함수를 새로 정의하여야 한다. MDP에서 상태 전이 함수는 특정 상태(s)에서 행동(a)를 취했을 때 다음 상태(s')으로 전이되는 확률이다. $$P_{ss'}^a = P[S_{t+1} = s' \mid S_t = s, A_t = a]$$ 마찬가지로 보상함수는특정 상태(s)에서 행동(a)를 취했을 때 t+1에서 받을 수 있는 보상의 기댓값이므로 다음과 같다. $$R_s^a = E[R_{t+1} \mid S_t = s, A_t = a]$$ Agent가 Action을 선택하는 확률을 정책이라 한다. 정책은 $\pi$로 나타내며 다음과 같이 정의된다. $$\pi = P[A_t = a \mid S_t = s]$$ 식 그대로 상태 s에서 행동 a를 할 확률이다. 이때 Agent가 특정 상황에서 취할 수 있는 모든 정책의 합 즉, 각각의 행동을 할 확률의 합은 1이다. 따라서 MRP와 MDP에서 모두 특정 상태에서 다음 상대로 전이되는 확률은 같다. 이는 다음 그림을 보면 이해가 쉬울것이다. MRP에서 상태 $s_1$에서 상태 $s_2$로 이전할 확률은 $p_1$이고 MDP에서는 다음과 같다. $$\pi_1 p_1 + \pi_2 p_1 = (\pi_1 + \pi_2) p_1 = p_1$$ 이와 같은 원리가 보상함수에서도 성립한다. 이를 수식으로 나타내면 다음과 같다. $$P_{ss'}^{\pi} = \sum_{a \in A} \pi(a \mid s) P_{ss'}^a \\ R_{ss'}^{\pi} = \sum_{a \in A} \pi(a \mid s) R_s^a$$ MDP에서 상태가치 함수를 구해보자 $$\begin{matrix}v_{\pi