Python/인공지능

AI (퍼셉트론/ numpy/ pandas/ 은닉층/ 옵티마이저/ input_shape/ batch_size/ 손실함수/ 활성화 함수)

아리빠 2023. 5. 8. 12:24

●AI

-인공지능과 머신러닝, 딥러닝

 

 

● 딥러닝

 

- 일련의 단계들 또는 레이어들의 연산을 사용하는 머신러닝 알고리즘

- 레이어를 세로로 쌓았을 때 모양 때문에 깊이라고 부름

 

 


 퍼셉트론

 

- 인공 신경망의 한 종류

- 뉴런의 모델을 모방하여 입력층, 출력층으로 구성한 모델

- 구성 요소: 입력값, 가중치, 활성화 함수, 출력값(예측값)

 

 

 

다층 퍼셉트론

 

- 딥러닝은 다층 퍼셉트론 구조에서 파생

- 명칭: 노드(node, 뉴런)는 에지라고 하는 선으로 연결

- 입력층,은닉층,출력층으로 구성

● 퍼셉트론과 다층 퍼셉트론의 차이점은?

 

- 은닉층의 유무

- 은닉층은 입력층과 출력층 사이에 위치하며, 입력 데이터를 여러 개의 가중치와 함께 처리하여 출력층으로 전달한다 
- 은닉층을 추가함으로써, 다중 퍼셉트론은 보다 복잡한 비선형적인 관계를 모델링할 수 있다

 

 

 


● 코드 실습

# 1.데이터
# 2.모델구성
# 3.컴파일, 훈련
# 4.예측, 평가

# 1.데이터
import numpy as np 					#Numpy 라이브러리를 np로 import
x=np.array([1,2,3])					#입력데이터로 사용할 x를 NumPy 배열로 생성
y=np.array([1,2,3])					#입력데이터로 사용할 y를 NumPy 배열로 생성

from keras.models import Sequential #Keras의 Sequential 모델 클래스를 import
from keras.layers import Dense		#Keras의 Dense 레이어 클래스를 import

# 2.모델구성
model = Sequential()	            #Sequential 모델 클래스를 이용해 model 객체를 생성
model.add(Dense(15, input_dim=1))   #입력층, 뉴런의 개수는 4, 입력 데이터의 차원은 1
model.add(Dense(30))                #히든레이어1, 은닉층을 추가, 뉴런의 개수는 30
model.add(Dense(5))                 #히든레이어2, 은닉층을 추가, 뉴런의 개수는 5
model.add(Dense(3))                 #히든레이어3, 은닉층을 추가, 뉴런의 개수는 3
model.add(Dense(2))	            #히든레이어4, 은닉층을 추가, 뉴런의 개수는 2
model.add(Dense(1))                 #출력층, 뉴런의 개수는 1

# 3.컴파일, 훈련
model.compile(loss='mse',optimizer='adam') #모델을 컴파일,손실 함수로는 평균 제곱 오차(mse)를, 옵티마이저로는 Adam을 사용
model.fit(x,y,epochs=1000) #입력 데이터(x)와 출력 데이터(y)를 이용하여 모델을 학습, epochs는 전체 데이터셋을 학습한 횟수를 뜻함

loss=model.evaluate(x,y)   #학습된 모델을 이용해 입력 데이터(x)와 출력 데이터(y)에 대한 손실값을 계산
print('loss: ', loss) #2.0889956431346945e-12 #계산된 손실값을 출력

result = model.predict([4])				   #학습된 모델을 이용해 새로운 입력 데이터(4)에 대한 예측값을 계산
print('4의 예측값: ', result) #3.9999957   #계산된 예측값을 출력

● Numpy

 

- Numerical Python의 약자 , 파이썬에서 과학 계산을 위한 핵심 라이브러리

- 다차원 배열과 연산을 위한 라이브러리

- 수치 계산을 위한 다양한 함수와 메소드 제공

- 다차원 배열(ndarray) 의 사용

