Week2 - Day 1 Review

오늘 하루 한 것

  • 강의
    • pytorch 1, 2, 3 강의
  • 과제
    • pytorch 기본과제1 중간정도
  • 정리
    • pytorch 1, 2, 3 강의, 기본과제1

피어세션에서 한 것

  • backward 함수의 파라미터로 gradient를 넘기는것에 대한 의미
  • reshape, view 차이점

내일 할것

  • 기본과제 정리 끝내기

하루 느낀점

  • 부덕아… 눈이 너무 아파

부스트 캠프 ai tech 2주 1일차 Pytorch (2)


2. 유용한 torch 함수들

  1. Tensors
  2. Creation Ops
  3. indexing, Slicing, Joining, Mutating

2.1 Tensors

  1. is_*
    • 데이터 형태가 tensor인지 판단, tensor의 내부 데이터 등의 여러가지 판단을 하는 함수
      1
      2
      3
      x = torch.tensor([0])
      is_tensor(x) # True
      is_nonzero(x) # False, input : single element tensor
  2. torch.numel(x)
    • 전체 element가 몇개인지 출력하는 함수
      1
      2
      a = torch.randn(1, 2, 3, 4, 5)
      torch.numel(a) # 120

2.2 Creation Ops

  1. torch.from_numpy
    • ndarray를 torch.Tensor로 바꾸는 함수
  2. torch.zeros(size), empty(size), ones(size)
    • 0, 빈, 1로 이루어진 tensor를 size 형태로 생성하는 함수
    • numpy와 같은 기능을 한다
  3. torch.zeros_like(tensor), empty_like(tensor), ones_like(tensor)
    • tensor의 size를 가진 0, 빈, 1로 이루어진 tensor를 생성하는 함수
    • numpy와 같은 기능을 한다
  4. torch.arrange(start, end, step)
    • numpy의 arrange와 같은 기능을 하는 함수
    • start 부터 end 까지 step마다의 수를 가진 1D-tensor를 생성한다
  5. torch.linspace(start, end, steps)
    • start에서 end의 구간의 길이를 steps개로 균등하게 나누는 1D-tensor를 생성한다
  6. torch.full(size, fill_value), torch.full_like(tensor, fill_value)
    • fill_value로 채워진 tensor를 생성한다

