SlideShare a Scribd company logo
1 of 89
Download to read offline
컴퓨터 비전을 위한 역전파2 Backpropagation2
도정찬
Michigan Online, Justin Johnson, Computer Vision, 2021. 02. 01
역전파 구현하기:
간단한 그라디언트 코드:
순방향:
출력 계산하기
▪ 음 이제 구현하는 코드를 한번 보겠습니다. 여러분들이 과제하는데도 필요하고, 두 가지 방향 순방향과 어떻게 역방향으로 고쳐
나갈까 생각하면서 보면 좋을것같아요. 먼저 이걸 그냥 간단한 역전파 구현 코드라고 부르겠습니다. 요기 보시면 파이썬 함수로
전체 계산 그래프를 계산하는 함수가 있는데, 이 함수는 선형 분류기 처럼 동작하겠죠.
▪ 입력에서는 미니 배치 데이터와 가중치들을 받아 미니 배치 데이터들에 대한 비용을 계산합니다. 미니 배치 데이터는 신경망
학습 데이터가 크다보니 일정 크기로 나눈 일부라고 생각하면 되요. 신경망 모델 훈련때 자주 보니 이정도만 알고 넘어갑시다.
▪ 아마 숙제 한 사람들이라면 익숙해 보일거에요. 이제 비용도 계산하고, 그리고 비용에 대한 각 가중치의 미분을 계산하는 하나
의 함수로서 봅시다. 이정도는 여러분들도 미분 계산하는걸 직접 손으로 풀수도 있긴하지만 너무 힘드니 그런 방식으로 기울기를
gradient check 확인 하지 말고 역전파 코드를 구현해서 쉽고 간단하게 할수 있습니다.
역전파 구현하기:
간단한 그라디언트 코드:
순방향:
출력 계산하기
역방향:
기울기 계산하기
gradient
▪ 이 조그만 계산 그래프를 봅시다. 이 왼쪽 그래프는 시그모이드 함수를 적용하는 예제인데, 시그모이드 함수 부분은 슬라이드
몇장 전에 봤엇죠. 이제 여기서 우린 두 가중치 행렬 w0, w1와 입력 x0, x1, 그리고 편향항인 w2를 받아 순방향으로 나아가는데
보면 곱셈연산도 하고, 덧셈 연산도 해서 마지막에 비용 L을 구하게 됩니다. 이제 역방향으로 봅시다. 역방향 코드는 순방향 코드
가 다 동작한 후에 진행되는데, 신기한 점은 순방향 코드의 역방향 버전처럼 보입니다.
역전파 구현하기:
간단한 그라디언트 코드:
순방향:
출력 계산하기
베이스 케이스
▪ 제가 여러분들에게 얘기하고 싶은건, 먼저 역방향 코드에선 출력의 자기 자신에 대한 기울기 베이스케이스를 계산해요 이 값은
1이니 베이스 케이스 코드 라인은 생략해도 되요. 하지만 저는 교육적으로 하고싶고 계산 그래프를 생각하면 넣는게 맞습니다.
역전파 구현하기:
간단한 그라디언트 코드:
순방향:
출력 계산하기
베이스 케이스
▪ 역전파 코드의 둘째 줄을 보면 시그모이드 함수를 역방향으로 지나가고 있죠. 여러분도 보시다시피 역전파에서 시그모이드 함
수 라인과 순전파의 마지막 줄이 매치되고 있어요.
▪ 제가 여기서 약간 얘기하고싶은건 순방향에서 시그모이드 함수는 입력을 3개 갖고 출력 L을 반환했지만, 역방향에서 매치되는
코드 라인을 보면 약간 역변환 시켜 구현되었습니다. 이 라인에서는 입력으로 grad_L과 L을 입력받아 grad_s3을 출력으로 하고
있죠. 이런식으로 순방향과 역방향 사이에 1:1 관계를 볼수 있으며 입력과 출력이 뒤바뀐 형태로 볼 수 있을거 같아요.
역전파 구현하기:
간단한 그라디언트 코드:
순방향:
출력 계산하기
시그모이드
▪ 다음 줄로 넘어가서 이번에는 순방향의 마지막 2번째 줄은 s2와 w2를 더하고 있다 보니 역방향의 경우 출력이 2개, 2개의 라인
으로 구현하였습니다. 이전에 덧셈 게이트가 그라디언트/기울기 분배기 처럼 동작한다고 했었죠. 그래서 이전의 그라디언트가 고
대로 각 라인의 입력으로 전달 됩니다.
역전파 구현하기:
간단한 그라디언트 코드:
순방향:
출력 계산하기
덧셈
▪ 순방향 끝에서 셋째 줄에도 똑같인 연산이 수행되요. 또 순방향으로 덧셈을 하다보니, 역방향으로는 기존 그라디언트를 그대로
보내주죠.
역전파 구현하기:
간단한 그라디언트 코드:
순방향:
출력 계산하기
덧셈
▪ 순방향 뒤에서 4번째 줄도 비슷하게 생기기는 하지만 여기는 곱셈 게이트다 보니 여기서 로컬 그라디언트를 구하였었죠.
역전파 구현하기:
간단한 그라디언트 코드:
순방향:
출력 계산하기
곱셈
▪ 마지막 출력 다운스트림 그라디언트는 전에 본대로 로컬 그라디언트와 업스트림그라디언트를 곱해서 구하면 되겠습니다. 지금
까지 우리가 역전파를 수학적인 지식 없이 구현할 수 있었습니다. 여기선 어떤 방정식을 정리할 필요도 없었죠, 대신 어떤게 전파
transfer되는지는 좀 생각해야 하지만요.
▪ 우린 이걸 코드로 구현했고, 4 입력들을 적절히 변환시켜 역전파하는대 사용할수 있었어요. 아무튼 이런식으로 아직 과제 하지
못한 사람들은 참고해서 하면 될것 같습니다. 이걸로 좀 그라디언트를 쉽게 계산하실수 있을거에요.
역전파 구현하기:
간단한 그라디언트 코드:
순방향:
출력 계산하기
곱셈
▪ (과제 내용은 패스하고) 실제 현장에서 역전파를 구현하는 방법은 이런 모듈화된 API를 사용합니다. 이걸로 우리가 봤던 대로
노드 주변의 지역적인 계산을 할수도 있을거에요.
▪ 여기 지금 보시는건 역전파를 모듈화해서 구현한걸 보여주고 있는데, 지금 계산 그래프 객체를 정의한게 있죠. 이 객체에서는
모든 노드에 대해서 토폴로지 순서대로 연산을 하면서 그래프의 모든 노드에서 순전파도하고, 역전파도 할수 있으나, 보시는 이
코드는 슈도 코드라고는 할수 있지만 실제 타이핑해서 동작하는 코드는 아닙니다.
역전파 구현하기 : 모듈화된 API
그래프(신경망) 객체 (러프하게 만든 슈도코드)
▪ 이게 실제 동작하는 코드 예시로 파이 토치에서 사용하는건데, 이 API처럼 torch.autograd.Function을 상속 받아서 우리들에게
필요한 함수를 정의할수 있을거에요. 한번 여러분들이 어러분들 만의 계산 그래프 노드를 정의한다면, 이 객체처럼 순방향과 역
방향에 대한 함수들을 볼수 있어요.
예시 : 파이토치 autograd 함수
역전파때 사용할
값들을 저장해야함
업스트림
그라디언트
업스트림과
지역 그라디언트의
곱셈
▪ 우선 순전파 함수를 보면 3개의 입력을 받고 있는데 여기서 x와 y는 입력 값으로 이 노드가 순방향으로 받는 값들이고, 이들은
토치 텐서라고 하는 데이터들입니다. 지금까지 우리가 스칼라값들만 쓰다보니 이 경우에는 토치 스칼라겠지요.
▪ 그리고 이 순전파 함수는 상황, 문맥에 대한 객체 context(ctx)도 받고 있는데, 이 객체에는 역전파 계산에 필요한 정보들을 저장
해놓는 객체라고 생각하면 될거같아요. 그리고 이제 내부를 보면 순전파 함수는 z = x * y을 해서 z를 반환하도록 간단하게 정의
되어 있는데 이 모든 연산들은 토치 텐서라고 하는 타입으로 동작하게 됩니다.
예시 : 파이토치 autograd 함수
역전파때 사용할
값들을 저장해야함
업스트림
그라디언트
업스트림과
지역 그라디언트의
곱셈
▪ 이번에는 역전파 함수를 봅시다. 이 함수는 순전파 때랑 똑같이 컨텍스트 객체를 매개변수로 받고, 미분들을 계산하는데 필요한
four pass? 정보들을 꺼내서 사용합니다.(순전파떄 ctx에 x와 y를 저장해두었으니 요기서 꺼낸다는 얘기로 보입니다.)
▪ 그래서 컨택스트로부터 x와 y를 꺼내고 업스트림 그라디언트인 grad_z를 받고, 로컬 그라디언트와 업스트림 그라디언트를 곱하
여 다운 스트림 그라디언트를 계산할수 있겠습니다. 이 경우는 입력이 2개다 보니 두 입력에 대한 다운스트림 그라디언트들을 간
단하게 리턴 시켜주었습니다.
예시 : 파이토치 autograd 함수
역전파때 사용할
값들을 저장해야함
업스트림
그라디언트
업스트림과
지역 그라디언트의
곱셈
예시 : 파이토치 연산자들 operators
▪ 이게 실제 구현된 토치 코드들입니다. 여러분들이 어떤이유로 자신 만의 연산자, 순
전파 역전파 함수들을 구현하길 원한다면, 이것들이 좋은 예시가 될것 같아요.
▪ 한번 깃헙 저장소에서 한 파일을 제대로 보자면, 시그모이드 함수를 구현한 것들중에 하나로 되게 깊은 건데, 여기서는 시그모
이드의 순전파를 정의하고 있습니다. 여기서는 C++ 아니면 C 같은걸 사용해서 파이 토치의 핵심 코드들이 구현되어 있어요.
파이토치 시그모이드 계층
▪ 이게 순전파 방향의 시그모이드 함수를 계산하는 건데,
파이토치 시그모이드 계층
순방향에 대한 함수
▪ 아쉽게도 다른 함수로 호출되서 어디선가 이걸 찾을수는 있긴한데, 너무 큰 스파게티 코드라 파이토치의 백앤드를 보려고 한다
면, 이런건 무시해도 될것 같아요.
파이토치 시그모이드 계층
순방향에 대한 함수
▪ 다른 비슷한 함수로 THNN이 있는데, 여기서는 역전파 계산시에 사용되는 그라디언트 인풋을 업데이트 해주는 곳입니다. 이건
표준 형태? 템플릿? boilerplate처럼 되어있는데, 혹시 패킹되지 않은 텐서 값을 알고 있다면 입력으로 사용해서 확인해볼수 있을
겁니다. 이건 실제 동작하는 코드 베이스에요. 여기서 오른쪽을 보면 이게 중첩된 매크로랑 복잡한 코드들을 c로 구현한 것들 사
이에서 시그모이드 계층에이 역전파에서 어떻게 계산되는지 형태를보여주고 있습니다.
파이토치 시그모이드 계층
역방향에 대한 함수
순방향에 대한 함수
▪ 정신없고 복잡하긴하지만, 파이토치는 기본적으로 순전파와 역전파 쌍으로된 함수로 이루어져 있고, 계산 그래프 상에서 쉽게
바꿀수도 있어요.
파이토치 시그모이드 계층
역방향에 대한 함수
순방향에 대한 함수
▪ 지금까지 우리가 얘기 한건 스칼라를 이용한 역전파와 계산그래프에 대해서구요. 단변수 미분학에 대해서 알고 있다면 정말 쉽
게 이해할수 있었을 거에요. 하지만 실제로 사용하려면 몇 차원으로 이루어진 벡터, 행렬, 텐서 같은 데이터들로 연산을 해야 합
니다. 그러려면 벡터, 텐서로 이루어진 역전파에 대해서 배워나가야하고, 다변수 미분에 대한 개념들을 좀 짚고 넘어가야 해요.
지금까지 스칼라 값으로 역전파를 했는데,
벡터의 경우는 어떻게 할까?
▪ 여러분들은 하나의 스칼라 값이 주어지는 함수, 그러니가 단변수 함수 ex. y = ax가 주어질때, 이에 대한 미분을 어떻게 구하는
지 알고 있습니다. 이 미분 dy/dx 은 입력에 대한 출력의 기울기, 출력의 변화율을 말하는데, 이것을 지역 선형 근사 local linear
approximcation이라고도 말할 수 있을거 같아요. 입력이 변할때 출력이 얼마나 변하는지 정도를 알려주는 개념인데, 그라디언트
연산에서 계속 봐 왔엇죠.
요약 : 벡터의 미분
일반적인 미분
(도함수 derivative)
x의 값이 바뀔 때,
y가 변하는 정도를
의미한다.
▪ .우리가 사용했던 그라디언트는 입력을 여러 개로 받는 함수(다변수 함수)가 주어질때, 각 변수에 대한 미분들(편미분, 방향 도
함수)들의 모음을 말합니다. 위의 빨간색 상자가 다변수 함수 f에 대한 그라디언트 벡터를 보여주고 있어요.
▪ 다시 말하면 그라디언트는 입력을 벡터로 받는 함수로 스칼라 출력을 계산하고, dy/dx를 구했다고 할 수 있어요. 그런데 일반적
인 도함수와 차이첨은 dx가 여러개가 존재한다는 거죠. 그라디언트 벡터는 그래서 입력 벡터와 당일한 크기가 되며, 입력 중 한
요소가 변할때 출력이 변하는 정도를 보여줍니다.
요약 : 벡터의 미분
일반적인 미분
(도함수 derivative)
그라디언트 : 다변수 함수의 미분
ref : https://darkpgmr.tistory.com/132
x의 값이 바뀔 때,
y가 변하는 정도를
의미한다.
다변수 함수 f(x1, x2, ..., xn)의
한 x_i가 변할때, y가 변하는 정
도를 의미한다.
▪ 이건 고전적인 단변수 미분들을 봤고, 이번에는 이것을 일반화하여 입력이 벡터이고, 출력도 벡터로 되는 경우를 보겠습니다.
제가 말하고 싶은건 여기 있는 것들은 다 다른이름이지만 기본적으로는 같은 원리라고 생각할 수 있을것같은데, 더 일반화 시킨
형태로 맨 우측의 자코비안 jacobian이라고 부릅니다.
▪ 이 자코비안은 행렬로 모든 원소가 N x M개가 있으며, 입력과 출력으로 인해 2차원이 존재한다면 이 것을 자코비안이라고 합
니다. 자코비안도 이전과 마찬가지로 입력의 한 원소가 출력의 한 원소에 영향을 미치는 정도를 나타낸다고 할수 있어요.
요약 : 벡터의 미분
일반적인 미분
(도함수 derivative)
자코비안 : 다변수 벡터 함수의
1차 미분(first derivative)
그라디언트 : 다변수 함수의 미분
ref : https://darkpgmr.tistory.com/132
x의 값이 바뀔 때,
y가 변하는 정도를
의미한다.
다변수 함수 f(x1, x2, ..., xn)의
한 x_i가 변할때, y가 변하는 정
도를 의미한다.
다변수 벡터 함수 y = [y1, ..., ym],
y_i = f_i(x1, ..., xn)일때
x중 n번째 요소 x_n이 변할때,
y의 m번째 함수의 값이 변하는 정도
▪ 이제 한 노드에서 어떻게 역전파가 동작하는지 한번 생각해 봅시다. 그러면 이런 노드 안에서 벡터 형태의 값이 역전파를 한다
는게 무엇을 의미할까요? 여기에 한 함수 f가 있고 여기에 두 벡터를 넣는다고 해봅시다. 하나는 X로 차원이 Dx라고 할게요. 그리
고 Y도 차원이 Dy인 벡터라고 합시다.
▪ 그러면 이 두 벡터를 받아 출력 Z를 만들고 이 차원수, 원소 갯수를 Dz라고 부릅시다. 이게 순전파의 처리 과정입니다. 매우
쉽죠.
벡터로 보는 역전파
▪ 이제 업스트림 그라디언트를 받는다고 합시다. 이 업스트림 그라디언트도 벡터 형태의 값입니다. 하지만 중요한건 계산하는 중
간에 벡터나 텐서로 연산되는지 상관없이 항상 비용은 스칼라 값입니다. 업스트림 그라디언트는 총 비용에 대한 이 노드 출력의
미분으로 바꿔 말하면 각 노드의 출력이 총 비용을 얼마나 변화시는지를 나타낸다고 할수 있겠습니다.
벡터로 보는 역전파
비용 L은 여전히 스칼라!
업스트림 그라디언트
z의 각 원소가 비용 L에 얼마나
영향을 줄까?
▪ 이번에는 나오는 로컬 그라디언트는 자코비안 행렬의 형태로 되어있습니다. 왜냐면 이 함수는 벡터 값을 처리하는 함수로 두
벡터x, y를 입력으로 받아 하나의 벡터를 출력 z로 보냈거든요. 그래서 지역 그라디언트는 자코비안이 되며, 이 자코비안 행렬은
입력 벡터의 원소가 출력 벡터에 얼마나 영향을 주었는지를 의미합니다.
벡터로 보는 역전파
비용 L은 여전히 스칼라!
업스트림 그라디언트
국소/지역
자코비안 행렬들
z의 각 원소가 비용 L에 얼마나
영향을 줄까?
▪ 역방향으로 진행하면서 우리가 원하던 다운 스트림 그라디언트를 구할수 있어요. 결국에 이 다운스트림 그라디언트는 총 비용
의 벡터 입력에 대한 미분으로, 입력이 변할때 총 비용이 변화는 정도가 됩니다. 이때 이 다운스트림 그라디언트는 입력때와 동일
한데, 알다시피 로컬 그라디언트와 업스트림 그라디언트를 곱하여 얻겠습니다. X의 다운스트림 그라디언트는 같은 크기의 벡터
로 dL/dx, Y의 다운스트림 그라디언트도 같은 크기의 벡터 dL/dy루요.
벡터로 보는 역전파
비용 L은 여전히 스칼라!
각 노드들의 z가 비용 L에 얼마나
영향을 줄까?
업스트림 그라디언트
국소/지역
자코비안 행렬들
행렬-벡터
다운스트림
그라디언트들
곱셈
▪ 지금 우리가 다루는 내용들은 스칼라 곱셈이 아니라 벡터들을 다루다보니, 로컬 그라디언트는 자코비안 행렬이 되었고, 업스트
림/다운스트림 그라디언트는 각각의 벡터가 되었습니다. 다운 스트림 그라디언트를 만들려면 업스트림 그라디언트 벡터와 로컬
자코비안 행렬을 곱하면 됬죠.
벡터로 보는 역전파
비용 L은 여전히 스칼라!
각 노드들의 z가 비용 L에 얼마나
영향을 줄까?
업스트림 그라디언트
국소/지역
자코비안 행렬들
행렬-벡터
다운스트림
그라디언트들
곱셈
벡터로 보는 역전파
▪ 혹시 여러분들이 햇갈린다면, 직접 종이에다가 행렬 형태를 적어나가나는걸 추천해요. 적어나가는 방식으로 예제를 보다보면
벡터를 이용한 역전파라는게 무엇인지 좀더 명확해질것입니다.
▪ 한번 ReLU함수를 다룬다고 생각해봅시다. 이 함수는 원소 단위 element-wise 로 동작하고 있는데, 0보다 작은 값이 들어올때
제거해주고 있습니다.
벡터로 보는 역전파
▪ 위 예시에서는 입력 벡터 X로 1, -2, 3, -1이 들어오고 있는데, ReLU함수를 적용한 뒤에 음수들이 사라졌어요.그래서 출력 벡터
Y는 1, 0, 3, 0이 됩니다. 이 ReLu 함수는 벡터 값들을 처리하는 함수 중 하나로 계산 그래프 상에 어딘가에 노드로 들어가 사용될
겁니다.
▪ 이번에는 역전파 과정으로 업스트림 그라디언트(현 노드의 출력이 총 그라디언트에 미치는 영향, 기울기)를 받았다고 해볼께요.
이 ReLu함수의 출력에 약간의 변화가 생기는 경우, 어떻게 이 값들이 어떻게 계산이 되었고, 자동적으로 미분이 되어 돌아오는지
는 아직 잘 모릅니다.
벡터로 보는 역전파
▪ 이 자코비안 행렬은 각 입력 x가 출력 y를 얼마나 변화시키는가를 알려주는데, 원소 단위의 방사형 함수로 된 자코비안 행렬은
첫번째 출력은 첫번째 입력에의해 정해지고, 둘째 입력은 둘째 입력으로 정해진다는 점, 첫째 입력이 둘째/셋째 출력에 영향을 주
지 않고 벡터에서 같은 위치에 대응되는 출력에만 영향을 주기 때문에 , 특별한 구조를 가졌다고 할수 있겠습니다..
벡터로 보는 역전파
▪ 그러면 자코비안 행렬이 비대각 구조를 가지는 경우 무슨 의미를 가질까요? 자코비안 행렬의 비대각 원소들은 i와 j가 같지 않을
때, 입력 원소 i가 출력 원소 j에 얼마나 영향을 미치는 정도를 나타낸다고 할수있으나 이 원소단위의 함수의 경우 비대각 원소는 0
이죠.
벡터로 보는 역전파
▪ 대각 원소들은 스칼라 형태의 미분 값을 가지는데, 이 미분 값들이 입력이 얼마나 변화시키는 지를 나타낸다고 할수 있겠습니
다. 입력으로 양의 값이 들어온다면 대각 원소에서 로컬 그라디언트가 1이 될것이고, 음의 입력을 받는다면 로컬 그라디언트는 0
이 될겁니다. 이런 식으로 주어진 입력에 대해 연산이 수행되어 완전한 자코비안 행렬이 만들어 지게 되요.
벡터로 보는 역전파
▪ 이제 다운스트림 그라디언트 벡터를 구하기 위해서는 로컬 자코비안 행렬과 그라디언트 벡터를 구하면 되겠습니다.
벡터로 보는 역전파
▪ 그러면 이런 다운스트림 그라디언트 벡터를 구하게 되고, 다른 노드의 역전파 입력으로 사용될겁니다.
벡터로 보는 역전파
벡터로 보는 역전파
▪ 이제 이 변화율에 대한 함수의 신기한 점을 보자면, 자코비안 행렬은 희소 sparse 행렬이다 보니 대부분의 값들이 0으로 되어
있는데, 이건 딥러닝에서 사용하는 함수들을 생각하면 흔한경우는 아니에요.
▪ 실제 환경에서 대부분의 지역 자코비안 행렬들은 엄청 엄청 희소하다보니, 이 자코비안 행렬을 명시적으로 만든다거나 자코비
안과 업스트림 그라디언트의 곱 연산을 수행할수가 없습니다.
자코비안이 희소 sparse하다
= 비대각 원소들이 모두 0이다
-> 명시적으로 자코비안을 만들지 않고,
묵시적으로 곱 연산을 하자
벡터로 보는 역전파
▪ 이 ReLU 예제는 입력을 4개로 받다보니 자코비안으로 만들수는 있었지만, 미니배치 입력을 받는 경우 128개의 데이터를 받는
데 한 데이터당 4096개의 차원으로 이루어진 벡터라면 자코비안 행렬이 엄청엄청 커지면서 희소해지고, 대각 요소들만 0이 아닌
값이 될겁니다.
▪ 그래서 이런 행렬들을 명시적으로 만들고, 계산하는건 자원 낭비이고 비효율적입니다. 그래서 역전파 과정에서 자코비안과 벡
터 곱 연산을 효율적이고, 묵시적으로 하는 방법이 있는데,
자코비안이 희소 sparse하다
= 비대각 원소들이 모두 0이다
-> 명시적으로 자코비안을 만들지 않고,
묵시적으로 곱 연산을 하자
▪ ReLU 함수에서 예를 들자면 어짜피 우린 ReLU의 구조가 어떤지, 대각 원소들이 1 또는 0인걸 알고 있으니 이렇게 간단하게 정
리할수 있어요.
▪ 이걸로 다운스트림 그라디언트를 업스트림 그라디언트를 그냥 통과시키거나, 0으로 만들어버리는 식으로 (순방향 때 입력의 부
호에 따라) 구할수가 있게 되겠습니다. 그래서 이런 방법으로 큰 희소 자코비안과 업스트림 그라디언트의 곱셈 연산을 암시적으
로(형태는 다를수 있으나 결과는 똑같은) 효율적인 구현할수 있었습니다. 이렇게 효율적으로 구현하는 방법들을 잘 생각해야해요.
벡터로 보는 역전파
자코비안이 희소 sparse하다
= 비대각 원소들이 모두 0이다
-> 명시적explicit 으로 자코비안을 만들지 않고,
묵시적/암시적 implicit으로 곱 연산을 하자
▪ 우리는 지금까지 벡터에 대해서 얘기했고, 랭크가 1보다 큰 텐서 연산에 대해서도 알아야 합니다. 아마 행렬를 사용하거나 3차
원, 4차원 식의 데이터, 텐서들을 처리해야할 때가 있어요. 지금 보시는 그림은 어느 크기를 가진 텐서가 어떻게 역전파를 하는지
보여주기 위한건데, 로컬 함수인 f(x)는 없지만 입력으로 x와 y가 있네요.
행렬들(텐서)로 보는 역전파
▪ 여기서 행렬 x는 크기가 Dx, Mx이며, 행렬 y는 Dy, My의 크기를 가졌으며, 출력또한 행렬이라고 합시다. 그리고 비용은 스칼라
값이에요. 어떤 원소에 대한 비용의 그라디언트들은 항상 텐서 형태를 가지며, 각 입력 텐서의 원소들에 의해 최종 다운스트림 비
용이 얼마나 바뀌는지를 나타냅니다.
행렬들(텐서)로 보는 역전파 비용 L은 여전히 스칼라!
dL/dx는 항상 x와 같은 형태
shape를 갖는다.
▪ 우리가 업스트림 그라디언트를 받았다고 합시다. 이 행렬의 크기를 Dz, Mz라고 할거구, 이 행렬은 출력이 변할때 로스가 얼마
나 변하는지를 의미하는 값입니다.
행렬들(텐서)로 보는 역전파 비용 L은 여전히 스칼라!
dL/dx는 항상 x와 같은 형태
shape를 갖는다.
업스트림 그라디언트
z의 각 원소가 비용 L에 얼마나
영향을 줄까?
▪ 이번에 지역 자코비안 행렬들을 보시면 신기하게 생겼는데, 자코비안 행렬이 입력의 스칼라 원소들이 출력의 스칼라 원소들에
얼마나 영향을 주는가, 변화를 시키는가를 나타낸다고 했던것을 생각하면, 이 자코비안 행렬은 더 일반화 시킨 행렬의 형태라고
할수 있어요.
▪ 이 x와 z사이의 지역 자코비안 행렬의 원소 수는 (Dx, Mx) * (Dz, Mz)로 구할수 있어요. 이런 자코비안 행렬의 차원은 입력의 차
원수 x 출력의 차원수 x로 이해할수 있을것 같습니다.
행렬들(텐서)로 보는 역전파 비용 L은 여전히 스칼라!
dL/dx는 항상 x와 같은 형태
shape를 갖는다.
z의 각 원소가 비용 L에 얼마나
영향을 줄까?
업스트림 그라디언트
국소/지역
자코비안 행렬들
각 y의 원소가 z의 원소에 얼마나 영향을
줄까?
▪ 아무튼 랭크가 엄청 큰 탠서인 자코비안 행렬을 구하였으니, 다운스트림 그라디언트를 계산할 차례입니다. 이 다운스트림 그라
디언트는 계속 본대로 지역 자코비안과 업스트림을 곱하여 얻으며, 기존 입력과 동일한 형태를 가집니다.
▪ 여기서 문제는 벡터도 아니고, 행렬도 아닌 좀더 행렬 곱이나 지역 자코비안 행렬을 일반화시킨 표현이 필요합니다. 자코비안
행렬 같은 경우 입력과 출력을 펼쳐서 flatten 시켜 만들었었죠. 출력과 입력을 펼쳐 각각 고차원 벡터를 만들고, 이들로 벡터 곱
연산을 시켜 위와 같은 결과를 얻을 수 있었습니다.
행렬들(텐서)로 보는 역전파 비용 L은 여전히 스칼라!
dL/dx는 항상 x와 같은 형태
shape를 갖는다.
업스트림 그라디언트
국소/지역
자코비안 행렬들
행렬-벡터 곱셈
z의 각 원소가 비용 L에 얼마나
영향을 줄까?
각 y의 원소가 z의 원소에 얼마나 영향을
줄까?
▪ 하지만 매우 고차원이고, 암시적인 자코비안 행렬과 고차원 텐서 간에 곱셈 연산을 시킨다면 머리가 터져버릴 거고, 암시적으로
연산 과정을 정리해 나가기는 너무 힘든 일입니다.
행렬들(텐서)로 보는 역전파 비용 L은 여전히 스칼라!
dL/dx는 항상 x와 같은 형태
shape를 갖는다.
업스트림 그라디언트
국소/지역
자코비안 행렬들
행렬-벡터 곱셈
z의 각 원소가 비용 L에 얼마나
영향을 줄까?
각 y의 원소가 z의 원소에 얼마나 영향을
줄까?
▪ 그래서 여러분들이 매우 고차원적이고, 랭크가 높은 텐서들까지 생각할 필요없이 연산자를 구현할수 있는 방법들을 알려줄게
요. 행렬 곱셈 연산을 역전파로 나타내는 예제를 한번 다뤄봅시다. 지금 하는 방법은 여러분들에게 많이 도움 될거고 어떤 복잡한
텐서 연산하는 함수더라도 역전파 연산을 정리할수 있겠습니다.
▪ 2 x 3 크기의 입력 해렬과, D x M 크기의 가중치 행렬이 주어졌다고 해 봅시다. 이 경우에는 3 x 4 크기라고 할게요. 그러면 계
산 노드가 행렬 곱 연산을 하여 출력 Y를 만들어 내어 오른쪽의 결과 값을 구하였습니다.
예제 : 행렬 곱 연산
▪ 이제는 역방향으로 생각해봅시다. 우리가 어딘가에서 업스트림 그라디언트를 받았다고 해요. 이 값은 현재 출력이 얼마나 비용
을 변화시키는지 나타내는 값이었죠. 우리들이 해야할 일은 다운 스트림 그라디언트를 계산하는 것인데,
예제 : 행렬 곱 연산
▪ 자코비안의 크기가 (N x D) x (D x M)으로 꽤 클수 있을거에요. 지금 슬라이드에서 보는 예제는 아주 간단한 예제지만 실제 신
경망의 경우 N=64, D=4096 같은 값이 들어갈수도 있다보니 이런 자코비안들을 곱해간다면, 256GB의 메모리 공간이 필요하고
엄청 큰 GPU도 구매해야 할거에요.
▪ 제 생각에는 48gb의 메모리를 구매하면 될것 같긴한데 자코비안을 명시적으로 곱연산을 수행할때 동작할지는 모르겠어요.
예제 : 행렬 곱 연산
N=64, D=M=4096 인 신경망이 있다고 하자
각 자코비안 행렬을 계산하는데는 256GB의 메모리가 필요하다!
명시적인 방법(전체 공간을 따로 준비해서 계산)하기 보다는 묵시적인 방법으로 해야 한다!
* 묵시적 방법 : 기존의 주어진 데이터와 연산 과정을 간소화 하여
명시적인 방법과 동일한 결과를 나오게 함
▪ 지금 보시는건 아주 작은 신경망 시스템이고, 간단하지만 명시적으로 자코비안을 만들고, 벡터와 행렬 곱을 하는 것 대신 계산
을 수행하는 방법이 있어요. 여러분들은 암시적으로 연산 하는 방법을 알아야 하는데, 입력의 원소 단위처리로 하는 방법이 있겠
습니다.
예제 : 행렬 곱 연산
N=64, D=M=4096 인 신경망이 있다고 하자
각 자코비안 행렬을 계산하는데는 256GB의 메모리가 필요하다!
명시적인 방법(전체 공간을 따로 준비해서 계산)하기 보다는 묵시적인 방법으로 해야 한다!
* 묵시적 방법 : 기존의 주어진 데이터와 연산 과정을 간소화 하여
명시적인 방법과 동일한 결과를 나오게 함
▪ 입력의 한 원소 x1,1가 어떻게 되는지 생각해볼 수 있을 거 같아요. x1,1 이 값을 알고 있으면 해당 지역 그라디언트 일부를 계
산할수 있어요. 지역 그라디언트는 입력의 형태 x 출력의 형태로 엄청 크지만, 제가 설명하고자 하는 지역 그라디언트 일부는 하
나의 입력 원소 x1,1이 주어질때 출력 행렬 Y의 미분이라고 할 수 있어요. 이건 행렬의 미분이다 보니 출력 Y의 한 원소가 입력 X
의 한 스칼라 원소로부터 얼마나 영향을 받는 정도를 알수 있습니다.
예제 : 행렬 곱 연산
▪ 그럼 여기서 더나아가서 지역 그라디언트의 첫번째 요소는 무엇이고, 얼마나 y1,1이 x1,1의 영향을 받을까요. 이미 우리는 행렬
곱 연산이 어떻게 되는지 알고 있다보니 y 1,1을 계산한다면 X의 첫번째 행과 W의 첫번재 열을 내적하여 구할수가 있겠죠. 이 내
용을 아래와 같이 정리할수 있겠습니다.
예제 : 행렬 곱 연산
▪ 이제 x1,1에 대한 y1,의 미분, 기울기를 계산할수 있어요. 여기서 모든 항들을 보시면 중요한건 첫번째 항으로 x1,1 * w1,1인데,
두 스칼라 곱으로 부터 미분을 구하는 방법은 알고 있으니 이 로컬 그라디언트의 일부분은 w1,1으로 3이 됩니다.
예제 : 행렬 곱 연산
▪ 이 과정을 반복해서 로컬 그라디언트의 두번째 원소를 계산할수 잇을건데, 아무튼 입력의 파란색 원소가 출력의 보라색 원소를
구하는데 얼마나 영향을 주는가를 나타내는 값이겠죠.
예제 : 행렬 곱 연산
▪ 다시 X의 첫번째 행과, Y의 두번째 열을 내적해서 아래의 식으로 정리 될거고
예제 : 행렬 곱 연산
▪ 여기서 남은 한 항인 w1,1가 지역 그라디언트의 두 번째 원소이며, 2가 되겠습니다.
예제 : 행렬 곱 연산
▪ 나머지 두 원소도 이렇게 구하면 됩니다. 이런 과정에서 지역 그라디언트의 첫번째 행이 가중치 행렬 W의 첫번째 행을 복사한
것이란걸 알 수 있었어요. 이번에는 지역 그라디언트의 두번째 행을 봅시다.
예제 : 행렬 곱 연산
▪ 지역 그라디언트의 두번째 줄을 봐야하는데, 입력의 파란색 원소가 출력의 보라색 원소를 구하는데 얼마나 영향을 미치는가를
의미하는 값이 되겠죠. 하지만 출력의 보라색 워소는 X의 둘째 줄과 Y의 첫전빼 열을 곱하여 계산하다보니 X1,1 항이 계산하는데
사용되지 않았습니다.
예제 : 행렬 곱 연산
▪ 그래서 지역 그라디언트 슬라이스/일부의 한 값이 0이 되요.
예제 : 행렬 곱 연산
▪ 지역 그라디언트 슬라이스의 둘째 열의 나머지 모든 원소들도 동일하게 반복되어 0이 되어버립니다. 설명이 정말 많긴 했지만
지역 그라디언트의 일부 dy/dx1,1를 계산해 냈어요. 이 지역 그라디언트 슬라이스는 출력 y를 구하는데 x1,1가 얼마만큼 영향을
주었는지를 나타내는 행렬이 되었습니다.
▪ 다운스트림 그라디언트 계산이 가능한데, 다운 스트림 그라디언트의 파란색 원소는 지역 그라디언트 슬라이스와 업스트림 그
라디언트를 내적해서 구할수 있어요. 그리고 이 값이 입력의 한 원소 x1,1가 비용 계산에 미치는 영향 정도가 되겠습니다.
예제 : 행렬 곱 연산
▪ 이 로컬 그라디언트 일부가 업스트림 그라디언트와 내적을 하게되는걸 보실수가 있는데, 로컬 그라디언트 슬라이스가 가중치
행렬의 한 행만 복사를 해오다보니 나머지는 0이 됩니다. 그래서 다운스트림 그라디언트는 가중치 행렬 W의 첫번쨰 행과 업스트
림 그라디언트 dL/dy 첫째 행의 내적으로 계산이 됩니다.
▪ 이런 식으로 로컬 그라디언트 슬라이스를 계산할수 있지만 이 과정은 잊어버려되고, 가중치 행렬의 첫째 행과 업스트림 그라디
언트의 첫째행이 사용된다는 것만 알면 됩니다.
예제 : 행렬 곱 연산
▪ 이제 이런 방식으로 입력의 다른 원소(위의 그림은 x2,3)가 주어질떄의 경우도 구할수가 있어요. 하지만 한 원소를 계산할때마
다 그 원소에 대한 로컬 그라디언트를 계산해내야 해요.
예제 : 행렬 곱 연산
▪ 입력 X의 오른쪽 바닥에 있는 원소인 x2,3의 로컬 그라디언트를 구한다면, 이전에 본것과 똑같은 식으로 가중치 행렬의 한 행을
가져오고 나머지는 0으로 채우면 되고, 이 로컬 그라디언트 슬라이스와 업스트림그라디이언트를 내적 해서 다운스트림 그라디언
트의 원소를 구할 수 있겠습니다.
예제 : 행렬 곱 연산
▪ 다운스트림 그라디언트들의 다른 원소들은 가중치 행렬의 한 행과 업스트림 그라디언트의 한 행을 내적해서 연산할수 있으며,
직접 손으로 풀어 적기에는 인덱싱 표현이 다소 복잡할 수 있지만, 이것을 위와 같이 일반화 시켜서 정리 할수 있을 것 같아요.
▪ 여기서 알수 있는 점은 업스트림 그라디언트와 로컬 그라디언트 슬라이스 전체를 만들 필요 없이, 그저 가중치 행렬의 행과 업
스트린 그라디언트의 행들을 곱하기만 한다면 되는 것이에요.
예제 : 행렬 곱 연산
▪ 이 계산을 한번에 정리한다면 업스트림 그라디언트 dL/dy와 가중치 행렬 W의 전치 행렬을 행렬 곱하여 구할수 있겠습니다.
▪ 어떤 사람들은 여기서 자코비안 행렬을 만드는지 아닌지 햇갈릴수도 있긴한데, 이 식에서는 업스트림 그라디언트와 가중치 행
렬을 곱함으로서 묵시적으로 (매우 고차원의 희소 자코비안 행렬과 업스트림 그라디언트의) 행렬 곱 연산을 했다고 볼수 있겠습
니다.
예제 : 행렬 곱 연산
▪ 하지만 그럼에도 행렬 곱 연산으로 보이는 것은 이건 실제로 자코비안을 (명시적으로) 만드는걸 간단하게 정리한 것이라고 할
수 있을것 같아요. 이 형태로 우리가 배운 내용들이 동작하며, 이 두항을 곱하여 다운 스트림 그라디언트 dL/dx를 구하는데 업스
트림 그라디언트 w를 사용해야 하고, 또 곱 연산은 역방향으로 그라디언트 스와퍼(그라디언트를 뒤바꾸는, mul 게이트에서 역전
파시 다른 입력의 값을 사용)이다 보니 입력한 값(x)이 아닌 다른 입력값 y을 사용해야 합니다.
예제 : 행렬 곱 연산
▪ 그래서 우리는 업스트림 그라디언트도 사용하고, 가중치 w을 곱함으로서 X와 같은 형태의 결과물을 얻었습니다.
▪ 행렬곱 연산 시 이렇게 행렬 형태를 맞추는걸 꼭 기억해야 하고, 그러면 다른 입력들이 들어오더라도 잘 동작하게 됩니다.
예제 : 행렬 곱 연산
▪ 이제 dL/dw를 계산해본다면, 업스트림 그라디언트와 다른 입력 x를 사용하면 되고, 이 둘을 곱하여 y와 똑같은 형태의 다운스
트림 그라디언트를 얻을수가 있습니다. 역전파에서 어떻게 그라디언트들이 계산되는지 정말 보기 쉽죠.
예제 : 행렬 곱 연산
▪ 역전파를 다른 관점에서보자면, f1, f2, f3, f4 같이 아주 긴 체인 함수가 있다고 해봅시다. 그리고 이 함수를 통해 스칼라 값인 비
용 L을 만들었어요.
다른 관점에서 보는 역전파
▪ 다변수 체인 룰에 따라 그라디언트에 대한 식으로 정리 할수 있는데, dL/dx0는 위와 같이 자코비안 행렬들의 곱이 될거에요. 중
간에 있는 것들은 자코비안 행렬들이고 맨 오른쪽에 있는건 그라디언트 벡터가 되겠죠.
▪ dL/dx0는 모든 행렬과 벡터를 곱하여 결합한것이며, 우리는 계산할 자코비안 행렬들을 선택하고, 최종 비용 벡터를 포함하여
그룹을 만들어서 곱셈 연산을 할수 있어요. 위는 입력을 x0하나만 받아 순방향으로 가나, 입력 x0가 x0,0/x0,1/.../x0,n같이 벡터인
경우, dL/dx0,4를 계산하려면 역전파 과정에 체인 룰에 따라 구성하는 행렬 그룹을 만들어서 곱연산을 하면된다는 예긴것같아요.
다른 관점에서 보는 역전파
행렬 곱셈은 결합된다:필요한 다운스트림 그라디언트를 구할수 있도록 연관된 행렬들을 구성하여 곱하면 됩니다.
▪ 그래서 역전파 과정에서는 우리가 오른쪽에서 왼쪽으로 곱셈을 할 행렬들을 모아 그룹으로 만들어 계산함으로서, 필요없는 곱
연산을 줄일 수 있어 더 효율적으로 결과를 얻을 수가 있겠습니다.
역방향 자동 미분 계산 Reverse Mode Automatic Differentiation
행렬 곱셈은 결합된다:필요한 다운스트림 그라디언트를 구할수 있도록 연관된 행렬들을 구성하여 곱하면 됩니다.
우측에서 좌측방향 곱연산을 하여 행렬과 행렬의 연산 대신, 행렬 대 벡터 연산만 수행하게 됩니다.
▪ 하지만 이 전체 과정은 오른쪽 끝에 있는 값에 달려있죠. 이건 정말 좋은 알고리즘이기는 하지만 이게 동작하려면 항상 최종 스
칼라 비용을 계산해야 해요. 그리고 최종 비용에 대한 모든 원소들의 미분치 계산만 가능 합니다. 하지만 여러분들이 스칼라 입력
의 기울기를 계산하고, 스칼라 입력에 대한 전체 그래프 요소들의 기울기를 알고 싶은 경우도 있을 거에요.
역방향 자동 미분 계산 Reverse Mode Automatic Differentiation
행렬 곱셈은 결합된다:필요한 다운스트림 그라디언트를 구할수 있도록 연관된 행렬들을 구성하여 곱하면 됩니다.
우측에서 좌측방향 곱연산을 하여 행렬과 행렬의 연산 대신, 행렬 대 벡터 연산만 수행하게 됩니다.
스칼라 입력 w이
주어질때 출력 벡터
의 기울기를 알고싶
으면 어떻게 할까?
모든 입력 벡터에 대한 스칼라 출력
w의 기울기를 계산한다.
역방향 자동 미분 계산 Reverse Mode Automatic Differentiation
▪ 이 역전파 알고리즘은 약간 다른 버전으로 오른쪽에서 왼쪽 방향으로 자코비안 행렬을 곱해나다보니 자동 미분의 역방향 모드
라고 부르기도 해요. 여기서 역방향 모드라고 하다보니 순방향 모드 자동 미분도 있습니다.
행렬 곱셈은 결합된다:필요한 다운스트림 그라디언트를 구할수 있도록 연관된 행렬들을 구성하여 곱하면 됩니다.
우측에서 좌측방향 곱연산을 하여 행렬과 행렬의 연산 대신, 행렬 대 벡터 연산만 수행하게 됩니다.
스칼라 입력 w이
주어질때 출력 벡터
의 기울기를 알고싶
으면 어떻게 할까?
모든 입력 벡터에 대한 스칼라 출력
w의 기울기를 계산한다.
▪이 방법은 약간 다른데, 우리가 스칼라 입력 값을 가지고 있고, 이 입력 값에 대한 모든 요소들의 기울기, 미분들을 계산하고 싶
다고 하면, 벡터와 자코비안 관점에서 보면서 곱해나갈수 있겠습니다.
순방향 자동 미분 계산 Forward Mode Automatic Differentiation
▪ 좌측에서 우측으로의 곱셈을 해 나간다면 이런식으로 될거에요. 그러면 아마 여러분들은 왜 이것을 하고, 머신 러닝 시스템이
맨 끝이 비용을 계산해야하고, 경사를 내려가겠다고 비용에 대한 그라디언트를을 계산하는지 왜하냐 싶겠어도. 믿긴 힘들겠지만
머신 러닝하는데 더 많은 방법들이 있어요.
순방향 자동 미분 계산 Forward Mode Automatic Differentiation
▪ 비용 함수를 최소화 시키지 않는 경우에도 그라디언트를 자동적으로 계산하는 시스템이 있다면 좋겠죠. 물리 시스템의 예를 들
어볼게요.
▪ 여기선 스칼라 값을 입력으로 받는다고 할게요. 그리고 이걸 중력이나 마찰력같은거라고 합시다. 그리고 이 입력으로 중력, 마
찰력 같은걸 바꿔간다고 할때 시스템의 출력이 얼마나 변하는지 알고싶다고 해요. 이게 자동 미분 automatic differentiation의 개
념이며 머신 러닝 시스템을 너머 많은 분야에서 유용하게 쓰이고 있습니다.
순방향 자동 미분 계산 Forward Mode Automatic Differentiation
▪ 이건 어느 종류의 미분치, 기울기를 계산할때 유용해요, 하지만 아쉬운 점은 순방향 자동 미분은 파이토치나 텐서플로우, 다른
프레임워크에서에 구현되어 있지 않습니다.
▪ 이게 정말 좋지만 사용하기가 쉽지 않아 구현하지 않았습니다. 그래서 이 이슈가 깃헙에 다뤄 졌고 공개 되기는 했지만 아직 머
지 되지는 않았어요.
순방향 자동 미분 계산 Forward Mode Automatic Differentiation
▪ 그리고 또 대수적인 방법으로 두 역전파 연산자를 사용해서 전방향 그라디언트를 계산할 수 있는 방법도 있는데,저 링크에 들
어가 보시면 딥러닝 프레임워크에서 전방향 그라디언트가 어떻게 계산되는지 보실수 있을 거에요.
순방향 자동 미분 계산 Forward Mode Automatic Differentiation
▪ 역전파 관점에서 사용할수 있는 정말 유용한 방법은 벡터, 텐서, 자코비안을 곱하긴 할건데, 역전파 알고리즘을 그라디언트(1차
미분)만을 계산할 뿐만 아니라 더 고차 미분 higher order derivatives을 계산하는데 사용할 수있지 않을까요?
▪ 예를 들면 여기처럼 계산 그래프가 있다고 합시다. 입력 x가 있는데, f1을 지나면 크기가 d1인 중간 벡터로 이게 f2를 지나 스칼
라 비용을 얻게 된다고 합시다.
역전파에서 더 높은 차수로 미분하기 backprop: higher-order derivatives
헤시안 행렬
2차 미분 행렬
▪ 지금까지 우리는 1차 미분, 그라디언트와 자코비안 그리고 일반 도함수,미분값에 대해서 얘기했지만 x0에 대한 비용의 2차 미
분인 경우를 보면 이것도 행렬인데, 이 행렬은 2차 미분이다 보니 x0가 변할때 x1이 얼마나 변하고, x1이 변하면서 비용이 얼마
나 변하는지를 알려줍니다.
▪ 다시 얘기하면 x1의 한 원소를 변화시킨다고 할때, 그라디언트가 얼마나 빠르게 바뀌는지를 나타내는게 해시안 행렬 이라고 할
수 있을거에요.
역전파에서 더 높은 차수로 미분하기 backprop: higher-order derivatives
헤시안 행렬
2차 미분 행렬
▪ 햇갈릴수 있으니 조심합시다. 해시안 행렬은 2차 미분이고, 자코비안은 1차 미분이에요. 그리고 자코비안 행렬에는 벡터가 들어
가서 벡터가 나오지만, 헤시안 행렬의 경우 벡터가 들어가서 스칼라 값이 나오게 됩니다.
역전파에서 더 높은 차수로 미분하기 backprop: higher-order derivatives
헤시안 행렬
2차 미분 행렬
▪ 이제 대강 봤으니 계산 그래프에서 해시안 행렬을 이용하여 원소들을 계산한다고 합시다. 예를들어 헤시안과 벡터가 곱해진다
면, 우리가 헤시안 행렬과 벡터를 가지고 있어 이를 곱할수가 있는데, 이걸 하는 이유는 예를들면 이런 행렬 곱으로 행렬의 특이
값을 근사하여 구하는 반복 알고리즘이 있다고 합시다.
▪ 그리고 여러분들이 최적화 관점에서 특이값에 대한 2차적인 정보를 계산한다고 하면, 헤시안 행렬과 벡터를 곱하여 근사화된
특이값을 얻을수가 있습니다.
역전파에서 더 높은 차수로 미분하기 backprop: higher-order derivatives
역전파에서 더 높은 차수로 미분하기 backprop: higher-order derivatives
▪ 여기서 유용한 대수적인 변환 방법을 사용할수가 있는데, 미분도 선형적이고, 그라디언트도 선형적이다 보니, 선형 함수로 2차
미분을 이런 행렬과 벡터의 곱 형태로 고칠수가 있어요. 2차 미분을 그라디언트와 벡터를 내적 한 후 이를 미분하는 형태루요.
저는 이게 잘 동작할거라 생각하는데, 당연히 여기서 말하는 벡터는 상수고, x0에 의존하지는 않습니다.
▪ 이제 계산 그래프에서 좀더 좋은 방법을 해볼건데, 우리가 썻던 계산그래프에 역전파 함수를 추가하여 볼건데, 해보려는건 비용
을 계산한 후에 x1에 대한 비용의 기울기(dL/dx1)를 계산하는 함수 f'2와 비용의 x0에 대한 기울기(dL/dx0)를 계산하는 함수 f'1을
사용할수가 있어요.
▪ 이 과정에서 역방향 함수 f'n은 fn게이트를 역방향으로 통과 시켜서 구현한건데, f'n들을 내적하도록 구현 할 수 있고, 이걸 다
른 노드라고 하고 나아가면 최종 출력은 그라디언트 dL/dx0와 벡터 v의 내적이 되며, 여기서 v는 우리가 고른걸 사용하면 됩니다.
역전파에서 더 높은 차수로 미분하기 backprop: higher-order derivatives
▪ 이제 x0에 대한 미분을 계산하려면 역전파를 하면 되겠는데, 역전파 경로의 모든 연산들이 미분 가능 연산자인다 보니, 더 고
차 그라디언트얻을 수 있어요. 그래서 역전파로 2차 미분을 계산 할수 있고, 더 고차 미분들도 가능 합니다.
역전파에서 더 높은 차수로 미분하기 backprop: higher-order derivatives
▪ 아무튼 단순 역전파 알고리즘으로 고차 미분을 계산하도록 연산 과정을 늘릴수가 있겠습니다. 그리고 전방향 자동 미분과는 다
르게, 텐서 플로나 파이토치 같은 딥러닝 프레임워크들에도 구현되어 있어 이걸 좀 만져보거나 그라디언트를 포함하여 비용함수
에 대해 뭔가 써볼수도 있겠죠.
역전파에서 더 높은 차수로 미분하기 backprop: higher-order derivatives
▪ 오늘 본 내용들을 정리하자면, 계산 그래프를 사용한 복잡한 함수를 보았고, 추상화를 통해 좀더 보기 좋게 만들었습니다. 그리
고 이게 순방향으로 가고 돌아오면서 그라디언트를 계산했어요. 순방향은 값들을 계산하는 과정이었고, 역전파는 그라디언트를
계산하는 과정이었습니다.
▪ 그리고 우리가 알아야하는건 그래프 전체가 아닌 일부 노드가 어떻게 되어있는지이며, 노드가 출력을 계산하고, 로컬 그라디언
트와 업스트림그라디언트를 곱하여 다운스트림 그라디언트를 계산했었죠.
정리하기
▪ 그리고 이 강의에서 우리가 선형 분류기와 신경망도 보고, 어떻게 그라디언트를 계산하는지도 봤습니다. 하지만 문제는 신경망
이 입력 이미지릐 픽셀들을 연산하는 과정과 입력 이미지를 벡터로 쳐내는 것인데, 이러면 이미지의 공간적인 정보가 사라지겠죠.
공간적인 정보가 사라진다면 좋지 않을겁니다. 그래서 다음 강의에 이를 고치기위한 방법인 합성곱 신경망에 대해서 이야기 해봅
시다.
정리하기
감사합니다

