0. 딥러닝에서의 매개변수 탐색과 최적화
딥러닝은 함수의 최적의 매개변수를 찾는 것을 목표로 한다. 일반적으로 y = wx + b와 같은 수학적인 함수로 모델을 표현한다. 이때, 딥러닝은 최적의 매개변수를 찾아내는 과정을 거친다.
이러한 매개변수는 가중치(weight)와 편향(bias)로 구성되어 있다.
가중치는 초기에 랜덤한 값으로 설정되고, 학습 과정에서 최적의 가중치를 탐색한다. 가중치는 입력과 출력 사이의 연결 강도를 나타내며, 학습 데이터와 손실 함수를 기반으로 업데이트된다.
편향은 함수의 기울기를 조정하는 매개변수로, 가중치와 함께 사용되어 모델의 표현력을 향상시킨다.
초기에도 랜덤한 값으로 설정되며, 학습 과정에서 최적의 편향 값을 찾기 위해 업데이트된다.
딥러닝의 목표는 입력과 출력 사이의 관계를 가장 잘 표현하는 최적의 가중치와 편향 값을 찾는 것이다. 이를 위해 학습 데이터를 사용하여 손실 함수를 최소화하는 방향으로 매개변수를 조정하고, 모델의 예측 성능을 향상시킨다.
1. 인공지능 개념 정리 – 머신러닝, 딥러닝
머신러닝 데이터 전처리는 사람이 데이터를 처리하여 모델에 맞는 형태로 변환하는 작업이다.
정규화는 데이터의 스케일을 조정하여 모델의 성능을 개선한다.
딥러닝은 인공신경망을 사용하여 데이터의 특징을 추출하고 분류하는데, 다양한 층의 연산이 신경망처럼 연결되어 있다. 딥러닝은 머신러닝의 한 분야로 속하며, 인공신경망을 기반으로 한다.
딥러닝은 함수의 최적의 매개변수를 찾는 것을 목표로 한다. 일반적으로 y = wx + b와 같은 수학적인 함수로 모델을 표현한다.
이때, 딥러닝은 최적의 매개변수를 찾아내는 과정을 거친다.
이러한 매개변수는 가중치(weight)와 편향(bias)로 구성되어 있다.
2. 퍼셉트론 (Perceptron)
퍼셉트론은 인공 신경망의 한 종류이며, 뉴런의 동작 원리를 모방하여 만들어진 모델이다. 퍼셉트론은 입력층과 출력층으로 구성되어 있으며, 각각의 뉴런은 입력값, 가중치, 활성화 함수 등의 구성요소로 이루어져 있다.
구성요소로는 다음과 같은 요소들이 있다:
입력값(x): 퍼셉트론에 입력되는 데이터이다.
가중치(w)와 편향(b): 입력값과 곱해지는 가중치와 편향은 뉴런이 학습하는 과정에서 조정되는 매개변수이다. 가중치는 입력값의 중요도를 조절하고, 편향은 결정 경계를 조정한다.
활성화 함수: 입력값과 가중치의 합에 적용되는 활성화 함수는 뉴런의 출력을 결정한다. 일반적으로는 0 또는 +1과 같은 값을 출력하도록 설계되었다.
출력값: 활성화 함수를 통과한 결과로, 예측값을 나타낸다.
퍼셉트론은 입력값과 가중치의 선형 조합을 계산하고, 그 결과에 활성화 함수를 적용하여 0 또는 +1과 같은 출력값을 생성한다. 이를 통해 퍼셉트론은 입력 데이터를 분류하거나 예측하는 데 사용될 수 있다.
3. 다층 퍼셉트론 (Multi-Layer Perceptron: MLP)
다층 퍼셉트론은 딥러닝의 구조에서 나온 개념이다. 퍼셉트론과의 차이점은 은닉층(hidden layer)의 존재 여부이다. 퍼셉트론은 단일 뉴런으로만 구성되어 있어 은닉층이 없는 단층 구조이다. 다층 퍼셉트론은 여러 개의 은닉층을 거치면서 복잡한 패턴을 학습할 수 있는 구조이다.
다층 퍼셉트론에서는 노드들이 에지라고 불리는 선으로 연결되어 있다. 입력층에서 출력층까지의 경로를 따라 정보가 흐르며, 은닉층을 거치면서 중간 계산과 활성화 함수를 통해 다양한 특징을 추출하고 학습한다.
은닉층은 다층 퍼셉트론에서 가장 중요한 부분이다. 은닉층의 구성 방식, 노드의 수, 활성화 함수 등을 조절하여 모델의 복잡성과 성능을 조정할 수 있다. 은닉층을 적절하게 구성하는 것이 모델의 성능에 큰 영향을 미치는 중요한 요소이다. 이를 통해 다층 퍼셉트론은 비선형 문제를 해결하고, 복잡한 패턴을 학습하는 데에 더 적합한 모델로 발전하였다.
4. 옵티마이저 (Optimizer)
옵티마이저는 딥러닝 모델의 학습 과정에서 사용되는 알고리즘이다.
그 주요 목적은 손실 함수를 최소화하기 위해 모델의 가중치와 편향을 업데이트하는 것이다.
경사하강법을 기반으로 동작하며, 다양한 변형 알고리즘이 있다.
옵티마이저의 선택과 조정은 모델의 성능과 수렴 속도에 영향을 미치므로 중요하다.
적절한 옵티마이저 선택은 딥러닝 모델의 성능 향상을 위한 핵심 과제이다.
5. 학습률 (learning rate)
학습률(learning rate)은 옵티마이저가 가중치와 편향을 업데이트할 때 사용되는 값이다. 적절한 학습률 선택은 모델의 성능과 수렴 속도에 직접적인 영향을 미치므로 매우 중요하다. 너무 작으면 수렴이 늦어지고, 너무 크면 발산할 수 있다. 일반적으로 실험과 경험을 통해 적절한 학습률을 선택하는 것이 좋다.
6. 경사하강법 (Gradient Descent)
경사하강법(Gradient Descent)은 딥러닝에서 손실 함수를 최소화하기 위해 사용되는 기법이다. 가중치와 편향을 조정하여 손실 함수를 최소화하는 방향으로 이동한다. 경사하강법은 그래디언트(기울기)를 이용하여 매개변수를 업데이트하며, 학습률을 사용하여 업데이트 크기를 조절한다. 이를 반복하여 최적의 매개변수를 찾는다. 경사하강법은 딥러닝에서 가장 중요한 최적화 알고리즘 중 하나이다.
7. 손실함수 (Loss Function)
손실함수(Loss Function)은 딥러닝 모델의 성능을 측정하는 함수이다. 실제값과 예측값의 차이를 계산하여 모델의 오차를 나타낸다. 목표는 손실 함수 값을 최소화하여 모델을 학습하는 것이다. 손실 함수는 문제의 특성에 따라 선택되며, 회귀 문제와 분류 문제에서 다양한 유형의 손실 함수를 사용한다. 손실 함수는 모델의 예측 성능을 측정하고, 최적화 알고리즘에 의해 최소화되는 방향으로 모델을 학습시킨다. 적절한 손실 함수 선택은 모델의 학습과 성능에 큰 영향을 미치므로 중요하다.
8. 활성화 함수 (Activation Function) – Sigmoid, ReLU, Softmax
활성화 함수(Activation Function)은 딥러닝 모델의 각 뉴런에서 입력값을 받아 출력값을 계산하는 함수이다. 주로 사용되는 활성화 함수로는 Sigmoid, ReLU, Softmax 등이 있다.
Sigmoid 함수는 입력값을 0과 1 사이의 값으로 압축하여 출력하며, 이진 분류에 사용된다. ReLU 함수는 입력값이 0보다 작을 경우 0을 출력하고, 0 이상일 경우 입력값을 그대로 출력한다. ReLU는 은닉층에서 주로 사용되는 활성화 함수로, 경사 소실 문제를 완화하는 장점이 있다. Softmax 함수는 다중 클래스 분류에 사용되며, 출력값을 0과 1 사이로 압축하고 확률 분포로 정규화한다.
각 활성화 함수는 모델의 성능과 학습 동작에 영향을 미치므로 적절한 선택이 중요하다. 문제의 특성과 모델의 요구사항에 맞게 적절한 활성화 함수를 선택해야 한다.
https://dev-with-gpt.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-Anaconda-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD-%EC%83%9D%EC%84%B1-tensorflow-%EC%84%A4%EC%B9%98
1. 아나콘다 파이썬 다운로드 및 프롬프트 실행
https://www.anaconda.com/download-success
anaconda 설치 후 프롬프트를 실행해준다.
2. 가상환경 생성
conda create -name tf210 python=3.10.0
파이썬 가상환경을 생성하는 명령어이다. tf210 으로 생성하였다.
3. 가상환경 활성화 및 텐서플로우 설치
activate tf210
conda install tensorflow
생성한 tf210 가상환경을 활성화 시키고 tensorflow를 실행하는 과정이다.
4. 가상환경 리스트 확인
conda env list
명령어를 통해 가상환경에 설치된 리스트를 확인할 수 있다.
5. 라이브러리 설치
conda install scikit-learn
conda install matplotlib
conda install numpy
conda install pandas
scikit-learn: scikit-learn은 파이썬에서 머신러닝과 데이터 분석을 위한 라이브러리입니다.
다양한 머신러닝 알고리즘과 도구들을 제공하여 데이터의 전처리, 특징 추출, 모델 학습, 평가 등을 수행할 수 있습니다.
matplotlib: matplotlib은 파이썬에서 데이터 시각화를 위한 라이브러리입니다.
다양한 그래프와 플롯을 생성하여 데이터의 시각적 표현을 가능하게 합니다.
numpy: numpy는 파이썬에서 수치 연산을 위한 라이브러리입니다.
다차원 배열을 다루는 기능과 수학적인 함수들을 제공하여 빠르고 효율적인 수치 연산을 가능하게 합니다.
pandas: pandas는 파이썬에서 데이터 처리와 분석을 위한 라이브러리입니다.
데이터 구조인 데이터프레임을 사용하여 데이터의 조작, 필터링, 변환 등 다양한 작업을 수행할 수 있습니다.
위 명령어들을 통해 필요한 라이브러리를 하나씩 설치해주면 된다.
6. 설치된 파이썬 버전 확인
python -v
python -v 를 입력하면 현재 설치된 파이썬의 버전을 확인해주면서 설치가 성공적인지 확인해주면 된다.
https://dev-with-gpt.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B4%88-%EB%AC%B8%EC%A0%9C-list-traspose-reshape-%EC%8B%A4%EC%8A%B5
[문제]
네이버클라우드 캠프 AI 인공지능 과정 파이썬 1일차에 받은 파이썬 기초 문제들이다.
한번 풀어보도록 하자 .
[코드]
#1번 문제
n=1
print(n,"번 문제")
print('makit "code" lab ')
print("she's goen")
print("\n")
#2번 문제
n=2
print(n,"번 문제")
a=10
b = 20
print("a의 값은", a)
print("b의 값은", b)
print("a와 b의 합은", a+b)
print("\n")
#3번 문제
n=3
print(n,"번 문제")
a = 10
b = 'makit '
print(a * 3)
print(b * 3)
print("\n")
# 리스트
#4번 문제
n=4
print(n,"번 문제")
a = ['메이킷', '우진', '시은']
print(a)
print(a[0])
print(a[1])
print(a[2])
# 리스트 정수와 문자 출력
c = ['james', 26, 175.3, True]
print(c)
#5번 문제
n=5
print(n,"번 문제")
a = ['메이킷', '우진', '제임스','시은']
print(a[0:2])
print(a[1:4])
print(a[2:4])
print(a)
#6번 문제
n=6
print(n,"번 문제")
a = ['우진','시은']
b = ['메이킷','소피아','하워드']
print(a[0:2])
print(a+b)
print(b)
#7번 문제
n=7
print(n,"번 문제")
a = ['우진','시은']
b = ['메이킷','소피아','하워드']
print(a)
print(b+a)
#8번 문제
n=8
print(n,"번 문제")
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)
#9번 문제
import numpy as np
n=9
print(n,"번 문제")
a = np.array([[1, 2, 3], [4, 5, 6]])
print("Original :\n", a)
a_reshape = np.reshape(a, (3,2)) #행과 열을 입력해주어야 한다.
print("Reshape :\n", a_reshape)
# transpose와 reshape의 차이
'''
Transpose :
[[1 4]
[2 5]
[3 6]]
Reshape :
[[1 2]
[3 4]
[5 6]]
'''
# transpose 는 각 리스트의 배열을 순차적으로 하나씩 가져온다.
# reshape는 리스트의 배열을 정해준 행과 열로 재배열 시킨다.
[출력]
해당 코드는 딥러닝에서 사용하게 될 list와 transpose 학습에 사용되는 선행학습이므로 반드시 배워두도록 하자.
https://dev-with-gpt.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%94%A5%EB%9F%AC%EB%8B%9D-%EA%B8%B0%EB%B3%B8-%EC%BD%94%EB%93%9C-%EC%8B%A4%EC%8A%B5-numpy-keras-adam
파이썬 딥러닝 기본 코드 실습 (numpy, keras, adam)
데이터 준비: 입력 데이터 x와 출력 데이터 y를 numpy 배열로 정의합니다.
입력 데이터 x는 2개의 특성(feature)을 가진 10개의 샘플로 구성되어 있습니다.
데이터 전처리: x의 행과 열을 확인하고, x를 전치(transpose)하여 열을 특성(feature)로, 행을 샘플로 변환합니다. 이를 통해 모델이 올바른 형태의 데이터를 입력받을 수 있습니다.
모델 구성: Sequential 모델을 생성하고, Dense 레이어를 추가하여 모델을 구성합니다.
입력층과 은닉층을 추가하고, 출력층은 하나의 노드로 구성됩니다.
컴파일과 훈련: 모델을 컴파일하고, 훈련 데이터를 사용하여 모델을 학습시킵니다.
손실 함수로는 'mse'를 사용하고, 옵티마이저로는 'adam'을 사용합니다.
에포크 수와 배치 크기도 설정합니다.
예측과 평가: 학습된 모델을 사용하여 입력 데이터에 대한 예측을 수행하고, 손실 값을 평가합니다.
마지막으로, 특정 입력 [10, 1.6]에 대한 예측 값을 출력합니다.
코드를 실행하면 모델이 학습되고 예측 결과가 출력됩니다.
손실 값은 모델의 학습 성능을 나타내는 지표이며, 예측 결과는 입력 [10]과 [1.6]에 대한 출력 값을 나타냅니다.
은닉층과 에포크, 배치의 값을 조정하면 손실함수와 예측 결과값을 유의미 하게 조정시킬 수 있다.
은닉층과 에포크, 배치 크기의 값을 조정하면 모델의 표현력을 향상시킬 수 있다.
은닉층을 더 많이 추가하거나 노드 수를 늘리면 모델은 더 복잡한 패턴을 학습할 수 있지만,
과적합의 위험이 있으므로 적절한 구성을 선택해야한다.
에포크 수를 조정하여 모델이 전체 데이터셋을 적절한 횟수만큼 학습할 수 있도록 해야한다.
배치 크기를 작게 설정하면 모델이 더 자주 업데이트되지만 노이즈가 많아질 수 있고, 크게 설정하면 안정적인 학습이 가능하지만 메모리 문제와 학습 시간이 증가할 수 있다.
따라서, 적절한 조정을 통해 모델의 손실 함수 값과 예측 결과를 개선할 수 있다.
[결과값 출력]
[예측/평가 결과 해석]
손실 값이 9.003997200607294e-12로 매우 작게 나타납니다.
이는 모델이 입력 데이터와 실제 출력 데이터 간의 차이를 매우 잘 예측하고 있다는 것을 의미합니다.
즉, 모델이 입력값에 대해 매우 정확한 예측을 수행하고 있습니다.
예측값인 20.00001은 입력 [10, 1.6]에 대한 모델의 출력 결과입니다.
모델은 입력 데이터를 기반으로 학습하여 이러한 입력에 대해 20.00001이라는 예측값을 제시하고 있습니다.
이는 모델이 입력에 대해 정확하게 예측하는 능력을 갖추고 있다는 것을 의미합니다.
따라서, 손실 값이 매우 작고 예측값이 실제 값과 유사하다는 것은 모델이 학습을 잘 수행하고 있다는 것을 나타내며, 입력에 대한 정확한 예측을 수행할 수 있다는 것을 의미합니다.
[코드 및 GPT질문]
GPT 질문1
입력층 안에 들어가는 dense 의 값은 ? 어떤 의미인가 ? 꼭 1이어야 하나 ?
▶ model.add(Dense(1)) #입력층 입력층 안에 들어가는 Dense의 값은 입력 데이터의 특성 수를 의미합니다. 입력층은 모델에 데이터를 입력하는 역할을 담당하며, 입력 데이터의 특성 수와 일치하는 Dense 레이어를 사용하여 설정해야 합니다. 예를 들어, 입력 데이터가 3개의 특성을 가지고 있다면, 입력층의 Dense 레이어는 3으로 설정됩니다. 따라서, 입력층의 Dense 값은 입력 데이터의 특성 수에 따라 결정됩니다. 고정된 값이 아니며, 입력 데이터의 특성 수에 맞게 설정되어야 합니다.
GPT 질문2
출력층은 꼭 dense가 1이어야 하나 ?
▶ model.add(Dense(1)) #출력층 출력층의 Dense 값은 해결하고자 하는 문제의 성격에 따라 다를 수 있습니다. model.add(Dense(1))은 출력층의 노드 수를 1로 설정한 예시입니다. 일반적으로 회귀 문제에서는 출력층을 하나의 값을 예측하기 위해 1로 설정할 수 있습니다. 분류 문제에서는 클래스의 수에 따라 출력층의 노드 수가 결정됩니다. 이진 분류의 경우 1로 설정하고, 다중 클래스 분류의 경우 클래스 수에 맞게 노드 수를 설정할 수 있습니다. 따라서, 출력층의 Dense 값은 해결하고자 하는 문제의 특성에 맞게 조정되어야 합니다.
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]])
y = np.array([11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
# 행과 열을 확인해준다.
print(x.shape) #(2, 10)
print(y.shape) #(10,)
a = x
a_transpose = np.transpose(a)
print("Transpose :\n", a_transpose)
print(a_transpose) #(2, 10)
x = a_transpose
# 2. 모델구성
model = Sequential()
model.add(Dense(10, input_dim=2)) #feature.=column (x1,x2)
model.add(Dense(500))
model.add(Dense(1))
# 3. 컴파일, 훈련
model.compile(loss = 'mse', optimizer='adam') # w 같이 음수일 때 사용.
#model.compile(loss = 'mae', optimizer='adam') # w 같이 음수일 때 사용.
model.fit(x, y, epochs=1000,batch_size=5)
# 4. 예측, 평가
loss = model.evaluate(x, y)
print('loss : ', loss)
result = model.predict([[10, 1.6]])
print('[10]과 [1.6]예측값 : ', result)