2.3 indexing, Slicing, Joining, Mutating 함수

  1. torch.index_select(input, dim, index)
    • 특정한 index에 위치한 데이터를 모아서 return 해주는 함수
      1
      2
      3
      4
      5
      6
      A = torch.Tensor([[1, 2], [3, 4]])
      torch.index_select(A, 1, torch.tensor([0]))
      ===========================================
      output:
      tensor([[1.],
      [3.]])
  2. torch.gather(input, dim, index)
    • 특정한 index들에 위치한 데이터를 모아서 return 해주는 함수
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      t = torch.tensor([[1, 2], [3, 4]])
      torch.gather(t, 1, torch.tensor([[0, 0], [1, 0]]))
      ==================================================
      output:
      tensor([[ 1, 1],
      [ 4, 3]])
      ==================================================
      index calculate:
      out[i][j][k] = input[index[i][j][k]][j][k] # if dim == 0
      out[i][j][k] = input[i][index[i][j][k]][k] # if dim == 1
      out[i][j][k] = input[i][j][index[i][j][k]] # if dim == 2
  3. torch.cat(tensors, dim) == torch.concat
    • tensors들을 합치는 함수
    • 기준이 되는 dim을 제외하고 같은 shape를 가지고 있어야한다
      1
      2
      3
      x = torch.rand(1, 3)
      y = torch.rand(2, 3)
      torch.cat((x,y), 0).size() # torch.Size([3, 3])
  4. torch.chunk(input, chunks, dim)
    • tensor를 chunk의 갯수만큼으로 분리해주는 함수
    • chunks의 갯수가 넘어가지 않는 선에서 같은 size의 tensor로 분리해준다
    • 나누어 떨어지지 않는경우 마지막 tensor의 사이즈의 크기가 다를 수도 있다
      1
      2
      3
      4
      5
      6
      7
      8
      torch.arange(13).chunk(6)
      =========================
      output:
      (tensor([0, 1, 2]),
      tensor([3, 4, 5]),
      tensor([6, 7, 8]),
      tensor([ 9, 10, 11]),
      tensor([12]))
      1
      2
      3
      4
      5
      6
      7
      8
      t = torch.tensor([[1, 2, 3],
      [4, 5, 6]])
      print(torch.chunk(t, 2, 1))
      ===========================
      output:
      (tensor([[1, 2],
      [4, 5]]), tensor([[3],
      [6]]))
  5. torch.Tensor.scatter_(dim, index, src, reduce=None)
    • Tensor에 index에 맞춰서 src를 삽입하는 함수이다
    • reduce에 add, multiple을 넣어서 더하거나 곱하기도로 바꿀 수 있다
    • torch.gather와 반대로 작동한다
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      src = torch.arange(1, 11).reshape((2, 5)) 
      # tensor([[ 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10]])
      index = torch.tensor([[0, 1, 2, 0]])
      torch.zeros(3, 5, dtype=src.dtype).scatter_(0, index, src)
      ==========================================================
      output:
      tensor([[1, 0, 0, 4, 0],
      [0, 2, 0, 0, 0],
      [0, 0, 3, 0, 0]])
      ==========================================================
      index calculate:
      self[index[i][j][k]][j][k] = src[i][j][k] # if dim == 0
      self[i][index[i][j][k]][k] = src[i][j][k] # if dim == 1
      self[i][j][index[i][j][k]] = src[i][j][k] # if dim == 2
  6. torch.stack(tensors, dim)
    • 지정하는 차원으로 확장해서 tensor를 쌓아주는 함수이다
    • 두 차원이 정확하게 일치해야 쌓기가 가능하다
      1
      2
      3
      x = torch.rand(3, 1, 3) # 3, 1, 3
      y = torch.rand(3, 1, 3) # 3, 1, 3
      torch.stack((x,y), dim=2).size() #torch.Size([3, 1, 2, 3])

      2.4 random Sampling

  • 자주 쓰이지만 numpy와 비슷해서 문서를 참고하는편이 좋을듯 하다
  • Random sampling - PyTorch 공식 문서
  • torch.seed(), torch.manual_seed(int)
    • Seed값을 고정해서 랜덤한 변수를 고정시킬 수 있다
    • manual_seed는 직접 시드값을 입력할 수 있다

2.5 Pointwise Ops

  • 수학 연산과 관련된 기능을 포함하는 함수군
    • numpy와 비슷하다
  1. torch.sqrt(tensor)
    • 각 tensor의 element에 대한 제곱근을 구해주는 함수
  2. torch.exp(tensor)
    • 각 tensor의 element에 대한 $e^x$
  3. torch.pow(tensor)
    • 각 tensor의 element에 대한 $x^2$

2.6 Reduction Ops

2.7 Comparison Ops

  1. torch.argsort(tensor)

    • tensor를 sort하는 index를 return 해준다
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      a = torch.randint(1, 10, (3, 3))
      a
      torch.argsort(a)
      ================
      output:
      tensor([[9, 5, 3],
      [6, 4, 2],
      [5, 8, 6]])
      tensor([[2, 1, 0],
      [2, 1, 0],
      [0, 2, 1]])
  2. torch.eq, torch.gt, torch.ge

    • tensor의 값들이 같은지, 더 큰지, 이상인지를 판단하는 함수들이다
  3. torch.allclose(input, other, trol, atol)

    • input tensor와 other의 원소들의 차가 특정 범위인지를 판단하는 함수
      $$
      |\operatorname{input} - \operatorname{other}| \leq atol + rtol \times|other|
      $$
1
2
torch.allclose(torch.tensor([10.1, 1e-9]), torch.tensor([10.0, 1e-08]))
# False

