반응형

학습이란 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득하는 것 을 뜻합니다.

손실함수 

손실함수의 결괏값을 가장 작게 만드는 가중치 매개변수를 찾는 것이 학습의 목표입니다.

 

손실함수의 값을 가급적 적게 만드는 기법으로 , 함수의 기울기를 활용하는 경사법을 소개합니다.

 

4.1 데이터에서 학습한다. !

데이터에서 학습한다는 것은 가중치 매개변수의 값을 데이터를 보고 자동으로 결정

 

4.1.1 데이터 주도학습

사람의 개입을 최소화 하고 수집한 데이터로부터 패턴을 찾으려 하는 것이 기계학습

 

이미지에서 특징feature을 추출하고 그 특징의 패턴을 기계학습 기술로 학습하는 방법이 있습니다.여기서 말하는 특징은 입력 데이터(입력 이미지)에서 본질적인 데이터(중요한 데이터)를 정확하게 추출할 수 있도록 설계된 변화기를 가리킵니다.

 

데이터로부터 규칙을 찾아내는 역할을 기계가 담당하는 방식이지만

이미지를 벡터로 변환할 때 사용하는 특징은 여전히 사람이 설계

 

적합한 특징을 쓰지 않으면 좋은 결과 얻기 힘들다.

 

딥러닝을 종단간 기계학습 end-to-end machine learning 이라고 도 합니다. 여기서 종단간은 '처음부터 끝까지 '라는 의미로 , 데이터 (입력) 에서 목표한 결과(출력)를 사람의 개입 없이 얻는다는 뜻  => 처음 부터 끝까지 사람이 개입을 안한다.

 

신경망은 모든 문제를 주어진 데이터 그대로를 입력 데이터로 활용해 'end-to-end'로 학습할 수 있습니다.

 

4.1.2 훈련 데이터와 시험 데이터

training data

test data

우선 훈련데이터만 사용하여 학습하면서 최적의 매개변수를 찾습니다.

그런 다음 시험 데이터를 사용하여 앞서 훈련한 모델의 실력을 평가하는 것입니다.

 

데이터 나누는 이유 :

벙용적으로 사용할 수 있는 모델을 만들려고 하기 때문에

범용능력을 제대로 평가하기 위해 훈련 데이터와 시험데이터를 분리하는 것이죠 

범용능력은 아직 보지 못한 데이터(훈련 데이터에 포함되지 않는 데이터)로도 문제를 올바르게 풀어내는 능력입니다.

 

오버피팅overfitting : 한 데이터셋에만 지나치게 최적화된 상태

 

4.2 손실 함수 

신경망 학습에서는 현재의 상태를 '하나의 지표'로 표현합니다. 

 

loss function  신경망 학습에서 사용하는 지표 

손실 함수는 임의의 함수를 사용할 수 도 있지만 일반적으로는 평균 제곱 오차와 교차 엔트로피 오차를 사용합니다.

손실 함수는 신경망 성능의 '나쁨'을 나타내는 지표로 , 현재의 신경망이 훈련 데이터를 얼마나 잘 처리 하지 '못'하느냐를 나타냅니다.

 

4.2.1 평균제곱오차 mean squared error MSE 

회귀 문제에서 손실 함수로 사용

MSE는 단순히 예측값과 목표값의 차이의 제곱에 대한 평균

yk는 신경망의 출력(신경망이 추정한 값), tk는 정답 레이블 , k는 데이터 차원 수를 나타냅니다. 

 

원-핫 인코딩 : 한 원소만 1로 하고 그 외는 0으로 나타내는 표기법

 

4.2.2 교차엔트로피 오차 cross entropy error CEE 

분류 문제에서 손실 함수로 사용

log는 밑이 e인 자련로그 입니다. 

yk는 신경망의 출력, tk는 정답 레이블입니다. 

또 tk는 정답에 해당하는 인덱스의 원소만 1이고 나머지는 0입니다. (원-핫 인코딩)

 

x가 1일때 y는 0이 되고 x가 0에 가까워질 수록 y의 값은 점점 작아집니다. 

마찬가지로 정답에 해당하는 출력이 커질 수록 0에 다가가다가 , 그 출력이 1일 때 0 이 됩니다.

반대로 정답일 때의 출력이 작아질수록 오차는 커집니다. 

 

Predicted probability가 실제 label 값으로 부터 멀어질수록 값이 증가

 

4.2.3 미니배치 학습 

 

모든 데이터를 대상으로 손실 함수의 합을 구하려면 시간이 오래 걸림

 

그래서  미니배치 사용 mini-batch

6,000장의 훈련 데이터 중에서 100장을 무작위로 뽑아 그 100장 만을 사용하여 학습 하는 것입니다.

 

훈련 데이터데이터 일부를 추려 전체의 근사치로 이용

np.random.choice()로는 지정한 범위의 수 중에서 무작위로 원하는 개수만 꺼낼 수 있습니다.

 

4.2.3 (배치용)교차 엔트로피 오차 구현하기

y는 신경망의 출력, t는 정답 레이블입니다. 