파이썬의 리스트와 유사하지만, ndarray는 벡터, 행렬 등 다차원 데이터의 처리 및 다양한 함수를 사용하여 데이터 빠르고 효율적 처리

 


● Pandas

 

- 데이터 처리와 분석을 위한 파이썬 라이브러리

- DataFrame  이라는 테이블 형태의 데이터 구조를 기반으로 생성

- 엑셀, csv 파일 등 다양한 파일과 데이터베이스 읽어올 수 있다

 


● y=wx +b (일차 함수) 일대일 대응 / w값이 (-) 일때 'mae' 사용

 

- 최적의 매개변수 w,b 찾는게 목적이다

입력층의 각 노드는 은닉층의 각 노드와 연결되어 대응, 이때 입력층의 각 노드는 입력 데이터의 각 feature(특성)을 나타내며, 은닉층의 노드는 입력층의 각 feature(특성)를 기반으로 한 일련의 변환(연산)을 수행

 

- 일대일 대응이란 입력과 출력의 관계를 정의한 것

 

 


● 입력층의 뉴런 개수와 은닉층 뉴런 개수는 상관관계가 있을까?

-> 없다입력층의 뉴런 개수는 입력 데이터의 특성에 의해 결정되고, 은니층의 뉴런 개수는 모델의 복잡도와 학습 성능에 따라 결정되기 때문, 따라서 입력 데이터의 특성 개수와 모델의 복잡도 및 학습 성능을 고려하여 적절한 뉴런 개수를 결정해야 한다

 

-> 뉴런의 개수는 일대일 대응이 필요하지 않음

 

 


● 출력층의 뉴런 개수대로 예측값이 출력되던데, 출력층에서 많은 예측값을 출력해 원하는 근삿값을 고르면 안되나?

 

- NO 예측값으로 나온 값들의 평균이 되기 때문에 의미없다

 

 


●뉴런의 개수가 정확도를 의미할 수 있는가?

 

- 뉴런의 개수는 모델의 복잡도와 연관이 있기에, 뉴런의 개수가 증가할수록 모델의 복잡도가 증가

모델의 성능은 입력 데이터 특성, 데이터의 양, 모델의 아키텍처, 하이퍼파라미터 설정 등 여러 요인에 영향을 받기때문에, 뉴런의 개수 증가가 모델 성능의 향상으로 이어지지 않는다 

 

 


● 데이터 정확도를 위한 은닉층은 무한해도 되는가?

 

- 일정 수준 이상에서는 과적합(overfiting)문제가 발생한다. 훈련 데이터에 대해 정확도는 높아지지만, 세로운 데이터에 대한 예측력이 떨어지는 현상이 발생 할 수 있다. 또한 은닉층이 많아지면 연산량이 증가해 학습시간이 길어지게된다.

 

 


●  'dense' 란 무엇인가? 

 

- keras의 층 중 하나, full connected layer을 구현하는데 사용, 입력 뉴런과 출력 뉴런이 모두 연결되어 있는 일반적인 신경망 계층

- dense 층은 뉴런의 수, 활성화 함수, 가중치 초기화 방법 등을 지정할 수 있다

입력값 * 가중치 +bias  (활성화 함수 적용) = 출력값 계산

 

 


● 옵티마이저란? 

 

- 신경망의 가중치를 학습시키는 방법을 결정하는 알고리즘

=>손실 함수를 최소화하는 가중치를 찾기 위해 사용되는 최적화 알고리즘

 

 

● 옵티마이저 종류

(위 실습 코드에선 optimizer='adam'을 사용하고 있다)

 

-확률적 경사 하강법(Stochastic Gradient Descent, SGD): 각 학습 단계마다 샘플의 그래디언트를 계산하여 가중치를 업데이트한다.

이 옵티마이저는 구현이 간단하고 대규모 데이터셋에도 적용 가능하며, 로컬 미니멈에 빠질 가능성이 낮다.

하지만, 수렴 속도가 느리고 지역 최소값에 빠질 가능성이 있다.