2.8 Other Operations

  1. torch.einsum
    • Einstein Notation에 따라 연산을 진행하는 함수
    • Einstein Notation은 특정 index의 집합에 대한 합연산을 간결하게 표시하는 방법이다
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      x = torch.randn(5)
      y = torch.randn(4)
      torch.einsum('i,j->ij', x, y)
      ============================
      output:
      tensor([[ 0.1156, -0.2897, -0.3918, 0.4963],
      [-0.3744, 0.9381, 1.2685, -1.6070],
      [ 0.7208, -1.8058, -2.4419, 3.0936],
      [ 0.1713, -0.4291, -0.5802, 0.7350],
      [ 0.5704, -1.4290, -1.9323, 2.4480]])
      ==============================================
      As = torch.randn(3,2,5)
      Bs = torch.randn(3,5,4)
      torch.einsum('bij,bjk->bik', As, Bs)
      ====================================
      output:
      tensor([[[-1.0564, -1.5904, 3.2023, 3.1271],
      [-1.6706, -0.8097, -0.8025, -2.1183]],

      [[ 4.2239, 0.3107, -0.5756, -0.2354],
      [-1.4558, -0.3460, 1.5087, -0.8530]],

      [[ 2.8153, 1.8787, -4.3839, -1.2112],
      [ 0.3728, -2.1131, 0.0921, 0.8305]]])

2.9 BLAS & LAPACK Ops

부스트 캠프 ai tech 2주 1일차 Pytorch (1)


0. pytorch란?

  • Meta(구 Facebook) 에서 개발한 딥러닝 프레임워크
  • numpy + AutoGradient
  • 동적 그래프 기반

1. pytorch 기본

  • pytorch 에서는 Tensor class를 사용한다
  • Tensor
    • numpy의 ndarray와 사실상 동일하다
      • 내장 함수도 대부분 비슷한 기능이 존재한다
    • tensor가 가질수 있는 type은 ndarray와 동일하나 GPU 사용이 가능한 차이가 존재한다

1.1 기본 Tensor 함수

  • list > tensor
    1
    2
    3
    4
    5
    6
    7
    import torch
    data = [[3, 5],[10, 5]]
    x_data = torch.tensor(data)
    ##########################
    output:
    tensor([[ 3, 5],
    [10, 5]])
  • ndArray > tensor
    1
    2
    3
    4
    5
    6
    nd_array_ex = np.array(data)
    tensor_array = torch.from_numpy(nd_array_ex)
    ############################################
    output:
    tensor([[ 3, 5],
    [10, 5]])
  • tensor > ndarray
    1
    2
    3
    4
    5
    tensor_array.numpy()
    ####################
    output:
    array([[ 3, 5],
    [10, 5]])
  • flatten
    1
    2
    3
    4
    5
    6
    data = [[3, 5, 20],[10, 5, 50], [1, 5, 10]]
    x_data = torch.tensor(data)
    x_data.flatten()
    ################
    output:
    tensor([ 3, 5, 20, 10, 5, 50, 1, 5, 10])
  • one_like
    1
    2
    3
    4
    5
    6
    torch.ones_like(x_data)
    #######################
    output:
    tensor([[1, 1, 1],
    [1, 1, 1],
    [1, 1, 1]])
  • shape, dtype
    1
    2
    x_data.shape # torch.Size([3, 3])
    x_data.dtype # torch.int64
  • GPU load
    1
    2
    3
    device = torch.device('cpu')
    if torch.cuda.is_available():
    device = torch.device('cuda')

1.2 Tensor handling

  • view & reshape
    • tensor의 shape를 변경하는 함수
    • view는 input tensor와 return tensor가 데이터를 공유하여 항상 같은 주소값들을 가진다
    • reshape은 tensor의 복사본 혹은 view를 반환한다
      • 원본과 동일한 tensor값이 필요할 경우에는 view를 사용하거나 clone()을 이용해야한다
  • squeeze & unsqueeze
    • 차원의 개수가 1인 차원을 축소, 확장하는 함수
    • unsqueeze(index) : index에 1인 차원을 삽입해서 차원을 확장한다
      1
      2
      3
      4
      5
      6
      7
      8
      tensor_ex = torch.rand(size=(2, 1, 2))
      tensor_ex.squeeze().shape # torch.Size([2, 2])
      tensor_ex = torch.rand(size=(2, 2))
      tensor_ex.unsqueeze(0).shape # torch.Size([1, 2, 2])
      tensor_ex = torch.rand(size=(2, 2))
      tensor_ex.unsqueeze(1).shape # torch.Size([2, 1, 2])
      tensor_ex = torch.rand(size=(2, 2))
      tensor_ex.unsqueeze(2).shape # torch.Size([2, 2, 1])

