https://www.quora.com/How-is-reinforcement-learning-related-to-genetic-algorithms

 

How is reinforcement learning related to genetic algorithms?

Answer (1 of 4): Reinforcement learning (RL) attempts to maximise the expected sum of rewards (as per a pre-defined reward structure) obtained by the agent. It does so by learning a value (or action-value) function which is updated using information obtain

www.quora.com

RL은 에이전트로부터 얻은 reward의 합계를 최대하기 위해 시도한다. Q function을 사용해서.

GA는 무작위로 생성된 solution으로 시작해서 자연 선택 원리를 사용하여 솔루션을 발견한다. 그 선택은 다음 세대에 선발될 확률이 높아진다. mutation이나 crossover 영향을 받는다.

GA는 heuristics, RL은 gradient-based update

experience replay는 RL에만 있다. (stored and recalled)

둘 다 nature-inspired, gooood soultion을 찾기 위해 시도함

 

 

 

 

https://www.youtube.com/watch?v=7vunJlqLZok

70년대부터 월가에서 시장의 가격 예측을 위한 예측 모델을 사용했다
금융 데이터 포인터 : 재무자료, 배당금, 세금, 주가
시간 분석으로 회귀 분석 해야한다
분류하는 여러 방법. 분류 문제/회귀
실무적회계/재무보고/배당조정/화해
금융 산업에서 인공지능 시장의 규모는 2017년 15조원에서 22년에는 80조원까지 오를 것으로 예상 -> 시장이 커진다!
인공지능이 핀테크 시장에 쓰이는 방법에 대한 지도 : 신용 평가, 밀레니얼 세대를 위한 개인융자, 금융 조언, 보안분야(오탐률, 사기로 분류된 거래 등 오분류, 비정상 금융거래탐지), 신용 대출, 자산관리, ...
회귀 모델은 수치형 데이터만 사용 가능하다
NLTK, Text blob 라이브러리로 문자로 감정/의미/생각 분석 가능, 좋다 나쁘다~~
분류 문제의 결과가 회귀 모델의 데이터로 들어갈 수도 (수치형)
LSTM : 주가 분석에 월등한 성능을 보이는 모델, 먼 미래까지 순차적으로 예측
강화 학습 : 시행착오를 통하여 학습

TF-Lite uses gemmlowp for matrix multiplication, which stores results of uint8 matrix products in int32. Then, we can add the biases quantized in higher precision as int32 itself. Finally, in going from 32-bit to 8-bit.

https://github.com/google/gemmlowp/blob/master/doc/quantization.md

 

google/gemmlowp

Low-precision matrix multiplication. Contribute to google/gemmlowp development by creating an account on GitHub.

github.com

https://github.com/google/gemmlowp/blob/master/doc/quantization_example.cc

  • Quantization as an affine map
    • quantized uint8 value와 real value의 매핑을 나타내면
    • ...더보기
      real_value = A * quantized_value + B              (1)

      real_value = C * (quantized_value + D)            (2)
  • zero-padding 등 구현의 이점을 위하여 real value 0에 대응하는 quantized value를 zero-point라 한다.
  • Quantizing a matrix multiplication
    • quantied value의 행렬곱 형태로 변경한다.
    • 2개의 real matrix가 있다고 하면 (lhs_real_matrix, rhs_real_matrix)
    • ...더보기
      lhs_real_value[i] = lhs_scale * (lhs_quantized_value[i] - lhs_zero_point)

      rhs_real_value[i] = rhs_scale * (rhs_quantized_value[i] - rhs_zero_point)
    • 행렬곱 결과인 result_real_value는
    • ...더보기
      result_real_value
           = Sum_over_i(lhs_real_value[i] * rhs_real_value[i])
           = Sum_over_i(
                  lhs_scale * (lhs_quantized_value[i] - lhs_zero_point) *
                  rhs_scale * (rhs_quantized_value[i] - rhs_zero_point) )
           = lhs_scale * rhs_scale * Sum_over_i(
                  (lhs_quantized_value[i] - lhs_zero_point) *
                  (rhs_quantized_value[i] - rhs_zero_point)
              )                                                                               (4)

Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference

https://arxiv.org/pdf/1712.05877.pdf

 

2. Quantized Inference

2.1 Quantization scheme

  • q : quantized value
    • 8bit quantization에서
      • q is quantized as an 8-bit integer
      • Some arrays, typically bias vectors, are quantized as 32-bit integers
        • 32bit 쓰는 이유는 bias에서 오차가 생길 경우 패널티가 더 심하기 때문
  • r : real value
  • S : scale, 보통 floating point로 표현되고, 이를 피하는 방법이 2.2에 설명되어있다.
  • Z : zero-point, real value 0과 매칭되는 quantized value
    • zero-padding 등 효율적인 구현을 위해 필요하다.

2.2 Integer-arithmetic-only matrix multiplication

  • (1)번식에서 q를 어떻게 구할 것인가, S가 integer가 아닌데 어떻게 integer arithmetic으로 바꿀 것인가
  • NxN 행렬 r1, r2가 있다고 했을 때, 행렬곱 r3 = r1r2
  • rα (α = 1, 2 or 3) 라고 할 때, 위의 식에 대입하면, 행렬 각 각의 값은 아래와 같이 표현할 수 있다.

  • 행렬곱 식으로 r3을 다시 써보면,

  • multiplier M은 아래가 되고, quantization scale 값으로만 구성된, 식에서 유일한 non-integer 값이다.

  • S1, S2, S3은 offline으로 계산될 수 있다. (?)
  • 경험적으로 이 값들은 (0, 1) 사이에 있고, 그러므로 정규형(normalized form)으로 표현할 수 있다.

  • M0은 [0.5, 1) 사이의 값이고, n은 non-negative integer(0을 포함한 자연수, 음이 아닌 정수)이다.
    • Half-Closed Interval, [은 include, )는 not inclued
  • normalized multiplier M0은 fixed-point multiplier로 표현되기 적합하고, 2^-n은 bit-shift로 구현될 수 있다.

2.3 Efficient handling of zero-points

  • 위의 식 (4)를 풀어쓰면

  • (8) 식은 그럼 N번 더하는 덧셈 계산만 있는거고, 둘 다해서 2N^2번 덧셈을 하게 되는 것이다.
  • 그럼 (7) 식은 아래 integer 행렬곱 누적 계산에 집중되어있다.

 

2.4 Implementation of a typical fuesd layer

  • 행렬곱에 bias-addition, activation function evaluation을 추가한 fused layer를 위해 (7) 식을 수정할것이다.
  • Inference code에서도 training 때 사용한 "fake quantization" operator와 동일하게 매치되어야한다.
  • q1 행렬은 weights, q2 행렬은 activation, 둘 다 uint8 타입을 가진다고 하면, 곱셈 결과 타입은 signed 32bit.
  • 왜냐하면 bias-vector가 int32로 quantization되었기 때문 (bias의 zero-point는 0으로 사용한다.)
  • (9) 식을 아래와 같이 나타낼 수 있다

  • 그 다음으로,
    1. scale down (8bit output activations을 위해)
    2. cast down (uint8로)
    3. apply the activation function (최종 8bit output 생성!)

3. Training with simulated quantization

3.1 Learning quantization ranges

  • For each layer, quantization is parameterized by the number of quantization levels and clamping range, and is performed by applying point-wise the quantization function q defined as follows:

  • 의미 : 
    • r : real value
    • [a; b] : quantization range
    • n : the number of quantization levels
    • ⌊·⌉ : rounding to the nearest integer
  • weight quantization과 activation quantization의 quantization range는 다르게 다루어진다.

 

 