-모멘텀(Momentum): SGD에 모멘텀 항을 추가하여, 이전 학습 단계의 가중치 업데이트 방향을 고려하여 최적화 방향을 결정한다.

이 방법은 SGD보다 더 빠른 학습 속도와 좋은 일반화 성능을 가진다.

-네스테로프 가속 경사(Nesterov Accelerated Gradient, NAG): 모멘텀 방법에서 모멘텀 항을 사용하여 이전 업데이트 방향을 고려하는 것처럼, NAG는 현재 위치에서 모멘텀 방향으로 이동한 뒤 그 위치에서 그래디언트를 계산한다.

이 방법은 모멘텀 방법보다 더 나은 성능을 보인다.

-아다그라드(Adagrad): 학습률을 각 매개변수에 맞추어 조정하면서 최적화한다.

이 방법은 많은 변화가 있는 매개변수에 대해 더 작은 학습률을 적용하여 효과적으로 학습하며, 과거의 그래디언트 제곱 합을 누적하여 학습률을 조절한다.

-아다메(Adadelta): Adagrad의 단점 중 하나는 학습률이 너무 빠르게 감소하여 학습이 멈추는 것.

이를 보완하기 위해 아다메는 과거의 그래디언트 제곱 합 대신 최근 몇 번의 그래디언트 제곱 합을 이용하여 학습률을 조정한다.

-RMS프롭(RMSprop): 아다그라드와 유사하게 각 매개변수에 대해 학습률을 조절하지만, 과거의 그래디언트 제곱 합 대신 지수 이동 평균을 사용하여 학습률을 계산한다.

 

-아담(Adam): RMSprop과 모멘텀 방법을 합친 것으로, 학습률을 각 매개변수에 맞게 조정하면서 그래디언트의 1차 및 2차 모멘트 추정치를 유지한다.

이 방법은 대부분의 문제에서 잘 작동하며, 수렴 속도와 일반화 성능이 우수하다.

-아담 와일드(AdamW): 아담에서 가중치 감소 항을 수정하여, 일반화 성능을 더욱 향상시킨다.

이 방법은 가중치 감소와 그래디언트의 2차 모멘트 추정치를 포함하여 학습률을 각 매개변수에 맞게 조정한다.

-라드아담(RAdam): 아담에서 그래디언트의 2차 모멘트 추정치가 너무 클 때 발생하는 문제를 해결한 것으로, 변화하는 학습률과 적응형 모멘트를 사용하여 학습을 가속화한다.

-벨로시티(Velocity): SGD에 모멘텀을 추가하여 학습 속도를 높인다. 또한, 학습률을 각 매개변수에 맞게 조정하여 학습을 안정화한다.

-라지바(LaProp): 학습률과 모멘텀을 자동으로 조정하여 안정적으로 학습하도록 하는 방법. 이 방법은 SGD보다 더 높은 성능을 보입니다.

-스키마(Sketching): SGD에서 무작위 샘플링을 이용하여 모델의 일부분만 업데이트하도록 하는 방법입니다.

이 방법은 대규모 데이터셋에 효과적이며, 전체 데이터를 사용한 경우보다 더 높은 성능을 보인다.

-라듐(Radon): SGD와 모멘텀 방법의 조합으로, 그래디언트를 재생산 가능한 형식으로 저장하고 사용하여 모델을 안정적으로 학습시킨다.

-PAdam: 아담에서 파라미터 분할 방법을 사용하여 분산 학습을 지원하는 방법


-새디(SA): 아다그라드와 RMSprop의 아이디어를 결합하여, 수렴 속도와 일반화 성능을 향상시키는 방법.

이 방법은 빠른 학습 속도와 높은 성능을 보여준다.


 

 


● 만약 dim=2 라면?

- 2차원 배열, 행과 열이 있는 테이블 형태의 데이터를 나타냄

 

 


● input_shape 이란?

- input_shape은 모델의 첫 번째 층에 입력되는 데이터의 형태(shape)를 지정하는 인자

입력 데이터의 크기(shape)는 모델 구성에 중요한 역할을 한다

input_shape은 다음과 같은 방법으로 지정 가능하다 

