선 한줄 요약: 주어진 출력데이터와 계산한 출력데이터의 오차합이 최소가 되게끔 미지수벡터c(신경망구조의 함수의 미지수값들)을 수치해석적으로 찾는 방법.
딥러닝 관련해서 질문 글들을 볼때마다
너무 어렵게 생각하는것 같다는 느낌이 들어서 개념은 의외로 단순하게 생각할수 있어서 간략히 설명해봄.
난 ai쪽 전공자는 아니지만 밑바닥딥러닝 책을 독학해서 수식을 전개하고 numpy로 코딩해본 경험.
- 신경망 구조에서 forward 함수로 오차함수 정의: E(c, 입력데이터set, 출력데이터set)
E 함수는 1950년대 쯤에 이미 발명된 함수. 신경망 구조에 따라서 정해지는 함수.
c 는 노드 연결선마다의 weight 와 bias들을 모두 모은 미지수벡터.
E 값의 의미는 주어진 출력데이터set 와 {입력데이터set, c벡터}로 계산한 출력set 과의 오차를 모두 더한 값. (제곱)
- 딥러닝 학습 목표: {입력,출력} 데이터 쌍들이 주어질때 E 값을 최소화 하는 c벡터를 구하면됨.
- c벡터를 구하는 방법은 여러가지 있을수 있음.
. 가장 단순 무식한 방법은 c_i 값 각각을 -1e9~1e9 범위를 1e-9 마다 증분시킨것들을 모두 계산해서
이중 최소 E의 c벡터를 선정.
. 유전알고리즘
. 기울기 구해서 반복 찾기
- 기울기 구하는 방법도 여러가지 있을수 있음.
. 단순 무식한 방법: [E(c_i + d) - E(c_i - d)] / (2 * d) ~ 아래 역전파 검증 용도로 사용가능. d는 1e-7 같은 작은값.
. 수식 자체를 편미분한 수식으로 전개해서 이걸 코딩해서 기울기 구하기 - 신경망의 규칙성을 이용하면 역전파방법이됨.
실제 딥러닝할때 쓰는 방법은 마지막 방법임. 다른 방법도 동일한 결과를 얻을순 있지만, 이 역전파 방법아닌 방법으로는 몇배, 심지어 몇억경만배 더 시간이 걸림.
역전파 수식화를 전개해보면, 여러층을 거치는 수식을 편미분 하는거라서 편미분을 알고있으면 그 규칙성만 잘 따지고, 텐서 정의만 잘하면, 그냥 노가다임. CNN은 2d 층이 있어서 더 복잡하지만 이것도 마찬가지.
그리고 위에 설명한 방법은 개요라서, 실제 딥러닝할때는 수렴성, 메모리 용량, 계산시간 등을 고려해서 다양한 기법들을 쓰곤함. 가령 dropout, 배치학습 등등. 근데 뼈대는 위에 설명한 방법.
초기 c벡터는 임의의 벡터여도 되는거에요?
역전파 사용할때는 작은값의 랜덤한 수치를 이용했던걸로 기억. 기울기 구하는 방법이 아닌 다른 방법중에는 초기 c벡터란게 필요없는 방법도 있음.
혹시 초기 c벡터를 최적화하는게 initializing 연구들의 주 목적으로 이해하고있는데 맞을까요?
사수님이 항상 강조했던 게 결국 딥러닝은 비에 젖듯이 하는 거라고 했음. 나도 6개월쯤 돼서야 이런 글 보고 맞아 이런 거였어 하는 거지, 대부분의 초심자는 당장 벡터로 뭘 한다에서부터 머릿속에 그림이 안 그려짐. 결국 시간이 답이라고 봄
이 말이 진짜 너무 맞는거 같네요