y가 1차원이라면, 즉 데이터 하나당 교차 엔트로피 오차를 구하는 경우는 reshape함수로 데이터의 형상을 바꿔줍니다. 

그리고 배치의 크기로 나눠 정규화하고 이미지 1장당 평균의 교차 엔트로피 오차를 계산합니다. 

 

4.2.5 왜 손실 함수를 설정하는 가 ?

가중치 매개변수의 손실함수의 미분이란' 가중치 매개변수의 값을 아주 조금 변화시켰을 때 , 손실함수가 어떻게 변하나'라는 의미입니다.

만약 이 미분값이 음수면 그 가중치 매개변수를 양의 방향으로 변화시켜 손실함수의 값을 줄일 수 있습니다.

반래도 ,  이 미분값이 양수면 그 가중치 매개변수를 음의 방향으로 변화시켜 손실함수의 값을 줄일 수 있습니다. 

그러나 미분 값이 0이면 가중치 매개변수를 어느쪽으로 움직여도 손실함수의 값은 줄어들지 않습니다. 그래서 그 가중치 매개변수의 갱신은 거기서 멈춥니다.

 

계단 함수를 이용하면 손실 함수를 지표로 삼는게 아무 의미가 없습니다.

매개변수의 작은 변화가 주는 파장을 계단 함수가 말살하여 손실 함수의 값에는 아무런 변화가 나타나지 않기때문입니다.

 

4.3 수치 미분 numerical difference

4.3.1 미분

미분은 특정 순간의 변화량을 뜻합니다.

한순간의 변화량

f(x)의 x에 대한 미분: x에 대한 f(x)의 변화량

x의 '작은 변화'가 함수 f(x)를 얼마나 변화시키는가

 

반올림 오차 rounding error : 작은 값( 가령 소수점 8자리 이하)이 생략되어 최종 계산 결과에 오차가 생기게 합니다.

 

너무 작은 값을 이용하면 컴퓨터로 계산하는 데 문제가 된다.

아주 작은 차분으로 미분하는 것을 수치미분 이라 합니다.

 

수치 미분에는 오차가 포함됩니다.

(x+h)와 (x-h) 일 떄의 함수 f의 차분을 계산하는 방법을 쓰기도 합니다. 

중심 차분 혹은 중앙 차분이라 합니다. 

전방 차분: (x + h)와 x의 차분

중앙 차분: (x + h)와 (x -h)의 차분

 

아주 작은 차분으로 미분하는 것을 수치 미분이라 합니다.

 

4.3.2 수치 미분의 예

 

=>밉분으로 하면  df(x)/dx = 0.02x + 0.1

 

4.3.3 편미분

변수가 여럿인 함수에 대한 미분

미분하려면, 변수가 2개이기에 어느 변수에 대한 미분이냐를 구별

여러변수 중 목표 변수 하나에 초점을 맞추고 다른 변수는 값을 고정합니다.

 

4.4 기울기 gradient

모든 변수의 편미분을 벡터로 정리한 것 

 

기울기가 가리키는 쪽은 각 장소에서 함수의 출력 값을 가장 크게 줄이는 방향입니다. 

가장 낮은 장소(최솟값)

4.4.1 경사법(경사 하강법)

신경망은 학습 단계에서 최적의 매개변수를 찾아야 함

 

최적 : 손실함수가 최솟값이 될 때의 매개변수 값

매개변수 공간이 광대하여 어디가 최솟값이 되는 곳인지를 짐작할 수 없습니다.  

함수가 극솟값, 최솟값,  또 안장점 saddle point이 되는 장소에서는 기울기가 0입니다.

기울어진 방향이 꼭 최솟값을 가리키는 것은 아니다, 그 방향으로 가야 함수의 값을 줄일 수 있습니다.

경사 하강법 gradient descent method : 최솟값 찾는것 

경사 상승법 gradient ascent method: 최댓값 찾는 것 

 

학습률  에타 는 갱신하는 양 

하이퍼파라미터 hyper parameter 초매개변수 학습룰 같은 매개변수

 

4.4.2 신경망에서의 기울기 

신경망 학습에서도 기울기를 구해야 함

가중치 매개변수에 대한 손실함수의 기울기

 

4.5 학습 알고리즘 구현하기

확률적 경사 하강법 stochastic gradient descednt,  데이터를 미니배치로 무작위로 선정하기 때문 

'확률적으로 무작위로 골라낸 데이터'에 대해 수행하는 경사 하강법이라는 의미 SGD

 

1단계 - 미니배치 훈련 데이터 중 일부를 무작위로 가져옴

2단계 - 기울기 산출 각 가중치 매개변수의 기울기(손실 함수의 값을 작게 하는 방향)를 구함

3단계 - 매개변수 갱신 가중치 매개변수를 기울기 방향으로 조금 갱신

4단계 - 반복 1~3단계를 반복

 

 

4.5.1 2층 신경망 클래스 구현하기

오차역전파법을 사용하여 기울기를 효율적으로 빠르게 계산 할 수 있습니다. 

 

