딥러닝
- Jupyter notebook 시작 디렉토리 설정 작동 안 될 때 (간단 해결) 2021.11.23
- 신경망의 구조 2021.11.22
- CPU와 듀얼 GPU로 딥러닝 분업 할당하는 법 (3개 동시 모델링) 2021.11.22
- 한방에 99.9% 예측 정확도, <1% 오차라 2021.11.19
- 딥러닝 TensorFlow 텐서플로 GPU 설치 한방에 끝내기 2 (윈도우) 2021.11.18
- 딥러닝 TensorFlow 텐서플로 GPU 설치 한방에 끝내기 1 (윈도우) 2021.11.18
- ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type float). 2021.11.17
- CUBLAS_STATUS_ALLOC_FAILED 2021.11.17
- `Model.state_updates` will be removed in a future version. 2021.11.17
- `Model.state_updates` will be removed 2021.11.17
- ConvergenceWarning: lbfgs failed to converge (status=1): 2021.11.17
- Anaconda 프롬프트 명령어 정리 2021.11.17
- 신경망에서 딥러닝으로 - 기울기 소실 문제 2021.11.08
- R Keras - 모델링 결과가 loss: NaN, mae: NaN 등으로 나올때 2021.11.05
- R Keras -csv 파일 읽어 train와 test 데이터로 나누기 2021.11.05
- 퍼셉트론 - 오차 역전파 2021.11.05
- 퍼셉트론 - XOR 문제 해결(다층 퍼셉트론, 신경망) 2021.11.05
- 퍼셉트론(perceptron) 2021.11.05
- 딥러닝 수학 통계 - 경사 하강법 2021.11.04
- 연역법과 귀납법 2021.11.04
Jupyter notebook 시작 디렉토리 설정 작동 안 될 때 (간단 해결)
신경망의 구조
신경망 구조
1. 네트워크(또는 모델)를 구성하는 층
2. 입력 데이터와 그에 대응하는 타깃
3. 손실함수: 예측과 타깃을 비교하여 모델의 예측이 기대값에 얼마나 잘 맞는지 측정하는 손실값을 만듬
4. 학습 진행방식을 결정하는 옵티마이저
모델:
층의 네트워크
딱 맞는 네트워크 구조를 찾는 것은 과학보다 예술. 연습 필요.
>>> from keras import models
>>> from keras import layers
>>> model = model.Sequential()
Sequential() 모델의 경우, 단일 입력, 단일 출력인 경우 사용
다중입력 데이터 + 여러 딥러닝 모듈 인 경우 함수형 API 사용
모델 설정 - 층 설정
입력층, 은닉층, 출력층 등의 딥러닝의 구성 단위
하나 이상의 텐서를 입력받아 하나 이상의 텐서를 출력하는 데이터 처리 모듈
가중치: 대부분의 층은 가중치를 가짐. 네트워크(모델)가 학습한 지식이 가중치에 담겨 있음.
>>> model.add(layers.Dense(32, input_shape=(784,)) activation = 'relu')
첫번째 차원이 784인 2D텐서만 입력으로 받는 층을 만듬.
배치 차원인 0번째 축은 지정하지 않았기 때문에 어떤 배치 크기도 입력받을 수 있음
이 층은 첫번째 차원 크기가 32로 변환된 텐서를 출력함
즉, 이 다음 하위층은 32차원의 벡터를 입력으로 받는 하위 층으로 연결되어야 함.
(Kerase에서는 자동으로 층 호환성을 맞춤)
>>> model.add(layers.Dense(10), activation='softmax')
input_shape을 지정하지 않아도 Kerase에서는 자동으로 앞선 층의 출력크기로 맞춰줌.
컴파일 - 손실함수와 옵티마이저: 학습 과정을 조절하는 열쇠!
>>> from keras import optimizers
>>>model.comopile(optimizer = optimizers.RMSprop(r=0.001),
... loss='mse'
... metrics=['accuracy'])
손실(또는 목적)함수:
모델의 최적 매개변수(가중치, 편향) 학습에 필요한 에러 측정 함수
네트워크(망)이 예측한 결과와 데이터 세트에 명시된 실제 결과의 차이를 측정
훈련하는 동안 최소화될 값. 주어진 문제에 대한 성공 지표
손실함수 정의 방법:
분류문제: 데이터 세트의 데이터 중 잘못 분류한 비율을 계산하고, 그 비율을 에러 발생 확률로 사용
회귀문제: 입력 데이터로 예측한 결과와 실제 결과 간의 차이를 계산하여 평균을 구함.
옵티마이저 - 손실함수 최적화
손실 함수를 기반으로 네트워크가 어떻게 업그레이드 될 지 결정. 확률적 경사 하강법 사용해서 구함.
여러개의 출력을 만드는 신경망은 또한 여러 개(vector or tensor)의 손실함수를 가질 수 있음 (출력당 하나씩).
경사 하강법은 하나의 손실값(scalar)을 이용하기 때문에, 모든 네트워크에서 출력된 손실의 평균값을 계산.
신경망은 단지 손실함수를 최소화하기만 한다. 따라서, 목적 함수를 올바로 선택하지 않으면 원치않는 side effects가 커질 수 있다.
올바른 손실/목적함수 선택법:
1. binary_crossentropy (이항 교차 엔트로피 또는 이진 크로스엔트로피): 이진 분류 문제. 참/거짓 2개의 클래스를 분류할 때
2. categorical_crossentropy 범주형 크로스엔트로피: 여러개의 클래스 분류할 때
3. mean_squared_error 평균 제곱 오차: 회귀문제
4. mean_absolute_error 평균 절대 오차: 회귀문제
5. mean_absolute_percentage_error: 평균 절대 백분율 오차: 회귀문제
6. CTC(Connection Temporal Classification): 시퀀스 학습 문제
모델 실행 - 모델링 (fitting)
>>> model.fit(X, Y, epochs=100, batch_size=10)
일반적인 데이터 셋 csv 파일의 경우, 가로행(속성 또는 피쳐 feature), 세로열(샘플 또는 인스턴스instance 또는 example))로 구성됨.
Epochs
학습 프로세서가 모든 샘플 에 대해 한 번 실행되는 것을 1epoch
epochs=100 이면, 각 샘플이 처음부터 끝까지 100번 재사용될 때가지 실행을 반복하라는 뜻.
batch_size:
샘플을 한번에 몇개씩 처리할지 정하는 부분
batch_size=10 이면 전체 샘플 중 10개씩 끊어저 집어넣으라는 뜻.
너무 크면 학습도 저하, 너무 작으면 편차가 높아져 결과값이 불안정해 짐
따라서, 현재 시스템의 메모리가 감당할 만큼의 batch_size를 찾아 설정해 주는 게 관권.
모델평가
학습/테스트 세트로 구분하여 평가
과소적합/과적합
CPU와 듀얼 GPU로 딥러닝 분업 할당하는 법 (3개 동시 모델링)
GPU가 2개인데, CPU 에서도 작업을 수행하게 해서 3개 작업을 동시에 분업시키는 방법
1. 듀얼 GPU 설정하는 방법은 아래 링크 참고.
듀얼 또는 다중 GPU 각각 따로 사용하는 딥러닝 환경만들기
Dual GPU 사용시 NVLink 등으로 묶거나 상호 교차 계산(multi-tasking) 하지 않고, 두 개의 프로그램을 각각 다른 GPU에서 독립적으로 분업으로 실행시키고자 할 때의 환경을 만드는 방법이다. 1. Anaconda pro
aeir.tistory.com
2. 기본적으로 케라스가 GPU를 인식에서 이용하기 때문에, 아래 명령어를 추가해 주면 CPU를 사용한다.
import os
os.environ["CUDA_VISIBLE_DEVICES"] = ""
from keras import backend as K
with K.tf.device('/cpu:0'):
classifier = Sequential()
classifier.add(Dense(units = 13, activation = 'relu'))
classifier.add(Dense(units = 1, activation = 'sigmoid'))
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
따라서, GPU 2개 CPUs 1개 돌려서 총 3개의 작업을 동시에 할 수 있다.
한방에 99.9% 예측 정확도, <1% 오차라
한방에 99.9% 정확도, 오차<1% 나올리가 있나?
accuracy의 변동성이 있긴해도 99.9%...
좋아할 게 아니라, 상당히 의심스러운데
뭘 잘 못했는지 고민해봐야...
missing-data 를 너무 평균값으로 넣었나?
코드내용:
[0,1] 분류
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
>>> X_train.shape
(48456, 13)
>>> y_train.shape
(48456,)
>>> X_test.shape
(20767, 13)
>>> y_test.shape
(20767,)
>>> classifier.add(Dense(units = 13, activation = 'relu'))
>>> classifier.add(Dense(units = 1, activation = 'sigmoid'))
>>> classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
>>> classifier.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(X_test, y_test))
결과:
>>> print("Best Accuracy on training set = ", max(history.history['accuracy'])*100)
Best Accuracy on training set = 99.94015097618103
>>> print("Best Accuracy on test set = ", max(history.history['val_accuracy'])*100)
Best Accuracy on test set = 99.99518394470215
>>> print("Loss on training set = ", max(history.history['loss']))
Loss on training set = 0.3780692219734192
>>> print("Loss on test set = ", max(history.history['val_loss']))
Loss on test set = 0.018711965531110764
딥러닝 TensorFlow 텐서플로 GPU 설치 한방에 끝내기 2 (윈도우)
TensorFlow-GPU 버전을 사용하려면, 아래 링크 설명을 따라 먼저 GPU에 맞는 드라이버를 먼저 설치해야 함. 본 문서만으로는 TensorFlow-CPU 버전을 사용할 수 있음.
Tensorflow GPU 딥러닝 개발 환경 구축 1 (윈도우)
1. 하드웨어 요구사항 확인 1.1. 현재 설치된 NVIDIA GPU 카드와 드라이버 버전 확인 현재 설치된 그래픽 카드 확인. (본 문서에서는 NVIDIA Quadro RTX 6000 기준) NVIDIA 제품만 가능 윈도우 설정>앱 열어
aeir.tistory.com
1. 아나콘다 (Anaconda) 설치
- https://www.anaconda.com/products/individual 방문
- 아래 그림과 같이 웹페이지 아래로 내려가서, 64-Bit Graphical Installer 클릭
- 기존 설치된 Anaconda와의 버전 충돌을 피하기 위해서, 아래 그림과 같이 체크박스 2개 모두 체크 후 Install 클릭
- 시작버튼 > Anaconda Prompt 클릭
- 아래와 같이 conda 와 python 버전 확인
2. TensorFlow-GPU 설치
- (base) C:\Users\chpark> conda list 실행
- 아래와 같이 tensorflow가 설치 안되어 있는 것을 확인
- 각 자의 개발환경에 따라서, 본 문서의 예시 처럼 (base)가 아닌 가상 개발 환경 위에서 설치할 수 있음.
- (base) C:\Users\chpark> pip install tensorflow-gpu 실행
- 주의! conda install tensorflow-gpu 사용하지 말 것
- 만약 cpu만 사용한다면, (base) C:\Users\chpark> pip install tensorflow 실행
- (base) C:\Users\chpark> pip list 실행
- 아래 그림과 같이 설치됨.
TensorFlow-CPU 설치의 경우, 아래 내용은 필요 없음.
3. TensorFlow-GPU 인식 유무 확인
아래 코드 실행
(base) python
>>> import tensorflow
>>> from tensorflow.python.client import device_lib
>>> print(device_lib.list_local_devices())
- 아래 그림과 같이 나오면 성공! 이제 TensorFlow-GPU 사용할 수 있음.
이후, pip 명령어로 원하는 라이브러리를 깔아서 사용하면 됨.
만약 tensorflow-gpu가 작동하지 않으면, 새로 다 설치할 필요없이 수리할 수 있는 방법을 아래 링크를 통해 참고하시길.
Tensorflow GPU 작동하지 않을때, 재설치 없이 수리하는 법
본 문서는 NVIDIA 그래픽 카드와 Anaconda를 설치했음에도 tensorflow_gpu가 작동하지 않은 경우, 모든 설치 앱을 갈아없지 않고 수리하는 방법을 정리한 것임. 증상 아래 그림에서 CPU만 인식한다. 몇 번
aeir.tistory.com
딥러닝 TensorFlow 텐서플로 GPU 설치 한방에 끝내기 1 (윈도우)
TensorFlow-GPU 버전을 사용하기 위한 시스템 구축을 설명하고 있음.
TensorFlow-CPU 버전의 경우, 바로 아래 문서로 가서 Anacona 설치부터 하면 됨.
TensorFlow GPU 딥러닝 개발 환경 구축 2 (윈도우)
TensorFlow GPU 버전을 사용하기 위해서, 아래 링크를 따라 먼저 하드웨어와 드라이버 등의 소프트웨어를 먼저 설치해야 한다. 앱 열어 " data-og-host="aeir.tistory.com" data-og-source-url="https://aeir.tist..
aeir.tistory.com
1. 하드웨어 요구사항 확인
1.1. 현재 설치된 NVIDIA GPU 카드와 드라이버 버전 확인
- 현재 설치된 그래픽 카드 확인. (본 문서에서는 NVIDIA Quadro RTX 6000 기준)
- NVIDIA 제품만 가능
- 윈도우 설정>앱 열어 그래픽 카드 버전 확인
- 현재 설치된 NVIDIA 버전은 462.31
1.2. Tensorflow 요구사항 확인
- 텐서플로 웹페이지 방문 (https://www.tensorflow.org/install/gpu) CUDA 지원 GPU 카드 클릭
- https://developer.nvidia.com/cuda-gpus 로 이동
- CUDA-Enabled NVIDIA Quadro and NVIDIA RTX 클릭하면 시스템별 capability가 나옴.
- 현재 그래픽 카드는 사용 가능함 (목록에 그래픽 카드가 없으면 딥러닝에 활용할 수 없음)
2. 소프트웨어 요구사항 확인
2.1. NVIDIA GPU 드라이버 버전 확인
- 다시 Tensorflow 웹페이지에서 NVIDIA GPU드라이버 - CUDA 11.2에는 450.80.02 이상이 필요합니다 확인
- 현재 설치된 NVIDIA 버전은 462.31이므로 사용 가능함.
- 만약 현재 설치된 드라이버 버전이 낮다면, NVIDIA GPU드라이버 클릭, https://developer.nvidia.com/cuda-gpus 로 이동.
- 그래픽 카드 종류 세팅하고 "SEARCH" 클릭해서 최신 버전 드라이버 다운받고 설치해야함 (버전은 R470 U6 (472.47)형태로 표기하고 있음)
2.2. CUDA 설치
- 다시 Tensorflow 웹페이지에서 CUDA Toolkit 클릭
- https://developer.nvidia.com/cuda-toolkit-archive 로 이동
- CUDA Toolkit 11.4.3 Versioned Online Documentation 클릭
- Installation Guide Windows 클릭
- 아래 문서에서, CUDA 11.4가 Window10을 지원함을 확인
- Compiler 는 Visual Studio 2019 16.x 를 사용해야함
3. 소프트웨어 설치
- Visual Studio -> CUDA -> cuDNN 순서로 설치.
3.1. Visual Studio 2019 설치
- https://visualstudio.microsoft.com/ko/downloads/ 방문
- 아래 그림에서 릴리스 정보 클릭
3.2. CUDA 설치 (버전 11.4.3)
- 다시 https://developer.nvidia.com/cuda-toolkit-archive 에서, CUDA Toolkit 11.4.3 클릭
- 아래 페이지에서 CUDA Toolkit 11.4 Update 3 다운로드 (cuda_11.4.3_ win10.exe)
- 다운받은 파일을 관리자 권한으로 실행.
- 설치하면, 재부팅하라고 함.
3.3. cuDNN 설치
- CUPTI 는 CUDA Toolkit과 함께 제공되므로 설치 필요 없음.
- 다시 아래 페이지에서 cuDNN 버전 클릭
- CUDA 11.4.3 을 다운받았으므로, cuDNN v8.2.4 [September 2nd, 2021] for CUDA 11.4 클릭
- 아래와 같이 cuDNN Library for Windwos (x64) 클릭
- 다운 받은 zip 파일 압축풀면 cuda 폴더 아래 bin, include, lib 3개 폴더를 복사하여, C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4 에 덮어쓰기.
- 시스템 환경 변수 편집 > 고급 > 환경변수 클릭CU
- 아래 그림과 같이 CUDA_PATH 가 설정되어 있는지 확인
- 없으면, 아래와 같이 추가한다.
이후 아래 문서를 따라 Anaconda 를 설치하고 TensorFlow GPU 동작 여부를 확인한다.
TensorFlow GPU 딥러닝 개발 환경 구축 2 (윈도우)
TensorFlow GPU 버전을 사용하기 위해서, 아래 링크를 따라 먼저 하드웨어와 드라이버 등의 소프트웨어를 먼저 설치해야 한다. 앱 열어 " data-og-host="aeir.tistory.com" data-og-source-url="https://aeir.tist..
aeir.tistory.com
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type float).
에러:
>>> df.loc[df['Vis'] <= 100, "flag"] = "1"
>>> df.loc[df['Vis'] > 100, "flag"] = "2"
>>> (중략)
>>> d = df.values
>>> (중략)
>>> history=classifier.fit(X_train, y_train, batch_size = 5, epochs = 300, validation_data=(X_test, y_test))
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type float).
원인:
데이터가 float 뿐만 아니라 object가 섞여 있다.
numpy 는 오로지 숫자만 취급한다. pandas는 섞여 있어도 된다.
따라서, 데이터 전처리 시, 이미 df['Vis'] 를 0, 1로 바꾸고 number로 변환시킨 후, 데이터를 불러서 처리해야 한다.
해결:
아래와 같이 문장 수정 후 성공
>>> df.loc[df['Vis'] <= 100, "flag"] = pd.to_numeric(1)
>>> df.loc[df['Vis'] > 100, "flag"] = pd.to_numeric(0)
CUBLAS_STATUS_ALLOC_FAILED
에러:
E tensorflow/stream_executor/cuda/cuda_blas.cc:226] failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
해결:
아래 구문을 통해서 GPU 메모리를 제한해 줘야 된다.
config = tf.compat.v1.ConfigProto(gpu_options =
tf.compat.v1.GPUOptions(per_process_gpu_memory_fraction=0.8)
# device_count = {'GPU': 1}
)
config.gpu_options.allow_growth = True
session = tf.compat.v1.Session(config=config)
tf.compat.v1.keras.backend.set_session(session)
참고:
python - Tensorflow CUBLAS_STATUS_ALLOC_FAILED error - Stack Overflow
`Model.state_updates` will be removed in a future version.
에러:
C:\Users\chpark\ANACON~1\lib\site-packages\keras\engine\training.py:2401: UserWarning: `Model.state_updates` will be removed in a future version. This property should not be used in TensorFlow 2.0, as `updates` are applied automatically.
warnings.warn('`Model.state_updates` will be removed in a future version. '
해결:
아래 라인 실행해 주면 에러 사라진다.
config = tf.compat.v1.ConfigProto(gpu_options =
tf.compat.v1.GPUOptions(per_process_gpu_memory_fraction=0.8)
# device_count = {'GPU': 1}
)
`Model.state_updates` will be removed
에러:
UserWarning: `Model.state_updates` will be removed in a future version. This property should not be used in TensorFlow 2.0, as `updates` are applied automatically.
warnings.warn('`Model.state_updates` will be removed in a future version.
해결:
아래 라인 실행해 주면 에러 사라진다.
config = tf.compat.v1.ConfigProto(gpu_options =
tf.compat.v1.GPUOptions(per_process_gpu_memory_fraction=0.8)
# device_count = {'GPU': 1}
ConvergenceWarning: lbfgs failed to converge (status=1):
에러:
ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
해결:
model = LogisticRegression(random_state=42) 을
model = LogisticRegression(random_state=42, solver='lbfgs', max_iter=100) 로 수정한다.
Anaconda 프롬프트 명령어 정리
(base) conda info --envs
(base) conda list
(base) conda remove --prefix [PATH] --all
(base) conda remove --name --all
(base) activate test
(test)
명령어 conda 나 pip 가 같은 역할의 명령을 수행함.
주의: 모듈을 설치할때는 conda 대신 pip 사용하길 추천함 (아래 글 참고). 버전 충돌이나 miniconda 충돌 등이 발생할 수 있음.
Tensorflow GPU 작동하지 않을때, 재설치 없이 수리하는 법
본 문서는 NVIDIA 그래픽 카드와 Anaconda를 설치했음에도 tensorflow_gpu가 작동하지 않은 경우, 모든 설치 앱을 갈아없지 않고 수리하는 방법을 정리한 것임. 증상 아래 그림에서 CPU만 인식한다. 몇 번
aeir.tistory.com
신경망에서 딥러닝으로 - 기울기 소실 문제
기울기 소실 문제(vanishing gradient)
- 출력층에서 은닉층을 역방향으로 하나씩 진행하며, 각 층(은닉층, 입력층)의 가중치를 수정하는 방법
- 가중치 수정을 위해서는 미분값(기울기)가 필요
- 층의 갯수가 늘어나면, 역전파를 통해 전달되는 기울기 값이 점점 작아져, 맨 처음층(입력층)까지 도달하지 않는 문제가 발생... 기울기 소실 문제(vanishinig gradient)
- 활성화 함수(시그모이드 함수)의 특징 때문에, 여러 층을 거칠 수록 기울기가 사라져서 가중치 수정이 어려워짐.
활성화 함수
1. Sigmoid 함수
- 미분하면 최대치가 < 1.0 따라서, 계속 곱하면 0에 수렴.... 기울기 소실 발생
2. tanh 함수
- 시그모이드 함수 확장형 [-1,1]
- 1보다 작은 값이 존재하므로, 기울기 소실 발생
기울기 소실 문제를 해결하기 위해서 새로운 활성화 함수가 필요.
3. ReLU 함수
- 0보다 작을때 0으로 처리, 0보다 클때 x값을 그대로 사용 ... 기울기 소실 해결
4. Softplus 함수
- ReLU함수에서 0보다 작은 경우를 완화한 함수... 기울기 소실 해결
그 외 다양한 활성화 함수
Activation Functions : Sigmoid, ReLU, Leaky ReLU and Softmax basics for Neural Networks and Deep…
Let’s start with the basics why would we even need an activation function and what is it >
himanshuxd.medium.com
R Keras - 모델링 결과가 loss: NaN, mae: NaN 등으로 나올때
여기서는 모델이 수행되는 과정에서는 에러가 없었으나, 최종 결과가 loss: NaN, accuracy:NaN, mae:NaN 등으로 나오는 경우, 필자가 찾아낸 문제해결 법이다.
지금까지 2가지 경우에 대해서 경험하였고, 다음과 같이 해결할 수 있다.
1. 입력 데이터에 NA 가 들어있는 경우
이때 아래와 같이 데이터 셋에서 NA를 제거해 준 다음 사용하면 된다.
> data.set <- na.omit(<INPUT DATA>)
> str(data.set)
2. 활성화 함수 선택이 문제인 경우
1번으로 해결되지 않을 때, layer_dense 내 activation 함수를 "softmax"에서 "relu"로 바꾸면 된다. single output 인 경우, softmax를 사용하면 이런 현상이 발생할 수 있다. 여기(https://github.com/keras-team/keras/issues/2134) 내용의 댓글들을 참고하시오.
3. 입력 데이터에 Inf 가 들어있는 경우
아래 블로그를 참조하시라.
R Keras -csv 파일 읽어 train와 test 데이터로 나누기
책이나 사이트에 공개된 잘 만들어진 예제를 이용해서, 자신의 데이터에 바로 적용할 때, 필자와 같은 왕초보들은 항상, as always, as usual, 필연적으로, 반드시, 운명적으로, .... 한방에 작동하지 않고 여러가지 문제들로 인해 머리가 지끈지끈 아픈 상황과 문제가 발생할 수 있다. 아니, 발생한다. 하나하나 잡아보자.
딥러닝 책 등에서 제공된 예제 파일들은 모두 Keras 등의 패키지 내에 포함된 예제 파일들이다. 그래서 실제 내가 만든 .csv 파일을 읽어 들이는데, 입력 포맷이 맞지 않아 헤맬 수 있다. 이런 경우, 모델이 잘 돌아가지만, input_data 값이 없다는 에러가 발생할 수 있다.
아래와 같이 sampling 하면, 일반 책에서 사용하는 예제 파일을 읽어들이는 포맷으로 쉽게 변환된다. 아래는 13개 컬럼으로 구성된 데이터 셋의 경우의 예임.
> set.seed(1)
# sample 함수는 수행할 때 마다 다른 난수를 추출하기 때문에 난수를 고정시켜 같은 값이 나오도록 하기 위함이다.
> smp = sample(1:nrow(<INPUT DATA>), nrow(<INPUT DATA>)/2)
# 2로 나눈 것은 절반의 데이터만 추출해서 쓰겠다는 의미
> train_data <- <INPUT DATA>[smp, 1:12]
> train_targets <- <INPUT DATA>[smp, 13]
> test_data <- <INPUT DATA>[-smp, 1:12]
> test_targets <- <INPUT DATA>[-smp, 13]
이 후 keras model을 구성하면 된다.
퍼셉트론 - 오차 역전파
예측을 위한 순전파
신경망은 순전파 해서 결과를 예측한다.
결과 레이어에 도달하기까지 모든 레이어에서의 연산이 포함된다.
오차 역전파 (back propagation)
- 가중치와 바이어스를 실제로 구할 때, 신경망 내부의 가중치 수정하는 방법(딥러닝에서 가장 중요한 부분 중 하나)
- 경사 하강법의 확장 개념
단일 퍼셉트론에서의 오차 역전파
1. 임의의 초기 가중치를 사용하여 처음 결과값(y)을 구함.
2. 그 결과값과 참값(예상 또는 기대하는 값) 사이의 평균 제곱 오차(ε)를 구함.
3. 이 오차를 최소로 만드는 지점으로 조금씩 거슬로 이동하면서 미분... 경사 하강법
4. 미분의 기울기가 0인(0으로 수렴되는) 지점이 최적화된(수정된) 최종 가중치.
최적화의 방향은 출력층에서 시작해서 입력층... 따라서 "오차 역전파"라고 부름
다층 퍼셉트론에의 오차 역전파
단일 퍼셉트론과 같은 원리이나, 은닉층의 가중치를 구해야 함.
1. 임의의 초기 가중치를 사용하여 처음 결과값(y)을 구함.
2. 그 결과값과 참값(예상 또는 기대하는 값) 사이의 평균 제곱 오차를 구함.
3. 경사 하강법을 이용하여, 오차가 작아지는(미분값이 0으로 수렴하는) 방향으로 이동시켜 가중치를 갱신함.
4. 오차가 더 이상 줄어들지 않을 때까지 (미분의 기울기가 0으로 수렴 할 때까지) 반복.
가중치 갱신의 수학적 표현
- 실제 구해야 하는 값(가중치)는 출력값의 오차(ε)를 W에 대해서 편미분한 값.
- {가중치-기울기| --> 0 일때 까지 가중치를 계속 수정하는 반복작업
퍼셉트론 - XOR 문제 해결(다층 퍼셉트론, 신경망)
XOR 문제 해결
아래 그림과 같이 2차원 평면 공간을 3차원으로 확장해서 분류할 수 있음.
즉, 좌표 평면 변화를 적용.
XOR 문제를 해결하기 위해서는 2개의 퍼셉트론을 한번에 계산할 수 있어야 하는데, 은닉층(hidden layer)를 사용하면 가능함.
다층 퍼셉트론
1. 각 퍼셉트론의 가중치(w)와 바이어스(b)를 은닉층의 노드(n)로 보냄.
2. 은닉층으로 들어온 w, b에 시그모이드 함수를 적용하여 최종 결과값을 출력함
w와 b를 구하기 위해서 행렬로 표현하면,
연습: XOR 문제 해결
아래 예제를 통해서, XOR 진리표를 구할 수 있는지 연습해 보자.
먼저 각 노드 n1, n2를 구하고, 최종 y 출력값을 계산한다.
퍼셉트론(perceptron)
다변량 함수 알고리즘
- 입력값(x)을 통해 출력값(y)을 구하는 다변량 회귀식은 아래와 같이 표현할 수 있음.
- 출력값(y)을 알려면, a1, a2, b 값을 알아야함.
- 입력된 x1, x2는 각각 가중치 a1, a2와 곱해지고, b가 더해진 후 로지스틱 회귀함수인 시그모이드 함수를 거쳐 1 또는 0값이 출력됨.... 퍼셉트론(perceptron) 개념
퍼셉트론 (perceptron)
- 1957년 프랑크 로젠블라트에 의해 고안됨.
- 이후 인공 신경망, 오차 역전파 등의 연구개발을 거쳐 딥러닝으로 발전됨.
- 인간 뇌의 뉴런의 신호 전달과 메커니즘이 유사.
- 뉴런과 뉴런 사이의 시냅스 연결부위가 자극(입력값) 받으면, 시냅스에서 화학물질이 나와 전위 변화를 일으킴.
- 전위가 임계치를 넘으면 다음 뉴런으로 신호를 전달(출력값 1)하고, 임계치 아래 자극이면 아무것도 하지 않음(출력값 0).... 로지스틱 회귀
- 즉, 로지스틱 회귀가 퍼셉트론의 기본 개념
- 퍼셉트론은 입력값과 활성화 함수를 사용하여 출력값을 다음 퍼셉트론으로 넘기는 단위 신경망임.
딥러닝 용어정리
가중치(weight): 기울기 a1, a2를 퍼셉트론에서는 가중치(weight)라고 하고 w1, w2으로 표기
바이어스(bias): 절편 b는 퍼셉트론에서 편향(bias)라고 함.
가중합(weighted sum): 입력값(x)와 가중치(w)를 곱한 후 모두 더한 다음 바이어스(b)를 더한 값
활성화 함수: 0,1을 판단하는 함수. 예) 시그모이스 함수
딥러닝 수학 통계 - 경사 하강법
경사하강법 (gradient descent)
- 2차원 이상의 함수에서 최저점(기울기, 절편)을 찾는 방법
- 오차의 변화의 2차 함수 그래프를 만들고 적절한 학습률을 설정해 기울기가 0인 지점을 구하는 것.
방법적 알고리즘 (2차 함수)
1. X1에서 미분으로 기울기 구함
2. 구해진 기우기의 반대방향으로 얼마간 이동시킨 X2에서 미분
(기울기가 +이면 음의 방향, 기울기가 -이면 양의 방향으로 이동시킴)
3. 미분 값이 0이 될때 까지 위 과정을 반복해서 최소값을 구함.
학습률 (learning rate)
- 학습율을 너무 크게 설정하면, 기울기의 부호를 바꿔 이동할 때 적절한 거리는 찾지 못해 너무 멀리 이동하면, 기울기(a)가 수렴하지 않고 발산할 수 있음. -> overshooting
학습율을 너무 작게 하면 국소 최적치(local minima)에 빠져 최적화된 w를 찾기 전에 학습이 끝날 수 있다.
- 따라서, 이동거리를 정하는 것이 중요 ... 학습률 개념
- 딥러닝에서 학습률의 값을 적절히 바꾸면서 최적의 학습률을 찾는 것이, 최적화 과정 중의 하나. 일반적으로 0.01 을 초기값으로 하고 학습비용 (cost)를 관찰한 후 조금식 조정함.
- 경사 하강법은 오차 변화의 2차 함수 그래프를 만들고 적절한 학습률을 설정해 기울기가 0인 지점을 구하는 것.
- 최적의 절편(b)을 구할 때도 동일하게 사용.
- a, b에 대해서는 각각 편미분
학습율 조정 방법
TensorFlow 가 제공하는 메소드를 이용
tf.train.exponential_decay()
tf.train.natural_exp_decay()
tf.train.polynomial_decay()
tf.train.inverse_time_decay()
tf.train.piecewise_constant()
3차 이상 함수
- 다차원 편미분 개념 도입
확률적 경사하강법 (Stochastic Gradient Descent, SGD)
경사 하강법은 계산량이 커서 속도가 느리다.
확률적 경사 하강법은 데이터 일부를 랜덤하게 추출하여 일부 데이터만을 사용하기 때문에 속도가 빠르고 자주 업데이트할 수 있는 장점이 있다.
확률적 경사 하강법의 중간 결과는 진폭이 크고 불안정해 보일 수 있으나, 빠르게 최적해에 근사한 값을 찾아낼 수 있기에, 경사하강법을 대체해서 사용된다.
특히 모멘텀(momentum)을 이용하면, 지그재그 현상을 줄이면서 이동 방향에 관성을 더해 효과적으로 계산할 수 있다.
연역법과 귀납법
진리탐구 방법 (연역법, 귀납법)
기적에 대한 차원적 접근
1차원 세계
1, 2차원 세계
1,2,3차원 세계
고차원 존재의 일상은 저차원 존재에게 기적
신 존재에 대한 추론
1. 외계인?
2. 자기 현현의 보편성
유물론 vs. 유신론
인간 인식 방법의 한계로 인해,
두 가지 인식 방법을 모두 포함한 균형잡힌 자세가 필요
분쟁, 전쟁, 착취, 이기주의