Deep Learning Study (2) / 24.09.04
텐서 연산
- 원소별 연산
: 텐서에 있는 각 원소에 독립적으로 적용.
- relu 함수 : 입력이 0보다 크면 그 값을 그대로 출력하고, 0 이하이면 0을 출력하는 함수
- 곱셈, 뺄셈, 덧셈 등 진행 가능
- 브로드캐스팅 ← 프로그래밍 개념(수학적인 개념이 프로그래밍 연산에 적용될 때 등장하는 개념), 덧셈에만 적용되는 건 아님
큰 텐서의 ndim에 맞도록 작은 텐서에 브로드캐스팅 축 추가 → 작은 텐서가 새 축을 따라 큰 텐서의 크기에 맞도록 반복됨. ⇒ 작은 텐서가 큰 텐서의 차원에 맞지 않는 경우, 부족한 차원은 앞쪽에 추가됨.
- 텐서 점곱 ← 이해가 잘 안돼….
: 입력 텐서의 원소들 결합시킴. 다차원 원소들간의 곱 연산
- 텐서 크기 변환 ← 주로 ‘전치’ 행과 열이 바뀌는 게 많이 사용됨
: 사용하는 이유
- 차원을 맞추기 위해: 행렬 곱셈이나 기타 연산에서 차원을 맞추기 위해.
- 연산 최적화: 특정 연산을 효율적으로 수행하기 위해.
- 데이터 차원 변환: 신경망에서 데이터 형식을 맞추기 위해.
- 벡터 방향 맞추기: 행 벡터와 열 벡터의 연산을 위해.
- 수학적 연산: 역행렬, 고유값 분해와 같은 선형대수학 연산에서.
- 텐서 연산의 기하학적 해석
: 모든 텐서 연산은 기하학적인 해석이 가능하다. (좌표 평면 상에 찍혀도 화살표 같은 걸로 표현 및 해석 가능)
- 딥러닝의 기하학적 해석
⇒ 신경망 전체는 텐서 연산의 연결, 모든 텐서 연산은 입력 데이터의 기하학전 변환
⇒ 신경망 전체는 입력 데이터의 기하학적 변환의 연결
복잡하고 심하게 꼬여 있는 데이터의 매니폴드에 대한 깔끔한 표현 찾는 일 (사람이 종이 공을 펼치기 위한 전략과 비슷)
그래디언트 기반 최적화
각 신경망에서의 연산 : 데이터에 대해 가중치와 편향을 연산하고 예측값과 정답 간의 오차를 계산하고 이를 바탕으로 가중치 값을 업데이트한다.
- how 가중치 값 업데이트?: 네트워크 가중치 행렬의 원소를 나머지 다 고정하고 관심 있는 하나만 다른 값으로 적용 (두 번의 정방향 패스 적용 → 비용이 큼: 신경망에 사용된 모든 연산이 미분 가능하다는 장점을 사용해 네트워크 가중치에 대한 손실의 그래디언트 계산
- (2) 그래디언트
- (1) 가장 간단한 방법
- 변화율
: x가 바뀜에 따라 f(x) 값이 얼만큼 어떻게 변하게 되는지에 대한 정도
- 텐서에서의 변화율 = 그래디언트
: 다차원에 대한 입력받는 함수에 대한 변화율 개념 확장
- 확률적 경사 하강법 (그래디언트 업데이트 방법) → 함수에서는 옵티마이저 항목에 해당(2) 진정한 확률적 경사 하강법 (SGD) : 단일 샘플을 사용하여 매번 가중치를 업데이트 → 매우 빠르지만, 최적의 가중치를 찾는 과정에서 불안정할 수 있음.
- (3) 미니 배치 경사 하강법 (mini BGD) : 데이터셋을 여러 개의 작은 배치로 나누어 각 배치에 대해 손실 함수의 그래디언트를 계산하고, 그 배치의 평균 그래디언트를 사용하여 가중치를 업데이트 → 배치 경사 하강법과 SGD의 절충안
- (1) 배치 경사 하강법 (BGD) : 전체 데이터셋을 한 번에 사용하여 손실 함수의 그래디언트를 계산한 후, 그 그래디언트를 기반으로 가중치를 업데이트 → 큰 데이터 셋에서 느리지만, 수렴 과정이 안정적
*기존 경사하강법의 문제점 : 수렴 속도 문제, 진동 문제
- 모멘텀 : 이전의 이동 경로를 기억하여 계속 가중치를 업데이트할 때 그 방향을 강화하는 방식 → 지역 최솟값이 아니라 전역 최솟값을 찾을 수 있도록 도와줌.
- 역전파 알고리즘 (변화율 연결)
(한 번 더 손봐야 할 듯)
정리 : 신경망 활성화 함수(층을 이루는 함수)를 업그레이드 하는 방법
- 손실 함수 선택: 손실 함수는 문제 유형, 모델 출력 유형, 활성화 함수에 따라 결정한다.
- 오차 계산: 오차값(x값을 넣고 예측한 y값 - 원본 y값) 계산하기
- 손실 값 계산: 손실 값 (오차값을 손실 함수에 넣기) 구하기 → 모델 성능 평가 (값이 작을수록 모델의 예측이 실제값에 가까운 것)
- 가중치 조정: 성능을 개선해야 할 거 같으면 입력된 x값과 원본 y값을 가지고 경사 하강법(그레디언트의 반대 방향으로 파라미터 이동)을 활용해 신경망 활성화 함수의 가중치를 조정한다.
- 반복 학습: 손실 함수에서의 최소값인지 그레디언트를 통해 파악(역전파 알고리즘을 활용해 그래디언트 구하기)하고 아니면 2번부터의 과정을 계속 반복하면서 업데이트하기
Q1) 왜 손실이 최소여야 하나?
A1) 말 그대로 손실 값이니까…. 손해가 많으면 안 좋은 거잖아? 손해의 최소값을 찾으려면 그래디언트가 0이어야 함.
Q2) 손실 함수는 어떻게 만들어지는 거지? 하나인가? 고정되는 것인가?
A2) 손실 함수는 일반적으로 모델의 구조와 학습 목표에 따라 초기 설정으로 결정 (손실 함수는 문제 유형에 따라, 모델 출력 유형과 활성화 함수에 따라 결정됨), 모델이 학습할 때마다 변경되지 않으며, 전체 모델에 대해 하나만 정의
3장 신경망 시작하기
신경망 구조
1. 층
- 완전 연결 층, 밀집 연결 층 : 2D 텐서가 저장된 간단한 벡터 데이터
- 순환 층 : 3D 텐서
- 2D 합성곱 층 : 4D 텐서
2. 모델 : 층의 네트워크
딥러닝 모델 = 층으로 만든 비순환 유향 그래프
3. 손실 함수 & 옵티마이저
- 손실 함수 : 훈련하는 동안 최소화될 값, 성공지표 ← 제일 중요한 선택
- 옵티마이저 : 손실함수 기반으로 네트워크(모델)이 어떻게 업데이트 될 지 결정, SGD 구현