4.5.2 미니배치 학습 구현하기

확률적 경사 하강법을 수행해 매개변수를 갱신합니다. 

 

4.5.3 시험 데이터로 평가하기 

훈련 데이터의 손실 함수 값이 작아지는 것은 신경망이 잘 학습하고 있다는 방증이지만, 

이 결과만으로는 다른 데이터셋에도 비슷한 실력을 발휘할지는 확실하지 않습니다. 

 

범용 능력

 

1 epoch 별로 훈련 데이터와 시험 데이터에 대한 정확도를 기록

epoch은 학습에서 훈련 데이터를 모두 소진했을 때의 단위

 

1 epoch 마다 모든 훈련 데이터와 시험 데이터에 대한 정확도를 계산

epoch이 증가할수록 훈련 데이터와 시험 데이터 모두 정확도 상승

Overfitting이 일어나지 않았음을 알 수 있음

 

 

반응형

' > 밀바닥부터 시작하는 딥러닝' 카테고리의 다른 글

06. 학습 관련 기술들  (0) 2020.10.20
05. 오차역전파법  (0) 2020.10.16
03. 신경망  (0) 2020.09.23
02. 퍼셉트론  (0) 2020.09.21
01. 헬로 파이썬  (0) 2020.09.18
반응형

출처 : 밑바닥부터 시작하는 딥러닝 

퍼셉트론 관련해서 

좋은 소식: 복잡한 함수도 표현할 수 있다는 것 =>컴퓨터가 수행하는 복잡한 처리도 퍼셉트론으로 (이론상) 표현할 수 있음을 앞 장에서 설명했습니다.

나쁜 소식: 가중치를 설정하는 작업(원하는 결과를 출력하도록 가중치 값을 적절히 정하는 작업)은 여전히 사람이 수동으로 한다는 것입니다. => 신경망이 해결해준다. 

가중치 매개변수 값 

 

3.1 퍼셉트론에서 신경망으로

 

3.1.1 신경망의 예

가장 왼쪽 은 입력층 

맨 오른쪽 출력층 

중간 줄은 은닉층(입력층이나 출력층과 달리) 사람 눈에는 보이지 않습니다. 

0층, 1층, 2층 (층 번호를 0부터 시작하는 이유는 파이썬 배열의 인덱스도 0부터 시작하여 , 나중에 구현할 때 짝짓기 편하기 때문입니다.

 

신경망은 모두 3층으로 구성됩니다만, 가중치를 갖는 층은 2개뿐이기 때문에 '2층 신경망'이라고 합니다.

 

3.1.2 퍼셉트론 복습

퍼셉트론 복습

b 편향  : 매개변수 , 뉴런이 얼마나 쉽게 활성화되느냐를 제어합니다

w 가중치 : 매개변수, 각 신호의 영향력을 제어합니다 

네트워크에는 b가 보이지 않습니다. 여기에 편향을 명시한다면 아래와 같습니다 

가중치가 b이고 입력이 1인 뉴런이 추가되었습니다 

이 퍼셉트론의 동작은 x1, x2, 1이라는 3개의 신호가 뉴런에 입력되어 , 각 신호에 가중치를 곱한 후 , 다음 뉴런에 전달됩니다.

다음 뉴런에서는 이 신호들의 값을 더하여 , 그 합이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력합니다.

y = h( b + w1x1 + w2x2)

 

 

3.1.3 활성화 함수의 등장

activation function : 조금전 h(x)라는 함수가 등장했는데 , 이처럼 입력 신호의 총합을 출력 신호로 변환하는 함수를 일반적으로 활성하 함수라 합니다. 

활성화 라는 이름이 말해주듯 활성화함수는 입력 신호의 총합이 활성화를 일으키는지를 정하는 역할을 합니다.

 

가중치가 곱해진 입력 신호의 총합을 계산하고 , 그 합을 활성화 함수에 입력해 결과를 내는 2단계로 처리됩니다. 

가중치가 달린 입력 신호와 편향의 총합을 계산하고 , 이를 a라 합니다. 

a를 함수 h()에 넣어 y를 출력하는 흐름입니다. 

뉴런 과 노드 

활성화 함수 h()

 

일반적으로 단순 퍼셉트론은 단층 네트워크에서 계단 함수(임계값을 경계로 출력이 바뀌는 함수)를 활성화 함수로 사용한 모델을 가리키고 

다층 퍼셉트론은 신경망(여러 층으로 구성되고 시그모이드 함수 등의 매끈한 활성화 함수를 사용하는 네트워크)을 가리킵니다.

 

3.2.2 활성화 함수

3.2.1 시그모이드 함수 sigmoid function

e는 자연 상수로 2.7182.. 의 값을 갖는 실수

h(x) = 1 /( 1+ exp^(-x)) exp^(-x) => e ^(-x)

함수는 입력을 주면 출력을 돌려주는 변환기죠 

신경망에서는 활성화 함수로 시그모이드 함수를 이용하여 신호를 변환하고 , 그 변환된 신호를 다음 뉴런에 전달합니다. 

퍼셉트론과 앞으로 볼 신경망의 주된 차이는 이 활성화 함수 뿐입니다.

 

3.2.2 계단 함수 구현하기

입력이 0을 넘으면 1을 출력하고 , 그 외에는 0을 출력하는 함수 입니다. 

def step_funtion(x):
    if x > 0:
        return 1
    else:
        return 0

x는 실수(부동소수점)만 받아들입니다. 

 

배열 지원 

def step_function(x):
    y = x>0
    return y.astype(np.int)

x라는 넘파이 배열을 준비하고  그 넘파이 배열에 부등호 연산을 수행합니다 

bool 배열 - 각각 원소에 부등호 연산 

 

astype() 메서드를 배열의 자료형을 변환할 때 

True는 1로 , False는 0으로 변환

 

 

3.2.3 계단 함수의 그래프 

matplotlib 라이브러리를 사용 

def step_function(x):
    return np.array( x >0 , dtype= np.int)

x = np.arange(-5.0, 5.0, 0.1)
y = step_function(x)
plt.plot(x,y)
plt.ylim(-0.1, 1.1)
plt.show()

-0.5 에서 5.0 전 까지 0.1 각격의 넘파이 배열을 생성합니다. 

0을 경계로 출력이 0에서 1(또는 1에서 0)로 바뀝니다.

 

3.2.4 시그모이드 함수 구현하기

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

np.exp(-x) 는 exp(-x)수식에 해당합니다. 

x = np.array([-1.0, 1.0, 2.0])
sigmoid(x)

이 함수가 넘파이 배열도 훌륭히 처리해줄 수 있는 비밀은 넘파이의 브로드캐스트에 있습니다.

브로드캐스트 기능이란 넘파일 배열과 스칼라값의 연산을 넘파이 배열릐 원소 각각과 스칼라값의 연산으로 바꿔 수행하는 것입니다.

x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x,y)
plt.ylim(-0.1, 1.1)
plt.show()

