[Intel] 1주차 회고록

LHW·2023년 7월 17일
0

Intel교육과정

목록 보기
1/15

1주차 주 내용

  1. 가중치와 편향(기준치)

    우리가 특정 물건을 산다고 가정했을 때, 저마다의 기준이 존재하기 마련이다. '나는 디자인이 예쁜게 좋아' 혹은 '나는 가격이 싼 게 좋아'라는 식의 기준 말이다. 여기서 얘기하는 디자인 혹은 가격의 경우 단층 퍼셉트론의 input값인 x값이 되고, 조건의 중요도가 가중치를 의미하는 w가 된다.

  2. 단층 퍼셉트론 계산 실습

    수식에 맞춰 단층 퍼셉트론 계산 실습을 진행하고, ppt를 제작하여 발표까지 진행했다.

  3. 초간단 신경망 학습 실습

    1x2x1의 초간단 신경망 학습을 실습했다. 임의로 정하는 4개의 가중치와 3개의 편향값을 가지고 경사하강법과 오차역전파법을 이용해 손실값(E, loss function으로는 MSE를 사용했다.)을 최소화 하며 임의의 x값에 대해 정답에 가까워지는 과정을 python코드로 실습했다.

실습 코드

import numpy as np

alpha = 1.0 # learning rate
epoch = 5000 # number of learning iteration

# 가중치, 편향 초기값 설정
w1 = 1.0 # 히든 레이어의 1번째 가중치
w2 = -1.0 # 2번째 가중치
w3 = 2.0 # 3번째 가중치
w4 = -2.0 # 4번째 가중치
b1 = -1.0 # 1번째 편향
b2 = 1.0 # 2번째 편향
b3 = 2.0 # 3번째 편향

def sigmoid(x): # 활성화 함수 정의
    y = 1/(1+np.exp(-x))
    return y

input_data = np.array([-4, -3, -2, -1, 0, 1, 2, 3, 4, 5]) # 10개의 입력데이터
teaching_data = [sigmoid(i) for i in input_data]

result_array = []
for n in range(1, epoch + 1): # 5000회의 학습 진행
    result_per_each = []
    for i in range(len(input_data)): 
        x = input_data[i] # input값을 x에 할당
        t = teaching_data[i] # 타겟값은 t에 할당    
        # 순전파 계산
        u1 = sigmoid(w1*x + b1) # -5
        u2 = sigmoid(w2*x + b2) # 5
        y = sigmoid(w3*u1 + w4*u2 + b3)
        result_per_each.append(y)
        # 역전파 계산
        E = 0.5*(y-t)**2 # 손실함수
        dE_dw_3 = (y-t)*(1-y)*y*u1 # 출력층 가중치
        dE_dw_4 = (y-t)*(1-y)*y*u2 # 출력층 가중치2
        dE_db_3 = (y-t)*(1-y)*y # 출력층 편향값
        
        dE_dw_1 = (y-t)*(1-y)*y*w3*(1-u1)*u1*x # 은닉층 가중치
        dE_dw_2 = (y-t)*(1-y)*y*w4*(1-u2)*u2*x # 은닉층 가중치
        dE_db_1 = (y-t)*(1-y)*y*w3*(1-u1)*u1 # 은닉층 기준치
        dE_db_2 = (y-t)*(1-y)*y*w4*(1-u2)*u2 # 은닉층 기준치
        
        # 가중치, 기준치 업데이트(Gradient Descent)
        w1 = w1 - alpha * dE_dw_1
        w2 = w2 - alpha * dE_dw_2
        w3 = w3 - alpha * dE_dw_3
        w4 = w4 - alpha * dE_dw_4
        b1 = b1 - alpha * dE_db_1
        b2 = b2 - alpha * dE_db_2
        b3 = b3 - alpha * dE_db_3
    result_array.append(result_per_each)
        
    print(f"{n} Epoch - Error : {E}")
    
x = 0.5
u1 = sigmoid(w1*x + b1)
u2 = sigmoid(w2*x + b2)
y = sigmoid(w3*u1 + w4*u2 + b3)

print(f"실측값 t : {sigmoid(x)}")
print(f"신경망에 의해 예측된 값 y : {y}")
profile
하루가 다르게 성장하기

0개의 댓글