[ 참고 ]

  1. normalization & standardization : https://m.blog.naver.com/PostView.nhn?blogId=zzing0907&logNo=220213633559&proxyReferer=https%3A%2F%2Fwww.google.com%2F
    1. normalization : 정규화, 데이터의 범주를 바꾸는 작업
    2. standardization : 표준화,  
  2. 8bit Inference with TensorRT : http://on-demand.gputechconf.com/gtc/2017/presentation/s7310-8-bit-inference-with-tensorrt.pdf

'개발 > Deep learning' 카테고리의 다른 글

RL & GA  (0) 2019.10.01
Stock Price Prediction | AI in Finance  (0) 2019.04.22
TF-Lite uses gemmlowp for matrix multiplication  (0) 2019.04.18
밑바닥 딥러닝_7장 합성곱 신경망(CNN)  (1) 2019.01.27

* 합성곱 신경망 Convolutional neural network, CNN *

- 이미지 인식 분야에서 딥러닝을 활용한 기법은 거의 다 CNN을 기초로 함


7.1 전체 구조

- CNN도 이전 신경망과 같이 레고 블록처럼 계층을 조합하여 만들 수 있다

- 합성곱 계층 convolutional layer풀링 계층 pooling layer가 등장

- 기존의 신경망은 인접하는 계층의 모든 뉴런과 결합 = 완전연결 fully-connected 이라고하고, 완전히 연결된 계층을 Affine 계층이라는 이름으로 구현

   - 아래와 같이 Affine 계층 뒤에 활성화 함수를 갖는 ReLU(또는 sigmoid) 계층으로 이어짐

- CNN의 구조 : 합성공 계층과 풀링 계층이 추가됨

   - Conv-ReLU-(Pooling) 흐름, 풀링 계층은 생략되기도 함

   - 출력에 가까운 층에서는 Affine-ReLU 구성을 사용할 수 있음

   - 마지막 출력 계층에서는 Affine-Softmax 조합을 그대로 사용


7.2 합성곱 계층

7.2.1 완전연결 계층의 문제점

- 완전연결 계층에 입력할 때는 3차원 데이터를 평평한 1차원 데이터로 평탄화 -> 데이터의 형상 무시

   - MNIST 데이터셋 1 x 28 x 28  -> 1줄로 세운 784개 데이터를 입력으로..

- 완전연결 계층은 형상을 무시하고 모든 이력 데이터를 동등한 뉴런(같은 차원의 뉴런)으로 취급하여 형상에 담긴 정보를 살릴 수 없다.

- 합성곱 계층은 형상을 유지!!

   - CNN에서 합성곱 계층의 입출력 데이터를 특징맵(feature map) 이라고 한다

   - 입력 데이터를 입력 특징 맵(input feature map IFM)

   - 출력 데이터를 출력 특징 맵(output feature map OFM)

7.2.2 합성곱 연산 (이미지 처리에서 말하는 필터 연산)

- 합성곱 연산은 입력 데이터에 필터를 적용한다. (필터는 커널이라고도 한다.)

- 필터의 윈도우를 일정 간격으로 이동해가며 입력 데이터에 적용

- 입력과 필터에서 대응하는 원소끼리 곱한 후 그 총합을 구한다 = 단일 곱센-누산(fused multiply-add, FMA)

- 위의 예 : 15 = 1*2 + 2*0 + 3*1 + 0*0 + 1*1 + 2*2 + 3*1 + 0*0 + 1*2

- 그 결과를 출력의 해당 장소에 저장, 이 과정을 모든 장소에서 수행하면 합성곱 연산의 출력 완성

- 완전연결 신경망에는 가중치 매개변수와 편향이 존재

- CNN에서는 필터의 매개변수가 그동안의 가중치에 해당, 편향도 존재함. 포함하면 아래와 같음

※ 합성곱 효과

- 필터는 그 특징이 데이타에 있는지 없는지를 검출

- 위의 곡선과 비슷한 특징들을 추출

7.2.3 패딩

- 합성곱 연산을 수행하기 전에 입력 데이터 주변을 특정 값(예컨대 0, zero padding)으로 채우기도 한다. = 패딩 padding