3.2.5 시그모이드 함수와 계단 함수 비교

입력이 작을 때의 출력은 0에 가깝고(혹은 0 이고 ). 입력이 커지면 출력이 1에 가까워지는(혹은 1이 되는)구조인 것이다.

계딴 함수와 시그코이드 함수는 입력이 중요하면 큰 값을 출력하고 입력이 중요하지 않으면 작은 값을 출력합니다.

그리고 입력이 아무리 작거나 커도 출력은 0에서 1사이라는 것도 둘의 공통점입니다.

 

차이점 1

시그모이드 함수는 부드러운 곡선이며 입력에 따라 출력이 연속적으로 변화

계단 함수는 0을 경계로 출력이 갑자기 변화

차이점 2

계단 함수가 0과 1 중 하나의 값 반환

시그모이드는 0과 1 사이의 실수를 반환

공통점

입력이 작을 때 출력은 0 입력이 커지면 출력이 1이 되는 구조

입력이 아무리 작거나 커도 출력은 0에서 1 사이의 값

 

3.2.6 비선형 함수

시그모이드 함수와 계단 함수는 비선형 함수로 분류됩니다.

비선형 함수는 문자 그래도 '선형이 아닌' 함수 입니다.
신경망에서는 활성화 함수로 비선형 함수를 상용해야 합니다.

 

3.2.7 ReLU함수 Rectified Linear Unit

0이하이면 0을 출력하는 함수 

0 을 넘으면 그 입력을 그대로 출력 

def relu(x):
    return np.maximum(0,x)

maximum 두 입력 중 큰 값을 선택해 반환하는 함수 입니다. 

 

3. 다차원 배열의 계산

3.3.1 다차원 배열

import numpy as np
A = np.array([1,2,3,4])
print(A)
print(np.ndim(A))
print(A.shape)
print(A.shape[0])

배열의 차원 수 np.ndim()

배열의 형상은 인스턴스 변수인 shape으로 알 수 있십니다.

import numpy as np
B = np.array([[1,2],[3,4],[5,6]])
print(B)
print(np.ndim(B ))
print(B.shape)
print(B.shape[0])

2차원 배열은 특히 행렬matrix이라고 부르고 , 가로 방향을 행, 세로 방향을 열 이라고 합니다.

 

3.3.2 행렬의 곱

 

1 2
3 4

 

5 6
7 8

 

19 (1 * 5 + 2 * 7 ) 22
43 (3 * 5 + 4 * 7) 50
A = np.array([[1,2,3],[4,5,6]])
B = np.array([[1,2],[3,4],[5,6]])
print(np.dot(A,B))

matrixmultiplication.xyz/

 

Matrix Multiplication

 

matrixmultiplication.xyz

 

3.3.3 신경망에서의 행렬 곱

 Y = np.dot(X,W)

 

3.4 3층 신경망 구현하기 

 

3.4.1 표기법 설명

 

3.4.2 각 층의 신호 전달하기 

A1 = np.dot(X,W1)+ B1

identity_function() 항등함수 입력을 그대로 출력하는 함수

