2021-04-14-Wen-StudyKR

» studyKR

RL

Deep RL

상태의 갯수가 많은 MDP 푸는 법
딥러닝과 강화 학습이 결합된 deep RL

함수를 활용한 근사

1. 연속적인 상태 공간
    가능한 상태가 무한
        --> table 만들기가 불가능
2. 이산적인 상태 공간
    가능한 상태가 딱 떨어짐

테이블 방식의 접근법으로는 너무 많은 시간이 걸리기 때문에 불가

상태 값을 input으로 받아 value 값을 내놓는 함수 -> 실제 가치 함수 ~= 근사 함수
    근사 함수이므로 최대한 근사하게 하기 위해 최소제곱법을 사용한다.

최소 제곱법

최소화하는 a와 b를 찾는 방법론
데이터의 개수와 무관하게 표현한다면 각 오차의 제곱 합을 평균 내고
    MSE(평균제곱오차)를 최소화 하는 것이다.

함수

상태와 밸류의 쌍을 기록해 놓는 용도로 함수를 사용한다.
기존에 테이블에 저장하던 것을 이제는 함수에 저장하고, 
    함수의 곡선이 데이터에 가깝게 지나도록 fitting한다.
Fitting을 잘하기 위해서 함수가 가지고 있는 parameter들을 수정하고 
    parameter의 값을 구하는 법으로 MSE를 최소화하는 최소제곱법을 사용한다.

다항함수

함수를 fitting한다
    1. 함수에 데이터를 기록한다.
    2. 데이터 점들을 가장 가깝게 지나도록 함수를 그려본다.
    3. 함수 f의 파라미터의 값을 찾는다
    4. 학습 f를 학습한다.

차수가 높을수록 데이터를 기록하는데 유리하진 않다
    -> 노이즈가 있기 때문이다.
    너무 정확하게 노이즈까지 학습해 버렸기 때문이다.

너무 유연한 함수를 사용하여 f가 노이즈에 fitting해 버리는 것
    너무 정확하게 학습 = Overfitting

실제 모델을 담기에 함수 f의 유연성이 부족하여 주어진 데이터와의 에러가 큰 상황
     = Underfitting 
    -> 프리 파라미터가 별로 없다.

가장 좋은 함수는 underfitting도 아니고 overfitting이 아닌 그 중간 어딘가에 있다.

함수의 장점: 일반화

기존 테이블 방식의 접근법은 모든 상태의 밸류를 다 담을 수 없다는 것이다.
함수는 일반화라는 성질 덕분에 저장 용량이 적게 필요하다.

테이블 기반 방법론은 새로운 상태에 방문하면, 어떤 밸류를 갖게 될지 알 수 없지만
    함수는 일반화로 결과를 예측할 수 있습니다.
        + 적당한 pre parameter을 가지고 있는 함수를 사용한다면 
            저장 공간이 부족하지 않다.

인공 신경망

신경망

매우 유연한 함수
    Pre Parameter의 개수를 통해 함수의 유연성을 표현할 수  있다.

신경망은 Hidden Layer로 구성되어 있고, Hidden Layer는 Node로 구성되어 있다.
    Node는 해당 Node로 들어오는 값들을 Linear combination한 후 nonlinear actiavtion을 적용한다.

Input n개를 선형 결합하여 비선형함수를 통과 시킨다.
    비선형함수 = RELU (Rectified Linear Unit)
    선형결합 = 새로운 feature를 만드는 과정

선형결합: 현재 상태를 평가하는데 필요한 feature로 만드는 것 
비선형함수: input과 output의 관계가 비선형 관계일 때 필요한 함수

신경망의 학습

Gradient Descent
gradient를 계산하여 parameter를 업데이트 방식으로 목적 함수를 최소화 하는 과정
    Loss Function: (실제 값 - 함수 값)^2 
        Loss function을 줄이도록 input 값을 조정해야함
        input = x
        output = f(x)
        Alpha =  Learning Rate or Step Size 

f(x)를 x로 미분하면 x가 f(x)에 미치는 영향력

1 2

w1과 w2는 랜덤한 값
w1 = 0.5, w2 = 1.2
fitting data = (1,2,1) 
    --> fw(1,2) = 1 
        하지만 현재 값은 -0.9
        Alpha = 0.01
업데이트 후 1에 가까워짐. 
    수 많은 데이터와 업데이트를 한다면 정답에 가까워짐.

Pytorch를 이용한 신경망의 학습 구현

자동 미분 라이브러리
    Back Propagation Algorithm을 통해 아주 복잡한 함수의 gradient를 매우 효율적으로 구함
    중간중간 미분 값들을 caching했다가 재사용하며 효율적으로 gradient 계산

Example

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.fc1 = nn.Linear(1, 128)
        self.fc2 = nn.Linear(128, 128)
        self.fc3 = nn.Linear(128, 128)
        self.fc4 = nn.Linear(128, 1, bias=False)

    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = F.relu(self.fc3(x))
        x = self.fc4(x)
        return x

def true_fun(X):
    noise = np.random.rand(X.shape[0]) * 0.4 - 0.2
    return np.cos(1.5 * np.pi * X) + X + noise

def plot_results(model):
    x = np.linspace(0, 5, 100)
    input_x = torch.from_numpy(x).float().unsqueeze(1)
    plt.plot(x, true_fun(x), label="Truth")
    plt.plot(x, model(input_x).detach().numpy(), label="Prediction")
    plt.legend(loc='lower right',fontsize=15)
    plt.xlim((0, 5))
    plt.ylim((-1, 5))
    plt.grid()

def main():
    data_x = np.random.rand(10000) * 5 # 0~5 사이 숫자 1만개를 샘플링하여 인풋으로 사용 
    model = Model()
    optimizer = optim.Adam(model.parameters(), lr=0.001)

    for step in range(10000):
        batch_x = np.random.choice(data_x, 32) # 랜덤하게 뽑힌 32개의 데이터로 mini-batch를 구성
        batch_x_tensor = torch.from_numpy(batch_x).float().unsqueeze(1)
        pred = model(batch_x_tensor)

        batch_y = true_fun(batch_x)
        truth = torch.from_numpy(batch_y).float().unsqueeze(1)
        loss = F.mse_loss(pred, truth) # 손실 함수인 MSE를 계산하는 부분
        
        optimizer.zero_grad() 
        loss.mean().backward() # 역전파를 통한 그라디언트 계산이 일어나는 부분
        optimizer.step() # 실제로 파라미터를 업데이트 하는 부분

    plot_results(model)

if __name__ == '__main__':
    main()

3

Agent

제약 조건 X
Model Free 상황
state space와 action space이 매우 커서 테이블 방식 적용 불가

*Neural Net으로 해결

가치 함수 혹은 액션 가치 함수를 뉴럴넷으로 표현하는 방식
정책함수 자체를 뉴럴넷으로 표현하는 방식 

가치 기반 에이전트

가치 함수에 근거하여 action 선택
    action-avlue function을 보고 액션을 선택하는 것
ex) SARSA, Q Learning

정책 기반 에이전트

Policy function을 보고 직접 action을 선택, value보고 하지 않음

Actor-Critic

가치 함수와 정책 함수 모두 사용
actor: 정책 함수
critic: 가치함수