1.3 Tensor operation

  • numpy와 동일하게 operation에 대해서 broadcasting을 지원한다
  • 행렬곱셈 연산은 mm 및 matmul을 사용한다
    • dot은 1차원 벡터와 스칼라 연산에서만 사용가능
    • mm과 matmul은 2차원이상의 행렬연산에서만 사용가능
    • mm은 broadcasting을 지원하지 않지만 matmul은 지원한다

1.4 Tensor operation for ML/DL formula

  • nn.functional을 이용한 다양한 연산가능
  • softmax, argmax, one_hot 등등

1.5 AutoGrad

  • 자동 미분
  • tensor에 requires_grad=True로 설정해서 자동으로 gradient 추적이 가능하다
    • 기본적으로 nn모듈의 선형연산들은 default로 True로 설정되어있어 잘 쓰지 않는다
      1
      tensor(data, requires_grad=True)
  • backward() 함수를 통하여 Backpropagation 수행

Activation Function


활성화 함수 Activation Function

  • 실수범위에서 정의된 비선형 함수
  • 딥러닝을 비선형 모델로 만들어주는 결정적인 함수이다

1. softmax

  • 분류 모델에서 많이 사용하는 함수
  • 출력값은 항상 0~1사이로 정규화된다
    • 보통 활성화 함수로는 사용되지 않고 마지막 단계에서 출력을 정규화할때 사용한다.
      $$
      f(x)_{k} = \frac{e^{x_i}}{\sum_{k=1}^{n}e^{x_{k}}}
      $$

2. sigmoid

  • 출력값을 0~1 사이로 변경한다
  • 위의 softmax 함수의 원형
  • 함수의 단점
    • 중심이 0이 아니기 때문에 모든차원이 같은방향으로 이동한다
    • 값이 커질수록 기울기 값이 감소한다
      $$
      \sigma(x) = \frac{1}{1+e^{-x}}
      $$

3. Tanh

  • sigmoid함수의 개량형
  • 중심을 0으로 맞춰서 sigmoid 함수의 단점을 줄였다.
  • 하지만 여전히 기울기 값의 감소에 따른 Gradient vanishing 문제가 존재한다

$$
tanh = 2\times \sigma(2x) -1
$$

4. ReLU

  • 0보다 크면 그대로 넘기고 작으면 0으로 만드는 매우 간단한 함수
  • sigmoid 계열에 비해 연산속도가 매우 빠르다
  • 큰값이 와도 기울기 값이 유지되기 때문에 gradient vanishing이 해소되었다.
  • 단점
    • 큰 값이 연속될 수 있는RNN 계열에서는 Gradient exploring이 발생한다.
    • 0 이하의 값이 무시되기 때문에 음수값만 존재하면 weight가 죽어버리는 Dying ReLU현상이 일어난다

$$
\operatorname{ReLU} = max(0, x)
$$

5. Leaky ReLU

  • Dying ReLU 현상을 해결하기위해 고안된 활성화 함수
  • 0보다 작은값에는 $\alpha$값을 곱한다
  • GAN 계열의 Generator에서 많이 사용된다
  • 단점
    • 여전한 Gradient exploring

$$
\operatorname{Leaky ReLU} = max(\alpha x, x)
$$

Week1 Homework


1. 기초과제

  • 과제 내용
    • 간단한 python의 built-in function 과 문자열 처리를 위한 과제
  • 결과
    • 정규식 라이브러리 re를 사용하여 문자열을 처리해주었다
  • 회고
    • 기초과제 + 첫주라 그런지 난이도는 어렵지 않았다
    • 문제표현상 애매한 점이있었지만, 조교님과의 소통으로 해결함

2. 심화과제

  • 여기서부터 진정한 과제

1. 경사하강법 구현

  • 말 그대로 경사하강법의 구현
  • 차근차근 수식을 코드로 바꾸면 되기때문에 어려운부분은 없었다

2. BPTT 구현

  • 과정
    • RNN의 Backpropagation은 처음 구현하는거라 시행착오가 많았다
  • numpy를 거의 사용 안하고 문제를 풀었는데 조금 연습을 할 필요가 있어보인다

