[Deep Learning Specialization] Neural Networks and Deep Learning
로지스틱 회귀
1. 모델 정의
- 로지스틱 회귀 모델은 선형 회귀 모델을 시그모이드 함수에 적용한 형태
z=wTx+bz=wTx+b - ww: 가중치 벡터
- xx: 입력 특성 벡터
- bb: 바이어스 편향 항
이 z 값을 시그모이드 함수에 적용하여 확률값을 계산합니다.
ˆy=σ(z)=11+e−z
2. 비용 함수 CostFunction
- 로지스틱 회귀에서 사용되는 비용 함수는 로그 손실 LogLoss 함수
- 로그 손실 함수는 예측된 확률과 실제 클래스 간의 차이를 측정합니다.
J(w,b)=−1mm∑i=1[y(i)log(ˆy(i))+(1−y(i))log(1−ˆy(i))]
여기서:
- 로그 손실 함수는 예측된 확률과 실제 클래스 간의 차이를 측정합니다.
- m: 훈련 데이터의 샘플 수
- y(i): i번째 샘플의 실제 레이블
- ˆy(i): i번째 샘플에 대한 예측 확률
3. 경사 하강법 GradientDescent
- 경사 하강법을 사용하여 비용 함수를 최소화하는 최적의 w와 b 값 탐색
- 반복적으로 가중치와 바이어스를 업데이트하여 비용 함수를 최소화합니다.
w=w−α∂J∂w
b=b−α∂J∂b
- 반복적으로 가중치와 바이어스를 업데이트하여 비용 함수를 최소화합니다.
- α: 학습률
- ∂J∂w, ∂J∂b: 가중치와 바이어스에 대한 비용 함수의 기울기
4. 기울기 계산
∂J∂wj=1mm∑i=1(ˆy(i)−y(i))x(i)j
∂J∂b=1mm∑i=1(ˆy(i)−y(i))
- x(i)j: i번째 샘플의 j번째 특성 값
5. 계산 예시
import numpy as np
# 샘플 데이터 생성
np.random.seed(0)
X = np.array([[0.5, 1.5], [-1.5, -0.5], [1.0, 1.0], [1.5, -0.5], [0.0, 0.0],
[0.5, -0.5], [-0.5, 0.5], [-1.0, -1.0], [1.0, -1.0], [-1.5, 1.5]])
y = np.array([1, 0, 1, 1, 0, 0, 1, 0, 1, 0])
# 초기화
w = np.zeros(2)
b = 0
alpha = 0.1
num_iterations = 10
def sigmoid(z):
return 1 / (1 + np.exp(-z))
for i in range(num_iterations):
# 모델 예측
z = np.dot(X, w) + b
y_hat = sigmoid(z)
# 비용 함수 계산
cost = -1/len(y) * np.sum(y * np.log(y_hat) + (1 - y) * np.log(1 - y_hat))
# 기울기 계산
dw = 1/len(y) * np.dot(X.T, (y_hat - y))
db = 1/len(y) * np.sum(y_hat - y)
# 파라미터 업데이트
w = w - alpha * dw
b = b - alpha * db
print(f"Iteration {i}: Cost {cost}, w {w}, b {b}")
print("Final weights:", w)
print("Final bias:", b)
- 각 반복에 대한 계산 수행
- 초기 값
- w=[0,0]
- b=0
- 첫 번째 반복
- 모델 예측
z=[0,0,0,0,0,0,0,0,0,0]
yhat=[0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5] - 비용 함수 계산
cost=−1/10∑([1,0,1,1,0,0,1,0,1,0]log([0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5])+(1−[1,0,1,1,0,0,1,0,1,0])log(1−[0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5]))
cost=0.693 - 기울기 계산
dw=1/10∑XT([0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5]−[1,0,1,1,0,0,1,0,1,0])
dw=[−0.25,−0.2]
db=1/10∑([0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5]−[1,0,1,1,0,0,1,0,1,0])
db=0 - 파라미터 업데이트
w=[0,0]−0.1×[−0.25,−0.2]
w=[0.025,0.02]
b=0−0.1×0
b=0
신경망
1. 신경망 구조
- 하나의 은닉층을 가진 신경망 구조
- 입력층: x
- 은닉층: a[1] 활성화값
- 출력층: ˆy 예측값
신경망의 각 층은 가중치 W와 바이어스 b를 가집니다.
2. 순전파 계산 ForwardPropagation
- 순전파는 입력 데이터를 신경망을 통해 전달하여 예측값을 계산하는 과정
1 입력층에서 은닉층으로의 계산
z[1]=W[1]x+b[1]
a[1]=g(z[1])
- g: 활성화 함수ReLU,sigmoid,tanh등
2 은닉층에서 출력층으로의 계산
z[2]=W[2]a[1]+b[2]
ˆy=g(z[2])
3. 비용 함수 CostFunction
- 예측값과 실제 값 사이의 오차를 측정하는
- 이진 분류의 경우, 로지스틱 회귀와 동일하게 로그 손실 LogLoss을 사용합니다.
J=−1mm∑i=1[y(i)log(ˆy(i))+(1−y(i))log(1−ˆy(i))]
- 이진 분류의 경우, 로지스틱 회귀와 동일하게 로그 손실 LogLoss을 사용합니다.
- 비용 함수 정의
4. 역전파 계산 BackwardPropagation
- 역전파는 비용 함수를 최소화하기 위해 가중치와 바이어스를 업데이트하는 과정
1 출력층에서 은닉층으로의 기울기 계산
δ[2]=ˆy−y
∂J∂W[2]=1mδ[2]a[1]T
∂J∂b[2]=1mm∑i=1δ[2]
2 은닉층에서 입력층으로의 기울기 계산
δ[1]=W[2]Tδ[2]⋅g′(z[1])
∂J∂W[1]=1mδ[1]xT
∂J∂b[1]=1mm∑i=1δ[1]
- g′: 활성화 함수의 도함수
5. 경사 하강법을 통한 파라미터 업데이트
- 학습률 $α$를 사용하여 가중치와 바이어스 업데이트
W[2]=W[2]−α∂J∂W[2]
b[2]=b[2]−α∂J∂b[2]
W[1]=W[1]−α∂J∂W[1]
b[1]=b[1]−α∂J∂b[1]
6. 계산 예시
import numpy as np
# 샘플 데이터 생성
np.random.seed(0)
X = np.array([[0.5, 1.5], [-1.5, -0.5], [1.0, 1.0], [1.5, -0.5], [0.0, 0.0]])
y = np.array([[1], [0], [1], [1], [0]])
# 가중치와 바이어스 초기화
W1 = np.random.randn(2, 3)
b1 = np.zeros((3, 1))
W2 = np.random.randn(3, 1)
b2 = np.zeros((1, 1))
# 활성화 함수와 그 도함수 정의
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def sigmoid_derivative(z):
s = sigmoid(z)
return s * (1 - s)
print("Initial W1:", W1)
print("Initial b1:", b1)
print("Initial W2:", W2)
print("Initial b2:", b2)
# 순전파
Z1 = np.dot(W1.T, X.T) + b1
A1 = sigmoid(Z1)
Z2 = np.dot(W2.T, A1) + b2
A2 = sigmoid(Z2)
print("Z1:", Z1)
print("A1:", A1)
print("Z2:", Z2)
print("A2:", A2)
# 비용 함수 계산
m = y.shape[0]
cost = -1/m * np.sum(y * np.log(A2.T) + (1 - y) * np.log(1 - A2.T))
print("Cost:", cost)
# 역전파
dZ2 = A2 - y.T
dW2 = 1/m * np.dot(A1, dZ2.T)
db2 = 1/m * np.sum(dZ2, axis=1, keepdims=True)
dA1 = np.dot(W2, dZ2)
dZ1 = dA1 * sigmoid_derivative(Z1)
dW1 = 1/m * np.dot(X.T, dZ1.T)
db1 = 1/m * np.sum(dZ1, axis=1, keepdims=True)
print("dW2:", dW2)
print("db2:", db2)
print("dW1:", dW1)
print("db1:", db1)
# 파라미터 업데이트
alpha = 0.1
W1 = W1 - alpha * dW1.T
b1 = b1 - alpha * db1
W2 = W2 - alpha * dW2.T
b2 = b2 - alpha * db2
print("Updated W1:", W1)
print("Updated b1:", b1)
print("Updated W2:", W2)
print("Updated b2:", b2)
- 샘플 데이터 및 초기화
- 입력 데이터 X 및 실제 레이블 y
X=[0.51.5 −1.5−0.5 1.01.0 1.5−0.5 0.00.0],y=[1 0 1 1 0] - 초기 가중치 W1 및 바이어스 b1
W1=[1.7640.4000.979 2.2411.868−0.977],b1=[0 0 0] - 초기 가중치 W2 및 바이어스 b2
W2=[0.950 −0.151 −0.103],b2=[0]
- 순전파 ForwardPropagation
1 입력층에서 은닉층으로의 계산
- 입력 데이터 X와 가중치 W1, 바이어스 b1를 사용하여 은닉층의 입력값 Z1를 계산
Z1=W1T⋅XT+b1Z1=[2.384−0.5602.1641.7640.000 3.743−3.8422.2672.0450.000 −0.225−1.3670.001−0.4860.000] - Z1=[1.7642.241 0.4001.868 0.979−0.977]⋅[0.5−1.51.01.50.0 1.5−0.51.0−0.50.0]+[0 0 0]
- 은닉층의 활성화 값 A1을 계산 시그모이드함수
A1=σ(Z1)A1=[0.9150.3630.8970.8540.500 0.9770.0210.9060.8850.500 0.4440.2030.5000.3810.500] - 2 은닉
- A1=[σ(2.384)σ(−0.560)σ(2.164)σ(1.764)σ(0.000) σ(3.743)σ(−3.842)σ(2.267)σ(2.045)σ(0.000) σ(−0.225)σ(−1.367)σ(0.001)σ(−0.486)σ(0.000)]
층에서 출력층으로의 계산
- 은닉층의 활성화 값 A1와 가중치 W2, 바이어스 b2를 사용하여 출력층의 입력값 Z2를 계산
Z2=W2T⋅A1+b2Z2=[0.7190.7400.6790.6680.348] - Z2=[0.950−0.151−0.103]⋅[0.9150.3630.8970.8540.500 0.9770.0210.9060.8850.500 0.4440.2030.5000.3810.500]+[0]
- 출력층의 활성화 값 A2을 계산 시그모이드함수
A2=σ(Z2)A2=[0.6720.6770.6630.6610.586] - A2=[σ(0.719)σ(0.740)σ(0.679)σ(0.668)σ(0.348)]
- 비용 함수 계산
J=−1mm∑i=1[y(i)log(A2(i))+(1−y(i))log(1−A2(i))]
- m: 샘플의 수 $m=5$
J=−15[1log(0.672)+0log(0.323)+1log(0.663)+1log(0.661)+0log(0.414)] - J≈0.746
- 역전파 BackwardPropagation
- 1 출력층에서 은닉층으로의 기울기 계산
- 출력층의 오차 δ[2]를 계산δ[2]=[0.672−1 0.677−0 0.663−1 0.661−1 0.586−0]=[−0.328 0.677 −0.337 −0.339 0.586]dW2=15[0.9150.3630.8970.8540.500 0.9770.0210.9060.8850.500 0.4440.2030.5000.3810.500]⋅[−0.3280.677−0.337−0.3390.586]Tdb2=15m∑i=1[−0.328 0.677 −0.337 −0.339 0.586]=0.653
- 2 은닉층에서 입력층으로의 기울기 계산
- dW2=[0.339 0.242 0.171]
- dW2=1mm∑i=1A1(i)δ[2]T
db2=1mm∑i=1δ[2] - δ[2]=A2−y
- 은닉층의 오차 δ[1]를 계산δ[1]=[0.950 −0.151 −0.103]⋅[−0.3280.677−0.337−0.3390.586]⋅σ′(Z1)σ′(Z1)=[0.0780.2320.0930.1250.250 0.0220.0200.0850.1010.250 0.2470.1610.2500.2360.250]dW1=[−0.0190.159−0.073 0.026−0.0950.120]
db1=[0.058 −0.128 0.104] - dW1=1mm∑i=1X(i)δ[1]T
db1=1mm∑i=1δ[1] - σ′(z)=σ(z)⋅(1−σ(z))
- δ[1]=W2⋅δ[2]⋅σ′(Z1)
- 파라미터 업데이트
W1=W1−α⋅dW1
b1=b1−α⋅db1
W2=W2−α⋅dW2
b2=b2−α⋅db2
W1=[1.7650.3840.986 2.2381.877−0.989]
b1=[−0.006 0.013 −0.010]
W2=[0.916 −0.175 −0.120]
b2=[−0.065]
'IT > 인공지능' 카테고리의 다른 글
[LLM][RAG] RAGRetrieval−AugmentedGeneration 소개 및 설명 1 | 2024.06.04 |
---|---|
[AI][NLP] 한국어 요약 모델 개발 코드 및 최적화 방법 0 | 2024.05.15 |
[LLM][프롬프트엔지니어링] CoTChainofThought 0 | 2024.05.07 |
[LLM] ReALM: Reference Resolution As Language Modeling 논문 리뷰 0 | 2024.04.21 |
[LLM] Social Skill Training with Large Language Models 논문 리뷰 0 | 2024.04.10 |