- 패딩의 목적 : 출력 크기 조정

   - (4, 4) 입력 데이터에 (3, 3) 필터를 적용하면 OFM은 (2, 2)가 된다 -> 합성곱을 거칠 때마다 크기가 작아져 어느 시점에서는 1이 될거다.

  - 이러한 사태를 막기위해, 입력 데이터의 공간적 크기를 고정한 채로 다음 계층에 전달할 수 있다.

7.2.4 스트라이드

- 필터를 적용하는 위치의 간격을 스트라이드(stride, 보폭)이라고 한다.

- 이전에 본 건 스트라이드 1

- 스트라이드를 키우면 출력 크기가 작아짐, 패딩을 크게하면 출력 크기가 커짐

- 이러한 관계에서 OFM 크기를 구하는 걸 수식화하면?

   - (4, 4) 입력 데이터에 (3, 3) 필터를 패딩 0, 스트라이드 1로 적용하면 OFM은 (2, 2)가 된다

   - 

   - 딥러닝 프레임워크 중에는 값이 딱 나누어 떨어지지 않을 때, 가장 가까운 정수로 반올림 하는 경우도 있다.

※ 움직이는 데모 : http://cs231n.github.io/convolutional-networks/

http://aikorea.org/cs231n/convolutional-networks/

7.2.5 3차원 데이터의 합성곱 연산

- 채널 방향으로 특징 맵이 늘어남

- 계산순서

- 입력 데이터의 채널 수와 필터의 채널 수가 같아야 한다!!

http://taewan.kim/post/cnn/

7.2.6 블록으로 생각하기

- 3차원의 합성곱 연산은 데이터와 필터를 직육면체 블록으로 생각하면 쉽다!

- 3차원 데이터를 다차원 배열로 나타낼 때는 (채널, 높이, 너비) 순서로 쓴다. (C, H, W), 필터도 (C, FH, FW)

- 출력 데이터를 한 장의 OFM... = 채널이 1장인 OFM -> 출력으로 다수의 채널을 내보려면? 필터를 여러개 사용!!

- 즉, 필터의 갯수가!!!!!! OFM의 채널수가 된다!!!!!!!!

- 이 완성된 블록을 다음 계층으로 넘기겠다는 것이 CNN의 처리 흐름

- 필터의 수도 고려 = 4차원 데이터 (출력 채널 수, 입력 채널 수, 높이, 너비)

   - 채널 수 3개, 크기 5x5 필터가 20개 있다면 (20, 3, 5, 5)

- 편향은? 채널 하나에 값 하나씩 (FN, 1, 1),  (FN, OH, OW) 블록의 대응 채널의 원소 모두에 더해짐

7.2.7 배치 처리 (입력 데이터를 한 덩어리로 묶어 배치 처리)

- 각 계층에 흐르는 데이터의 차원을 하나 늘려 4차원 데이터로 저장 = (데이터 수, 채널 수, 높이, 너비) 순으로 저장

- 신경망에 4차원 데이터가 하나 흐를 때마다 데이터 N개에 대한 합성곱 연산이 이뤄진다 = 즉 N회 분의 처리를 한 번에 수행


7.3 폴링 계층

- 풀링 : 세로, 가로 방향의 공간을 줄이는 연산

- 최대 풀링(max pooling) : 최대값을 구하는 연산, 2x2 대상 영역에 대하여 가장 큰 원소를 꺼냄

- 풀링의 윈도우 크기와 스트라이드는 같은 값으로  설정하는 것이 보통

- 평균 풀링(average pooling) : 대상 영역에서 평균을 계산. 주로 이미지 인식 분야에서는 최대 풀링을 사용함