More Related Content

What's hot

홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018devCAT Studio, NEXON
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)Heungsub Lee
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기Yongha Kim
 
소프트웨어 부트캠프 설계 및 운영사례(42Seoul)
소프트웨어 부트캠프 설계 및 운영사례(42Seoul)소프트웨어 부트캠프 설계 및 운영사례(42Seoul)
소프트웨어 부트캠프 설계 및 운영사례(42Seoul)수보 김
 
[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희changehee lee
 
Game Physics Engine Development (게임 물리 엔진 개발)
Game Physics Engine Development (게임 물리 엔진 개발)Game Physics Engine Development (게임 물리 엔진 개발)
Game Physics Engine Development (게임 물리 엔진 개발)Bongseok Cho
 
NDC 2017 키노트: 이은석 - 다가오는 4차 산업혁명 시대의 게임개발
NDC 2017 키노트: 이은석 - 다가오는 4차 산업혁명 시대의 게임개발NDC 2017 키노트: 이은석 - 다가오는 4차 산업혁명 시대의 게임개발
NDC 2017 키노트: 이은석 - 다가오는 4차 산업혁명 시대의 게임개발Eunseok Yi
 
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법강 민우
 
5강 알파와알파소팅
5강 알파와알파소팅5강 알파와알파소팅
5강 알파와알파소팅JP Jung
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직Hoyoung Choi
 
신입 SW 개발자 취업 준비
신입 SW 개발자 취업 준비신입 SW 개발자 취업 준비
신입 SW 개발자 취업 준비인서 박
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012devCAT Studio, NEXON
 
스타트업처럼 토이프로젝트하기
스타트업처럼 토이프로젝트하기스타트업처럼 토이프로젝트하기
스타트업처럼 토이프로젝트하기Sunyoung Shin
 
빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자KyeongWon Koo
 
충돌 알고리즘(collision detection algorithms)
충돌 알고리즘(collision detection algorithms)충돌 알고리즘(collision detection algorithms)
충돌 알고리즘(collision detection algorithms)ssuserbe87d6
 
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019devCAT Studio, NEXON
 
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템Chaeone Son
 
Conditional Image Generation with PixelCNN Decoders
Conditional Image Generation with PixelCNN DecodersConditional Image Generation with PixelCNN Decoders
Conditional Image Generation with PixelCNN Decoderssuga93
 

What's hot (20)

홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기
 
소프트웨어 부트캠프 설계 및 운영사례(42Seoul)
소프트웨어 부트캠프 설계 및 운영사례(42Seoul)소프트웨어 부트캠프 설계 및 운영사례(42Seoul)
소프트웨어 부트캠프 설계 및 운영사례(42Seoul)
 
[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희
 
Game Physics Engine Development (게임 물리 엔진 개발)
Game Physics Engine Development (게임 물리 엔진 개발)Game Physics Engine Development (게임 물리 엔진 개발)
Game Physics Engine Development (게임 물리 엔진 개발)
 
NDC 2017 키노트: 이은석 - 다가오는 4차 산업혁명 시대의 게임개발
NDC 2017 키노트: 이은석 - 다가오는 4차 산업혁명 시대의 게임개발NDC 2017 키노트: 이은석 - 다가오는 4차 산업혁명 시대의 게임개발
NDC 2017 키노트: 이은석 - 다가오는 4차 산업혁명 시대의 게임개발
 
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
 
5강 알파와알파소팅
5강 알파와알파소팅5강 알파와알파소팅
5강 알파와알파소팅
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직
 
신입 SW 개발자 취업 준비
신입 SW 개발자 취업 준비신입 SW 개발자 취업 준비
신입 SW 개발자 취업 준비
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
 
스타트업처럼 토이프로젝트하기
스타트업처럼 토이프로젝트하기스타트업처럼 토이프로젝트하기
스타트업처럼 토이프로젝트하기
 
빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자
 
충돌 알고리즘(collision detection algorithms)
충돌 알고리즘(collision detection algorithms)충돌 알고리즘(collision detection algorithms)
충돌 알고리즘(collision detection algorithms)
 
Cnn 강의
Cnn 강의Cnn 강의
Cnn 강의
 
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
 
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템
 
Bump Mapping
Bump MappingBump Mapping
Bump Mapping
 
Conditional Image Generation with PixelCNN Decoders
Conditional Image Generation with PixelCNN DecodersConditional Image Generation with PixelCNN Decoders
Conditional Image Generation with PixelCNN Decoders
 

Similar to [컴퓨터비전과 인공지능] 6. 역전파 2

[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수jdo
 
자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기라한사 아
 
Deep Learning from scratch 5장 : backpropagation
 Deep Learning from scratch 5장 : backpropagation Deep Learning from scratch 5장 : backpropagation
Deep Learning from scratch 5장 : backpropagationJinSooKim80
 
Coursera Machine Learning (by Andrew Ng)_강의정리
Coursera Machine Learning (by Andrew Ng)_강의정리Coursera Machine Learning (by Andrew Ng)_강의정리
Coursera Machine Learning (by Andrew Ng)_강의정리SANG WON PARK
 
Python_numpy_pandas_matplotlib 이해하기_20160815
Python_numpy_pandas_matplotlib 이해하기_20160815Python_numpy_pandas_matplotlib 이해하기_20160815
Python_numpy_pandas_matplotlib 이해하기_20160815Yong Joon Moon
 
Ch11.특수기저
Ch11.특수기저Ch11.특수기저
Ch11.특수기저진성 김
 
3D Graphics Transform
3D Graphics Transform3D Graphics Transform
3D Graphics Transform문익 장
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexityskku_npc
 
텐서플로우 기초 이해하기
텐서플로우 기초 이해하기 텐서플로우 기초 이해하기
텐서플로우 기초 이해하기 Yong Joon Moon
 
제어-물리적시스템의 수학적모델링
제어-물리적시스템의 수학적모델링제어-물리적시스템의 수학적모델링
제어-물리적시스템의 수학적모델링jdo
 
람다, 스트림 Api
람다, 스트림 Api람다, 스트림 Api
람다, 스트림 ApiChi Hwan Choi
 
병렬 프로그래밍2
병렬 프로그래밍2병렬 프로그래밍2
병렬 프로그래밍2준혁 이
 
Howto_Tensorflow+Linear Regression
Howto_Tensorflow+Linear RegressionHowto_Tensorflow+Linear Regression
Howto_Tensorflow+Linear RegressionHyo jeong Lee
 
Start IoT with JavaScript - 4.객체1
Start IoT with JavaScript - 4.객체1Start IoT with JavaScript - 4.객체1
Start IoT with JavaScript - 4.객체1Park Jonggun
 
개발자를 위한 공감세미나 tensor-flow
개발자를 위한 공감세미나 tensor-flow개발자를 위한 공감세미나 tensor-flow
개발자를 위한 공감세미나 tensor-flow양 한빛
 
R 기초 : R Basics
R 기초 : R BasicsR 기초 : R Basics
R 기초 : R BasicsYoonwhan Lee
 
Move semantics
Move semanticsMove semantics
Move semanticsQooJuice
 

Similar to [컴퓨터비전과 인공지능] 6. 역전파 2 (20)

[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수
 
자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기
 
Deep Learning from scratch 5장 : backpropagation
 Deep Learning from scratch 5장 : backpropagation Deep Learning from scratch 5장 : backpropagation
Deep Learning from scratch 5장 : backpropagation
 
Coursera Machine Learning (by Andrew Ng)_강의정리
Coursera Machine Learning (by Andrew Ng)_강의정리Coursera Machine Learning (by Andrew Ng)_강의정리
Coursera Machine Learning (by Andrew Ng)_강의정리
 
Python_numpy_pandas_matplotlib 이해하기_20160815
Python_numpy_pandas_matplotlib 이해하기_20160815Python_numpy_pandas_matplotlib 이해하기_20160815
Python_numpy_pandas_matplotlib 이해하기_20160815
 
Ch11.특수기저
Ch11.특수기저Ch11.특수기저
Ch11.특수기저
 
3D Graphics Transform
3D Graphics Transform3D Graphics Transform
3D Graphics Transform
 
점, 선, 면
점, 선, 면점, 선, 면
점, 선, 면
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexity
 
텐서플로우 기초 이해하기
텐서플로우 기초 이해하기 텐서플로우 기초 이해하기
텐서플로우 기초 이해하기
 
제어-물리적시스템의 수학적모델링
제어-물리적시스템의 수학적모델링제어-물리적시스템의 수학적모델링
제어-물리적시스템의 수학적모델링
 
07. PCA
07. PCA07. PCA
07. PCA
 
Haskell study 9
Haskell study 9Haskell study 9
Haskell study 9
 
람다, 스트림 Api
람다, 스트림 Api람다, 스트림 Api
람다, 스트림 Api
 
병렬 프로그래밍2
병렬 프로그래밍2병렬 프로그래밍2
병렬 프로그래밍2
 
Howto_Tensorflow+Linear Regression
Howto_Tensorflow+Linear RegressionHowto_Tensorflow+Linear Regression
Howto_Tensorflow+Linear Regression
 
Start IoT with JavaScript - 4.객체1
Start IoT with JavaScript - 4.객체1Start IoT with JavaScript - 4.객체1
Start IoT with JavaScript - 4.객체1
 
개발자를 위한 공감세미나 tensor-flow
개발자를 위한 공감세미나 tensor-flow개발자를 위한 공감세미나 tensor-flow
개발자를 위한 공감세미나 tensor-flow
 
R 기초 : R Basics
R 기초 : R BasicsR 기초 : R Basics
R 기초 : R Basics
 
Move semantics
Move semanticsMove semantics
Move semantics
 

More from jdo

[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 2. 데이터 전처리
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 2. 데이터 전처리[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 2. 데이터 전처리
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 2. 데이터 전처리jdo
 
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 5 - Others
 [컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 5 - Others [컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 5 - Others
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 5 - Othersjdo
 
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 4 - ResNet
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 4 - ResNet[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 4 - ResNet
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 4 - ResNetjdo
 
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 3 - GoogLeNet
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 3 - GoogLeNet[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 3 - GoogLeNet
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 3 - GoogLeNetjdo
 
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 2 - ZFNet, VGG-16
 [컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 2 - ZFNet, VGG-16 [컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 2 - ZFNet, VGG-16
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 2 - ZFNet, VGG-16jdo
 
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 1 - 알렉스넷
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 1 - 알렉스넷[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 1 - 알렉스넷
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 1 - 알렉스넷jdo
 
[컴퓨터비전과 인공지능] 5. 신경망 2 - 신경망 근사화와 컨벡스 함수
[컴퓨터비전과 인공지능] 5. 신경망 2 - 신경망 근사화와 컨벡스 함수[컴퓨터비전과 인공지능] 5. 신경망 2 - 신경망 근사화와 컨벡스 함수
[컴퓨터비전과 인공지능] 5. 신경망 2 - 신경망 근사화와 컨벡스 함수jdo
 
[리트코드 문제 풀기] 연결 리스트
[리트코드 문제 풀기] 연결 리스트[리트코드 문제 풀기] 연결 리스트
[리트코드 문제 풀기] 연결 리스트jdo
 
[리트코드 문제 풀기] 배열
[리트코드 문제 풀기] 배열[리트코드 문제 풀기] 배열
[리트코드 문제 풀기] 배열jdo
 
[컴퓨터비전과 인공지능] 4. 최적화
[컴퓨터비전과 인공지능] 4. 최적화[컴퓨터비전과 인공지능] 4. 최적화
[컴퓨터비전과 인공지능] 4. 최적화jdo
 
[컴퓨터비전과 인공지능] 3. 선형 분류기 : 손실 함수와 규제
[컴퓨터비전과 인공지능] 3. 선형 분류기 : 손실 함수와 규제[컴퓨터비전과 인공지능] 3. 선형 분류기 : 손실 함수와 규제
[컴퓨터비전과 인공지능] 3. 선형 분류기 : 손실 함수와 규제jdo
 
[컴퓨터비전과 인공지능] 3. 선형 분류 : 선형 분류기 일부
[컴퓨터비전과 인공지능] 3. 선형 분류 : 선형 분류기 일부[컴퓨터비전과 인공지능] 3. 선형 분류 : 선형 분류기 일부
[컴퓨터비전과 인공지능] 3. 선형 분류 : 선형 분류기 일부jdo
 
Titanic kaggle competition
Titanic kaggle competitionTitanic kaggle competition
Titanic kaggle competitionjdo
 
1 2. 직선과 평면에서의 벡터 방정식
1 2. 직선과 평면에서의 벡터 방정식1 2. 직선과 평면에서의 벡터 방정식
1 2. 직선과 평면에서의 벡터 방정식jdo
 
1-1. 공학과 수학에서 벡터/ 내적 직교
1-1. 공학과 수학에서 벡터/ 내적 직교1-1. 공학과 수학에서 벡터/ 내적 직교
1-1. 공학과 수학에서 벡터/ 내적 직교jdo
 
소형 무인 비행체 5장-선형 모델 설계
 소형 무인 비행체 5장-선형 모델 설계 소형 무인 비행체 5장-선형 모델 설계
소형 무인 비행체 5장-선형 모델 설계jdo
 
소형 무인 비행체 4장-힘과 모멘트
소형 무인 비행체 4장-힘과 모멘트소형 무인 비행체 4장-힘과 모멘트
소형 무인 비행체 4장-힘과 모멘트jdo
 
소형 무인 비행체 3장-기구학과 동역학
소형 무인 비행체 3장-기구학과 동역학소형 무인 비행체 3장-기구학과 동역학
소형 무인 비행체 3장-기구학과 동역학jdo
 
소형 무인 비행체 2장-좌표계
소형 무인 비행체 2장-좌표계소형 무인 비행체 2장-좌표계
소형 무인 비행체 2장-좌표계jdo
 
소형 무인 비행기 1장-소개
소형 무인 비행기 1장-소개소형 무인 비행기 1장-소개
소형 무인 비행기 1장-소개jdo
 

More from jdo (20)

[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 2. 데이터 전처리
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 2. 데이터 전처리[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 2. 데이터 전처리
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 2. 데이터 전처리
 
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 5 - Others
 [컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 5 - Others [컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 5 - Others
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 5 - Others
 
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 4 - ResNet
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 4 - ResNet[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 4 - ResNet
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 4 - ResNet
 
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 3 - GoogLeNet
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 3 - GoogLeNet[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 3 - GoogLeNet
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 3 - GoogLeNet
 
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 2 - ZFNet, VGG-16
 [컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 2 - ZFNet, VGG-16 [컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 2 - ZFNet, VGG-16
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 2 - ZFNet, VGG-16
 
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 1 - 알렉스넷
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 1 - 알렉스넷[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 1 - 알렉스넷
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 1 - 알렉스넷
 
[컴퓨터비전과 인공지능] 5. 신경망 2 - 신경망 근사화와 컨벡스 함수
[컴퓨터비전과 인공지능] 5. 신경망 2 - 신경망 근사화와 컨벡스 함수[컴퓨터비전과 인공지능] 5. 신경망 2 - 신경망 근사화와 컨벡스 함수
[컴퓨터비전과 인공지능] 5. 신경망 2 - 신경망 근사화와 컨벡스 함수
 
[리트코드 문제 풀기] 연결 리스트
[리트코드 문제 풀기] 연결 리스트[리트코드 문제 풀기] 연결 리스트
[리트코드 문제 풀기] 연결 리스트
 
[리트코드 문제 풀기] 배열
[리트코드 문제 풀기] 배열[리트코드 문제 풀기] 배열
[리트코드 문제 풀기] 배열
 
[컴퓨터비전과 인공지능] 4. 최적화
[컴퓨터비전과 인공지능] 4. 최적화[컴퓨터비전과 인공지능] 4. 최적화
[컴퓨터비전과 인공지능] 4. 최적화
 
[컴퓨터비전과 인공지능] 3. 선형 분류기 : 손실 함수와 규제
[컴퓨터비전과 인공지능] 3. 선형 분류기 : 손실 함수와 규제[컴퓨터비전과 인공지능] 3. 선형 분류기 : 손실 함수와 규제
[컴퓨터비전과 인공지능] 3. 선형 분류기 : 손실 함수와 규제
 
[컴퓨터비전과 인공지능] 3. 선형 분류 : 선형 분류기 일부
[컴퓨터비전과 인공지능] 3. 선형 분류 : 선형 분류기 일부[컴퓨터비전과 인공지능] 3. 선형 분류 : 선형 분류기 일부
[컴퓨터비전과 인공지능] 3. 선형 분류 : 선형 분류기 일부
 
Titanic kaggle competition
Titanic kaggle competitionTitanic kaggle competition
Titanic kaggle competition
 
1 2. 직선과 평면에서의 벡터 방정식
1 2. 직선과 평면에서의 벡터 방정식1 2. 직선과 평면에서의 벡터 방정식
1 2. 직선과 평면에서의 벡터 방정식
 
1-1. 공학과 수학에서 벡터/ 내적 직교
1-1. 공학과 수학에서 벡터/ 내적 직교1-1. 공학과 수학에서 벡터/ 내적 직교
1-1. 공학과 수학에서 벡터/ 내적 직교
 
소형 무인 비행체 5장-선형 모델 설계
 소형 무인 비행체 5장-선형 모델 설계 소형 무인 비행체 5장-선형 모델 설계
소형 무인 비행체 5장-선형 모델 설계
 
소형 무인 비행체 4장-힘과 모멘트
소형 무인 비행체 4장-힘과 모멘트소형 무인 비행체 4장-힘과 모멘트
소형 무인 비행체 4장-힘과 모멘트
 
소형 무인 비행체 3장-기구학과 동역학
소형 무인 비행체 3장-기구학과 동역학소형 무인 비행체 3장-기구학과 동역학
소형 무인 비행체 3장-기구학과 동역학
 
소형 무인 비행체 2장-좌표계
소형 무인 비행체 2장-좌표계소형 무인 비행체 2장-좌표계
소형 무인 비행체 2장-좌표계
 
소형 무인 비행기 1장-소개
소형 무인 비행기 1장-소개소형 무인 비행기 1장-소개
소형 무인 비행기 1장-소개
 

[컴퓨터비전과 인공지능] 6. 역전파 2

  • 1. 컴퓨터 비전을 위한 역전파2 Backpropagation2 도정찬 Michigan Online, Justin Johnson, Computer Vision, 2021. 02. 01
  • 2. 역전파 구현하기: 간단한 그라디언트 코드: 순방향: 출력 계산하기 ▪ 음 이제 구현하는 코드를 한번 보겠습니다. 여러분들이 과제하는데도 필요하고, 두 가지 방향 순방향과 어떻게 역방향으로 고쳐 나갈까 생각하면서 보면 좋을것같아요. 먼저 이걸 그냥 간단한 역전파 구현 코드라고 부르겠습니다. 요기 보시면 파이썬 함수로 전체 계산 그래프를 계산하는 함수가 있는데, 이 함수는 선형 분류기 처럼 동작하겠죠. ▪ 입력에서는 미니 배치 데이터와 가중치들을 받아 미니 배치 데이터들에 대한 비용을 계산합니다. 미니 배치 데이터는 신경망 학습 데이터가 크다보니 일정 크기로 나눈 일부라고 생각하면 되요. 신경망 모델 훈련때 자주 보니 이정도만 알고 넘어갑시다.
  • 3. ▪ 아마 숙제 한 사람들이라면 익숙해 보일거에요. 이제 비용도 계산하고, 그리고 비용에 대한 각 가중치의 미분을 계산하는 하나 의 함수로서 봅시다. 이정도는 여러분들도 미분 계산하는걸 직접 손으로 풀수도 있긴하지만 너무 힘드니 그런 방식으로 기울기를 gradient check 확인 하지 말고 역전파 코드를 구현해서 쉽고 간단하게 할수 있습니다. 역전파 구현하기: 간단한 그라디언트 코드: 순방향: 출력 계산하기 역방향: 기울기 계산하기 gradient
  • 4. ▪ 이 조그만 계산 그래프를 봅시다. 이 왼쪽 그래프는 시그모이드 함수를 적용하는 예제인데, 시그모이드 함수 부분은 슬라이드 몇장 전에 봤엇죠. 이제 여기서 우린 두 가중치 행렬 w0, w1와 입력 x0, x1, 그리고 편향항인 w2를 받아 순방향으로 나아가는데 보면 곱셈연산도 하고, 덧셈 연산도 해서 마지막에 비용 L을 구하게 됩니다. 이제 역방향으로 봅시다. 역방향 코드는 순방향 코드 가 다 동작한 후에 진행되는데, 신기한 점은 순방향 코드의 역방향 버전처럼 보입니다. 역전파 구현하기: 간단한 그라디언트 코드: 순방향: 출력 계산하기 베이스 케이스
  • 5. ▪ 제가 여러분들에게 얘기하고 싶은건, 먼저 역방향 코드에선 출력의 자기 자신에 대한 기울기 베이스케이스를 계산해요 이 값은 1이니 베이스 케이스 코드 라인은 생략해도 되요. 하지만 저는 교육적으로 하고싶고 계산 그래프를 생각하면 넣는게 맞습니다. 역전파 구현하기: 간단한 그라디언트 코드: 순방향: 출력 계산하기 베이스 케이스
  • 6. ▪ 역전파 코드의 둘째 줄을 보면 시그모이드 함수를 역방향으로 지나가고 있죠. 여러분도 보시다시피 역전파에서 시그모이드 함 수 라인과 순전파의 마지막 줄이 매치되고 있어요. ▪ 제가 여기서 약간 얘기하고싶은건 순방향에서 시그모이드 함수는 입력을 3개 갖고 출력 L을 반환했지만, 역방향에서 매치되는 코드 라인을 보면 약간 역변환 시켜 구현되었습니다. 이 라인에서는 입력으로 grad_L과 L을 입력받아 grad_s3을 출력으로 하고 있죠. 이런식으로 순방향과 역방향 사이에 1:1 관계를 볼수 있으며 입력과 출력이 뒤바뀐 형태로 볼 수 있을거 같아요. 역전파 구현하기: 간단한 그라디언트 코드: 순방향: 출력 계산하기 시그모이드
  • 7. ▪ 다음 줄로 넘어가서 이번에는 순방향의 마지막 2번째 줄은 s2와 w2를 더하고 있다 보니 역방향의 경우 출력이 2개, 2개의 라인 으로 구현하였습니다. 이전에 덧셈 게이트가 그라디언트/기울기 분배기 처럼 동작한다고 했었죠. 그래서 이전의 그라디언트가 고 대로 각 라인의 입력으로 전달 됩니다. 역전파 구현하기: 간단한 그라디언트 코드: 순방향: 출력 계산하기 덧셈
  • 8. ▪ 순방향 끝에서 셋째 줄에도 똑같인 연산이 수행되요. 또 순방향으로 덧셈을 하다보니, 역방향으로는 기존 그라디언트를 그대로 보내주죠. 역전파 구현하기: 간단한 그라디언트 코드: 순방향: 출력 계산하기 덧셈
  • 9. ▪ 순방향 뒤에서 4번째 줄도 비슷하게 생기기는 하지만 여기는 곱셈 게이트다 보니 여기서 로컬 그라디언트를 구하였었죠. 역전파 구현하기: 간단한 그라디언트 코드: 순방향: 출력 계산하기 곱셈
  • 10. ▪ 마지막 출력 다운스트림 그라디언트는 전에 본대로 로컬 그라디언트와 업스트림그라디언트를 곱해서 구하면 되겠습니다. 지금 까지 우리가 역전파를 수학적인 지식 없이 구현할 수 있었습니다. 여기선 어떤 방정식을 정리할 필요도 없었죠, 대신 어떤게 전파 transfer되는지는 좀 생각해야 하지만요. ▪ 우린 이걸 코드로 구현했고, 4 입력들을 적절히 변환시켜 역전파하는대 사용할수 있었어요. 아무튼 이런식으로 아직 과제 하지 못한 사람들은 참고해서 하면 될것 같습니다. 이걸로 좀 그라디언트를 쉽게 계산하실수 있을거에요. 역전파 구현하기: 간단한 그라디언트 코드: 순방향: 출력 계산하기 곱셈
  • 11. ▪ (과제 내용은 패스하고) 실제 현장에서 역전파를 구현하는 방법은 이런 모듈화된 API를 사용합니다. 이걸로 우리가 봤던 대로 노드 주변의 지역적인 계산을 할수도 있을거에요. ▪ 여기 지금 보시는건 역전파를 모듈화해서 구현한걸 보여주고 있는데, 지금 계산 그래프 객체를 정의한게 있죠. 이 객체에서는 모든 노드에 대해서 토폴로지 순서대로 연산을 하면서 그래프의 모든 노드에서 순전파도하고, 역전파도 할수 있으나, 보시는 이 코드는 슈도 코드라고는 할수 있지만 실제 타이핑해서 동작하는 코드는 아닙니다. 역전파 구현하기 : 모듈화된 API 그래프(신경망) 객체 (러프하게 만든 슈도코드)
  • 12. ▪ 이게 실제 동작하는 코드 예시로 파이 토치에서 사용하는건데, 이 API처럼 torch.autograd.Function을 상속 받아서 우리들에게 필요한 함수를 정의할수 있을거에요. 한번 여러분들이 어러분들 만의 계산 그래프 노드를 정의한다면, 이 객체처럼 순방향과 역 방향에 대한 함수들을 볼수 있어요. 예시 : 파이토치 autograd 함수 역전파때 사용할 값들을 저장해야함 업스트림 그라디언트 업스트림과 지역 그라디언트의 곱셈
  • 13. ▪ 우선 순전파 함수를 보면 3개의 입력을 받고 있는데 여기서 x와 y는 입력 값으로 이 노드가 순방향으로 받는 값들이고, 이들은 토치 텐서라고 하는 데이터들입니다. 지금까지 우리가 스칼라값들만 쓰다보니 이 경우에는 토치 스칼라겠지요. ▪ 그리고 이 순전파 함수는 상황, 문맥에 대한 객체 context(ctx)도 받고 있는데, 이 객체에는 역전파 계산에 필요한 정보들을 저장 해놓는 객체라고 생각하면 될거같아요. 그리고 이제 내부를 보면 순전파 함수는 z = x * y을 해서 z를 반환하도록 간단하게 정의 되어 있는데 이 모든 연산들은 토치 텐서라고 하는 타입으로 동작하게 됩니다. 예시 : 파이토치 autograd 함수 역전파때 사용할 값들을 저장해야함 업스트림 그라디언트 업스트림과 지역 그라디언트의 곱셈
  • 14. ▪ 이번에는 역전파 함수를 봅시다. 이 함수는 순전파 때랑 똑같이 컨텍스트 객체를 매개변수로 받고, 미분들을 계산하는데 필요한 four pass? 정보들을 꺼내서 사용합니다.(순전파떄 ctx에 x와 y를 저장해두었으니 요기서 꺼낸다는 얘기로 보입니다.) ▪ 그래서 컨택스트로부터 x와 y를 꺼내고 업스트림 그라디언트인 grad_z를 받고, 로컬 그라디언트와 업스트림 그라디언트를 곱하 여 다운 스트림 그라디언트를 계산할수 있겠습니다. 이 경우는 입력이 2개다 보니 두 입력에 대한 다운스트림 그라디언트들을 간 단하게 리턴 시켜주었습니다. 예시 : 파이토치 autograd 함수 역전파때 사용할 값들을 저장해야함 업스트림 그라디언트 업스트림과 지역 그라디언트의 곱셈
  • 15. 예시 : 파이토치 연산자들 operators ▪ 이게 실제 구현된 토치 코드들입니다. 여러분들이 어떤이유로 자신 만의 연산자, 순 전파 역전파 함수들을 구현하길 원한다면, 이것들이 좋은 예시가 될것 같아요.
  • 16. ▪ 한번 깃헙 저장소에서 한 파일을 제대로 보자면, 시그모이드 함수를 구현한 것들중에 하나로 되게 깊은 건데, 여기서는 시그모 이드의 순전파를 정의하고 있습니다. 여기서는 C++ 아니면 C 같은걸 사용해서 파이 토치의 핵심 코드들이 구현되어 있어요. 파이토치 시그모이드 계층
  • 17. ▪ 이게 순전파 방향의 시그모이드 함수를 계산하는 건데, 파이토치 시그모이드 계층 순방향에 대한 함수
  • 18. ▪ 아쉽게도 다른 함수로 호출되서 어디선가 이걸 찾을수는 있긴한데, 너무 큰 스파게티 코드라 파이토치의 백앤드를 보려고 한다 면, 이런건 무시해도 될것 같아요. 파이토치 시그모이드 계층 순방향에 대한 함수
  • 19. ▪ 다른 비슷한 함수로 THNN이 있는데, 여기서는 역전파 계산시에 사용되는 그라디언트 인풋을 업데이트 해주는 곳입니다. 이건 표준 형태? 템플릿? boilerplate처럼 되어있는데, 혹시 패킹되지 않은 텐서 값을 알고 있다면 입력으로 사용해서 확인해볼수 있을 겁니다. 이건 실제 동작하는 코드 베이스에요. 여기서 오른쪽을 보면 이게 중첩된 매크로랑 복잡한 코드들을 c로 구현한 것들 사 이에서 시그모이드 계층에이 역전파에서 어떻게 계산되는지 형태를보여주고 있습니다. 파이토치 시그모이드 계층 역방향에 대한 함수 순방향에 대한 함수
  • 20. ▪ 정신없고 복잡하긴하지만, 파이토치는 기본적으로 순전파와 역전파 쌍으로된 함수로 이루어져 있고, 계산 그래프 상에서 쉽게 바꿀수도 있어요. 파이토치 시그모이드 계층 역방향에 대한 함수 순방향에 대한 함수
  • 21. ▪ 지금까지 우리가 얘기 한건 스칼라를 이용한 역전파와 계산그래프에 대해서구요. 단변수 미분학에 대해서 알고 있다면 정말 쉽 게 이해할수 있었을 거에요. 하지만 실제로 사용하려면 몇 차원으로 이루어진 벡터, 행렬, 텐서 같은 데이터들로 연산을 해야 합 니다. 그러려면 벡터, 텐서로 이루어진 역전파에 대해서 배워나가야하고, 다변수 미분에 대한 개념들을 좀 짚고 넘어가야 해요. 지금까지 스칼라 값으로 역전파를 했는데, 벡터의 경우는 어떻게 할까?
  • 22. ▪ 여러분들은 하나의 스칼라 값이 주어지는 함수, 그러니가 단변수 함수 ex. y = ax가 주어질때, 이에 대한 미분을 어떻게 구하는 지 알고 있습니다. 이 미분 dy/dx 은 입력에 대한 출력의 기울기, 출력의 변화율을 말하는데, 이것을 지역 선형 근사 local linear approximcation이라고도 말할 수 있을거 같아요. 입력이 변할때 출력이 얼마나 변하는지 정도를 알려주는 개념인데, 그라디언트 연산에서 계속 봐 왔엇죠. 요약 : 벡터의 미분 일반적인 미분 (도함수 derivative) x의 값이 바뀔 때, y가 변하는 정도를 의미한다.
  • 23. ▪ .우리가 사용했던 그라디언트는 입력을 여러 개로 받는 함수(다변수 함수)가 주어질때, 각 변수에 대한 미분들(편미분, 방향 도 함수)들의 모음을 말합니다. 위의 빨간색 상자가 다변수 함수 f에 대한 그라디언트 벡터를 보여주고 있어요. ▪ 다시 말하면 그라디언트는 입력을 벡터로 받는 함수로 스칼라 출력을 계산하고, dy/dx를 구했다고 할 수 있어요. 그런데 일반적 인 도함수와 차이첨은 dx가 여러개가 존재한다는 거죠. 그라디언트 벡터는 그래서 입력 벡터와 당일한 크기가 되며, 입력 중 한 요소가 변할때 출력이 변하는 정도를 보여줍니다. 요약 : 벡터의 미분 일반적인 미분 (도함수 derivative) 그라디언트 : 다변수 함수의 미분 ref : https://darkpgmr.tistory.com/132 x의 값이 바뀔 때, y가 변하는 정도를 의미한다. 다변수 함수 f(x1, x2, ..., xn)의 한 x_i가 변할때, y가 변하는 정 도를 의미한다.
  • 24. ▪ 이건 고전적인 단변수 미분들을 봤고, 이번에는 이것을 일반화하여 입력이 벡터이고, 출력도 벡터로 되는 경우를 보겠습니다. 제가 말하고 싶은건 여기 있는 것들은 다 다른이름이지만 기본적으로는 같은 원리라고 생각할 수 있을것같은데, 더 일반화 시킨 형태로 맨 우측의 자코비안 jacobian이라고 부릅니다. ▪ 이 자코비안은 행렬로 모든 원소가 N x M개가 있으며, 입력과 출력으로 인해 2차원이 존재한다면 이 것을 자코비안이라고 합 니다. 자코비안도 이전과 마찬가지로 입력의 한 원소가 출력의 한 원소에 영향을 미치는 정도를 나타낸다고 할수 있어요. 요약 : 벡터의 미분 일반적인 미분 (도함수 derivative) 자코비안 : 다변수 벡터 함수의 1차 미분(first derivative) 그라디언트 : 다변수 함수의 미분 ref : https://darkpgmr.tistory.com/132 x의 값이 바뀔 때, y가 변하는 정도를 의미한다. 다변수 함수 f(x1, x2, ..., xn)의 한 x_i가 변할때, y가 변하는 정 도를 의미한다. 다변수 벡터 함수 y = [y1, ..., ym], y_i = f_i(x1, ..., xn)일때 x중 n번째 요소 x_n이 변할때, y의 m번째 함수의 값이 변하는 정도
  • 25. ▪ 이제 한 노드에서 어떻게 역전파가 동작하는지 한번 생각해 봅시다. 그러면 이런 노드 안에서 벡터 형태의 값이 역전파를 한다 는게 무엇을 의미할까요? 여기에 한 함수 f가 있고 여기에 두 벡터를 넣는다고 해봅시다. 하나는 X로 차원이 Dx라고 할게요. 그리 고 Y도 차원이 Dy인 벡터라고 합시다. ▪ 그러면 이 두 벡터를 받아 출력 Z를 만들고 이 차원수, 원소 갯수를 Dz라고 부릅시다. 이게 순전파의 처리 과정입니다. 매우 쉽죠. 벡터로 보는 역전파
  • 26. ▪ 이제 업스트림 그라디언트를 받는다고 합시다. 이 업스트림 그라디언트도 벡터 형태의 값입니다. 하지만 중요한건 계산하는 중 간에 벡터나 텐서로 연산되는지 상관없이 항상 비용은 스칼라 값입니다. 업스트림 그라디언트는 총 비용에 대한 이 노드 출력의 미분으로 바꿔 말하면 각 노드의 출력이 총 비용을 얼마나 변화시는지를 나타낸다고 할수 있겠습니다. 벡터로 보는 역전파 비용 L은 여전히 스칼라! 업스트림 그라디언트 z의 각 원소가 비용 L에 얼마나 영향을 줄까?
  • 27. ▪ 이번에는 나오는 로컬 그라디언트는 자코비안 행렬의 형태로 되어있습니다. 왜냐면 이 함수는 벡터 값을 처리하는 함수로 두 벡터x, y를 입력으로 받아 하나의 벡터를 출력 z로 보냈거든요. 그래서 지역 그라디언트는 자코비안이 되며, 이 자코비안 행렬은 입력 벡터의 원소가 출력 벡터에 얼마나 영향을 주었는지를 의미합니다. 벡터로 보는 역전파 비용 L은 여전히 스칼라! 업스트림 그라디언트 국소/지역 자코비안 행렬들 z의 각 원소가 비용 L에 얼마나 영향을 줄까?
  • 28. ▪ 역방향으로 진행하면서 우리가 원하던 다운 스트림 그라디언트를 구할수 있어요. 결국에 이 다운스트림 그라디언트는 총 비용 의 벡터 입력에 대한 미분으로, 입력이 변할때 총 비용이 변화는 정도가 됩니다. 이때 이 다운스트림 그라디언트는 입력때와 동일 한데, 알다시피 로컬 그라디언트와 업스트림 그라디언트를 곱하여 얻겠습니다. X의 다운스트림 그라디언트는 같은 크기의 벡터 로 dL/dx, Y의 다운스트림 그라디언트도 같은 크기의 벡터 dL/dy루요. 벡터로 보는 역전파 비용 L은 여전히 스칼라! 각 노드들의 z가 비용 L에 얼마나 영향을 줄까? 업스트림 그라디언트 국소/지역 자코비안 행렬들 행렬-벡터 다운스트림 그라디언트들 곱셈
  • 29. ▪ 지금 우리가 다루는 내용들은 스칼라 곱셈이 아니라 벡터들을 다루다보니, 로컬 그라디언트는 자코비안 행렬이 되었고, 업스트 림/다운스트림 그라디언트는 각각의 벡터가 되었습니다. 다운 스트림 그라디언트를 만들려면 업스트림 그라디언트 벡터와 로컬 자코비안 행렬을 곱하면 됬죠. 벡터로 보는 역전파 비용 L은 여전히 스칼라! 각 노드들의 z가 비용 L에 얼마나 영향을 줄까? 업스트림 그라디언트 국소/지역 자코비안 행렬들 행렬-벡터 다운스트림 그라디언트들 곱셈
  • 30. 벡터로 보는 역전파 ▪ 혹시 여러분들이 햇갈린다면, 직접 종이에다가 행렬 형태를 적어나가나는걸 추천해요. 적어나가는 방식으로 예제를 보다보면 벡터를 이용한 역전파라는게 무엇인지 좀더 명확해질것입니다. ▪ 한번 ReLU함수를 다룬다고 생각해봅시다. 이 함수는 원소 단위 element-wise 로 동작하고 있는데, 0보다 작은 값이 들어올때 제거해주고 있습니다.
  • 31. 벡터로 보는 역전파 ▪ 위 예시에서는 입력 벡터 X로 1, -2, 3, -1이 들어오고 있는데, ReLU함수를 적용한 뒤에 음수들이 사라졌어요.그래서 출력 벡터 Y는 1, 0, 3, 0이 됩니다. 이 ReLu 함수는 벡터 값들을 처리하는 함수 중 하나로 계산 그래프 상에 어딘가에 노드로 들어가 사용될 겁니다.
  • 32. ▪ 이번에는 역전파 과정으로 업스트림 그라디언트(현 노드의 출력이 총 그라디언트에 미치는 영향, 기울기)를 받았다고 해볼께요. 이 ReLu함수의 출력에 약간의 변화가 생기는 경우, 어떻게 이 값들이 어떻게 계산이 되었고, 자동적으로 미분이 되어 돌아오는지 는 아직 잘 모릅니다. 벡터로 보는 역전파
  • 33. ▪ 이 자코비안 행렬은 각 입력 x가 출력 y를 얼마나 변화시키는가를 알려주는데, 원소 단위의 방사형 함수로 된 자코비안 행렬은 첫번째 출력은 첫번째 입력에의해 정해지고, 둘째 입력은 둘째 입력으로 정해진다는 점, 첫째 입력이 둘째/셋째 출력에 영향을 주 지 않고 벡터에서 같은 위치에 대응되는 출력에만 영향을 주기 때문에 , 특별한 구조를 가졌다고 할수 있겠습니다.. 벡터로 보는 역전파
  • 34. ▪ 그러면 자코비안 행렬이 비대각 구조를 가지는 경우 무슨 의미를 가질까요? 자코비안 행렬의 비대각 원소들은 i와 j가 같지 않을 때, 입력 원소 i가 출력 원소 j에 얼마나 영향을 미치는 정도를 나타낸다고 할수있으나 이 원소단위의 함수의 경우 비대각 원소는 0 이죠. 벡터로 보는 역전파
  • 35. ▪ 대각 원소들은 스칼라 형태의 미분 값을 가지는데, 이 미분 값들이 입력이 얼마나 변화시키는 지를 나타낸다고 할수 있겠습니 다. 입력으로 양의 값이 들어온다면 대각 원소에서 로컬 그라디언트가 1이 될것이고, 음의 입력을 받는다면 로컬 그라디언트는 0 이 될겁니다. 이런 식으로 주어진 입력에 대해 연산이 수행되어 완전한 자코비안 행렬이 만들어 지게 되요. 벡터로 보는 역전파
  • 36. ▪ 이제 다운스트림 그라디언트 벡터를 구하기 위해서는 로컬 자코비안 행렬과 그라디언트 벡터를 구하면 되겠습니다. 벡터로 보는 역전파
  • 37. ▪ 그러면 이런 다운스트림 그라디언트 벡터를 구하게 되고, 다른 노드의 역전파 입력으로 사용될겁니다. 벡터로 보는 역전파
  • 38. 벡터로 보는 역전파 ▪ 이제 이 변화율에 대한 함수의 신기한 점을 보자면, 자코비안 행렬은 희소 sparse 행렬이다 보니 대부분의 값들이 0으로 되어 있는데, 이건 딥러닝에서 사용하는 함수들을 생각하면 흔한경우는 아니에요. ▪ 실제 환경에서 대부분의 지역 자코비안 행렬들은 엄청 엄청 희소하다보니, 이 자코비안 행렬을 명시적으로 만든다거나 자코비 안과 업스트림 그라디언트의 곱 연산을 수행할수가 없습니다. 자코비안이 희소 sparse하다 = 비대각 원소들이 모두 0이다 -> 명시적으로 자코비안을 만들지 않고, 묵시적으로 곱 연산을 하자
  • 39. 벡터로 보는 역전파 ▪ 이 ReLU 예제는 입력을 4개로 받다보니 자코비안으로 만들수는 있었지만, 미니배치 입력을 받는 경우 128개의 데이터를 받는 데 한 데이터당 4096개의 차원으로 이루어진 벡터라면 자코비안 행렬이 엄청엄청 커지면서 희소해지고, 대각 요소들만 0이 아닌 값이 될겁니다. ▪ 그래서 이런 행렬들을 명시적으로 만들고, 계산하는건 자원 낭비이고 비효율적입니다. 그래서 역전파 과정에서 자코비안과 벡 터 곱 연산을 효율적이고, 묵시적으로 하는 방법이 있는데, 자코비안이 희소 sparse하다 = 비대각 원소들이 모두 0이다 -> 명시적으로 자코비안을 만들지 않고, 묵시적으로 곱 연산을 하자
  • 40. ▪ ReLU 함수에서 예를 들자면 어짜피 우린 ReLU의 구조가 어떤지, 대각 원소들이 1 또는 0인걸 알고 있으니 이렇게 간단하게 정 리할수 있어요. ▪ 이걸로 다운스트림 그라디언트를 업스트림 그라디언트를 그냥 통과시키거나, 0으로 만들어버리는 식으로 (순방향 때 입력의 부 호에 따라) 구할수가 있게 되겠습니다. 그래서 이런 방법으로 큰 희소 자코비안과 업스트림 그라디언트의 곱셈 연산을 암시적으 로(형태는 다를수 있으나 결과는 똑같은) 효율적인 구현할수 있었습니다. 이렇게 효율적으로 구현하는 방법들을 잘 생각해야해요. 벡터로 보는 역전파 자코비안이 희소 sparse하다 = 비대각 원소들이 모두 0이다 -> 명시적explicit 으로 자코비안을 만들지 않고, 묵시적/암시적 implicit으로 곱 연산을 하자
  • 41. ▪ 우리는 지금까지 벡터에 대해서 얘기했고, 랭크가 1보다 큰 텐서 연산에 대해서도 알아야 합니다. 아마 행렬를 사용하거나 3차 원, 4차원 식의 데이터, 텐서들을 처리해야할 때가 있어요. 지금 보시는 그림은 어느 크기를 가진 텐서가 어떻게 역전파를 하는지 보여주기 위한건데, 로컬 함수인 f(x)는 없지만 입력으로 x와 y가 있네요. 행렬들(텐서)로 보는 역전파
  • 42. ▪ 여기서 행렬 x는 크기가 Dx, Mx이며, 행렬 y는 Dy, My의 크기를 가졌으며, 출력또한 행렬이라고 합시다. 그리고 비용은 스칼라 값이에요. 어떤 원소에 대한 비용의 그라디언트들은 항상 텐서 형태를 가지며, 각 입력 텐서의 원소들에 의해 최종 다운스트림 비 용이 얼마나 바뀌는지를 나타냅니다. 행렬들(텐서)로 보는 역전파 비용 L은 여전히 스칼라! dL/dx는 항상 x와 같은 형태 shape를 갖는다.
  • 43. ▪ 우리가 업스트림 그라디언트를 받았다고 합시다. 이 행렬의 크기를 Dz, Mz라고 할거구, 이 행렬은 출력이 변할때 로스가 얼마 나 변하는지를 의미하는 값입니다. 행렬들(텐서)로 보는 역전파 비용 L은 여전히 스칼라! dL/dx는 항상 x와 같은 형태 shape를 갖는다. 업스트림 그라디언트 z의 각 원소가 비용 L에 얼마나 영향을 줄까?
  • 44. ▪ 이번에 지역 자코비안 행렬들을 보시면 신기하게 생겼는데, 자코비안 행렬이 입력의 스칼라 원소들이 출력의 스칼라 원소들에 얼마나 영향을 주는가, 변화를 시키는가를 나타낸다고 했던것을 생각하면, 이 자코비안 행렬은 더 일반화 시킨 행렬의 형태라고 할수 있어요. ▪ 이 x와 z사이의 지역 자코비안 행렬의 원소 수는 (Dx, Mx) * (Dz, Mz)로 구할수 있어요. 이런 자코비안 행렬의 차원은 입력의 차 원수 x 출력의 차원수 x로 이해할수 있을것 같습니다. 행렬들(텐서)로 보는 역전파 비용 L은 여전히 스칼라! dL/dx는 항상 x와 같은 형태 shape를 갖는다. z의 각 원소가 비용 L에 얼마나 영향을 줄까? 업스트림 그라디언트 국소/지역 자코비안 행렬들 각 y의 원소가 z의 원소에 얼마나 영향을 줄까?
  • 45. ▪ 아무튼 랭크가 엄청 큰 탠서인 자코비안 행렬을 구하였으니, 다운스트림 그라디언트를 계산할 차례입니다. 이 다운스트림 그라 디언트는 계속 본대로 지역 자코비안과 업스트림을 곱하여 얻으며, 기존 입력과 동일한 형태를 가집니다. ▪ 여기서 문제는 벡터도 아니고, 행렬도 아닌 좀더 행렬 곱이나 지역 자코비안 행렬을 일반화시킨 표현이 필요합니다. 자코비안 행렬 같은 경우 입력과 출력을 펼쳐서 flatten 시켜 만들었었죠. 출력과 입력을 펼쳐 각각 고차원 벡터를 만들고, 이들로 벡터 곱 연산을 시켜 위와 같은 결과를 얻을 수 있었습니다. 행렬들(텐서)로 보는 역전파 비용 L은 여전히 스칼라! dL/dx는 항상 x와 같은 형태 shape를 갖는다. 업스트림 그라디언트 국소/지역 자코비안 행렬들 행렬-벡터 곱셈 z의 각 원소가 비용 L에 얼마나 영향을 줄까? 각 y의 원소가 z의 원소에 얼마나 영향을 줄까?
  • 46. ▪ 하지만 매우 고차원이고, 암시적인 자코비안 행렬과 고차원 텐서 간에 곱셈 연산을 시킨다면 머리가 터져버릴 거고, 암시적으로 연산 과정을 정리해 나가기는 너무 힘든 일입니다. 행렬들(텐서)로 보는 역전파 비용 L은 여전히 스칼라! dL/dx는 항상 x와 같은 형태 shape를 갖는다. 업스트림 그라디언트 국소/지역 자코비안 행렬들 행렬-벡터 곱셈 z의 각 원소가 비용 L에 얼마나 영향을 줄까? 각 y의 원소가 z의 원소에 얼마나 영향을 줄까?
  • 47. ▪ 그래서 여러분들이 매우 고차원적이고, 랭크가 높은 텐서들까지 생각할 필요없이 연산자를 구현할수 있는 방법들을 알려줄게 요. 행렬 곱셈 연산을 역전파로 나타내는 예제를 한번 다뤄봅시다. 지금 하는 방법은 여러분들에게 많이 도움 될거고 어떤 복잡한 텐서 연산하는 함수더라도 역전파 연산을 정리할수 있겠습니다. ▪ 2 x 3 크기의 입력 해렬과, D x M 크기의 가중치 행렬이 주어졌다고 해 봅시다. 이 경우에는 3 x 4 크기라고 할게요. 그러면 계 산 노드가 행렬 곱 연산을 하여 출력 Y를 만들어 내어 오른쪽의 결과 값을 구하였습니다. 예제 : 행렬 곱 연산
  • 48. ▪ 이제는 역방향으로 생각해봅시다. 우리가 어딘가에서 업스트림 그라디언트를 받았다고 해요. 이 값은 현재 출력이 얼마나 비용 을 변화시키는지 나타내는 값이었죠. 우리들이 해야할 일은 다운 스트림 그라디언트를 계산하는 것인데, 예제 : 행렬 곱 연산
  • 49. ▪ 자코비안의 크기가 (N x D) x (D x M)으로 꽤 클수 있을거에요. 지금 슬라이드에서 보는 예제는 아주 간단한 예제지만 실제 신 경망의 경우 N=64, D=4096 같은 값이 들어갈수도 있다보니 이런 자코비안들을 곱해간다면, 256GB의 메모리 공간이 필요하고 엄청 큰 GPU도 구매해야 할거에요. ▪ 제 생각에는 48gb의 메모리를 구매하면 될것 같긴한데 자코비안을 명시적으로 곱연산을 수행할때 동작할지는 모르겠어요. 예제 : 행렬 곱 연산 N=64, D=M=4096 인 신경망이 있다고 하자 각 자코비안 행렬을 계산하는데는 256GB의 메모리가 필요하다! 명시적인 방법(전체 공간을 따로 준비해서 계산)하기 보다는 묵시적인 방법으로 해야 한다! * 묵시적 방법 : 기존의 주어진 데이터와 연산 과정을 간소화 하여 명시적인 방법과 동일한 결과를 나오게 함
  • 50. ▪ 지금 보시는건 아주 작은 신경망 시스템이고, 간단하지만 명시적으로 자코비안을 만들고, 벡터와 행렬 곱을 하는 것 대신 계산 을 수행하는 방법이 있어요. 여러분들은 암시적으로 연산 하는 방법을 알아야 하는데, 입력의 원소 단위처리로 하는 방법이 있겠 습니다. 예제 : 행렬 곱 연산 N=64, D=M=4096 인 신경망이 있다고 하자 각 자코비안 행렬을 계산하는데는 256GB의 메모리가 필요하다! 명시적인 방법(전체 공간을 따로 준비해서 계산)하기 보다는 묵시적인 방법으로 해야 한다! * 묵시적 방법 : 기존의 주어진 데이터와 연산 과정을 간소화 하여 명시적인 방법과 동일한 결과를 나오게 함
  • 51. ▪ 입력의 한 원소 x1,1가 어떻게 되는지 생각해볼 수 있을 거 같아요. x1,1 이 값을 알고 있으면 해당 지역 그라디언트 일부를 계 산할수 있어요. 지역 그라디언트는 입력의 형태 x 출력의 형태로 엄청 크지만, 제가 설명하고자 하는 지역 그라디언트 일부는 하 나의 입력 원소 x1,1이 주어질때 출력 행렬 Y의 미분이라고 할 수 있어요. 이건 행렬의 미분이다 보니 출력 Y의 한 원소가 입력 X 의 한 스칼라 원소로부터 얼마나 영향을 받는 정도를 알수 있습니다. 예제 : 행렬 곱 연산
  • 52. ▪ 그럼 여기서 더나아가서 지역 그라디언트의 첫번째 요소는 무엇이고, 얼마나 y1,1이 x1,1의 영향을 받을까요. 이미 우리는 행렬 곱 연산이 어떻게 되는지 알고 있다보니 y 1,1을 계산한다면 X의 첫번째 행과 W의 첫번재 열을 내적하여 구할수가 있겠죠. 이 내 용을 아래와 같이 정리할수 있겠습니다. 예제 : 행렬 곱 연산
  • 53. ▪ 이제 x1,1에 대한 y1,의 미분, 기울기를 계산할수 있어요. 여기서 모든 항들을 보시면 중요한건 첫번째 항으로 x1,1 * w1,1인데, 두 스칼라 곱으로 부터 미분을 구하는 방법은 알고 있으니 이 로컬 그라디언트의 일부분은 w1,1으로 3이 됩니다. 예제 : 행렬 곱 연산
  • 54. ▪ 이 과정을 반복해서 로컬 그라디언트의 두번째 원소를 계산할수 잇을건데, 아무튼 입력의 파란색 원소가 출력의 보라색 원소를 구하는데 얼마나 영향을 주는가를 나타내는 값이겠죠. 예제 : 행렬 곱 연산
  • 55. ▪ 다시 X의 첫번째 행과, Y의 두번째 열을 내적해서 아래의 식으로 정리 될거고 예제 : 행렬 곱 연산
  • 56. ▪ 여기서 남은 한 항인 w1,1가 지역 그라디언트의 두 번째 원소이며, 2가 되겠습니다. 예제 : 행렬 곱 연산
  • 57. ▪ 나머지 두 원소도 이렇게 구하면 됩니다. 이런 과정에서 지역 그라디언트의 첫번째 행이 가중치 행렬 W의 첫번째 행을 복사한 것이란걸 알 수 있었어요. 이번에는 지역 그라디언트의 두번째 행을 봅시다. 예제 : 행렬 곱 연산
  • 58. ▪ 지역 그라디언트의 두번째 줄을 봐야하는데, 입력의 파란색 원소가 출력의 보라색 원소를 구하는데 얼마나 영향을 미치는가를 의미하는 값이 되겠죠. 하지만 출력의 보라색 워소는 X의 둘째 줄과 Y의 첫전빼 열을 곱하여 계산하다보니 X1,1 항이 계산하는데 사용되지 않았습니다. 예제 : 행렬 곱 연산
  • 59. ▪ 그래서 지역 그라디언트 슬라이스/일부의 한 값이 0이 되요. 예제 : 행렬 곱 연산
  • 60. ▪ 지역 그라디언트 슬라이스의 둘째 열의 나머지 모든 원소들도 동일하게 반복되어 0이 되어버립니다. 설명이 정말 많긴 했지만 지역 그라디언트의 일부 dy/dx1,1를 계산해 냈어요. 이 지역 그라디언트 슬라이스는 출력 y를 구하는데 x1,1가 얼마만큼 영향을 주었는지를 나타내는 행렬이 되었습니다. ▪ 다운스트림 그라디언트 계산이 가능한데, 다운 스트림 그라디언트의 파란색 원소는 지역 그라디언트 슬라이스와 업스트림 그 라디언트를 내적해서 구할수 있어요. 그리고 이 값이 입력의 한 원소 x1,1가 비용 계산에 미치는 영향 정도가 되겠습니다. 예제 : 행렬 곱 연산
  • 61. ▪ 이 로컬 그라디언트 일부가 업스트림 그라디언트와 내적을 하게되는걸 보실수가 있는데, 로컬 그라디언트 슬라이스가 가중치 행렬의 한 행만 복사를 해오다보니 나머지는 0이 됩니다. 그래서 다운스트림 그라디언트는 가중치 행렬 W의 첫번쨰 행과 업스트 림 그라디언트 dL/dy 첫째 행의 내적으로 계산이 됩니다. ▪ 이런 식으로 로컬 그라디언트 슬라이스를 계산할수 있지만 이 과정은 잊어버려되고, 가중치 행렬의 첫째 행과 업스트림 그라디 언트의 첫째행이 사용된다는 것만 알면 됩니다. 예제 : 행렬 곱 연산
  • 62. ▪ 이제 이런 방식으로 입력의 다른 원소(위의 그림은 x2,3)가 주어질떄의 경우도 구할수가 있어요. 하지만 한 원소를 계산할때마 다 그 원소에 대한 로컬 그라디언트를 계산해내야 해요. 예제 : 행렬 곱 연산
  • 63. ▪ 입력 X의 오른쪽 바닥에 있는 원소인 x2,3의 로컬 그라디언트를 구한다면, 이전에 본것과 똑같은 식으로 가중치 행렬의 한 행을 가져오고 나머지는 0으로 채우면 되고, 이 로컬 그라디언트 슬라이스와 업스트림그라디이언트를 내적 해서 다운스트림 그라디언 트의 원소를 구할 수 있겠습니다. 예제 : 행렬 곱 연산
  • 64. ▪ 다운스트림 그라디언트들의 다른 원소들은 가중치 행렬의 한 행과 업스트림 그라디언트의 한 행을 내적해서 연산할수 있으며, 직접 손으로 풀어 적기에는 인덱싱 표현이 다소 복잡할 수 있지만, 이것을 위와 같이 일반화 시켜서 정리 할수 있을 것 같아요. ▪ 여기서 알수 있는 점은 업스트림 그라디언트와 로컬 그라디언트 슬라이스 전체를 만들 필요 없이, 그저 가중치 행렬의 행과 업 스트린 그라디언트의 행들을 곱하기만 한다면 되는 것이에요. 예제 : 행렬 곱 연산
  • 65. ▪ 이 계산을 한번에 정리한다면 업스트림 그라디언트 dL/dy와 가중치 행렬 W의 전치 행렬을 행렬 곱하여 구할수 있겠습니다. ▪ 어떤 사람들은 여기서 자코비안 행렬을 만드는지 아닌지 햇갈릴수도 있긴한데, 이 식에서는 업스트림 그라디언트와 가중치 행 렬을 곱함으로서 묵시적으로 (매우 고차원의 희소 자코비안 행렬과 업스트림 그라디언트의) 행렬 곱 연산을 했다고 볼수 있겠습 니다. 예제 : 행렬 곱 연산
  • 66. ▪ 하지만 그럼에도 행렬 곱 연산으로 보이는 것은 이건 실제로 자코비안을 (명시적으로) 만드는걸 간단하게 정리한 것이라고 할 수 있을것 같아요. 이 형태로 우리가 배운 내용들이 동작하며, 이 두항을 곱하여 다운 스트림 그라디언트 dL/dx를 구하는데 업스 트림 그라디언트 w를 사용해야 하고, 또 곱 연산은 역방향으로 그라디언트 스와퍼(그라디언트를 뒤바꾸는, mul 게이트에서 역전 파시 다른 입력의 값을 사용)이다 보니 입력한 값(x)이 아닌 다른 입력값 y을 사용해야 합니다. 예제 : 행렬 곱 연산
  • 67. ▪ 그래서 우리는 업스트림 그라디언트도 사용하고, 가중치 w을 곱함으로서 X와 같은 형태의 결과물을 얻었습니다. ▪ 행렬곱 연산 시 이렇게 행렬 형태를 맞추는걸 꼭 기억해야 하고, 그러면 다른 입력들이 들어오더라도 잘 동작하게 됩니다. 예제 : 행렬 곱 연산
  • 68. ▪ 이제 dL/dw를 계산해본다면, 업스트림 그라디언트와 다른 입력 x를 사용하면 되고, 이 둘을 곱하여 y와 똑같은 형태의 다운스 트림 그라디언트를 얻을수가 있습니다. 역전파에서 어떻게 그라디언트들이 계산되는지 정말 보기 쉽죠. 예제 : 행렬 곱 연산
  • 69. ▪ 역전파를 다른 관점에서보자면, f1, f2, f3, f4 같이 아주 긴 체인 함수가 있다고 해봅시다. 그리고 이 함수를 통해 스칼라 값인 비 용 L을 만들었어요. 다른 관점에서 보는 역전파
  • 70. ▪ 다변수 체인 룰에 따라 그라디언트에 대한 식으로 정리 할수 있는데, dL/dx0는 위와 같이 자코비안 행렬들의 곱이 될거에요. 중 간에 있는 것들은 자코비안 행렬들이고 맨 오른쪽에 있는건 그라디언트 벡터가 되겠죠. ▪ dL/dx0는 모든 행렬과 벡터를 곱하여 결합한것이며, 우리는 계산할 자코비안 행렬들을 선택하고, 최종 비용 벡터를 포함하여 그룹을 만들어서 곱셈 연산을 할수 있어요. 위는 입력을 x0하나만 받아 순방향으로 가나, 입력 x0가 x0,0/x0,1/.../x0,n같이 벡터인 경우, dL/dx0,4를 계산하려면 역전파 과정에 체인 룰에 따라 구성하는 행렬 그룹을 만들어서 곱연산을 하면된다는 예긴것같아요. 다른 관점에서 보는 역전파 행렬 곱셈은 결합된다:필요한 다운스트림 그라디언트를 구할수 있도록 연관된 행렬들을 구성하여 곱하면 됩니다.
  • 71. ▪ 그래서 역전파 과정에서는 우리가 오른쪽에서 왼쪽으로 곱셈을 할 행렬들을 모아 그룹으로 만들어 계산함으로서, 필요없는 곱 연산을 줄일 수 있어 더 효율적으로 결과를 얻을 수가 있겠습니다. 역방향 자동 미분 계산 Reverse Mode Automatic Differentiation 행렬 곱셈은 결합된다:필요한 다운스트림 그라디언트를 구할수 있도록 연관된 행렬들을 구성하여 곱하면 됩니다. 우측에서 좌측방향 곱연산을 하여 행렬과 행렬의 연산 대신, 행렬 대 벡터 연산만 수행하게 됩니다.
  • 72. ▪ 하지만 이 전체 과정은 오른쪽 끝에 있는 값에 달려있죠. 이건 정말 좋은 알고리즘이기는 하지만 이게 동작하려면 항상 최종 스 칼라 비용을 계산해야 해요. 그리고 최종 비용에 대한 모든 원소들의 미분치 계산만 가능 합니다. 하지만 여러분들이 스칼라 입력 의 기울기를 계산하고, 스칼라 입력에 대한 전체 그래프 요소들의 기울기를 알고 싶은 경우도 있을 거에요. 역방향 자동 미분 계산 Reverse Mode Automatic Differentiation 행렬 곱셈은 결합된다:필요한 다운스트림 그라디언트를 구할수 있도록 연관된 행렬들을 구성하여 곱하면 됩니다. 우측에서 좌측방향 곱연산을 하여 행렬과 행렬의 연산 대신, 행렬 대 벡터 연산만 수행하게 됩니다. 스칼라 입력 w이 주어질때 출력 벡터 의 기울기를 알고싶 으면 어떻게 할까? 모든 입력 벡터에 대한 스칼라 출력 w의 기울기를 계산한다.
  • 73. 역방향 자동 미분 계산 Reverse Mode Automatic Differentiation ▪ 이 역전파 알고리즘은 약간 다른 버전으로 오른쪽에서 왼쪽 방향으로 자코비안 행렬을 곱해나다보니 자동 미분의 역방향 모드 라고 부르기도 해요. 여기서 역방향 모드라고 하다보니 순방향 모드 자동 미분도 있습니다. 행렬 곱셈은 결합된다:필요한 다운스트림 그라디언트를 구할수 있도록 연관된 행렬들을 구성하여 곱하면 됩니다. 우측에서 좌측방향 곱연산을 하여 행렬과 행렬의 연산 대신, 행렬 대 벡터 연산만 수행하게 됩니다. 스칼라 입력 w이 주어질때 출력 벡터 의 기울기를 알고싶 으면 어떻게 할까? 모든 입력 벡터에 대한 스칼라 출력 w의 기울기를 계산한다.
  • 74. ▪이 방법은 약간 다른데, 우리가 스칼라 입력 값을 가지고 있고, 이 입력 값에 대한 모든 요소들의 기울기, 미분들을 계산하고 싶 다고 하면, 벡터와 자코비안 관점에서 보면서 곱해나갈수 있겠습니다. 순방향 자동 미분 계산 Forward Mode Automatic Differentiation
  • 75. ▪ 좌측에서 우측으로의 곱셈을 해 나간다면 이런식으로 될거에요. 그러면 아마 여러분들은 왜 이것을 하고, 머신 러닝 시스템이 맨 끝이 비용을 계산해야하고, 경사를 내려가겠다고 비용에 대한 그라디언트를을 계산하는지 왜하냐 싶겠어도. 믿긴 힘들겠지만 머신 러닝하는데 더 많은 방법들이 있어요. 순방향 자동 미분 계산 Forward Mode Automatic Differentiation
  • 76. ▪ 비용 함수를 최소화 시키지 않는 경우에도 그라디언트를 자동적으로 계산하는 시스템이 있다면 좋겠죠. 물리 시스템의 예를 들 어볼게요. ▪ 여기선 스칼라 값을 입력으로 받는다고 할게요. 그리고 이걸 중력이나 마찰력같은거라고 합시다. 그리고 이 입력으로 중력, 마 찰력 같은걸 바꿔간다고 할때 시스템의 출력이 얼마나 변하는지 알고싶다고 해요. 이게 자동 미분 automatic differentiation의 개 념이며 머신 러닝 시스템을 너머 많은 분야에서 유용하게 쓰이고 있습니다. 순방향 자동 미분 계산 Forward Mode Automatic Differentiation
  • 77. ▪ 이건 어느 종류의 미분치, 기울기를 계산할때 유용해요, 하지만 아쉬운 점은 순방향 자동 미분은 파이토치나 텐서플로우, 다른 프레임워크에서에 구현되어 있지 않습니다. ▪ 이게 정말 좋지만 사용하기가 쉽지 않아 구현하지 않았습니다. 그래서 이 이슈가 깃헙에 다뤄 졌고 공개 되기는 했지만 아직 머 지 되지는 않았어요. 순방향 자동 미분 계산 Forward Mode Automatic Differentiation
  • 78. ▪ 그리고 또 대수적인 방법으로 두 역전파 연산자를 사용해서 전방향 그라디언트를 계산할 수 있는 방법도 있는데,저 링크에 들 어가 보시면 딥러닝 프레임워크에서 전방향 그라디언트가 어떻게 계산되는지 보실수 있을 거에요. 순방향 자동 미분 계산 Forward Mode Automatic Differentiation
  • 79. ▪ 역전파 관점에서 사용할수 있는 정말 유용한 방법은 벡터, 텐서, 자코비안을 곱하긴 할건데, 역전파 알고리즘을 그라디언트(1차 미분)만을 계산할 뿐만 아니라 더 고차 미분 higher order derivatives을 계산하는데 사용할 수있지 않을까요? ▪ 예를 들면 여기처럼 계산 그래프가 있다고 합시다. 입력 x가 있는데, f1을 지나면 크기가 d1인 중간 벡터로 이게 f2를 지나 스칼 라 비용을 얻게 된다고 합시다. 역전파에서 더 높은 차수로 미분하기 backprop: higher-order derivatives 헤시안 행렬 2차 미분 행렬
  • 80. ▪ 지금까지 우리는 1차 미분, 그라디언트와 자코비안 그리고 일반 도함수,미분값에 대해서 얘기했지만 x0에 대한 비용의 2차 미 분인 경우를 보면 이것도 행렬인데, 이 행렬은 2차 미분이다 보니 x0가 변할때 x1이 얼마나 변하고, x1이 변하면서 비용이 얼마 나 변하는지를 알려줍니다. ▪ 다시 얘기하면 x1의 한 원소를 변화시킨다고 할때, 그라디언트가 얼마나 빠르게 바뀌는지를 나타내는게 해시안 행렬 이라고 할 수 있을거에요. 역전파에서 더 높은 차수로 미분하기 backprop: higher-order derivatives 헤시안 행렬 2차 미분 행렬
  • 81. ▪ 햇갈릴수 있으니 조심합시다. 해시안 행렬은 2차 미분이고, 자코비안은 1차 미분이에요. 그리고 자코비안 행렬에는 벡터가 들어 가서 벡터가 나오지만, 헤시안 행렬의 경우 벡터가 들어가서 스칼라 값이 나오게 됩니다. 역전파에서 더 높은 차수로 미분하기 backprop: higher-order derivatives 헤시안 행렬 2차 미분 행렬
  • 82. ▪ 이제 대강 봤으니 계산 그래프에서 해시안 행렬을 이용하여 원소들을 계산한다고 합시다. 예를들어 헤시안과 벡터가 곱해진다 면, 우리가 헤시안 행렬과 벡터를 가지고 있어 이를 곱할수가 있는데, 이걸 하는 이유는 예를들면 이런 행렬 곱으로 행렬의 특이 값을 근사하여 구하는 반복 알고리즘이 있다고 합시다. ▪ 그리고 여러분들이 최적화 관점에서 특이값에 대한 2차적인 정보를 계산한다고 하면, 헤시안 행렬과 벡터를 곱하여 근사화된 특이값을 얻을수가 있습니다. 역전파에서 더 높은 차수로 미분하기 backprop: higher-order derivatives
  • 83. 역전파에서 더 높은 차수로 미분하기 backprop: higher-order derivatives ▪ 여기서 유용한 대수적인 변환 방법을 사용할수가 있는데, 미분도 선형적이고, 그라디언트도 선형적이다 보니, 선형 함수로 2차 미분을 이런 행렬과 벡터의 곱 형태로 고칠수가 있어요. 2차 미분을 그라디언트와 벡터를 내적 한 후 이를 미분하는 형태루요. 저는 이게 잘 동작할거라 생각하는데, 당연히 여기서 말하는 벡터는 상수고, x0에 의존하지는 않습니다.
  • 84. ▪ 이제 계산 그래프에서 좀더 좋은 방법을 해볼건데, 우리가 썻던 계산그래프에 역전파 함수를 추가하여 볼건데, 해보려는건 비용 을 계산한 후에 x1에 대한 비용의 기울기(dL/dx1)를 계산하는 함수 f'2와 비용의 x0에 대한 기울기(dL/dx0)를 계산하는 함수 f'1을 사용할수가 있어요. ▪ 이 과정에서 역방향 함수 f'n은 fn게이트를 역방향으로 통과 시켜서 구현한건데, f'n들을 내적하도록 구현 할 수 있고, 이걸 다 른 노드라고 하고 나아가면 최종 출력은 그라디언트 dL/dx0와 벡터 v의 내적이 되며, 여기서 v는 우리가 고른걸 사용하면 됩니다. 역전파에서 더 높은 차수로 미분하기 backprop: higher-order derivatives
  • 85. ▪ 이제 x0에 대한 미분을 계산하려면 역전파를 하면 되겠는데, 역전파 경로의 모든 연산들이 미분 가능 연산자인다 보니, 더 고 차 그라디언트얻을 수 있어요. 그래서 역전파로 2차 미분을 계산 할수 있고, 더 고차 미분들도 가능 합니다. 역전파에서 더 높은 차수로 미분하기 backprop: higher-order derivatives
  • 86. ▪ 아무튼 단순 역전파 알고리즘으로 고차 미분을 계산하도록 연산 과정을 늘릴수가 있겠습니다. 그리고 전방향 자동 미분과는 다 르게, 텐서 플로나 파이토치 같은 딥러닝 프레임워크들에도 구현되어 있어 이걸 좀 만져보거나 그라디언트를 포함하여 비용함수 에 대해 뭔가 써볼수도 있겠죠. 역전파에서 더 높은 차수로 미분하기 backprop: higher-order derivatives
  • 87. ▪ 오늘 본 내용들을 정리하자면, 계산 그래프를 사용한 복잡한 함수를 보았고, 추상화를 통해 좀더 보기 좋게 만들었습니다. 그리 고 이게 순방향으로 가고 돌아오면서 그라디언트를 계산했어요. 순방향은 값들을 계산하는 과정이었고, 역전파는 그라디언트를 계산하는 과정이었습니다. ▪ 그리고 우리가 알아야하는건 그래프 전체가 아닌 일부 노드가 어떻게 되어있는지이며, 노드가 출력을 계산하고, 로컬 그라디언 트와 업스트림그라디언트를 곱하여 다운스트림 그라디언트를 계산했었죠. 정리하기
  • 88. ▪ 그리고 이 강의에서 우리가 선형 분류기와 신경망도 보고, 어떻게 그라디언트를 계산하는지도 봤습니다. 하지만 문제는 신경망 이 입력 이미지릐 픽셀들을 연산하는 과정과 입력 이미지를 벡터로 쳐내는 것인데, 이러면 이미지의 공간적인 정보가 사라지겠죠. 공간적인 정보가 사라진다면 좋지 않을겁니다. 그래서 다음 강의에 이를 고치기위한 방법인 합성곱 신경망에 대해서 이야기 해봅 시다. 정리하기