3. 최대가능도 계산 증명 및 구현

  • 가우시안 분포를 통한 최대가능도 계산
  • 로그우도함수
    $$
    \begin{aligned}
    L(\theta|x) &= \sum_{i=1}^{n}\left( -\frac{1}{2}\log2\pi\sigma^2 +\log \exp\left(-\frac{(x_i-\mu)^2}{2\sigma^2}\right) \right)\\
    &= -\frac{n}{2}\log2\pi\sigma^2 - \sum_{i=1}^{n}\frac{(x_i-\mu)^2}{2\sigma^2}\\
    &= -\frac{n}{2}\log2\pi\sigma^2 - \frac{1}{2\sigma^2}\sum_{i=1}^{n}(x_i-\mu)^2
    \end{aligned}
    $$
  • 모평균의 추정량
    $$
    \begin{aligned}
    \frac{\partial L(\theta|x)}{\partial \mu}&= -\frac{1}{2\sigma^2}\sum_{i=1}^{n}\frac{\partial}{\partial \mu}\left(x_i^2-2x_i\mu+\mu^2\right)\\
    &= -\frac{1}{2\sigma^2}\sum_{i=1}^{n}(-2x_i + 2\mu)\\
    &= \frac{X-n\mu}{\sigma^2}\\
    \hat{\mu} &= \frac{1}{n}X\\
    &= \frac{1}{n}\sum_{i=1}^{n}x_i
    \end{aligned}
    $$
  • 모분산의 추정량
    $$\frac{\partial L(\theta|x)}{\partial \sigma} = -\frac{n}{\sigma} + \frac{1}{\sigma^3}\sum_{i=1}^{n}(x_i-\mu)^2$$
    $$\hat{\sigma}^2 = \frac{1}{n}\sum_{i=1}^{n}(x_i-\mu)^2$$

후기

  • 우린 앞으로 편미분과 평생을 같이 살아야한다고
  • 역시 스스로 힘으로 문제를 해결하면 기분이 좋다
  • 다음 심화과제는 어떨지 궁금하다

Week1 - Day 5 Review


오늘 하루 한 것

  • 정리
    • RNN
    • 딥러닝 기초

피어세션에서 한 것

  • 무어 펜로즈 역행렬 간단하게 설명하기
  • 일주일 회고

주말에 할 것

  • 추가 정리
    • 정규식
    • pickles
    • __init__.py, __main__.py
    • numpy, pandas 정리
    • KL diverence
    • 여러가지 활성함수

하루 느낀점

  • 마지막 날이지만 주말에 정리할게 많다.

부스트 캠프 ai tech 1주 4일차 Ai Math (8)


8. RNN

  • 연속적인 데이터(Sequence Data)를 주로 다루는 Nerual Network
  • 소리, 문자열, 주가등의 데이터를 분석하는데 사용된다

8.1 시계열 데이터

  • 독립동등분포 가정을 잘 위배하기 때문에 순서를 바꾸거나 과거에 정보에 손실이 발생하면 데이터의 확률분포 자체가 변해버린다

  • 베이즈 법칙을 이용하여 다음과 같이 표현이 가능하다
    $$
    \begin{aligned}
    P(X_1, … ,X_{t}) & = P(X_t|X_1, …, X{t-1})P(X_1,…,X_{t-1})\\
    & = \prod_{s=1}^{t}P(X_s|X_{s-1},…,X_1)
    \end{aligned}
    $$

  • 시퀸스 데이터를 다루기 위해서는 길이가 가변적인 데이터를 다룰수 있는 모델이 필요하다

    • 조건부에 들어가는 데이터의 길이는 시퀸스마다 가변적이다
      $$
      \begin{aligned}
      X_t &\sim P(X_t|X_{t-1}, … X_{1})\\
      X_{t+1} &\sim P(X_t|X_{t}, X_{t-1}, … X_{1})
      \end{aligned}
      $$
  • 고정된길이 $\tau$ 만큼의 시퀸스만 사용하는 모델의 경우 자기회귀모델(Autoregressive Model)이라고 한다

    • 매우 오래된 과거의 데이터는 실제 데이터에 큰 영향을 주기 힘들다는 가정하에 세워진 모델이다
      $$
      \begin{aligned}
      X_t &\sim P(X_t|X_{t-1}, … X_{t-\tau})\\
      X_{t+1} &\sim P(X_t|X_{t}, … X_{t-\tau+1})
      \end{aligned}
      $$
  • 이전정보를 제외한 나머지 정보들을 잠재변수로 활용하는 모델을 잠재자기회귀모델 이라고 한다

    • 앞으로 다룰 RNN도 이 모델에 해당한다
      $$
      \begin{aligned}
      X_t &\sim P(X_t|X_{t-1}, H_t)\\
      X_{t+1}&\sim P(X_t|X_{t}, H_{t+1})\\
      H_t&=\operatorname{Net}(H_{t-1}, X_{t-1})
      \end{aligned}
      $$

