일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 자연어처리
- 리처드소처
- 파이썬과 케라스로 배우는 강화학습
- ai
- model free
- 양성평등
- 인공지능
- 독서
- MDP
- NLP
- CS224N
- 강화학습
- Gradient descent
- 취미
- 벨만 방정식
- 애쉬브라운
- MB
- 폴댄스
- kbpf
- 다이내믹 프로그래밍
- Richard Socher
- 행복
- 딥러닝
- cost function
- Linear Regression
- 머신러닝
- tensorflow
- 딥뉴럴넷
- 페미니즘
- 파이썬
- Today
- Total
Ordinary day
강화학습 스터디 6주차 본문
(파이썬과 케라스로 배우는 강화학습을 읽고 요약정리 한 것입니다.)
1. 케라스
현재 가장 널리 쓰이는 딥러닝 프레임워크는 텐서플로우이다. 케라스는 텐서플로우를 감싸는 또 다른 프레임워크이다.
앞에서 input, hidden, output 의 레이어를 정의했었는데 케라스의 소스로 표현한다면 아래와 같이 나타낼 수 있다.
model.add(Dense(30, input_dim=15, activation='relu'))
model.add(Dense(30, activation='relu'))
model.add(Dense(1, activation='linear'))
모델(Sequential model)은 add() 함수로 레이어를 연결할 수 있다.
Dense() 의 첫번째 파라미터는 노드 수를 의미한다.
input_dim 은 input layer의 데이터 열을, activation은 사용할 activation function을 정의하면 된다.
따라서 위의 코드는 input layer에서 15열로 이루어진 데이터가 들어오고, 이 input은 첫번째 hidden layer로 연결된다.
첫번째 hidden layer는 30개의 노드를 가지고, ReLU function을 activation function으로 사용한다.
두번째 hidden layer도 첫번째 hidden layer와 동일하며,
output layer는 1개의 출력을 가지고, linear function을 activation function으로 사용하는 모델이다.
model.compile(loss='mse', optimizer='RMSProp')
model.fit(x_train, y_train, batch_size=32, epoch=1)
compile() 함수로 뉴럴넷을 학습시키기 위한 optimizer와 loss function을 정의할 수 있다.
(여기서 mse 는 Mean Squared Error를 의미함)
fit() 함수는 뉴럴넷을 학습시키고 업데이트하는 함수인데, 트레이닝 데이터를 입력해야한다.
epoch는 트레이닝 데이터를 몇 번 사용해서 학습할 것인지에 대한 변수이다.
전체 트레이닝 데이터를 작은 단위로 쪼개서 여러 번에 걸쳐 모델을 업데이트 할 수 있는데, 이런 방법을 미니배치 mini-batch라고 하며, 몇 개의 데이터로 쪼개는 지에 대한 변수가 batch_size이다.
2. 딥살사
살사 알고리즘을 사용하되 큐함수를 뉴럴넷으로 근사하고, hidden layer가 2개 이상인 알고리즘이 딥살사 Deep SARSA 이다.
딥살사에서는 뉴럴넷을 업데이트 할 때 경사하강법 Gradient descent 을 사용한다.
gradient descent 를 사용하여 뉴럴넷을 업데이트하려면 loss function을 정의해야 하는데, 기본적으로는 MSE를 사용한다.
그런데 강화학습에서는 Supervised learning과 달리 정답이 없지만, 살사의 큐함수 업데이트 식을 보면 정답의 역할을 하는 부분을 볼 수 있다.
따라서 이 정답과 예측을 MSE 식에 대입하여 오차함수를 만든다면 아래와 같은 식이 나온다.
기존의 강화학습 알고리즘에서는 에이전트가 가지고 있는 큐함수 테이블을 이용했지만 딥살사에서는 큐함수 테이블 대신 뉴럴넷을 사용한다.
현재 상태의 feature들이 뉴럴넷의 input으로 들어가면 output은 각 action에 대한 큐함수가 된다.
output layer의 activation function은 linear function이 되는데 이는 큐함수 값에 대한 범위 제한이 없기 때문이다.
또 앞의 살사, 큐러닝에서는 ε-greedy policy를 사용했는데, 딥살사에서는 이 ε값을 시간에 따라 감소시킨다.
이렇게 하는 이유는 초반에는 에이전트가 탐험을 통해 다양한 상황에 대해 학습해야하고, 학습이 충분히 이루어진 후에는 예측하는대로 에이전트가 움직여야하기 때문이다. 따라서 ε을 얼마의 크기로 감소시킬지도 정해야 할 변수 중 하나이다.
3. 폴리시 그레디언트
앞에서 다뤘던 강화학습 알고리즘(ex. 몬테카를로, 살사, 큐러닝...)은 모두 에이전트가 가치함수를 기반으로 행동을 선택하고 가치함수를 업데이트하면서 학습하는 가치 기반 강화학습 Value-based Reinforcement Learning 이다.
이제부터 나올 내용은 가치함수를 토대로 행동을 선택하는 것이 아니라 상태에 따라 바로 행동을 선택하는 정책 기반 강화학습 Policy-based Reinforcement Learning 이다.
Policy-based Reinforcement Learning 에서는 policy를 직접적으로 근사시키기 때문에, output은 각 action을 할 확률 즉, policy가 된다.
output 이 확률 값으로 나오기 때문에 output layer의 activation function은 softmax함수를 사용한다.
강화학습의 목표는 누적 보상을 최대로 하는 최적의 policy를 찾는 것이다.
따라서 Policy-based Reinforcement Learning 에서는 뉴럴넷의 계수 θ 에 따라 누적 보상이 달라질 것이다.
즉, 다시 생각해보면 이 θ 가 목표함수 J(θ) 의 변수가 된다.
우리는 J(θ) 를 최적화해야하는데, gradient descent 에서 했던 것과 마찬가지로 미분값을 이용하여 policy를 업데이트 하면 된다.
이때 loss function과는 달리, J(θ)를 최대화하는 것이 목표이기 때문에 경사를 올라가야하므로 gradient ascent 라고 부른다.
J(θ) 의 gradient ascent를 따라 근사된 policy를 업데이트하는 방식을 폴리시 그레디언트 Policy Gradient 라고 한다.
policy gradient 를 위해서는 J(θ)의 미분값이 필요하다.
J(θ) 는 가치함수로 나타낼 수 있는데 가치함수를 미분하는 것은 쉽지 않다.
가치함수에서 즉각적인 보상 대신 큐함수로 대체할 수 있는데, 이때 나오는 것이 폴리시 그레디언트 정리 policy gradient theorem 이다.
이 식을 간단히 설명하자면, 가능한 모든 상태에 대해 각 상태에서 특정 행동을 했을 때 받을 큐함수의 기대값을 의미한다.
이 값을 이용해서 J(θ) 을 최적화하면 되는데, policy gradient 에서는 action을 선택하는 데 현재 정책만 가지고 있기 때문에, 위의 식에서 Qπθ(s,a) 값을 구할 수 없다.
이에 대한 방법은 여러가지가 있는데, 그 중 가장 고전적인 방법 중 하나가 큐함수를 반환값 Gt로 대체하는 것이다. 그리고 이것을 REINFORCE 알고리즘 이라고 한다.
'Study > ML 이론' 카테고리의 다른 글
강화학습 스터디 5주차 (0) | 2017.10.19 |
---|---|
강화학습 스터디 4주차 (0) | 2017.10.09 |
강화학습 스터디 3주차 (0) | 2017.09.28 |
강화학습 스터디 2주차 (0) | 2017.09.18 |
강화학습 스터디 1주차 (0) | 2017.09.12 |