출력층의 활성화 함수는 σ() 로 표현 (은닉층의 활성화 함수 h())

 

3.4.3 구현 정리

forward()라는 함수를 정의합니다. 

forward라 한 것은 신호가 순방향(입력에서 출력 방향)으로 전달됨(순전파)을 알리기 위함입니다. 

역방향(backward)

 

3.5 출력층 설계하기 

신경망은 분류와 회귀 모두에 이용할 수 있습니다. 

회귀에는 항등 함수

분류에는 소프트맥스 함수 

 

3.5.1 항등함수 와 소프트맥스 함수 구현하기

항등함수는identity function  입력을 그대로 출력합니다.입력과 출력이 항상 같다

소프트맥스 함수  softmax 함수 

지수함수 exponential function 

출력 층의 각 뉴런이 모든 입력 신호에서 영향을 받기 때문입니다

def softmax(a):
	exp_a = np.exp(a)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
	return y

 

3.5.2소프트맥스 함수 구현시 주의점

오버플로 문제가 생길 수 있다. 

softmax()

np.exp(a-c) / np.sum(np.exp(a-c))

개선 된 수식 

def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a-c) #오버플로 대책
    sum_exp_a = np.sum(exp_a)
    y = exp_a/ sum_exp_a
    return y

a = np.array([0.3, 2.9, 4.0])
y = softmax(a)
print(y)
print(np.sum(y))

 

3.5.3 소프트 맥스 함수의 특징

소프트함수의 출력은 0에서 1.0 사이의 실수입니다. 소프트맥스 함수 출력의 총합은 1입니다. 

총합이 1인 것은 중요한 성질입니다. => ' 확률'로 해석할 수있습니다. 

주의점으로 , 소프트맥스 함수를 적용해도 각 원소의 대소 관계는 변하지 않습니다.

결과적으로  신경망으로 분류할 때는 출력층의 소프트맥스 함수를 생략해도 됩니다 .

 

3.5.4 출력층의 뉴런 수 정하기

출력층의 뉴런 수는 풀려는 문제에 맞게 적절히 정해야 합니다. 

분류에서는 분류하고 싶은 클래스 수로 설정하는 것이 일반입니다. 

 

3.6 손글씨 숫자 인식

이미 학습된 매개변수를 사용하여 학습 과정은 생략하고 , 추론 과정만 구현할 겁니다.

이 추론 과정을 신경망의 순전파 forward propagation라고도 합니다.

 

3.6.1 MNIST 데이터 셋 

이미지 인식이나 기계학습 논문들을 읽다 보면 실험용 데이터로 자주 등장하는 것을 확인할 수 있습니다.

import sys, os
sys.path.append(os.pardir) #부모 디렉터리의 파일을 가져올 수 있도록 설정
from dataset.mnist import load_mnist

(x_train, t_train) , (x_test, t_test) = \
    load_mnist(flatten = True, normalize = False)

print(x_train.shape)
print(t_train.shape)
print(x_test.shape)
print(t_test.shape)

 

normalize는 입력 이미지의 픽셀 값을 0.0 ~ 1.0 사이의 값으로 정규화 할지를 정합니다.

False로 설정하면 입력 이미지의 픽셀 은 원래 값 그대로 0 ~ 255 사이의 값을 유지합니다.

flatten은 입력 이미지를 평탄하게 , 즉 1차원 배열로 만들지를 정합니다. 

False로 설정하면 입력 이미지를 1 * 29 * 28 의 3차원 배열로 ,True로 설정하면 784 개의 원소로 이뤄진 1차원 배열로 저장합니다.

one_hot_label은 레이블을 원-핫 인코딩 형태로 저장할지를 정합니다.

 

import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, t_train) , (x_test, t_test) = mnist.load_data()
#x_train, x_test = x_train / 255.0, x_test / 255.0

print(x_train.shape)
print(t_train.shape)
print(x_test.shape)
print(t_test.shape)

배치 처리 

PIL python Image Library 모듈을 사용합니다. 이미지 표시에는 

reshape()메서드에 원하는 형상을 인수로 지정하면 넘피이 배열의 형상을 바꿀수 있습니다.

넘파이로 저장된 이미지 데이터를 PIL용 데이터 객체로 변환해야 하며 , 이 변환은 Image.fromarray()가 수행합니다.

 

3.6.2 신겸앙의 추론 처리

pickle파일 학습된 가중치 매개변수

정확도 

predict()함수는 각 레이블의 확률을 넘파이 배열로 반환합니다.

 

데이터를 특정 범위로 변환하는 처리를 정규화 normalization라 하고 

신경망의 입력 데이터에 특정 변화을 가하는 것을 전처리 pre-processing라 합니다.

 

3.6.3 배치 처리

range()함수는 range(start, end)처럼 인수를 2개 지정해 호출하면 start에서 end-1까지의 정수로 이뤄진 리스트를 반환합니다.

 

argmax()는 최대값의 인덱스를 가져옵니다.

aixs = 1 이라는 인수를 추가한것에 주의합시다. 