8.2 RNN

  • 기본적인 RNN 모델은 아래와 같이 MLP와 유사한 형태를 가지고 있다
  • RNN은 이전순서의 잠재변수와 현재의 입렬을 활용하여 계산을 이어나간다
  • RNN의 역전파는 BPTT(Backpropagation Through Time)라고 불리며 연결그래프에 따라 순차적으로 계산한다
    • $S$ : 잠재변수
    • $X$ : input Data
    • $W_x$ : $X$의 가중치행렬
    • $W_{rec}$ : $S$의 가중치 행렬
    • $\sigma$ : Activate Function
    • $X$ : 시퀸스 데이터
  • RNN의 Network 연산

$$
\mathbf{S_{t}} = \sigma (\mathbf{O}_{t-1} + \mathbf{X}_{t}\mathbf{W}_{x})
$$
$$
\mathbf{O_{t}} = \mathbf{S}_{t}\mathbf{W}_{rec}
$$

RNN

  • BPTT
    • RNN의 Backpropagation 을 계산해보면 미분의 곱으로 이루어진 항이 계산된다
    • 시퀸스의 길이만큼의 $W_{rec}$의 역전파가 이루어 질 때 마다 계속해서 미분을 하기 때문에 시퀸스의 길이가 길어질수록 gradient vanishing(기울기 소실)이 발생하여 계산이 불안정해 진다
      • $L$ : loss 함수
      • $y$ : target

$$
\frac{\partial S_{t}}{\partial W_{rec}} = \sum_{i=1}^{t-1} \left( \prod_{j=i+1}^{t} \frac{\partial S_{j}}{\partial S_{j-1}} \right)\frac{\partial S_{i}}{\partial W_{rec}} + \frac{\partial S_{t-1}}{\partial W_{rec}}
$$

  • truncated BPTT
    • RNN은 시퀸스의 길이가 길어지면 기울기 소실이 발생하여 계산이 불안정해지기 때문에 중간에 연산을 끊어주는 테크닉.
  • 이러한 기울기 소실을 해결하기 위해 등장한 네트워크
    • LSTM, GRU

부스트 캠프 ai tech 1주 3일차 Ai Math (7)


7. CNN

  • 합성곱을 이용한 신경망

7.1 Convolution 연산

  • 신호(signal)를 커널을 이용해서 국소적으로 증폭 또는 감소시키는 연산을 말한다

  • CNN 에서 하는 연산은 엄밀하게 말하면 Cross Correlation 연산이다

    • Cross Correlation
      $$
      [f*g](x) = \int_{\mathbb{R}}f(z)g(x+z)\operatorname{d}z
      $$
    • Convolution 연산
      $$
      [f*g](x) = \int_{\mathbb{R}}f(z)g(x-z)\operatorname{d}z
      $$
  • 다양한 차원에서 연산이 가능하다
    $$
    \begin{aligned}
    &1D \quad [f*g](i) = \sum_{p=1}^{d}f(p)g(i+p)\\
    &2D \quad [f*g](i,j) = \sum_{p,q}f(p,q)g(i+p,j+q)\\
    &3D \quad [f*g](i,j,k) = \sum_{p,q,r}f(p)g(i+p,j+q,k+r)
    \end{aligned}
    $$

7.1 2D Convolution 연산

  • 2차원 convolution 연산은 커널을 input위에서 움직여가면서 선형모델과 합성함수가 적용되는 구조이다.