1차원 배열의 경우: input_shape=(dim,)
2차원 배열의 경우: input_shape=(dim1, dim2)
3차원 배열의 경우: input_shape=(dim1, dim2, dim3)

input_shape은 모델의 첫 번째 층에만 지정해주면 된다

 


 

● 강아지 or 고양이 를 분류하는 이진 분류에서 강아지=1, 고양이는 0일때 소수값은?

 

- 분류에서는 예측값 1 ~  0.5xxxxx 사이는 강아지로 분류하게 된다

 


 

● 2차원 배열 코드 실습

import numpy as np
from keras.models import Sequential
from keras.layers import Dense

#1. 데이터
x = np.array([[1,2,3,4,5,6,7,8,9,10],
            [1,1,1,3,8,9,2,2,1.1,1.4]])
y = np.array([11,12,13,14,15,16,17,18,19,20])

print(x.shape)
print(y.shape)

#2. 모델구성
model = Sequential()
model.add(Dense (25, input_dim=2)) #2차원 배열
model.add(Dense(50))
model.add(Dense(50))
model.add(Dense(50))
model.add(Dense(40))
model.add(Dense(30))
model.add(Dense(35))
model.add(Dense(29))
model.add(Dense(30))
model.add(Dense(20))
model.add(Dense(15))
model.add(Dense(12))
model.add(Dense(9))
model.add(Dense(1))

#3. 컴파일, 훈련
model.compile(loss='mse',optimizer='adam') # w값이 (-) 일때 'mae' 사용
model.fit(x,y,epochs=100, batch_size=5)

#4. 예측 평가
loss=model.evaluate(x,y) # 0.0015491764061152935
print('loss: ', loss) 

result = model.predict([[10,1.4]]) #20.01144
print('10과1.6의 예측값: ', result)

 

● mlp 코드 실습

import numpy as np
from keras.models import Sequential
from keras.layers import Dense

#1. 데이터
x = np.array([[1,2,3,4,5,6,7,8,9,10],
            [1,2,1,1,2,1.1,1.2,1.4,1.5,1.6],
            [10,9,8,7,6,5,4,3,2,1]])
y = np.array([11,12,13,14,15,16,17,18,19,20])

print(x.shape)
print(y.shape)

#2. 모델구성
model = Sequential()
model.add(Dense (25, input_dim=3))
model.add(Dense(50))
model.add(Dense(50))
model.add(Dense(50))
model.add(Dense(40))
model.add(Dense(30))
model.add(Dense(35))
model.add(Dense(29))
model.add(Dense(30))
model.add(Dense(20))
model.add(Dense(15))
model.add(Dense(12))
model.add(Dense(9))
model.add(Dense(1))

#3. 컴파일, 훈련
model.compile(loss='mse',optimizer='adam') 
model.fit(x,y,epochs=100, batch_size=5) #bath_size

#4. 예측 평가
loss=model.evaluate(x,y) # 1.1068251132965088
print('loss: ', loss) 

result = model.predict([[10,1.6,1]]) #20.006065
print('10과1.6,0의 예측값: ', result)

● batch_size 란? 

 

- 하이퍼 파라미터

- 학습 데이터를 나누어서 몇 개의 데이터씩 묶어 학습을 진행할 것인지 정하는 파라미터이다

- batch_size가 작을 수록 모델이 더 자주 업데이트되므로 노이즈가 많은 경향, 더 많은 반복 학습이 필요 

/ 안정적 + 클수록 빠르게 학습하지만 예측결과의 불확실성

 

>> (질문) ppt에서 배치사이즈 클 수록 학습 시간이 길어지는 경향/ 메모리 문제 ?

>>ppt 오류

 

 


● 손실함수 (Loss Functon)

- 실제값과 예측값의 차이를 비교하는 지표

- 값이 낮을수록 학습이 잘된 것

- 최적의 매개변수(가중치와 편향)를 탐색할 떄  손실 함수를 가능할 작게하는 값 찾음

- MSE : 평균 제곱 오류 