y = np.argmax(x, axis = 1)

 

배치 하나로 묶은 입력 데이터를 배치라고 합니다. 

 

반응형

' > 밀바닥부터 시작하는 딥러닝' 카테고리의 다른 글

06. 학습 관련 기술들  (0) 2020.10.20
05. 오차역전파법  (0) 2020.10.16
04. 신경망 학습  (0) 2020.09.25
02. 퍼셉트론  (0) 2020.09.21
01. 헬로 파이썬  (0) 2020.09.18
반응형

출처 : 밑바닥부터 시작하는 딥러닝

 

퍼셉트론perceptron 프랑크 로젠블라트 Frank Rosenblatt

퍼셉트론이 신경망(딥러닝)의 기원이 되는 알고리즘이기 때문입니다.

 

2.1 퍼셉트론 이란 ?

퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력합니다.

여기서 말하는 신호란 전류나 강물처럼 흐름이 있는 것을 상상하면 좋습니다.

전류  로 생각하면 되는데 실제 전류와 달리 퍼셉트론 신호는 '흐른다/ 안 흐른다(1이나 0) ' 의 두 가지 값을 가질 수 있습니다. 

1은 신호가 흐른다. 0은 신호가 흐르지 않는다.

 

x1, x2는 입력신호 , y는 출력 신호 , w1과 w2는 가중치를 뜻합니다. 

그림의 원을 뉴런 혹은 노드

w1, w2 가중치 

w1x1, w2x2 

뉴런이 활성화 한다.  뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력합니다. 

한계를 임계값이라고 하며 θ 기호 theta 세타라 합니다.

가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용합니다. 

가중치가 클 수록 해당 신호가 그만큼 더 중요함을 뜻합니다. 

 

2.2 단순한 논리 회로

2.2.1 AND 게이트

진리표 입력 신호와 출력 신호의 대응표를 진리표라고 합니다.

모두 1이여야 1이다.

x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1

 

 

2.2.2 NAND게이트와 OR게이트

NAND NOT AND  모두 1이면 0이다.

x1 x2 y
0 0 1
1 0 1
0 1 1
1 1 0

OR 모두 0이면 0이다. 

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1

학습이란 적절한 매개변수 값을 정하는 작업이며, 사람은 퍼셉트론의 구조(모델)을 고민하고 컴퓨터에 학습할 데이터를 주는 일을 합니다. 

 

퍼셉트론의 구조는 똑같지만  세가지 게이트에서 다른 매개변수( 가중치와 임계값)의 값뿐입니다. 

 

2.3 퍼셉트론 구현하기

 

AND구현하기 

def AND(x1,x2):
    w1, w2, theta = 0.5, 0.6, 0.7
    tmp = x1*w1 + x2* w2
    if tmp <= theta:
        return 0
    elif tmp>theta:
        return 1

print(AND(0,0))
print(AND(1,0))
print(AND(0,1))
print(AND(1,1))

2.3.2 가중치와 편향 도입

θ를 -b로 치환하면 프셉트론의 동작이 아래처럼 됩니다. 

b를 편향 bias

w1, w2 가중치 weight

0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력합니다. 

numpy 배열끼리의 곱셈은 두 배열의 원소 수가 같다면 각 원소끼리 곱합니다. 

w*x

 

2.3.3 가중치와 편향 구현하기

AND게이트 

