본문 바로가기
IT/인공지능

[Deep Learning Specialization] Neural Networks and Deep Learning

by 드인 2024. 7. 14.

 

 

[Deep Learning Specialization] Neural Networks and Deep Learning


로지스틱 회귀

1. 모델 정의

  • 로지스틱 회귀 모델은 선형 회귀 모델을 시그모이드 함수에 적용한 형태
    z=wTx+bz=wTx+b
  • ww: 가중치 벡터
  • xx: 입력 특성 벡터
  • bb: 바이어스

z 값을 시그모이드 함수에 적용하여 확률값을 계산합니다.
ˆy=σ(z)=11+ez

2. 비용 함수 CostFunction

  • 로지스틱 회귀에서 사용되는 비용 함수는 로그 손실 LogLoss 함수
    • 로그 손실 함수는 예측된 확률과 실제 클래스 간의 차이를 측정합니다.
      J(w,b)=1mmi=1[y(i)log(ˆy(i))+(1y(i))log(1ˆy(i))]
      여기서:
  • m: 훈련 데이터의 샘플 수
  • y(i): i번째 샘플의 실제 레이블
  • ˆy(i): i번째 샘플에 대한 예측 확률

3. 경사 하강법 GradientDescent

  • 경사 하강법을 사용하여 비용 함수를 최소화하는 최적의 wb 값 탐색
    • 반복적으로 가중치와 바이어스를 업데이트하여 비용 함수를 최소화합니다.
      w=wαJw
      b=bαJb
  • α: 학습률
  • Jw, Jb: 가중치와 바이어스에 대한 비용 함수의 기울기

4. 기울기 계산

Jwj=1mmi=1(ˆy(i)y(i))x(i)j
Jb=1mmi=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
  • 첫 번째 반복
  1. 모델 예측
    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]
  2. 비용 함수 계산
    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
  3. 기울기 계산
    dw=1/10XT([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
  4. 파라미터 업데이트
    w=[0,0]0.1×[0.25,0.2]
    w=[0.025,0.02]
    b=00.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=1mmi=1[y(i)log(ˆy(i))+(1y(i))log(1ˆy(i))]
  • 비용 함수 정의

4. 역전파 계산 BackwardPropagation

  • 역전파는 비용 함수를 최소화하기 위해 가중치와 바이어스를 업데이트하는 과정
1 출력층에서 은닉층으로의 기울기 계산

δ[2]=ˆyy
JW[2]=1mδ[2]a[1]T
Jb[2]=1mmi=1δ[2]

2 은닉층에서 입력층으로의 기울기 계산

δ[1]=W[2]Tδ[2]g(z[1])
JW[1]=1mδ[1]xT
Jb[1]=1mmi=1δ[1]

  • g: 활성화 함수의 도함수

5. 경사 하강법을 통한 파라미터 업데이트

  • 학습률 $α$를 사용하여 가중치와 바이어스 업데이트
    W[2]=W[2]αJW[2]
    b[2]=b[2]αJb[2]
    W[1]=W[1]αJW[1]
    b[1]=b[1]αJb[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)
  1. 샘플 데이터 및 초기화
  • 입력 데이터 X 및 실제 레이블 y
    X=[0.51.5 1.50.5 1.01.0 1.50.5 0.00.0],y=[1 0 1 1 0]
  • 초기 가중치 W1 및 바이어스 b1
    W1=[1.7640.4000.979 2.2411.8680.977],b1=[0 0 0]
  • 초기 가중치 W2 및 바이어스 b2
    W2=[0.950 0.151 0.103],b2=[0]
  1. 순전파 ForwardPropagation
    1 입력층에서 은닉층으로의 계산
  • 입력 데이터 X와 가중치 W1, 바이어스 b1를 사용하여 은닉층의 입력값 Z1를 계산
    Z1=W1TXT+b1Z1=[2.3840.5602.1641.7640.000 3.7433.8422.2672.0450.000 0.2251.3670.0010.4860.000]
  • Z1=[1.7642.241 0.4001.868 0.9790.977][0.51.51.01.50.0 1.50.51.00.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=W2TA1+b2Z2=[0.7190.7400.6790.6680.348]
  • Z2=[0.9500.1510.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)]
  1. 비용 함수 계산

J=1mmi=1[y(i)log(A2(i))+(1y(i))log(1A2(i))]

  • m: 샘플의 수 $m=5$
    J=15[1log(0.672)+0log(0.323)+1log(0.663)+1log(0.661)+0log(0.414)]
  • J0.746
  1. 역전파 BackwardPropagation
  2. 1 출력층에서 은닉층으로의 기울기 계산
  • 출력층의 오차 δ[2]를 계산δ[2]=[0.6721 0.6770 0.6631 0.6611 0.5860]=[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.6770.3370.3390.586]Tdb2=15mi=1[0.328 0.677 0.337 0.339 0.586]=0.653
  • 2 은닉층에서 입력층으로의 기울기 계산
  • dW2=[0.339 0.242 0.171]
  • dW2=1mmi=1A1(i)δ[2]T
    db2=1mmi=1δ[2]
  • δ[2]=A2y
  • 은닉층의 오차 δ[1]를 계산δ[1]=[0.950 0.151 0.103][0.3280.6770.3370.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.1590.073 0.0260.0950.120]
    db1=[0.058 0.128 0.104]
  • dW1=1mmi=1X(i)δ[1]T
    db1=1mmi=1δ[1]
  • σ(z)=σ(z)(1σ(z))
  • δ[1]=W2δ[2]σ(Z1)
  1. 파라미터 업데이트

W1=W1αdW1
b1=b1αdb1
W2=W2αdW2
b2=b2αdb2

W1=[1.7650.3840.986 2.2381.8770.989]
b1=[0.006 0.013 0.010]
W2=[0.916 0.175 0.120]
b2=[0.065]