conv

  • 출력크기는 아래와 같이 계산된다
    • $H, W$ : 입력크기
    • $K_{h}, K_{w}$ : 커널의 크기
    • $O_{h}, O_{w}$ : 출력의 크기
      $$
      O_{h} = H-K_{h}+1\\
      O_{w} = W-K_{w}+1
      $$

7.2 Convolution 연산의 Backpropagation

  • Convolution 연산의 역전파도 결국에는 선형연산이 여러번 적용된 형태이기 때문에 계산할때 각 커널의 들어오는 모든 gradient를 더하면 된다

$$
\frac{\partial \mathcal{L}}{\partial w_{i}} = \sum_{j} \delta_{j} x_{i+j-1}
$$

conv_back

부스트 캠프 ai tech 1주 3일차 Ai Math (6)


6. 베이즈 통계학

  • 하나의 사건에서 믿음의 정도를 확률로 나타내는 베이즈 확률론에 기반한 통계학 이론
  • 쉽게 말하면 아직 일어나지 않은 사건이 일어날 확률에 대한 계산을 하는 학문

6.0 조건부 확률

  • 조건부확률 $P(A|B)$
    특정사건 $B$가 일어난 상황에서 사건 $A$가 일어날 확률이다. 아래와 같이 나타낼 수 있다.

    $A$와 $B$가 동시에 일어날 확률 = $B$가 일어날 확률 * $B$일어난 상황에서 $A$가 일어날 확률
    $$
    P(A\cap B) = P(B), P(A|B) = P(A), P(B|A)
    $$
    $$
    P(B|A) = \frac{P(A\cap B)}{P(A)} = P(B) \frac{P(A|B)}{P(A)}
    $$

6.1 베이즈 정리

  • $D$ : 데이터

  • $\theta$ : 측정하고싶은 파라미터

  • 조건부 확률 $P(\theta|D)$는 사후확률이라고 부른다

  • 조건부 확률 $P(D|\theta)$는 가능도(likehood, 우도)라고 부른다

  • $P(\theta)$ 는 사전확률이라고 부른다

  • 베이즈 정리는 아래와 같이 나타내며 이식으로 부터 우리는 사후확률과 가능도는 비례하는 관계임을 알 수 있다
    $$
    P(\theta|D) = P(\theta) \frac{P(D|\theta)}{P(D)}
    $$

  • 조건부 확률의 시각화

    • 정밀도(Precision) : 모델이 True라고 분류한 것들 중에서 실제 True인 것의 비율
    • 재현율(Recall) : 실제 True인 것 중에서 모델이 True라고 예측한 것의 비율
    • 정확도(Accuracy) : 올바르게 예측한 정도
      $$
      Precision = \frac{TP}{TP+FP}
      $$
      $$
      Recall = \frac{TP}{TP+FN}
      $$
      $$
      Accruacy = \frac{TP + TN}{TP+FN+FP+TN}
      $$

조건부 확률

  • 새로운 데이터가 들어왔을때 앞서 계산한 사후확률을 사전확률로 사용하여 새로운 사후확률로 갱신할 수 있다
    $$
    P^{\prime}(\theta|D) = P(\theta|D) \frac{P(D|\theta)}{P(D)}
    $$

  • 조건부 확률은 일어나지 않은 일에 대해 유용한 통계적 해석을 제공하지만 인과관계를 추론할때는 함부로 사용해서는 안된다

  • robust한 모델을 위해서는 인과관계를 생각할 필요가 있다

Week1 - Day 4 Review


오늘 하루 한 것

  • 강의
    • 모든강의 다 끝냄
  • 과제
    • 심화과제 완료
  • 정리
    • 통계학
    • 베이즈 통계학

피어세션에서 한 것

  • 선형회귀 경사하강법에 대한 질문

내일 할것

  • 정리 마무리!
  • 과제회고
  • 피어세션 질문 정리

주말에 할 것

  • 추가 정리
    • 정규식
    • pickles
    • __init__.py, __main__.py
    • numpy, pandas 정리
    • KL diverence

하루 느낀점

  • 생각보다 많이 정리하지는 못했다
  • 제출은 안하지만 답지 받기전까지 끝내고 싶어서 심화과제에 시간을 많이 투자했다