출력 결과와 데이터 차이 제곱의 평균으로 정답과 오답의 모든 확률 고려

- CEE: 교차 엔트로피 오차 

실제 정답의 확률만을 고려한 손실 함수 (훈련데이터의 정갑 혹은 확률이 0 or 1)

 

 


● 활성화 함수(Activation Function)

- 인공 신경망의 각 노드에서 입력 신호의 총합을 출력 신호로 변환하는 함수

- 각 층에서 입력 신호의 총합을 구한 후, 그 값을 활성화 함수에 적용하여 다음 층으로 전달

이를 통해 신경망은 비선형성을 학습 할 수 있다 + 다양한 복잡한 함수 모델링 가능

- Sigmoid/ReLU/tanh/Softmax

 

-Linear (선형 함수):

가장 기본적인 활성화 함수로, 입력과 동일한 값을 출력
주로 회귀(Regression) 문제에서 출력층의 활성화 함수로 사용
입력과 출력 사이의 선형 관계를 표현하기 위해 사용


ReLU (Rectified Linear Unit):

입력이 0보다 작을 경우 0을 출력하고, 0보다 큰 경우 입력 값을 그대로 출력
비선형 함수로, 신경망의 은닉층에서 주로 사용
입력에 대해 더 강한 비선형성을 제공하며, 그레이디언트 소실 문제를 완화


Sigmoid (로지스틱 시그모이드):

입력을 0과 1 사이의 값으로 압축하여 출력

이진 분류(Binary Classification) 문제에서 출력층의 활성화 함수로 사용
출력 값이 확률로 해석될 수 있어, 입력이 클래스에 속할 확률을 표현하는 데 사용
그러나 그레디언트 소실 문제와 출력 값의 제한된 범위가 있을 수 있는 단점이 존재

 

Softmax:

다중 클래스 분류(Multi-Class Classification) 문제에서 출력층의 활성화 함수로 사용됩니다.
입력값들을 정규화하여 클래스에 대한 확률 분포를 생성합니다.
출력 값들의 합이 1이 되며, 각 클래스에 속할 확률로 해석됩니다.
다중 클래스를 예측하고자 할 때 사용되며, Cross Entropy와 함께 사용됩니다.

 

 


 

● transpose / reshape

import numpy as np

a=np.array([[1,2,3],[4,5,6]])
print("Original :\n",a)


a_transpose = np.transpose(a)
print("Transpose:\n",a_transpose)


a_reshape = np.reshape(a,(3,2))
print("Reshape:\n ", a_reshape)

#transport와 reshape의 차이점은? 
#transport: x,y 1대1대응 형식 축을 바꿈 reshape:배열의 형태를 바꿈
# 시배열 순서가 중요하다면 transport 인과관계가 중허다

 


 

● HW

import numpy as np
from keras.models import Sequential
from keras.layers import Dense

#1. 데이터
x = np.array([[1,2,3,4,5,6,7,8,9,10],
            [1,2,1,1,2,1.1,1.2,1.4,1.5,1.6],
            [10,9,8,7,6,5,4,3,2,1]])
y = np.array([11,12,13,14,15,16,17,18,19,20])

print(x.shape)
print(y.shape)
#2. 모델구성


model = Sequential()
model.add(Dense (25, input_dim=3))
model.add(Dense(50))
model.add(Dense(50))
model.add(Dense(50))
model.add(Dense(40))
model.add(Dense(30))
model.add(Dense(35))
model.add(Dense(29))
model.add(Dense(30))
model.add(Dense(20))
model.add(Dense(15))
model.add(Dense(12))
model.add(Dense(9))
model.add(Dense(1))

#3. 컴파일, 훈련
model.compile(loss='mse',optimizer='adam') 
model.fit(x,y,epochs=100, batch_size=5) #bath_size
#4. 예측 평가
loss=model.evaluate(x,y) # 1.1068251132965088
print('loss: ', loss) 

result = model.predict([[10,1.6,1]]) #20.006065
print('10과1.6,0의 예측값: ', result)