즐거운프로그래밍

[딥러닝] 딥러닝 동작 원리 7가지(순전파, 역전파 등)

수수께끼 고양이 2023. 10. 28. 20:31
728x90
반응형

 

 

딥러닝 동작원리 7가지 공식을 공부합니다.

 

1. 순전파 : y=x*w+1*b

입력 노드 1개, 출력 노드 1개, 편향으로 구성된 단일 인공 신경입니다.

x=2
w=3
b=1
y=x*w+1*b
y

 

 

 


2. 평균 제곱 오차 : E=(y-yT)*(y-yT)/2

E는 오차, y는 순저차에 의한 예측값, yT는 목표값 또는 라벨을 의미하며,

yT는 입력값 x에 대해 실제로 나오기를 원하는 값입니다.

오차(error)는 손실(loss) 또는 비용(cost)라고도 하며, 오차값이 작을수록 예측을 잘하는 인공신경망입니다.

yT=10
E=(y-yT)**2/2
E

 

 

 


3. 역전파 오차 : yE=y-yT

yE는 역전파 오차, y는 순전파에 의한 예측값, yT는 목표값 또는 라벨을 나타냅니다.

yE의 정확한 의미는 y에 대한 오차 E의 순간변화율을 의미하며 편미분을 통해 유도됩니다.

yE=y-yT
yE

 

 


4. 입력 역전파 : xE=yE*w

xE는 입력 역전파, yE는 역전파의 오차입니다.

순전파에서 x는 w를 따라서 y로 전파됩니다. y로 전파된 예측값은 목표값과 비교하는 과정에서 오차(yE)가 발생합니다.

발생한 오차는 궁극적으로 0이 되도록 하며, 오차는 w를 따라서 역전파하여 xE로 보냅니다.

 


5. 가중치, 편향 순전파 : y=w*x+b*1, y=x*w+1*b

이번 공식은 다음에 6번째 공식을 유도하기 위해 사용되며, 구현을 위해 사용하지 않습니다.

 


6. 가중치, 편향 역전파 : wE=yE*x, bE=yE*1

wE는 가중치 역전파의 오차, bE는 편향 역전파의 오차를 의미합니다.

yE는 역전파 오차이며 6번 공식은 편미분을 연쇄적으로 적용하여 얻은 공식입니다.

wE의 정확한 의미는 w에 대한 오차 E의 순간변화율을 의미하며, bE는 b에 대한 오차 E의 순간 변화율을 의미합니다.

wE=yE*x
bE=yE*1
(wE,bE)

 

 

 


7. 신경망 학습 : w-=lr*wE, b-=lr*bE

lr = learning rate, 학습률

7번째 공식은 경사하강법이라고 하며, 미분을 이용하여 얻은 공식입니다. w, b값을 갱신하는 과정을 인공 신경망의 학습이라고 합니다.

 

신경망 학습 수행 1

w=w-wE
b=b-bE
w,b
y=x*w+1*b
y

 

 

신경망 학습 수행 2

w,b=3,1
lr=0.01
w=w-lr*wE
b=b-lr*bE
(w,b)

 

 

학습된 신경망으로 예측하기

y=x*w+1*b
y

 

 


예제 1. 반복 학습 2회 수행

x=2
w=3
b=1
yT=10
lr=0.01

for epoch in range(2):
    y=x*w+1*b
    E=(y-yT)**2/2
    yE=y-yT
    wE=yE*x
    bE=yE*1
    w-=lr*wE
    b-=lr*bE
    
    print(f'epoch={epoch}')
    print(f'y:{y:.3f}')
    print(f'w:{w:.3f}')
    print(f'b:{b:.3f}')

 

 

예제 2. 반복 학습 200회 수행

x=2
w=3
b=1
yT=10
lr=0.01

for epoch in range(200):
    y=x*w+1*b
    E=(y-yT)**2/2
    yE=y-yT
    wE=yE*x
    bE=yE*1
    w-=lr*wE
    b-=lr*bE
    
    print(f'epoch={epoch}')
    print(f'y:{y:.3f}')
    print(f'w:{w:.3f}')
    print(f'b:{b:.3f}')

 

** 학습 수행은 0번부터 진행되며 학습 200회 수행하여 199번까지 진행됩니다.

 

 

예제 3. 오차 조건 추가하기

x=2
w=3
b=1
yT=10
lr=0.01

for epoch in range(200):
    y=x*w+1*b
    E=(y-yT)**2/2
    yE=y-yT
    wE=yE*x
    bE=yE*1
    w-=lr*wE
    b-=lr*bE
    
    print(f'epoch={epoch}')
    print(f'y:{y:.3f}')
    print(f'w:{w:.3f}')
    print(f'b:{b:.3f}')
    
    if E < 0.0000001: 
        break

 

 

- epoch값이 172번째일 때 for문을 빠져나가며 y는 10에 수렴합니다.

 

 

예제 4. 학습률 변경하기 1

x=2
w=3
b=1
yT=10
lr=0.05

for epoch in range(200):
    y=x*w+1*b
    E=(y-yT)**2/2
    yE=y-yT
    wE=yE*x
    bE=yE*1
    w-=lr*wE
    b-=lr*bE
    
    print(f'epoch={epoch}')
    print(f'y:{y:.3f}')
    print(f'w:{w:.3f}')
    print(f'b:{b:.3f}')
    
    if E < 0.0000001: 
        break

 

 

 

 

 

예제 5. 학습률 변경하기 2

x=2
w=3
b=1
yT=10
lr=0.005

for epoch in range(200):
    y=x*w+1*b
    E=(y-yT)**2/2
    yE=y-yT
    wE=yE*x
    bE=yE*1
    w-=lr*wE
    b-=lr*bE
    
    print(f'epoch={epoch}')
    print(f'y:{y:.3f}')
    print(f'w:{w:.3f}')
    print(f'b:{b:.3f}')
    
    if E < 0.0000001: 
        break

 

- 200회 이내의 수행으로 학습이 완료되지 않은 상태로 종료됩니다.

 

 

 

예제 6. 반복횟수 수정하기

x=2
w=3
b=1
yT=10
lr=0.005

for epoch in range(2000):
    y=x*w+1*b
    E=(y-yT)**2/2
    yE=y-yT
    wE=yE*x
    bE=yE*1
    w-=lr*wE
    b-=lr*bE
    
    print(f'epoch={epoch}')
    print(f'y:{y:.3f}')
    print(f'w:{w:.3f}')
    print(f'b:{b:.3f}')
    
    if E < 0.0000001: 
        break

 

 

 

728x90
반응형