def AND(x1,x2):
    x= np.array([x1,x2])
    w = np.array([0.5, 0.5])
    b = -0.7
    tmp = np.sum(w * x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

print(AND(0,0))
print(AND(1,0))
print(AND(0,1))
print(AND(1,1))

W1,W2는 각 입력 신호가 결과에 주는 영향력(중요도_을 조절하는 매개변수고 , 편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력) 하느냐를 조정하는 매개변수 입니다. 

편향의 값은 뉴런이 얼마나 쉽게 활성화 되는지를 결정합니다. 

 

NAND게이트와 OR게이트를 구현 

def NAND(x1,x2):
    x= np.array([x1,x2])
    w = np.array([-0.5, -0.5])
    b = 0.7
    tmp = np.sum(w * x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

print(NAND(0,0))
print(NAND(1,0))
print(NAND(0,1))
print(NAND(1,1))

def OR(x1,x2):
    x= np.array([x1,x2])
    w = np.array([0.5, 0.5])
    b = -0.2
    tmp = np.sum(w * x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

print(OR(0,0))
print(OR(1,0))
print(OR(0,1))
print(OR(1,1))

2.4 퍼셉트론의 한계

2.4.1 도전 !XOR게이트

XOR 게이트는 배타적 논리합이라는 논리 회로입니다.

X1과 X2중 한쪽이 1일 때만 1을 출력합니다.('배타적'이란 자기외에는 거부한다는 의미죠 )排他

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 0

or게이트의 동작을 시각적으로 생각해보죠 .

0을 원 , 1을 삼각형으로 표시

실제로 이 그림의 직선은 네 점을 제대로 나누고 있습니다.

2.4.2 선형과 비선형

비선형 영역 : 곡선 영영

선형 영역 : 직선의 영역  

퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있습니다.

ko.wikipedia.org/wiki/AND_%EA%B2%8C%EC%9D%B4%ED%8A%B8

 

AND 게이트 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

ko.wikipedia.org/wiki/OR_%EA%B2%8C%EC%9D%B4%ED%8A%B8

 

OR 게이트 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

ko.wikipedia.org/wiki/NAND_%EA%B2%8C%EC%9D%B4%ED%8A%B8

 

NAND 게이트 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

ko.wikipedia.org/wiki/XOR_%EA%B2%8C%EC%9D%B4%ED%8A%B8

 

XOR 게이트 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. INPUT OUTPUT A B A XOR B 0 0 0 0 1 1 1 0 1 1 1 0 XOR 게이트, EOR 게이트, EXOR 게이트는 참 입력의 개수가 홀수일 때 참 (1/HIGH) 출력을 내보내는 디지털 논리 게이트이다. 배타

ko.wikipedia.org

"단층 퍼셉트론 single-layer perceptron 으로는 xor게이트를 표현할 수 없다." 또는 " 단층 퍼셉트론으로는 비선형 영역을 분리할 수 없다" 가 됩니다.

xor진리표 

x1 x2 s1 s2 y
0 0 1 0 0
1 0 1 1 1
0 1 1 1 1
1 1 0 1 0

 

 

2.5 다층 퍼셉트론의 충돌한다면 

층을 쌓는다. multi-layer percptron을 만들 수 있다는데 있습니다. 

 

2.5.1 기존 게이트 조합하기

2.5.2 XOR 게이트 구현하기

def XOR(x1,x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(x1, s2)
    return y

print(XOR(0,0))
print(XOR(1,0))
print(XOR(0,1))
print(XOR(1,1))

 

0층 1층 2층 왼쪽부터  

xor는 2층 퍼셉트론입니다. 

여러 개인 퍼셉트론을 다층 퍼셉트론이라 합니다. 

퍼셉트론은 모두 3층으로 구성됩니다만 , 가중치를 갖는 층은 사실 2개(0층과 1층사이 , 1층과 2층 상이) 뿐이니 '2층 퍼셉트론'이라 부르기로 합시다. 

1. 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보낸다.

2. 1층의 뉴런이 2층의 뉴런으로 신호를 보내고 , 2층의 뉴런은 y를 출력한다.

 

 

단층 퍼셉트론으로는 표현하지 못한 것을 층을 하나 늘려 구현할 수 있었습니다.

층을 쌓아(깊게 하여 ) 더 다양한 것을 표현할 수 있답니다. 

 

2.6 NAND 에서 컴퓨터까지

복잡한 회로

 

반응형

' > 밀바닥부터 시작하는 딥러닝' 카테고리의 다른 글

06. 학습 관련 기술들  (0) 2020.10.20
05. 오차역전파법  (0) 2020.10.16
04. 신경망 학습  (0) 2020.09.25
03. 신경망  (0) 2020.09.23
01. 헬로 파이썬  (0) 2020.09.18
반응형

출처 : 밑바닥부터 시작하는 딥러닝

 

1.1 파이썬이란?

간단하고 배우기 쉬운 프로그래밍 언어입니다.

오픈 소스라 무료로 자유롭게 이용할 수도 있지요.

영어와 유사한 문법으로 프로그램을 작성할 수 있고 불편한 컴파일 과정도 없어서 편리합니다. => 입문자에게 최적인 언어입니다.

 

파이썬 코드는 읽기 쉽고 성능도 뛰어납니다.

데이터가 많거나 빠른 응답이 필요할 떄도 파이썬은 제 몫을 톡톡히 해냅니다.

실제로 구글과 마이크로소프트, 페이스북 등 IT첨단에서 겨루는 기없들은 파이썬을 자주 사용하고 있답니다.

넘파이와 사이파이 Scipy같은 수치 계산과 통계 처리를 다루는 탁월한 라이브러리가 더해져 데이터 과학 분야에엇 확고한 위치를 차지하고 있죠 . 딥러닝 프레임워크 쪽에서도 

예: 카페, 텐서플로, 체이너 , 테아노 같은 유명 딥러닝 프레임워크들이 파이썬용 API를 제공합니다.

 

1.2 파이썬 설치하기

1.2.1 파이썬 버전

파이썬 2.x와 3.x 버전 100%호환되는 것이 아니다. 그래서 어느 버전을 설치할지 신중하게 선택해야 합니다.

(정확히 말하면 '하위 호환성' 이 없습니다.)

 

1.2.2 사용하는 외부 라이브러리

넘파이 , matplotlib =>딥러닝을 구현하기 위해서 

넘파이: 수치 계산용 라이브러리 입니다. 고도의 수학 알고리즘과 배열(행렬)을 조작하기 위한 편리한 메소드가 많다.  효율적 으로 구현 가능

matplotlib :  그래프를 그려주는 라이브러리 입니다.  시각화 

 

파이썬

넘파이

matplotlib

 

1.2.3 아나콘다 배포판

배포판: 사용자가 설치를 한 번에 수행할 수 있도록 필요한 라이브러리 등을 하나로 정리해둔 것입니다.

그중 아나콘다는 데이터 분석에 중점을 둔 배포판입니다.

 

1.3 파이썬 인터프리터

버전 확인 

python --version

1.3.1 산술 연산 덧셈과 곱셈 등

* 곱셉

/ 나눗셈

** 거듭제곱

파이썬 3에서는 정수를 나눈 결과는 실수(부동소수점)가 됩니다.

 

1.3.2 자료형

자료형이란 데이터의 성지를 나타내는 것

type()로 확인

 

1.3.3. 변수

x와 y등의 알파벳을 사용하여 변수를 정의할 수 있습니다.

변수를 사용하여 계산하거나 다른 값을 대입할 수도 있습니다.

 

파이썬은 동적언어로 분류되는 프로그래밍 언어입니다.

동적이라 함은 변수의 자료형을 상황에 맞게 자동으로 결정한다는 뜻입니다.

# 주석 처리

 

1.3.2 리스트

a = [1,2,3,]

[]안의 수를 인덱스(색인)라 하며 인덱스는 0부터 시작합니다.

슬라이싱 slicing이라는 편리한 기법이 준비되어 있습니다. 범위를 지정해 원하는 부분 리스트를 얻을 수 있습니다.

 

1.3.5 딕셔너리 

키와 값을 한 쌍으로 저장합니다.

{"":""}

 

1.3.6 bool

True(참)와 False(거짓) 라는 두 값 중 하나를 취합니다.

and, or, not 연산자를 사용할 수 있습니다. 

 

1.3.7 if문

파이썬에서는 공백 문자가 중요한 의미를 지닙니다. 

4개의 공백 문자가 있습니다. 탭

 

1.3.8 for문

for ... in ...: 구분을 사용하면 리스트 등 데이터 집합의 각 원소에 차례로 접근할 수 있습니다.

 

1.3.9 함수

 

1.4 파이썬 스크립트 파일

1.4.1 파일로 저장하기

1.4.2 클래스

클래스에는 그 클래스만의 전용 함수(메서드)와 속성을 정의 할 수도 있습니다.

__init__라는 특별한 메소드가 있는데 , 클래스를 초기화 하는 방법을 정의합니다.

이 초기화용 메서드를 생성자 constructor라고도 하며 , 클래스의 인스턴스가 만들어질 때 한 번만 불립니다.

파이썬에서는 첫 번쨰 인수로 자신(자신의 인스턴스)을 나타내는 self를 명시적으로 쓰는 것이 특징입니다.

 

인스턴스 변수는 인스턴스 별로 저장되는 변수입니다.

파이썬에서는 self.name 다음에 속성 이름을 써서 인스턴스 변수를 작성하거나 접근할 수 있습니다. 

 

1.5 넘파이

 

1.5.1 넘파이 가져오기 

import numpy as np 

 

1.5.2 넘파이 배열 생성하기

np.array()는 파이썬의 리스트를 인수로 받아 넘파이 라이브러리가 제공하는 특수한 형태의 배열을 반환합니다.

x= np.array([])

 

1.5.3 넘파이의 산술 연산

원소별 element-wise : 원소 수가 같아야 한다. 원소수가 다르면 오류가 발생하니 원소 수 맞추기는 중요하답니다. 

넘파이 배열은 원소별 계산 뿐 아니라 넘파이 배열과 수치 하나(스칼라값)의 조합으로 된 산술 연산도 수행할 수 있습니다.이 경우 스칼라값과 계산이 넘파이 배열이 원소별로 한번씩 수행됩니다. 이 기능을 브로드캐스트라고 합니다.

X = np.array([])

X/ 2.0

 

1.5.4 넘파이의 N차원 배열

1차원 백터

2차원 행렬 matrix

백터와 행렬을 일반화한 것을 텐서라고 합니다. 

3차원 이상의 배열을 다차원 배열이라고 합니다.

shape 행렬의 형상 

행렬에 담긴 원소의 자료형은 dtype으로 알 수 있습니다. 

 

1.5.5 브로드 캐스트 broadcast

1.5.6 원소 접근

원소의 인덱스는 0부터 시작합니다. 

1차원 배열로 X.flatten()

 

1.6 matplotlib 그래프를 그려주는 라이브러리

 

1.6.1 단순한 그래프 그리기

plt.plot

plt.show()

 

1.6.2 pyplot의 기능

plt.legend()

 

 

1.6.3 이미지 표시하기 

imread()

imshow()

 

1.7정리

 

 

반응형

' > 밀바닥부터 시작하는 딥러닝' 카테고리의 다른 글

06. 학습 관련 기술들  (0) 2020.10.20
05. 오차역전파법  (0) 2020.10.16
04. 신경망 학습  (0) 2020.09.25
03. 신경망  (0) 2020.09.23
02. 퍼셉트론  (0) 2020.09.21

+ Recent posts