- 풀링 계층의 특징

   1. 풀링 계층은 합성곱 계층과 달리 학습해야 할 매개 변수가 없다. 대상 영역에서 취하는 명학한 처리!

   2. 채널 수가 변하지 않는다. 입력 데이터 채널 수가 3이라면 풀링 후 출력 데이터의 채널 수도 3이다

   3. 입력의 변화에 영향을 적게 받는다(강건하다). 입력 데이터가 조금 변해도 풀링의 결과는 잘 변하지 않는다.


7.4 합성곱/풀링 계층 구현하기

7.4.1 4차원 배열

- 데이터 형상 (10, 1, 28, 28) = 높이 28, 너비 28, 채널 1개인 데이터가 10개

>>> x = np.random.rand(10, 1, 28, 28)

>>> x.shape

(10, 1, 28, 28)

>>> x[0].shape  # 10개 중 첫 번째 데이터에 접근하기

(1, 28, 28)

>>> x[0, 0] # 또는 x[0][0] # 첫 채널의 공간 데이터에 접근하기

7.4.2 im2col로 데이터 전개하기

- 합성곱 연산을 곧이곧대로 구현하려면 for문을 겹겹이 써야하겠지... 귀찮.. 성능도 떨어져.. 대신 im2col 사용

- im2col는 입력 데이터를 필터링하기 좋게 전개하는(펼치는) 함수

- im2col : image to column, 이미지에서 행렬로..

- 3차원 입력 데이터에 im2col을 적용하면 2차원 행렬로 바뀜

- im2col은 필터링하기 좋게 입력 데이터를 전개한다. 그림 7-18 을 보자..

- 전개한 다음에는 합성곱 계층의 필터를 1열로 전개하고 두 행렬의 곱을 계산한다.

- 결과도 2차원 행렬이니 출력 데이터를 4차원으로 변형(reshape)한다.

7.4.3 합성곱 계층 구현하기

- 이 책에서는 im2col 함수를 미리 만들어서 제공 (common/util.py)

def im2col(input_data, filter_h, filter_w, stride=1, pad=0):

    """다수의 이미지를 입력받아 2차원 배열로 변환한다(평탄화).

    

    Parameters

    ----------

    input_data : 4차원 배열 형태의 입력 데이터(이미지 수, 채널 수, 높이, 너비)

    filter_h : 필터의 높이

    filter_w : 필터의 너비

    stride : 스트라이드

    pad : 패딩

    

    Returns

    -------

    col : 2차원 배열

    """

- im2col 테스트

x1 = np.random.rand(1, 3, 7, 7)  # 7x7에 채널 3

col1 = im2col(x1, 5, 5, stride=1, pad=0)

print(col1.shape)


x2 = np.random.rand(10, 3, 7, 7)  # 배치 크기 10

col2 = im2col(x2, 5, 5, stride=1, pad=0)

print(col2.shape)

------------------------ 필터 크기 스트라이드 패딩을 고려하여 2차원 배열로 전개...

(9, 75)  # 2번째 차원의 원소수는 75로 필터의 원소수와 같다(3 x 5 x 5)

(90, 75)

- 합성곱 계층 클래스

class Convoultion:

def __init__(self, W, b, stride=1, pad=0):

self.W = W

self.b = b

self.stride = stride

self.pad = pad


def forware(self, x):

FN, C, FH, FW = self.W.shape

N, C, H, W = x.shape

out_h = int(1 + (H + 2*self.pad - FH) / self.stride)

out_w = int(1 + (W + 2*self.pad - FW) / self.stride)


                # IFM랑 Filter랑 계산 할 수 있게 각자 전개하고 dot으로 계산함

col = im2col(x, FH, FW, self.stride, self.pad)

col_W = self.W.reshape(FN, -1).T  # 필터 전개

out = np.dot(col, col_W) + self.b


                # 다시 형태 돌리기

out = out.reshape(N, out_h, out_w, -1).tanspose(0, 3, 1, 2)


return out

- reshape에 -1을 지정하면 다차원 배열의 원소 수가 변환 후에도 똑같이 유지되도록 적절히 묶어준다... (10, 3, 5, 5)의 원소 수 는 총 750개, reshape(10, -1)을 호출하면 750개의 원소를 10묶으로, 즉 형상이 (10, 75)인 배열로 만들어준다.

