줘이리의 인생적기

[tensorflow 04] 뉴런02 - 뉴런 학습 본문

공부/tensorflow

[tensorflow 04] 뉴런02 - 뉴런 학습

줘이리 2021. 4. 6. 22:00
728x90

sigmoid 활성화 함수를 구현하여, 입력이 1일 때 출력이 0이 되는 뉴런을 만들어보겠습니다.

 

import tensorflow as tf
import math


def sigmoid(x):
    return 1 / (1 + math.exp(-x))

x = 1
y = 0
w = tf.random.normal([1], 0, 1)
output = sigmoid(x * w)

error = y - output

print("output = ", output)
print("error = ", error)

결과

 

0이 되기에는 역부족으로 보입니다.

 

이제 w값을 변화시켜야 하는데 경사하강법을 사용해보겠습니다.

 


경사하강법은 w에 입력과 학습률(α)과 error를 곱한 값을 더해주는 것입니다.

 

w = w + x * α * error

 

 

import tensorflow as tf
import math

def sigmoid(x):
    return 1 / (1 + math.exp(-x))

x = 1
y = 0
w = tf.random.normal([1], 0, 1)
for i in range(1000):
    output = sigmoid(x * w)
    error = y - output
    w = w + x * 0.1 * error

    if i == 1 or i == 999:
        print(i, "output = ", output,"error = ", error)

결과

 

error값이 점점 기대출력 값인 0에 가까워지는 것을 확인할 수 있다.

 


반대로 입력이 0이고 출력이 1을 얻는 뉴런을 만들어보겠습니다.

 

import tensorflow as tf
import math


def sigmoid(x):
    return 1 / (1 + math.exp(-x))

x = 0
y = 1
w = tf.random.normal([1], 0, 1)
for i in range(1000):
    output = sigmoid(x * w)
    error = y - output
    w = w + x * 0.1 * error

    if i == 1 or i == 999:
        print(i, "output = ", output,"error = ", error)

결과

1000번동안 error값이 변하지 않았습니다.

 

이유는 경사하강법의 식에서 x가 0이기 때문에 w에 더해지는 값이 없어서입니다.

 

이런 경우에는 편향(bias)을 뉴런에 넣어 아무것도 배우지 못하는 상황을 방지해주는게 좋습니다.

 


 

편향의 입력은 보편적 값인 1을 넣겠습니다.

 

관용적으로 bias의 앞 글자인 b를 쓰며, w처럼 난수로 초기화되어 뉴런에 더해져 출력되어 집니다.

 

import tensorflow as tf
import math


def sigmoid(x):
    return 1 / (1 + math.exp(-x))

x = 0
y = 1
w = tf.random.normal([1], 0, 1)
b = tf.random.normal([1], 0, 1)

for i in range(1000):
    output = sigmoid(x * w + 1 * b)
    error = y - output
    w = w + x * 0.1 * error
    b = b + 1 * 0.1 * error

    if i == 1 or i == 999:
        print(i, "output = ", output,"error = ", error)

결과

 

w와 b를 업데이트 시키며 뉴런을 학습하였습니다.

 

error는 0에 가까워지고, output은 1에 가까워졌습니다.

'공부 > tensorflow' 카테고리의 다른 글

[tensorflow 06] OR 연산 뉴런  (0) 2021.04.08
[tensorflow 05] AND 연산 뉴런  (0) 2021.04.07
[tensorflow 03] 뉴런01 - 뉴런의 기본  (0) 2021.04.05
[tensorflow 02] 난수 생성  (0) 2021.04.02
[tensorflow 01] 버전 확인  (0) 2021.04.01