37.1 원소별 계산
지금까지는 연산 하무의 입력과 출력이 모두 스칼라라고 정의했는데 텐서일경우, 행렬일 경우에 대해서 다룰수 있도록 해보겠습니다.
37.2 텐서 사용 시의 역전파
지금까지 스칼라를 대상으로 역전파를 구현했는데 DeZero 함수에 텐서를 건네면 텐서의 원소마다 스칼라로 계산을 해왔습니다. 텐서의 원소별 스칼라 계산이 이루어지면 스칼라를 가정해 구현한 역전파는 텐서의 원소별 계산에서도 성립합니다.

위의 코드를 보면 두 변수 x와 c를 더한다음 sum 함수로 모든 원소를 더해 하나의 스칼라로 출력하는 코드입니다.
디버깅 해서 보면 t = [[11, 22, 33],[44,55,66]]의 값이 나오고 이 각각의 원소를 합하면 23이라는 스칼라값을 얻을 수 있습니다.

위의 계산그래프를 보면 계산이 진행되는 값들을 좀더 보기가 편합니다.
이번장은 마지막 출력이 스칼라인 게산 그래프에 역전파를 다루는 것이기 때문에 위 소스코드에서 역전파를 수행해줍니다.

y.backward(retain_grad=True)로 역전파를 진행해주고 각 변수별로 미분값을 확인했을때

출력이 잘 나온것을 알수 있고 이를 통해 DeZero는 텐서를 사용한 계산에서도 제대로 역전파가 가능한 것을 확인할 수 있습니다.
여기서 확인되는 점! 기울기 쉐입과 순전파 데이터의 쉐입이 일치하는데 이 성질을 이용하면 함수(sum, reshape같은)를 구현할수 있게됩니다.
37.3 [보충] 텐서 사용 시의 역전파
야코비 행렬
- 벡터 함수의 편미분을 행렬 형태로 나타낸 것
- 주어진 벡터 값을 입력 변수의 작은 변화에 대해 어떻게 변하는지를 근사적으로 표현
행렬 곱을 계산 하는 순서로는
1. 입력 쪽에서 출력 쪽으로 계산해가는 방식
2. 출력 쪽에서 입력 쪽으로 계산해 가는 방식
이 있습니다.

1번 방식은 자동 미분의 forward 모드라고 하고 행렬곱의 결과가 행렬이 되는겁니다.

2번 방식은 자동 미분의 reverse 모드라고 하며 y가 스칼라이므로 중간의 행렬 곱의 결과가 벡터가 됩니다.
그래서 계산량이 적어지고 계산 효율이 좋아집니다.
그러면 야코비 행렬을 구해서 행렬곱 계산이 필요없다는 것이고 결과만 필요하면 reverse 모드로 역전파를 해도 문제가 되지 않는 것입니다.
'Study 공부할레나' 카테고리의 다른 글
| [스터디/밑시딥3] 제 4고지 신경망 만들기_40. 브로드캐스트 함수 (1) | 2023.10.09 |
|---|---|
| [스터디/밑시딥3] 제 4고지 신경망 만들기_38. 형상 변환 함수 (1) | 2023.10.08 |
| [스터디/밑시딥3] 제 4고지 신경망 만들기_39. 합계 함수 (0) | 2023.09.19 |
| [스터디/밑시딥3] 제 3고지 고차미분계산_36. 고차 미분 이외의 용도 (0) | 2023.09.11 |
| [스터디/밑시딥3] 제 3고지 고차미분계산_35. 고차 미분 계산 그래프 (0) | 2023.09.11 |