- 출력 데이터 형태 바꾸기 위해 transpose 호출, 다차원 배열의 축 순서를 바꿔주는 함수.. (N, H, W, C) 는 인덱스 (0, 1, 2, 3) 인데 이걸 (N, C, H, W)로 바꿔주려면 (0, 3, 1, 2)

- 이상 forward, backward는 common/layer.py 참고;;

7.4.4 풀링 계층 구현하기

- im2col을 사용해서 입력데이터를 전개하지만, 채널 쪽이 독립적

- 이렇게 전개한 행렬에서 행별 최댓값을 구하고 적절한 형상으로 성형

class Pooling: 

....

    def forward(self, x):

        N, C, H, W = x.shape

        out_h = int(1 + (H - self.pool_h) / self.stride)

        out_w = int(1 + (W - self.pool_w) / self.stride)

        # 전개

        col = im2col(x, self.pool_h, self.pool_w, self.stride, self.pad)

        col = col.reshape(-1, self.pool_h*self.pool_w)

 ...

        # 최대값

        out = np.max(col, axis=1)  # 2차원 배열에서 axis=0은 열방향, axis=1은 행방향

        out = out.reshape(N, out_h, out_w, C).transpose(0, 3, 1, 2)

...


7.5 CNN 구현하기

- 합성곱 계층과 풀링 계층 조합해서 CNN 조립하기

- ch07/simple_convnet.py : conv - relu - pool - affine - relu - affine - softmax

- ch07/train_convnet.py : CNN으로 MNIST 데이트셋 학습 후 정확도


7.6 CNN 시각화하기

7.6.1 1번째 층의 가중치 시각화하기

- 위의 예제에서 합성곱의 필터는 (30, 1, 5, 5), 필터 30개, 채널 1개 5x5 크기

- 필터의 크기가 5x5이고 채널이 1개라는 것은 이 필터를 1채널의 회색조 이미지로 시각화 할 수 있다는 뜻

- ch07/visualizee_filter.py

- 1번째 층 무엇을 보는 걸까? 에지(색상이 바뀐 경계선)와 블롭(blob, 국소적으로 덩어리진 영역) 등을 보고 있다.

- 예 : 가로 에지와 세로 에지에 반응하는 필터.. 흰 픽셀이 많이 나옴

7.6.2 층 깊이에 따른 추출 정보 변화

- 계층이 깊어질 수로고 추출되는 정보(정확하는 반응하는 뉴런)는 더 추상화된다.

- 1번째 층은 에지와 블롭, 3번째 층은 텍스처, 5번째 층은 사물의 일부, 마지막 완전연결 계층은 사물의 클래스(개, 자동차 등)에 뉴런이 반응한다.

- 층이 깊어지면서 더 복잡하고 추상화된 정보가 추출된다.. 뉴런이 반응하는 대상이 단순한 모양에서 고급정보로 변화해간다. = 의미 이해


7.7 대표적인 CNN

7.7.1 LeNet

- 손글씨 숫자를 인식하는 네트워크로 1998년에 제안됨

- 합성곱 계층과 풀링 계층(원소를 줄이기만 하는 서브샘플링)을 반복하고 마지막으로 완전연결 계층을 거치면서 결과 출력

- LeNet의 활성화함수 는 시그모이드, 오늘날에는 ReLU..

7.7.2 AlexNet

- 2012년 발표됨

- 합성곱 계층과 풀링 계층을 거듭하고 마지막에 완전연결은 LeNet 구조와 같으나

- 활성화 함수로 ReLU 사용, LRN(Local response normalizaion)이라는 국소적 정규화를 실시하는 계층을 이용, 드랍아웃을 사용


- 다른 네트워크 8장에 조금 소개되는듯








- 로드맵

https://www.mindmeister.com/ko/812276967/_


+ Recent posts